hxinternetconfigutils.cpp
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:23k
源码类别:

Symbian

开发平台:

C/C++

  1. /* ***** BEGIN LICENSE BLOCK ***** 
  2.  * Version: RCSL 1.0/RPSL 1.0 
  3.  *  
  4.  * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. 
  5.  *      
  6.  * The contents of this file, and the files included with this file, are 
  7.  * subject to the current version of the RealNetworks Public Source License 
  8.  * Version 1.0 (the "RPSL") available at 
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed 
  10.  * the file under the RealNetworks Community Source License Version 1.0 
  11.  * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, 
  12.  * in which case the RCSL will apply. You may also obtain the license terms 
  13.  * directly from RealNetworks.  You may not use this file except in 
  14.  * compliance with the RPSL or, if you have a valid RCSL with RealNetworks 
  15.  * applicable to this file, the RCSL.  Please see the applicable RPSL or 
  16.  * RCSL for the rights, obligations and limitations governing use of the 
  17.  * contents of the file.  
  18.  *  
  19.  * This file is part of the Helix DNA Technology. RealNetworks is the 
  20.  * developer of the Original Code and owns the copyrights in the portions 
  21.  * it created. 
  22.  *  
  23.  * This file, and the files included with this file, is distributed and made 
  24.  * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 
  25.  * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
  26.  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS 
  27.  * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 
  28.  * 
  29.  * Technology Compatibility Kit Test Suite(s) Location: 
  30.  *    http://www.helixcommunity.org/content/tck 
  31.  * 
  32.  * Contributor(s): 
  33.  *  
  34.  * ***** END LICENSE BLOCK ***** */ 
  35. #include "hxtypes.h"
  36. #include "hxinternetconfigutils.h"
  37. #include "hx_moreprocesses.h" // for GetCurrentAppSignature
  38. #include "string.h"
  39. #ifndef _MAC_MACHO
  40. #include <Processes.h>
  41. #endif
  42. #include "hxstrutl.h"
  43. #ifndef _CARBON
  44. #define ICAttr long
  45. #endif
  46. ICInstance  HXInternetConfigMac::m_icInstance = NULL;
  47. UInt32  HXInternetConfigMac::m_refcount = 0;
  48. #ifdef _CARBON
  49.     const ICAttr kNoAttrChange = kICAttrNoChange;
  50. #else
  51.     const ICAttr kNoAttrChange = ICattr_no_change;
  52. #endif     
  53. static void ConcatPString(StringPtr mainStr, ConstStr255Param suffix)
  54. {
  55. short len1 = mainStr[0];
  56. short len2 = suffix[0];
  57. if (len1 + len2 > 255)
  58. {
  59. len2 = 255 - len1;
  60. }
  61. BlockMoveData(&suffix[1], &mainStr[len1 + 1], len2);
  62. mainStr[0] += len2;
  63. }
  64. static void CopyPString(ConstStr255Param source, StringPtr dest)
  65. {
  66. BlockMoveData(source, dest, 1 + source[0]);
  67. }
  68. static Boolean PStringInString(ConstStr255Param searchStr, ConstStr255Param biggerStr)
  69. {
  70. char csearch[256]; /* Flawfinder: ignore */
  71. char cbigger[256]; /* Flawfinder: ignore */
  72. Boolean bFound;
  73. CopyP2CString(searchStr, csearch, 256);
  74. CopyP2CString(biggerStr, cbigger, 256);
  75. bFound = (NULL != strstr(cbigger, csearch));
  76. return bFound;
  77. }
  78. Boolean HXInternetConfigMac::StartUsingIC(void)
  79. {
  80. Boolean bResult;
  81. bResult = false;
  82. if (!ICStart)
  83. {
  84. // we didn't link to InternetConfig
  85. return false;
  86. }
  87. // are there other instances already?
  88. if (m_refcount > 0)
  89. {
  90. m_refcount++;
  91. bResult = true;
  92. }
  93. else
  94. {
  95. // make a new instance
  96. OSStatus status;
  97. if (m_icInstance) return true;
  98. // start internet config
  99. status = ICStart(&m_icInstance, GetCurrentAppSignature());
  100. if (status == noErr)
  101. {
  102. #ifndef _CARBON
  103. status = ICFindConfigFile(m_icInstance, 0, NULL);
  104. #endif
  105. }
  106. else
  107. {
  108. (void) ICStop(m_icInstance);
  109. }
  110. if (status == noErr)
  111. {
  112. // IC is started now, so increase the refcount
  113. m_refcount++;
  114. bResult = true;
  115. }
  116. }
  117. return bResult;
  118. }
  119. void HXInternetConfigMac::StopUsingIC(void)
  120. {
  121. // are there outstanding instances besides us?
  122. if (m_refcount > 1)
  123. {
  124. m_refcount--;
  125. }
  126. else if (m_refcount == 1)
  127. {
  128. // we're the last instance, so close our connection
  129. // to the component
  130. (void) ICStop(m_icInstance);
  131. m_icInstance = NULL;
  132. m_refcount--;
  133. }
  134. }
  135. Boolean HXInternetConfigMac::StartReadingICPrefs(void)
  136. {
  137. OSStatus  status;
  138. Boolean bResult;
  139. bResult = false;
  140. if (StartUsingIC())
  141. {
  142. status = ICBegin(m_icInstance, icReadOnlyPerm);
  143. if (status == noErr)
  144. {
  145. bResult = true;
  146. }
  147. }
  148. return bResult;
  149. }
  150. Boolean HXInternetConfigMac::StartWritingICPrefs(void)
  151. {
  152. OSStatus  status;
  153. Boolean bResult;
  154. bResult = false;
  155. if (StartUsingIC())
  156. {
  157. status = ICBegin(m_icInstance, icReadWritePerm);
  158. if (status == noErr)
  159. {
  160. bResult = true;
  161. }
  162. }
  163. return bResult;
  164. }
  165. void HXInternetConfigMac::StopUsingICPrefs(void)
  166. {
  167. (void) ICEnd(m_icInstance);
  168. StopUsingIC();
  169. }
  170. // IsInternetConfigAvailable initializes internet config if necessary
  171. // and returns our connection
  172. Boolean HXInternetConfigMac::IsInternetConfigAvailable(void)
  173. {
  174. if (StartUsingIC())
  175. {
  176. StopUsingIC();
  177. return true;
  178. }
  179. return false;
  180. }
  181. // GetInstance initializes InternetConfig, if necessary, and returns
  182. // our instance of the IC component
  183. ICInstance HXInternetConfigMac::GetInstance(void)
  184. {
  185. return m_icInstance;
  186. }
  187. // GetFileTypeFromName returns the appropriate file type for
  188. // a given file name, or else zero if none is found
  189. OSType HXInternetConfigMac::GetFileTypeFromName(ConstStr255Param fileName)
  190. {
  191. ICMapEntry mapEntry;
  192. OSStatus status;
  193. OSType result;
  194. if (!StartUsingIC()) return 0;
  195. result = (OSType) 0;
  196. status = ICMapFilename(m_icInstance, fileName, &mapEntry);
  197. if (status == noErr)
  198. {
  199. #ifdef _CARBON
  200. result = mapEntry.fileType;
  201. #else
  202. result = mapEntry.file_type;
  203. #endif
  204. }
  205. StopUsingIC();
  206. return result;
  207. }
  208. // GetFileCreatorFromName returns the appropriate file creator for
  209. // a given file name, or else zero if none is found
  210. OSType HXInternetConfigMac::GetFileCreatorFromName(ConstStr255Param fileName)
  211. {
  212. ICMapEntry mapEntry;
  213. OSStatus status;
  214. OSType result;
  215. if (!StartUsingIC()) return 0;
  216. result = (OSType) 0;
  217. status = ICMapFilename(m_icInstance, fileName, &mapEntry);
  218. if (status == noErr)
  219. {
  220. #ifdef _CARBON
  221. result = mapEntry.fileCreator;
  222. #else
  223. result = mapEntry.file_creator;
  224. #endif
  225. }
  226. StopUsingIC();
  227. return result;
  228. }
  229. // GetFileCreatorFromName returns the appropriate file creator for
  230. // a given file name, or else zero if none is found
  231. OSErr HXInternetConfigMac::GetFileExtensionFromType(OSType fType, OSType fCreator, ConstStr255Param fileName, StringPtr extension)
  232. {
  233. ICMapEntry mapEntry;
  234. OSStatus status;
  235. if (!StartUsingIC()) return icInternalErr;
  236. status = ICMapTypeCreator(m_icInstance, fType, fCreator, fileName, &mapEntry);
  237. if (status == noErr)
  238. {
  239. // copy the extension (pascal string)
  240. CopyPString(mapEntry.extension, extension);
  241. }
  242. StopUsingIC();
  243. return (OSErr) status;
  244. }
  245. // LaunchURL launches the URL pointed to by the c-string
  246. OSErr HXInternetConfigMac::LaunchURL(const char *url)
  247. {
  248. OSStatus status;
  249. if (!StartUsingIC()) return icInternalErr;
  250. long startSel;
  251. long endSel;
  252. startSel = 0;
  253. endSel = strlen(url);
  254. status = ICLaunchURL(m_icInstance, "p", (char *) url, 
  255. strlen(url), &startSel, &endSel);
  256. StopUsingIC();
  257. return (OSErr) status;
  258. }
  259. // GetFTPHelper gets the signature and name of the ftp helper app.
  260. // Either parameter can be nil if the result isn't desired.
  261. OSErr HXInternetConfigMac::GetFTPHelper(OSType *signature, StringPtr helperName)
  262. {
  263. OSStatus status;
  264. if (!StartUsingIC()) return icInternalErr;
  265. long  dataSize;
  266. ICAppSpec targetSpec;
  267. ICAttr icAttr;
  268. // construct our key string for getting the ftp helper by concatenating
  269. // ftp to the standard pascal helper prefix
  270. #define kICHelperFTP kICHelper "ftp"
  271. dataSize = sizeof(ICAppSpec);
  272. // get the preference information for the ftp helper
  273. status = ICGetPref(m_icInstance,  kICHelperFTP, &icAttr, (Ptr) &targetSpec, &dataSize);
  274. if (status == noErr)
  275. {
  276. if (signature) *signature = targetSpec.fCreator;
  277. if (helperName) CopyPString(targetSpec.name, helperName);
  278. }
  279. StopUsingIC();
  280. return (OSErr) status;
  281. }
  282. // GetHTTPHelper gets the signature and name of the http helper app.
  283. // Either parameter can be nil if the result isn't desired.
  284. OSErr HXInternetConfigMac::GetHTTPHelper(OSType *signature, StringPtr helperName)
  285. {
  286. OSStatus status;
  287. if (!StartUsingIC()) return icInternalErr;
  288. long  dataSize;
  289. ICAppSpec targetSpec;
  290. ICAttr icAttr;
  291. // construct our key string for getting the ftp helper by concatenating
  292. // ftp to the standard pascal helper prefix
  293. #define kICHelperHTTP kICHelper "http"
  294. dataSize = sizeof(ICAppSpec);
  295. // get the preference information for the ftp helper
  296. status = ICGetPref(m_icInstance,  kICHelperHTTP, &icAttr, (Ptr) &targetSpec, &dataSize);
  297. if (status == noErr)
  298. {
  299. if (signature) *signature = targetSpec.fCreator;
  300. if (helperName) CopyPString(targetSpec.name, helperName);
  301. }
  302. StopUsingIC();
  303. return (OSErr) status;
  304. }
  305. // GetEmailAddress returns user's email address
  306. // returns FALSE if not found.
  307. BOOL HXInternetConfigMac::GetEmailAddress(CHXString& strEmail)
  308. {
  309. return GetICPreferenceString(kICEmail, strEmail);
  310. }
  311. // GetICPreferenceBoolean gets an IC preference that is a simple string
  312. // returns FALSE if not found
  313. // keys are in InternetConfig.h
  314. BOOL HXInternetConfigMac::GetICPreferenceBoolean( ConstStr255Param keyPascalString, BOOL& outBool )
  315. {
  316. OSStatus status;
  317. BOOL bSuccess = FALSE;
  318. outBool = FALSE;
  319. if (StartUsingIC())
  320. {
  321.      long  dataSize = sizeof(Boolean);
  322.      ICAttr icAttr;
  323. Boolean icBool;
  324. status = ICGetPref(m_icInstance, keyPascalString, &icAttr, (char*) &icBool, &dataSize);
  325. bSuccess = (status == noErr && dataSize == sizeof(Boolean));
  326. if (bSuccess)
  327. {
  328. outBool = (icBool ? TRUE : FALSE);
  329. }
  330. StopUsingIC();
  331. }
  332. return bSuccess;
  333. }
  334. // GetICPreference gets an IC preference that is a simple string
  335. // returns FALSE if not found
  336. // keys are in InternetConfig.h
  337. BOOL HXInternetConfigMac::GetICPreferenceString(ConstStr255Param keyPascalString, CHXString& strResult)
  338. {
  339. OSStatus status;
  340. BOOL bSuccess = FALSE;
  341. strResult.Empty();
  342. if (StartUsingIC())
  343. {
  344.      long  textSize = 255;
  345. ICAttr icAttr;
  346. Str255 bufferStr;
  347. status = ICGetPref(m_icInstance, keyPascalString, &icAttr, (char*) bufferStr, &textSize);
  348. bSuccess = (status == noErr && textSize <= 255);
  349. if (bSuccess)
  350. {
  351. strResult.SetFromStr255(bufferStr);
  352. }
  353. StopUsingIC();
  354. }
  355. return bSuccess;
  356. }
  357. // GetICPreferenceStringList returns a STR#-style IC preference
  358. // returns FALSE if not found
  359. // keys are in InternetConfig.h
  360. // the list is returns with items separated by the outputSeparator character
  361. BOOL HXInternetConfigMac::GetICPreferenceStringList(ConstStr255Param keyPascalString, char outputSeparator, CHXString& strResult)
  362. {
  363. OSStatus status;
  364. BOOL bSuccess = FALSE;
  365. strResult.Empty();
  366. if (StartUsingIC())
  367. {
  368. const int kBuffSize = 1024;
  369.      long  dataSize = kBuffSize;
  370. ICAttr icAttr;
  371. char buffer[kBuffSize]; /* Flawfinder: ignore */
  372. status = ICGetPref(m_icInstance, keyPascalString, &icAttr, (char*) buffer, &dataSize);
  373. bSuccess = (status == noErr && dataSize <= kBuffSize && dataSize >= sizeof(short));
  374. if (bSuccess)
  375. {
  376. // buffer is a short number of strings, followed by Pascal strings
  377. //
  378. // combine them into the output CHXString, separated by outputSeparator characters
  379. short numItems = *(short *) buffer;
  380. StringPtr pCurrentStr = (StringPtr) &buffer[2];
  381. CHXString strTemp;
  382. for (int idx = 0; idx < numItems; idx++)
  383. {
  384. strTemp.SetFromStr255(pCurrentStr);
  385. if ((!strTemp.IsEmpty()) && (!strResult.IsEmpty()))
  386. {
  387. strResult += outputSeparator;
  388. }
  389. strResult += strTemp;
  390. pCurrentStr += (1 + pCurrentStr[0]);
  391. }
  392. }
  393. StopUsingIC();
  394. }
  395. return bSuccess;
  396. }
  397. // SetProtocol 
  398. const unsigned char kHelper[] = kICHelper; // "pHelper