1 //===-- CFString.cpp --------------------------------------------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // Created by Greg Clayton on 1/16/08. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #include "CFString.h" 15 #include <string> 16 #include <glob.h> 17 18 //---------------------------------------------------------------------- 19 // CFString constructor 20 //---------------------------------------------------------------------- 21 CFString::CFString(CFStringRef s) : 22 CFReleaser<CFStringRef> (s) 23 { 24 } 25 26 //---------------------------------------------------------------------- 27 // CFString copy constructor 28 //---------------------------------------------------------------------- 29 CFString::CFString(const CFString& rhs) : 30 CFReleaser<CFStringRef> (rhs) 31 { 32 33 } 34 35 //---------------------------------------------------------------------- 36 // CFString copy constructor 37 //---------------------------------------------------------------------- 38 CFString& 39 CFString::operator=(const CFString& rhs) 40 { 41 if (this != &rhs) 42 *this = rhs; 43 return *this; 44 } 45 46 CFString::CFString (const char *cstr, CFStringEncoding cstr_encoding) : 47 CFReleaser<CFStringRef> () 48 { 49 if (cstr && cstr[0]) 50 { 51 reset(::CFStringCreateWithCString(kCFAllocatorDefault, cstr, cstr_encoding)); 52 } 53 } 54 55 //---------------------------------------------------------------------- 56 // Destructor 57 //---------------------------------------------------------------------- 58 CFString::~CFString() 59 { 60 } 61 62 const char * 63 CFString::GetFileSystemRepresentation(std::string& s) 64 { 65 return CFString::FileSystemRepresentation(get(), s); 66 } 67 68 CFStringRef 69 CFString::SetFileSystemRepresentation (const char *path) 70 { 71 CFStringRef new_value = NULL; 72 if (path && path[0]) 73 new_value = ::CFStringCreateWithFileSystemRepresentation (kCFAllocatorDefault, path); 74 reset(new_value); 75 return get(); 76 } 77 78 79 CFStringRef 80 CFString::SetFileSystemRepresentationFromCFType (CFTypeRef cf_type) 81 { 82 CFStringRef new_value = NULL; 83 if (cf_type != NULL) 84 { 85 CFTypeID cf_type_id = ::CFGetTypeID(cf_type); 86 87 if (cf_type_id == ::CFStringGetTypeID()) 88 { 89 // Retain since we are using the existing object 90 new_value = (CFStringRef)::CFRetain(cf_type); 91 } 92 else if (cf_type_id == ::CFURLGetTypeID()) 93 { 94 new_value = ::CFURLCopyFileSystemPath((CFURLRef)cf_type, kCFURLPOSIXPathStyle); 95 } 96 } 97 reset(new_value); 98 return get(); 99 } 100 101 CFStringRef 102 CFString::SetFileSystemRepresentationAndExpandTilde (const char *path) 103 { 104 std::string expanded_path; 105 if (CFString::GlobPath(path, expanded_path)) 106 SetFileSystemRepresentation(expanded_path.c_str()); 107 else 108 reset(); 109 return get(); 110 } 111 112 const char * 113 CFString::UTF8(std::string& str) 114 { 115 return CFString::UTF8(get(), str); 116 } 117 118 // Static function that puts a copy of the UTF8 contents of CF_STR into STR 119 // and returns the C string pointer that is contained in STR when successful, else 120 // NULL is returned. This allows the std::string parameter to own the extracted string, 121 // and also allows that string to be returned as a C string pointer that can be used. 122 123 const char * 124 CFString::UTF8 (CFStringRef cf_str, std::string& str) 125 { 126 if (cf_str) 127 { 128 const CFStringEncoding encoding = kCFStringEncodingUTF8; 129 CFIndex max_utf8_str_len = CFStringGetLength (cf_str); 130 max_utf8_str_len = CFStringGetMaximumSizeForEncoding (max_utf8_str_len, encoding); 131 if (max_utf8_str_len > 0) 132 { 133 str.resize(max_utf8_str_len); 134 if (!str.empty()) 135 { 136 if (CFStringGetCString (cf_str, &str[0], str.size(), encoding)) 137 { 138 str.resize(strlen(str.c_str())); 139 return str.c_str(); 140 } 141 } 142 } 143 } 144 return NULL; 145 } 146 147 // Static function that puts a copy of the file system representation of CF_STR 148 // into STR and returns the C string pointer that is contained in STR when 149 // successful, else NULL is returned. This allows the std::string parameter 150 // to own the extracted string, and also allows that string to be returned as 151 // a C string pointer that can be used. 152 153 const char * 154 CFString::FileSystemRepresentation (CFStringRef cf_str, std::string& str) 155 { 156 if (cf_str) 157 { 158 CFIndex max_length = ::CFStringGetMaximumSizeOfFileSystemRepresentation (cf_str); 159 if (max_length > 0) 160 { 161 str.resize(max_length); 162 if (!str.empty()) 163 { 164 if (::CFStringGetFileSystemRepresentation (cf_str, &str[0], str.size())) 165 { 166 str.erase(::strlen(str.c_str())); 167 return str.c_str(); 168 } 169 } 170 } 171 } 172 str.erase(); 173 return NULL; 174 } 175 176 177 CFIndex 178 CFString::GetLength() const 179 { 180 CFStringRef str = get(); 181 if (str) 182 return CFStringGetLength (str); 183 return 0; 184 } 185 186 187 const char* 188 CFString::GlobPath(const char* path, std::string &expanded_path) 189 { 190 glob_t globbuf; 191 if (::glob (path, GLOB_TILDE, NULL, &globbuf) == 0) 192 { 193 expanded_path = globbuf.gl_pathv[0]; 194 ::globfree (&globbuf); 195 } 196 else 197 expanded_path.clear(); 198 199 return expanded_path.c_str(); 200 } 201 202