cfwrappers.cpp
上传用户:dangjiwu
上传日期:2013-07-19
资源大小:42019k
文件大小:10k
源码类别:

Symbian

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Source last modified: $Id: cfwrappers.cpp,v 1.3.32.3 2004/07/09 01:47:27 hubbe Exp $
  3.  * 
  4.  * Portions Copyright (c) 1995-2004 RealNetworks, Inc. All Rights Reserved.
  5.  * 
  6.  * The contents of this file, and the files included with this file,
  7.  * are subject to the current version of the RealNetworks Public
  8.  * Source License (the "RPSL") available at
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed
  10.  * the file under the current version of the RealNetworks Community
  11.  * Source License (the "RCSL") available at
  12.  * http://www.helixcommunity.org/content/rcsl, in which case the RCSL
  13.  * will apply. You may also obtain the license terms directly from
  14.  * RealNetworks.  You may not use this file except in compliance with
  15.  * the RPSL or, if you have a valid RCSL with RealNetworks applicable
  16.  * to this file, the RCSL.  Please see the applicable RPSL or RCSL for
  17.  * the rights, obligations and limitations governing use of the
  18.  * contents of the file.
  19.  * 
  20.  * Alternatively, the contents of this file may be used under the
  21.  * terms of the GNU General Public License Version 2 or later (the
  22.  * "GPL") in which case the provisions of the GPL are applicable
  23.  * instead of those above. If you wish to allow use of your version of
  24.  * this file only under the terms of the GPL, and not to allow others
  25.  * to use your version of this file under the terms of either the RPSL
  26.  * or RCSL, indicate your decision by deleting the provisions above
  27.  * and replace them with the notice and other provisions required by
  28.  * the GPL. If you do not delete the provisions above, a recipient may
  29.  * use your version of this file under the terms of any one of the
  30.  * RPSL, the RCSL or the GPL.
  31.  * 
  32.  * This file is part of the Helix DNA Technology. RealNetworks is the
  33.  * developer of the Original Code and owns the copyrights in the
  34.  * portions it created.
  35.  * 
  36.  * This file, and the files included with this file, is distributed
  37.  * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY
  38.  * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS
  39.  * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES
  40.  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET
  41.  * ENJOYMENT OR NON-INFRINGEMENT.
  42.  * 
  43.  * Technology Compatibility Kit Test Suite(s) Location:
  44.  *    http://www.helixcommunity.org/content/tck
  45.  * 
  46.  * Contributor(s):
  47.  * 
  48.  * ***** END LICENSE BLOCK ***** */
  49. #pragma once
  50. #if defined(_CARBON) || defined(_MAC_UNIX)
  51. #include "platform/mac/cfwrappers.h"
  52. #include "hxassert.h"
  53. //------------------------------------------------------------
  54. //
  55. // CHXCFString
  56. //
  57. //------------------------------------------------------------
  58. // Constructors
  59. CHXCFString::CHXCFString(void) : mCFStringRef(NULL)
  60. {
  61. UpdateDebugOnlyString();
  62. }
  63. CHXCFString::CHXCFString(CFStringRef cfs)
  64. {
  65. mCFStringRef = cfs;
  66. UpdateDebugOnlyString();
  67. }
  68. CHXCFString::CHXCFString(const CHXCFString& othercfs)
  69. {
  70. mCFStringRef = othercfs.mCFStringRef; 
  71. CFRetain(mCFStringRef); // since he'll release it and we'll release it
  72. UpdateDebugOnlyString();
  73. }
  74. CHXCFString::CHXCFString(const char *pCString, CFStringEncoding encoding)
  75. {
  76. mCFStringRef = CFStringCreateWithCString(kCFAllocatorDefault, pCString, encoding);
  77. check_nonnull(mCFStringRef);
  78. UpdateDebugOnlyString();
  79. }
  80. CHXCFString::CHXCFString(const char *pCString)
  81. {
  82. mCFStringRef = CFStringCreateWithCString(kCFAllocatorDefault, pCString, CFStringGetSystemEncoding());
  83. check_nonnull(mCFStringRef);
  84. UpdateDebugOnlyString();
  85. }
  86. CHXCFString::CHXCFString(const CHXString &str)
  87. {
  88. mCFStringRef = CFStringCreateWithCString(kCFAllocatorDefault, (const char *) str, CFStringGetSystemEncoding());
  89. check_nonnull(mCFStringRef);
  90. UpdateDebugOnlyString();
  91. }
  92. CHXCFString::CHXCFString(ConstStr255Param pPString)
  93. {
  94. mCFStringRef = CFStringCreateWithPascalString(kCFAllocatorDefault, pPString, CFStringGetSystemEncoding());
  95. check_nonnull(mCFStringRef);
  96. UpdateDebugOnlyString();
  97. }
  98. CHXCFString::CHXCFString(const UInt16* pUniChars, INT32 numChars)
  99. {
  100. mCFStringRef = CFStringCreateWithCharacters(kCFAllocatorDefault, pUniChars, numChars);
  101. check_nonnull(mCFStringRef);
  102. UpdateDebugOnlyString();
  103. }
  104. CHXCFString::CHXCFString(CFURLRef urlRef)
  105. {
  106. mCFStringRef = NULL;
  107. SetToCFURL(urlRef);
  108. }
  109. CHXCFString::CHXCFString(const HFSUniStr255& hfsUni)
  110. {
  111. mCFStringRef = CFStringCreateWithCharacters(kCFAllocatorDefault, 
  112. hfsUni.unicode, hfsUni.length);
  113. check_nonnull(mCFStringRef);
  114. UpdateDebugOnlyString();
  115. }
  116. // Type cast operators
  117. CHXCFString::operator HFSUniStr255(void) const
  118. {
  119. HFSUniStr255 hfsUni;
  120. CFIndex cfLength;
  121. cfLength = CFStringGetLength(mCFStringRef);
  122. if (cfLength <= 255)
  123. {
  124. hfsUni.length = cfLength;
  125. CFStringGetCharacters(mCFStringRef, CFRangeMake(0, cfLength), hfsUni.unicode);
  126. }
  127. else
  128. {
  129. hfsUni.length = 0;
  130. }
  131. return hfsUni;
  132. }
  133. // Assignment operators
  134. const CHXCFString& CHXCFString::operator =(const char *pCString)
  135. {
  136. ReleaseCFString();
  137. mCFStringRef = CFStringCreateWithCString(kCFAllocatorDefault, pCString, CFStringGetSystemEncoding());
  138. check_nonnull(mCFStringRef);
  139. UpdateDebugOnlyString();
  140. return *this;
  141. }
  142. const CHXCFString& CHXCFString::operator =(const CHXString& str)
  143. {
  144. ReleaseCFString();
  145. mCFStringRef = CFStringCreateWithCString(kCFAllocatorDefault, (const char *) str, CFStringGetSystemEncoding());
  146. check_nonnull(mCFStringRef);
  147. UpdateDebugOnlyString();
  148. return *this;
  149. }
  150. const CHXCFString& CHXCFString::operator =(CFStringRef cfs)
  151. {
  152. ReleaseCFString();
  153. mCFStringRef = cfs; // note we're NOT doing an additional retain, since these usually are returned by toolbox calls
  154. UpdateDebugOnlyString();
  155. return *this;
  156. }
  157. const CHXCFString& CHXCFString::operator =(const CHXCFString& othercfs)
  158. {
  159. ReleaseCFString();
  160. mCFStringRef = othercfs.mCFStringRef; 
  161. CFRetain(mCFStringRef); // since he'll release it and we'll release it
  162. UpdateDebugOnlyString();
  163. return *this;
  164. }
  165. const CHXCFString& CHXCFString::operator =(CFURLRef urlRef)
  166. {
  167. SetToCFURL(urlRef);
  168. return *this;
  169. }
  170. const CHXCFString& CHXCFString::operator =(const HFSUniStr255& hfsUni)
  171. {
  172. ReleaseCFString();
  173. mCFStringRef = CFStringCreateWithCharacters(kCFAllocatorDefault, 
  174. hfsUni.unicode, hfsUni.length);
  175. check_nonnull(mCFStringRef);
  176. UpdateDebugOnlyString();
  177. return *this;
  178. }
  179. // Destructor
  180. CHXCFString::~CHXCFString()
  181. {
  182. ReleaseCFString();
  183. }
  184. // Internal utilities
  185. void CHXCFString::ReleaseCFString()
  186. {
  187. if (mCFStringRef)
  188. {
  189. ::CFRelease(mCFStringRef);
  190. mCFStringRef = NULL;
  191. }
  192. }
  193. void CHXCFString::SetToCFURL(CFURLRef cfURL)
  194. {
  195. ReleaseCFString();
  196. CFStringRef tempStringRef;
  197. tempStringRef = ::CFURLGetString(cfURL); // we do NOT release the CFString from CFURLGetString
  198. if (tempStringRef)
  199. {
  200. mCFStringRef = ::CFStringCreateCopy(kCFAllocatorDefault, tempStringRef);
  201. }
  202. UpdateDebugOnlyString();
  203. }
  204. #ifdef _DEBUG
  205. void CHXCFString::UpdateDebugOnlyString()
  206. {
  207. if (mCFStringRef)
  208. {
  209. mStrDebugOnly.SetFromCFString(mCFStringRef, CFStringGetSystemEncoding());
  210. }
  211. else
  212. {
  213. mStrDebugOnly.Empty();
  214. }
  215. pStrDebugOnlyPeek = (const char *) mStrDebugOnly;
  216. }
  217. #endif // _DEBUG
  218. #pragma mark -
  219. //------------------------------------------------------------
  220. //
  221. // CHXCFURL
  222. //
  223. //------------------------------------------------------------
  224. // Constructors
  225. CHXCFURL::CHXCFURL(void) : mCFURLRef(NULL)
  226. {
  227. UpdateDebugOnlyString();
  228. }
  229. CHXCFURL::CHXCFURL(const char *pCString)
  230. {
  231. mCFURLRef = NULL;
  232. SetToString(pCString);
  233. }
  234. CHXCFURL::CHXCFURL(const CHXString& str)
  235. {
  236. mCFURLRef = NULL;
  237. SetToString((const char *) str);
  238. }
  239. CHXCFURL::CHXCFURL(const FSRef& fsRef)
  240. {
  241. mCFURLRef = NULL;
  242. SetToFSRef(fsRef);
  243. }
  244. CHXCFURL::CHXCFURL(const FSRef* fsRef)
  245. {
  246. mCFURLRef = NULL;
  247. SetToFSRef(*fsRef);
  248. }
  249. CHXCFURL::CHXCFURL(CFURLRef urlRef)
  250. {
  251. mCFURLRef = urlRef; // note we're NOT doing an additional retain
  252. UpdateDebugOnlyString();
  253. }
  254. // Assignment operators
  255. const CHXCFURL& CHXCFURL::operator =(const char *pCString)
  256. {
  257. SetToString(pCString);
  258. return *this;
  259. }
  260. const CHXCFURL& CHXCFURL::operator =(const CHXString& str)
  261. {
  262. SetToString((const char *) str);
  263. return *this;
  264. }
  265. const CHXCFURL& CHXCFURL::operator =(const FSRef& fsRef)
  266. {
  267. SetToFSRef(fsRef);
  268. return *this;
  269. }
  270. const CHXCFURL& CHXCFURL::operator =(const FSRef* fsRef)
  271. {
  272. SetToFSRef(*fsRef);
  273. return *this;
  274. }
  275. const CHXCFURL& CHXCFURL::operator =(CFURLRef urlRef)
  276. {
  277. ReleaseCFURL();
  278. mCFURLRef = urlRef; // note we're NOT doing an additional retain
  279. UpdateDebugOnlyString();
  280. return *this;
  281. }
  282. const CHXCFURL& CHXCFURL::operator =(const CHXCFURL& othercfurl)
  283. {
  284. ReleaseCFURL();
  285. mCFURLRef = othercfurl.mCFURLRef; // note we're retaining since he'll release it and we'll release it
  286. CFRetain(mCFURLRef);
  287. UpdateDebugOnlyString();
  288. return *this;
  289. }
  290. // Destructor
  291. CHXCFURL::~CHXCFURL()
  292. {
  293. ReleaseCFURL();
  294. }
  295. // Internal utilities
  296. void CHXCFURL::SetToString(const char *pCString)
  297. {
  298. const CFURLRef kNoBaseURL = NULL;
  299. ReleaseCFURL();
  300. // make a CFString then a CFURL from which we can get an FSRef
  301. CHXCFString cfstr(pCString, kCFStringEncodingUTF8);
  302. require(cfstr.IsSet(), CantMakeCFString);
  303. mCFURLRef = ::CFURLCreateWithString(kCFAllocatorDefault, cfstr, kNoBaseURL);
  304. if (mCFURLRef == NULL)
  305. {
  306. // failed; CFURL seems unable to deal with parameters, so try
  307. // stripping those and trying again
  308. CHXString strURL = pCString;
  309. int paramOffset = strURL.Find('?');
  310. if (paramOffset != -1)
  311. {
  312. CHXCFString cfstr2((const char *) strURL.Left(paramOffset), kCFStringEncodingUTF8);
  313. mCFURLRef = ::CFURLCreateWithString(kCFAllocatorDefault, cfstr2, kNoBaseURL);
  314. }
  315. }
  316. UpdateDebugOnlyString();
  317. CantMakeCFString:
  318. return;
  319. }
  320. void CHXCFURL::SetToFSRef(const FSRef& fsRef)
  321. {
  322. ReleaseCFURL();
  323. mCFURLRef = ::CFURLCreateFromFSRef(kCFAllocatorDefault, &fsRef);
  324. UpdateDebugOnlyString();
  325. return;
  326. }
  327. void CHXCFURL::ReleaseCFURL()
  328. {
  329. if (mCFURLRef)
  330. {
  331. ::CFRelease(mCFURLRef);
  332. mCFURLRef = NULL;
  333. }
  334. UpdateDebugOnlyString();
  335. }
  336. #ifdef _DEBUG
  337. void CHXCFURL::UpdateDebugOnlyString()
  338. {
  339. if (mCFURLRef)
  340. {
  341. mStrDebugOnly = ::CFURLGetString(mCFURLRef); // we do NOT release the CFString from CFURLGetString
  342. }
  343. else
  344. {
  345. mStrDebugOnly.Empty();
  346. }
  347. pStrDebugOnlyPeek = (const char *) mStrDebugOnly;
  348. }
  349. #endif // _DEBUG
  350. #endif // _CARBON