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

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 "hxstrutl.h"
  37. #include "hxxfile.h"
  38. #include "hlxclib/string.h"
  39. #include "hlxclib/limits.h"
  40. #include <ctype.h>
  41. #include "hxheap.h"
  42. #ifdef _DEBUG
  43. #undef HX_THIS_FILE
  44. static const char HX_THIS_FILE[] = __FILE__;
  45. #endif
  46. #if defined(_MAC_UNIX) || defined(_CARBON)
  47. #include "platform/mac/fullpathname.h"
  48. #include "filespecutils.h" // for an assert in GetReasonableLocalFileName
  49. #endif
  50. #if defined _UNIX && !defined __QNXNTO__
  51. void strlwr(char*);
  52. #endif
  53. /////////////////////////////////////////////////////////////////////////////
  54. //
  55. // Method:
  56. //
  57. // GetReasonableLocalFileName()
  58. //
  59. // Purpose:
  60. //
  61. // Converts some file URLs to reasonable file names.
  62. //
  63. // Parameters:
  64. //
  65. // CHXString& fileName
  66. // File reference or URL to convert to reasonable local file name.
  67. //
  68. // Return:
  69. //
  70. // None.
  71. //
  72. void HXXFile::GetReasonableLocalFileName(CHXString& fileName)
  73. {
  74. #if defined(_MAC_UNIX) || defined(_CARBON)
  75. #ifdef _DEBUG
  76. CHXString debugSaveURL = (const char*) fileName;
  77. #endif
  78. (void) PathFromURL(fileName, fileName);
  79. #ifdef _DEBUG
  80. if (!CHXFileSpecUtils::FileExists(fileName))
  81. {
  82. CHXString msg;
  83. msg.Format("GetReasonableLocalFileName is returning invalid path '%s' given URL '%s'",
  84.  (const char*) fileName, (const char*) debugSaveURL);
  85. CFStringRef ref = CFStringCreateWithCString(nil, (const char*)msg, kCFStringEncodingUTF8);
  86. CFShowStr(ref);
  87. CFRelease(ref);
  88. }
  89. #endif // _DEBUG
  90. return;
  91. #endif
  92. // Trim off any leading and trailing spaces... 
  93. // Oooh... those pesky QA folks!
  94. fileName.TrimLeft();
  95. fileName.TrimRight();
  96. char szProtocol[6]; /* Flawfinder: ignore */
  97. strncpy(szProtocol,(const char*)fileName,5); /* Flawfinder: ignore */
  98. szProtocol[5] = '';
  99. strlwr(szProtocol);
  100. if (strncasecmp(szProtocol,"file:",5) == 0)
  101. {
  102. fileName = fileName.Mid(5);
  103. // Get this, sometimes, Netscape actually puts three whacks!
  104. // now that's whacky. <g>
  105. // That's because the third one is the leading slash on
  106. // an absolute path, don't strip the damn thing off!
  107. #if !defined(_UNIX) && !defined(_OPENWAVE)
  108. // This first case looks for 4 whacks meaning it is a UNC path on Windows should fail on Mac and UNIX
  109. if (fileName.Left(4) == "////")
  110. {
  111. fileName = fileName.Mid(2);
  112. }
  113. // This case occurs if the drive letter is present such as file:///G|/windows/test.rm
  114. else if (fileName.Left(3) == "///")
  115. {
  116. fileName = fileName.Mid(3);
  117. }
  118. // trim off those damn double whacks as well
  119. else 
  120. #endif
  121.     if (fileName.Left(2) == "//")
  122. {
  123. fileName = fileName.Mid(2);
  124. }
  125. }
  126. //////////////////////////////////////////////////////
  127. // Replace all directory markers with correct platform
  128. // specific directory markers!
  129. //
  130. #if defined (_MACINTOSH) || defined (_WINDOWS)
  131. int nFoundAt = 0;
  132. do
  133. {
  134. nFoundAt = fileName.Find('/');
  135. if (nFoundAt != -1)
  136. {
  137. #ifdef _MACINTOSH
  138. fileName.SetAt(nFoundAt,':');
  139. #else
  140. fileName.SetAt(nFoundAt,'\');
  141. #endif
  142. }
  143. }
  144. while(nFoundAt != -1);
  145. #endif
  146. #if defined (_UNIX)
  147. int nFoundAt = 0;
  148. do
  149. {
  150. nFoundAt = fileName.Find('\');
  151. if (nFoundAt != -1)
  152. {
  153. fileName.SetAt(nFoundAt,'/');
  154. }
  155. }
  156. while(nFoundAt != -1);
  157. #endif
  158. //////////////////////////////////////////////////////
  159. // Replace all drive markers with correct platform
  160. // specific drive markers!
  161. //
  162. #if defined (_WINDOWS)
  163. nFoundAt = 0;
  164. do
  165. {
  166. nFoundAt = fileName.Find('|');
  167. if (nFoundAt != -1)
  168. {
  169. fileName.SetAt(nFoundAt,':');
  170. }
  171. }
  172. while(nFoundAt != -1);
  173. #endif
  174. }
  175. BOOL HXXFile::IsPlusURL(const char* pURL)
  176. {
  177.     CHXString strURL = pURL;
  178.     
  179.     // quick short-circuit: if there's no +, it's not a plus URL
  180.     if (-1 == strURL.Find('+')) return FALSE;
  181.     int nSep = 0;
  182.     CHXString strFileName;
  183.     // trim off the options from the URL
  184.     nSep = strURL.ReverseFind('?');
  185.     if (nSep >= 0)
  186.     {
  187. strURL = strURL.Left(nSep);
  188.     }
  189.     GetReasonableLocalFileName(strURL);
  190.     // trim off relative path if there is
  191. #if defined (_MACINTOSH)
  192.     nSep = strURL.ReverseFind(':');    
  193. #elif defined (_WINDOWS)
  194.     nSep = strURL.ReverseFind('\');
  195. #else
  196.     nSep = strURL.ReverseFind('/');
  197. #endif
  198.     strFileName = strURL.Right(strURL.GetLength() - nSep - 1);
  199.     // if the '+' is after the '.', then we say this is a plus URL
  200.     int nPlusSign = strFileName.ReverseFind('+');
  201.     if (nPlusSign >= 0 && nPlusSign > strFileName.Find('.'))
  202.     {
  203. return TRUE;
  204.     }
  205.     return FALSE;
  206. }
  207. ULONG32 HXXFile::GetFileLength(FILE* in)
  208. {
  209. #ifdef _OPENWAVE
  210.     HX_ASSERT(!"HXXFile::GetFileLength() not implemented!");
  211.     return 0;
  212. #else
  213. ULONG32 was;
  214. ULONG32 length;
  215. was = ftell(in);
  216. fseek(in, 0, 2);
  217. length = ftell(in);
  218. fseek(in, was, 0);
  219. return length;
  220. #endif /* _OPENWAVE */
  221. }
  222. BOOL HXXFile::FindAndReplaceInFile
  223. (
  224. CHXString& fileNameIn, 
  225. CHXString&  fileNameOut, 
  226. const char* pFind,
  227. const char* pReplace
  228. )
  229. {
  230. #ifdef _OPENWAVE
  231.     HX_ASSERT(!"HXXFile::FindAndReplaceInFile() not implemented!");
  232.     return FALSE;
  233. #else
  234. CHXString strFileContents;
  235. char* pFileContents = NULL;
  236. FILE* fileIn = NULL;
  237. FILE* fileOut = NULL;
  238. BOOL bTheResult = FALSE;
  239. ULONG32  length = 0;
  240. GetReasonableLocalFileName(fileNameIn);
  241. GetReasonableLocalFileName(fileNameOut);
  242. // First read the entire file in...
  243. fileIn=fopen(fileNameIn,"rb");
  244. if (fileIn==NULL) goto CleanUp;
  245. // determine the file length
  246. length = GetFileLength(fileIn);
  247. HX_ASSERT(length < INT_MAX);
  248. // get a buffer large enough for a zero terminated string.
  249. pFileContents = strFileContents.GetBuffer((int)(length+1));
  250. if (!pFileContents) goto CleanUp;
  251. // actually read the file in...
  252. fread(pFileContents,1,(int)length,fileIn);
  253. // set last byte to 0 as not to leave trailing characters at the end.
  254. pFileContents[length]=0;
  255. // We're done with the static buffer...
  256. strFileContents.ReleaseBuffer();
  257. // Actually let CHXString do all the work...
  258. strFileContents.FindAndReplace(pFind,pReplace);
  259. // After replacing the string, write the entire file out...
  260. fileOut=fopen(fileNameOut,"wb");
  261. if (fileOut==NULL) goto CleanUp;
  262. fwrite((const char *)strFileContents,1,strFileContents.GetLength(),fileOut);
  263. // If we made it this far then we are cool!
  264. bTheResult = TRUE;
  265. CleanUp:
  266. if (fileIn != NULL) fclose(fileIn);
  267. if (fileOut != NULL) fclose(fileOut);
  268. return(bTheResult);
  269. #endif /* _OPENWAVE */
  270. }
  271. void HXXFile::ExtractFileAndPath(const char* pFullPath, char* pFileName, UINT32 ulFileNameBufLen,
  272.                                  char* pPath, UINT32 ulPathBufLen)
  273. {
  274. #ifdef _MACINTOSH
  275. UCHAR delim = ':';
  276. #elif defined(_WINDOWS)
  277. UCHAR delim = '\';
  278. #else
  279. UCHAR delim = '/';
  280. #endif
  281. CHXString strPath = pFullPath;
  282. CHXString strFile;
  283. int nEndOfPath = strPath.ReverseFind(delim);
  284. if (nEndOfPath != -1)
  285. {
  286. strFile = strPath.Mid(nEndOfPath+1);
  287. #ifndef _MACINTOSH
  288. strPath = strPath.Left(nEndOfPath);
  289. #else
  290. // on the Mac, let's have the : at the end to ensure
  291. // it's taken as a directory (otherwise a hard drive name,
  292. // with no colon, becomes a relative path)
  293. strPath = strPath.Left(nEndOfPath+1);
  294. #endif
  295. }
  296. SafeStrCpy(pPath,strPath, ulPathBufLen);
  297. SafeStrCpy(pFileName,strFile, ulFileNameBufLen);
  298. }
  299. /////////////////////////////////////////////////////////////////////////////
  300. //
  301. // Method:
  302. //
  303. // ConvertHexCodesToChars()
  304. //
  305. // Purpose:
  306. //
  307. // Converts a string containing %XX hex character codes into.
  308. // actual characters.  (For instance, "%20" will be changed to
  309. // " ".)  This is useful for URLs that contain non-alphanumeric
  310. // characters that have been converted to hex-codes.
  311. //
  312. // Parameters:
  313. //
  314. // CHXString& fileName
  315. // File reference or URL to convert.
  316. //
  317. // Return:
  318. //
  319. // BOOL - true if successful, false if bad input or out of mem.
  320. //
  321. BOOL HXXFile::ConvertHexCodesToChars(CHXString& fileName)
  322. {
  323. char*  c  = NULL;
  324.         char*   cBase   = NULL;
  325. char*  pTemp = NULL;
  326. char* pStop = NULL;
  327. BOOL  bOk  = FALSE;
  328. long  lVal = 0;
  329. int  nLen  = 0;
  330. char hex[3]; /* Flawfinder: ignore */
  331.  
  332. fileName.TrimLeft();
  333. fileName.TrimRight();
  334. // for doing string copies
  335. nLen = fileName.GetLength();
  336. pTemp = new char[nLen];
  337. if (!pTemp)
  338. {
  339. return FALSE;
  340. }
  341. cBase = c = fileName.GetBuffer(0);
  342. if (!c)
  343. {
  344. goto cleanup;
  345. }
  346. // init our temp array used for hex conversions
  347. memset(hex, 0, sizeof(char) * 3);
  348. // look for the first hex code
  349. c = strchr(c, '%');
  350. while (c)
  351. {
  352. // make sure we have enough buffer
  353. if (c[1] && c[2])
  354. {
  355. if (isxdigit(c[1]) && isxdigit(c[2]))
  356. {
  357. // hex convert two digits
  358. strncpy(hex, &(c[1]), 2); /* Flawfinder: ignore */
  359. lVal = strtol(hex, &pStop, 16);
  360. // replace the '%' with the actual char, then
  361. // shift the array down
  362. c[0] = (char)(lVal & 0xFF);
  363. SafeStrCpy(pTemp, &(c[3]), nLen);
  364. SafeStrCpy(&c[1], pTemp, nLen - (c+1-cBase));
  365. }
  366. }
  367. else
  368. {
  369. // out of chars, so quit
  370. break;
  371. }
  372. c++;
  373. c = strchr(c, '%');
  374. }
  375. cleanup:
  376. fileName.ReleaseBuffer();
  377. if (pTemp)
  378. {
  379. HX_VECTOR_DELETE(pTemp);
  380. }
  381. return bOk;
  382. }