//===-- CFString.cpp --------------------------------------------*- C++ -*-===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // // Created by Greg Clayton on 1/16/08. // //===----------------------------------------------------------------------===// #include "CFString.h" #include #include //---------------------------------------------------------------------- // CFString constructor //---------------------------------------------------------------------- CFString::CFString(CFStringRef s) : CFReleaser (s) { } //---------------------------------------------------------------------- // CFString copy constructor //---------------------------------------------------------------------- CFString::CFString(const CFString& rhs) : CFReleaser (rhs) { } //---------------------------------------------------------------------- // CFString copy constructor //---------------------------------------------------------------------- CFString& CFString::operator=(const CFString& rhs) { if (this != &rhs) *this = rhs; return *this; } CFString::CFString (const char *cstr, CFStringEncoding cstr_encoding) : CFReleaser () { if (cstr && cstr[0]) { reset(::CFStringCreateWithCString(kCFAllocatorDefault, cstr, cstr_encoding)); } } //---------------------------------------------------------------------- // Destructor //---------------------------------------------------------------------- CFString::~CFString() { } const char * CFString::GetFileSystemRepresentation(std::string& s) { return CFString::FileSystemRepresentation(get(), s); } CFStringRef CFString::SetFileSystemRepresentation (const char *path) { CFStringRef new_value = NULL; if (path && path[0]) new_value = ::CFStringCreateWithFileSystemRepresentation (kCFAllocatorDefault, path); reset(new_value); return get(); } CFStringRef CFString::SetFileSystemRepresentationFromCFType (CFTypeRef cf_type) { CFStringRef new_value = NULL; if (cf_type != NULL) { CFTypeID cf_type_id = ::CFGetTypeID(cf_type); if (cf_type_id == ::CFStringGetTypeID()) { // Retain since we are using the existing object new_value = (CFStringRef)::CFRetain(cf_type); } else if (cf_type_id == ::CFURLGetTypeID()) { new_value = ::CFURLCopyFileSystemPath((CFURLRef)cf_type, kCFURLPOSIXPathStyle); } } reset(new_value); return get(); } CFStringRef CFString::SetFileSystemRepresentationAndExpandTilde (const char *path) { std::string expanded_path; if (CFString::GlobPath(path, expanded_path)) SetFileSystemRepresentation(expanded_path.c_str()); else reset(); return get(); } const char * CFString::UTF8(std::string& str) { return CFString::UTF8(get(), str); } // Static function that puts a copy of the UTF8 contents of CF_STR into STR // and returns the C string pointer that is contained in STR when successful, else // NULL is returned. This allows the std::string parameter to own the extracted string, // and also allows that string to be returned as a C string pointer that can be used. const char * CFString::UTF8 (CFStringRef cf_str, std::string& str) { if (cf_str) { const CFStringEncoding encoding = kCFStringEncodingUTF8; CFIndex max_utf8_str_len = CFStringGetLength (cf_str); max_utf8_str_len = CFStringGetMaximumSizeForEncoding (max_utf8_str_len, encoding); if (max_utf8_str_len > 0) { str.resize(max_utf8_str_len); if (!str.empty()) { if (CFStringGetCString (cf_str, &str[0], str.size(), encoding)) { str.resize(strlen(str.c_str())); return str.c_str(); } } } } return NULL; } // Static function that puts a copy of the file system representation of CF_STR // into STR and returns the C string pointer that is contained in STR when // successful, else NULL is returned. This allows the std::string parameter // to own the extracted string, and also allows that string to be returned as // a C string pointer that can be used. const char * CFString::FileSystemRepresentation (CFStringRef cf_str, std::string& str) { if (cf_str) { CFIndex max_length = ::CFStringGetMaximumSizeOfFileSystemRepresentation (cf_str); if (max_length > 0) { str.resize(max_length); if (!str.empty()) { if (::CFStringGetFileSystemRepresentation (cf_str, &str[0], str.size())) { str.erase(::strlen(str.c_str())); return str.c_str(); } } } } str.erase(); return NULL; } CFIndex CFString::GetLength() const { CFStringRef str = get(); if (str) return CFStringGetLength (str); return 0; } const char* CFString::GlobPath(const char* path, std::string &expanded_path) { glob_t globbuf; if (::glob (path, GLOB_TILDE, NULL, &globbuf) == 0) { expanded_path = globbuf.gl_pathv[0]; ::globfree (&globbuf); } else expanded_path.clear(); return expanded_path.c_str(); }