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

Symbian

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Source last modified: $Id: hxinternetconfigutils.cpp,v 1.3.36.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. #include "hxtypes.h"
  50. #include "hxinternetconfigutils.h"
  51. #include "hx_moreprocesses.h" // for GetCurrentAppSignature
  52. #include "string.h"
  53. #ifndef _MAC_MACHO
  54. #include <Processes.h>
  55. #endif
  56. #include "hxstrutl.h"
  57. #ifndef _CARBON
  58. #define ICAttr long
  59. #endif
  60. ICInstance  HXInternetConfigMac::m_icInstance = NULL;
  61. UInt32  HXInternetConfigMac::m_refcount = 0;
  62. #ifdef _CARBON
  63.     const ICAttr kNoAttrChange = kICAttrNoChange;
  64. #else
  65.     const ICAttr kNoAttrChange = ICattr_no_change;
  66. #endif     
  67. static void ConcatPString(StringPtr mainStr, ConstStr255Param suffix)
  68. {
  69. short len1 = mainStr[0];
  70. short len2 = suffix[0];
  71. if (len1 + len2 > 255)
  72. {
  73. len2 = 255 - len1;
  74. }
  75. BlockMoveData(&suffix[1], &mainStr[len1 + 1], len2);
  76. mainStr[0] += len2;
  77. }
  78. static void CopyPString(ConstStr255Param source, StringPtr dest)
  79. {
  80. BlockMoveData(source, dest, 1 + source[0]);
  81. }
  82. static Boolean PStringInString(ConstStr255Param searchStr, ConstStr255Param biggerStr)
  83. {
  84. char csearch[256]; /* Flawfinder: ignore */
  85. char cbigger[256]; /* Flawfinder: ignore */
  86. Boolean bFound;
  87. CopyP2CString(searchStr, csearch, 256);
  88. CopyP2CString(biggerStr, cbigger, 256);
  89. bFound = (NULL != strstr(cbigger, csearch));
  90. return bFound;
  91. }
  92. Boolean HXInternetConfigMac::StartUsingIC(void)
  93. {
  94. Boolean bResult;
  95. bResult = false;
  96. if (!ICStart)
  97. {
  98. // we didn't link to InternetConfig
  99. return false;
  100. }
  101. // are there other instances already?
  102. if (m_refcount > 0)
  103. {
  104. m_refcount++;
  105. bResult = true;
  106. }
  107. else
  108. {
  109. // make a new instance
  110. OSStatus status;
  111. if (m_icInstance) return true;
  112. // start internet config
  113. status = ICStart(&m_icInstance, GetCurrentAppSignature());
  114. if (status == noErr)
  115. {
  116. #ifndef _CARBON
  117. status = ICFindConfigFile(m_icInstance, 0, NULL);
  118. #endif
  119. }
  120. else
  121. {
  122. (void) ICStop(m_icInstance);
  123. }
  124. if (status == noErr)
  125. {
  126. // IC is started now, so increase the refcount
  127. m_refcount++;
  128. bResult = true;
  129. }
  130. }
  131. return bResult;
  132. }
  133. void HXInternetConfigMac::StopUsingIC(void)
  134. {
  135. // are there outstanding instances besides us?
  136. if (m_refcount > 1)
  137. {
  138. m_refcount--;
  139. }
  140. else if (m_refcount == 1)
  141. {
  142. // we're the last instance, so close our connection
  143. // to the component
  144. (void) ICStop(m_icInstance);
  145. m_icInstance = NULL;
  146. m_refcount--;
  147. }
  148. }
  149. Boolean HXInternetConfigMac::StartReadingICPrefs(void)
  150. {
  151. OSStatus  status;
  152. Boolean bResult;
  153. bResult = false;
  154. if (StartUsingIC())
  155. {
  156. status = ICBegin(m_icInstance, icReadOnlyPerm);
  157. if (status == noErr)
  158. {
  159. bResult = true;
  160. }
  161. }
  162. return bResult;
  163. }
  164. Boolean HXInternetConfigMac::StartWritingICPrefs(void)
  165. {
  166. OSStatus  status;
  167. Boolean bResult;
  168. bResult = false;
  169. if (StartUsingIC())
  170. {
  171. status = ICBegin(m_icInstance, icReadWritePerm);
  172. if (status == noErr)
  173. {
  174. bResult = true;
  175. }
  176. }
  177. return bResult;
  178. }
  179. void HXInternetConfigMac::StopUsingICPrefs(void)
  180. {
  181. (void) ICEnd(m_icInstance);
  182. StopUsingIC();
  183. }
  184. // IsInternetConfigAvailable initializes internet config if necessary
  185. // and returns our connection
  186. Boolean HXInternetConfigMac::IsInternetConfigAvailable(void)
  187. {
  188. if (StartUsingIC())
  189. {
  190. StopUsingIC();
  191. return true;
  192. }
  193. return false;
  194. }
  195. // GetInstance initializes InternetConfig, if necessary, and returns
  196. // our instance of the IC component
  197. ICInstance HXInternetConfigMac::GetInstance(void)
  198. {
  199. return m_icInstance;
  200. }
  201. // GetFileTypeFromName returns the appropriate file type for
  202. // a given file name, or else zero if none is found
  203. OSType HXInternetConfigMac::GetFileTypeFromName(ConstStr255Param fileName)
  204. {
  205. ICMapEntry mapEntry;
  206. OSStatus status;
  207. OSType result;
  208. if (!StartUsingIC()) return 0;
  209. result = (OSType) 0;
  210. status = ICMapFilename(m_icInstance, fileName, &mapEntry);
  211. if (status == noErr)
  212. {
  213. #ifdef _CARBON
  214. result = mapEntry.fileType;
  215. #else
  216. result = mapEntry.file_type;
  217. #endif
  218. }
  219. StopUsingIC();
  220. return result;
  221. }
  222. // GetFileCreatorFromName returns the appropriate file creator for
  223. // a given file name, or else zero if none is found
  224. OSType HXInternetConfigMac::GetFileCreatorFromName(ConstStr255Param fileName)
  225. {
  226. ICMapEntry mapEntry;
  227. OSStatus status;
  228. OSType result;
  229. if (!StartUsingIC()) return 0;
  230. result = (OSType) 0;
  231. status = ICMapFilename(m_icInstance, fileName, &mapEntry);
  232. if (status == noErr)
  233. {
  234. #ifdef _CARBON
  235. result = mapEntry.fileCreator;
  236. #else
  237. result = mapEntry.file_creator;
  238. #endif
  239. }
  240. StopUsingIC();
  241. return result;
  242. }
  243. // GetFileCreatorFromName returns the appropriate file creator for
  244. // a given file name, or else zero if none is found
  245. OSErr HXInternetConfigMac::GetFileExtensionFromType(OSType fType, OSType fCreator, ConstStr255Param fileName, StringPtr extension)
  246. {
  247. ICMapEntry mapEntry;
  248. OSStatus status;
  249. if (!StartUsingIC()) return icInternalErr;
  250. status = ICMapTypeCreator(m_icInstance, fType, fCreator, fileName, &mapEntry);
  251. if (status == noErr)
  252. {
  253. // copy the extension (pascal string)
  254. CopyPString(mapEntry.extension, extension);
  255. }
  256. StopUsingIC();
  257. return (OSErr) status;
  258. }
  259. // LaunchURL launches the URL pointed to by the c-string
  260. OSErr HXInternetConfigMac::LaunchURL(const char *url)
  261. {
  262. OSStatus status;
  263. if (!StartUsingIC()) return icInternalErr;
  264. long startSel;
  265. long endSel;
  266. startSel = 0;
  267. endSel = strlen(url);
  268. status = ICLaunchURL(m_icInstance, "p", (char *) url, 
  269. strlen(url), &startSel, &endSel);
  270. StopUsingIC();
  271. return (OSErr) status;
  272. }
  273. // GetFTPHelper gets the signature and name of the ftp helper app.
  274. // Either parameter can be nil if the result isn't desired.
  275. OSErr HXInternetConfigMac::GetFTPHelper(OSType *signature, StringPtr helperName)
  276. {
  277. OSStatus status;
  278. if (!StartUsingIC()) return icInternalErr;
  279. long  dataSize;
  280. ICAppSpec targetSpec;
  281. ICAttr icAttr;
  282. // construct our key string for getting the ftp helper by concatenating
  283. // ftp to the standard pascal helper prefix
  284. #define kICHelperFTP kICHelper "ftp"
  285. dataSize = sizeof(ICAppSpec);
  286. // get the preference information for the ftp helper
  287. status = ICGetPref(m_icInstance,  kICHelperFTP, &icAttr, (Ptr) &targetSpec, &dataSize);
  288. if (status == noErr)
  289. {
  290. if (signature) *signature = targetSpec.fCreator;
  291. if (helperName) CopyPString(targetSpec.name, helperName);
  292. }
  293. StopUsingIC();
  294. return (OSErr) status;
  295. }
  296. // GetHTTPHelper gets the signature and name of the http helper app.
  297. // Either parameter can be nil if the result isn't desired.
  298. OSErr HXInternetConfigMac::GetHTTPHelper(OSType *signature, StringPtr helperName)
  299. {
  300. OSStatus status;
  301. if (!StartUsingIC()) return icInternalErr;
  302. long  dataSize;
  303. ICAppSpec targetSpec;
  304. ICAttr icAttr;
  305. // construct our key string for getting the ftp helper by concatenating
  306. // ftp to the standard pascal helper prefix
  307. #define kICHelperHTTP kICHelper "http"
  308. dataSize = sizeof(ICAppSpec);
  309. // get the preference information for the ftp helper
  310. status = ICGetPref(m_icInstance,  kICHelperHTTP, &icAttr, (Ptr) &targetSpec, &dataSize);
  311. if (status == noErr)
  312. {
  313. if (signature) *signature = targetSpec.fCreator;
  314. if (helperName) CopyPString(targetSpec.name, helperName);
  315. }
  316. StopUsingIC();
  317. return (OSErr) status;
  318. }
  319. // GetEmailAddress returns user's email address
  320. // returns FALSE if not found.
  321. BOOL HXInternetConfigMac::GetEmailAddress(CHXString& strEmail)
  322. {
  323. return GetICPreferenceString(kICEmail, strEmail);
  324. }
  325. // GetICPreferenceBoolean gets an IC preference that is a simple string
  326. // returns FALSE if not found
  327. // keys are in InternetConfig.h
  328. BOOL HXInternetConfigMac::GetICPreferenceBoolean( ConstStr255Param keyPascalString, BOOL& outBool )
  329. {
  330. OSStatus status;
  331. BOOL bSuccess = FALSE;
  332. outBool = FALSE;
  333. if (StartUsingIC())
  334. {
  335.      long  dataSize = sizeof(Boolean);
  336.      ICAttr icAttr;
  337. Boolean icBool;
  338. status = ICGetPref(m_icInstance, keyPascalString, &icAttr, (char*) &icBool, &dataSize);
  339. bSuccess = (status == noErr && dataSize == sizeof(Boolean));
  340. if (bSuccess)
  341. {
  342. outBool = (icBool ? TRUE : FALSE);
  343. }
  344. StopUsingIC();
  345. }
  346. return bSuccess;
  347. }
  348. // GetICPreference gets an IC preference that is a simple string
  349. // returns FALSE if not found
  350. // keys are in InternetConfig.h
  351. BOOL HXInternetConfigMac::GetICPreferenceString(ConstStr255Param keyPascalString, CHXString& strResult)
  352. {
  353. OSStatus status;
  354. BOOL bSuccess = FALSE;
  355. strResult.Empty();
  356. if (StartUsingIC())
  357. {
  358.      long  textSize = 255;
  359. ICAttr icAttr;
  360. Str255 bufferStr;
  361. status = ICGetPref(m_icInstance, keyPascalString, &icAttr, (char*) bufferStr, &textSize);
  362. bSuccess = (status == noErr && textSize <= 255);
  363. if (bSuccess)
  364. {
  365. strResult.SetFromStr255(bufferStr);
  366. }
  367. StopUsingIC();
  368. }
  369. return bSuccess;
  370. }
  371. // GetICPreferenceStringList returns a STR#-style IC preference
  372. // returns FALSE if not found
  373. // keys are in InternetConfig.h
  374. // the list is returns with items separated by the outputSeparator character
  375. BOOL HXInternetConfigMac::GetICPreferenceStringList(ConstStr255Param keyPascalString, char outputSeparator, CHXString& strResult)
  376. {
  377. OSStatus status;
  378. BOOL bSuccess = FALSE;
  379. strResult.Empty();
  380. if (StartUsingIC())
  381. {
  382. const int kBuffSize = 1024;
  383.      long  dataSize = kBuffSize;
  384. ICAttr icAttr;
  385. char buffer[kBuffSize]; /* Flawfinder: ignore */
  386. status = ICGetPref(m_icInstance, keyPascalString, &icAttr, (char*) buffer, &dataSize);
  387. bSuccess = (status == noErr && dataSize <= kBuffSize && dataSize >= sizeof(short));
  388. if (bSuccess)
  389. {
  390. // buffer is a short number of strings, followed by Pascal strings
  391. //
  392. // combine them into the output CHXString, separated by outputSeparator characters
  393. short numItems = *(short *) buffer;
  394. StringPtr pCurrentStr = (StringPtr) &buffer[2];
  395. CHXString strTemp;
  396. for (int idx = 0; idx < numItems; idx++)
  397. {
  398. strTemp.SetFromStr255(pCurrentStr);
  399. if ((!strTemp.IsEmpty()) && (!strResult.IsEmpty()))
  400. {
  401. strResult += outputSeparator;
  402. }
  403. strResult += strTemp;
  404. pCurrentStr += (1 + pCurrentStr[0]);
  405. }
  406. }
  407. StopUsingIC();
  408. }
  409. return bSuccess;
  410. }
  411. // SetProtocol 
  412. const unsigned char kHelper[] = kICHelper; // "pHelper