filespecutils.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 "filespecutils.h"
  36. #include "hxtick.h"
  37. #include "hxrand.h"
  38. #include "dbcs.h"
  39. #define NFS_SUPER_MAGIC 0x6969
  40. #define SMB_SUPER_MAGIC 0x517B
  41. //////////////////////////////////////////////////////////
  42. //
  43. // Utility base class -- CHXFileSpecUtils
  44. //
  45. //////////////////////////////////////////////////////////
  46. //******************************************************************************
  47. //#if defined(_FREEBSD) || defined (_OSF1)
  48. //#include <sys/mount.h>
  49. //#else
  50. //#include <sys/vfs.h>
  51. //#endif
  52. #include "op_fs.h"
  53. #include <sys/stat.h>
  54. //#include <dirent.h>
  55. #include <sys/types.h>
  56. #define ONEGIG (1<<30)
  57. #define STATFS_PATH_TYPE const char*
  58. #define HXStatfsStruct        struct OpFsStatStruct
  59. #define HXStatfs(path,sf)     OpFsStat((STATFS_PATH_TYPE)(path),(sf))
  60. HX_RESULT CHXFileSpecUtils::GetFreeSpaceOnDisk(const CHXDirSpecifier& volSpec, INT64& freeSpace)
  61. {
  62.     HX_RESULT result = HXR_NOTIMPL;
  63.     const char *szPath = volSpec.GetPathName();
  64.     
  65.     HXStatfsStruct sf;
  66.     if (kOpFsErrAny != HXStatfs(szPath, &sf))
  67.     {
  68.     freeSpace = (UINT64)sf.size;
  69.         result = HXR_OK;
  70.     }
  71.     else
  72.     {
  73. perror("statfs");
  74. freeSpace = ONEGIG; 
  75.     }
  76.     return result;
  77. }
  78. //******************************************************************************
  79. HX_RESULT CHXFileSpecUtils::GetTotalSpaceOnDisk(const CHXDirSpecifier& volSpec, 
  80. INT64& totalSpace)
  81.     HX_RESULT result = HXR_NOTIMPL;
  82.     const char *szPath = volSpec.GetPathName();
  83.     
  84.     HXStatfsStruct sf;
  85.     if (kOpFsErrAny != HXStatfs(szPath, &sf))
  86.     {
  87.         totalSpace = (UINT64)sf.size;
  88.         result = HXR_OK;
  89.     }
  90.     else
  91.     {
  92. perror("statfs");
  93. totalSpace = ONEGIG; 
  94.     }
  95.     return result;
  96. }
  97. //******************************************************************************
  98. BOOL CHXFileSpecUtils::IsDiskEjectable(const CHXDirSpecifier& volSpec)
  99. {
  100.     return FALSE;
  101. }
  102. // IsLocal returns TRUE if the file or directory is on a local volume
  103. // (not on a server)
  104. //******************************************************************************
  105. /* Include correct headers to get more fs types below... */
  106. BOOL CHXFileSpecUtils::IsDiskLocal(const CHXDirSpecifier& volSpec)
  107. {
  108.     return TRUE;
  109. }
  110. // file/dir utilities
  111. //******************************************************************** **********
  112. HX_RESULT CHXFileSpecUtils::RemoveDir(const CHXDirSpecifier& dirSpec)
  113. {
  114.     return HXR_NOTIMPL;
  115. };
  116. //******************************************************************** **********
  117. HX_RESULT CHXFileSpecUtils::RemoveFile(const CHXFileSpecifier& fileSpec)
  118. {
  119.     if (kOpFsErrAny != OpFsRemove(fileSpec.GetPathName()))
  120.     {
  121.         return HXR_OK;
  122.     }
  123.     return HXR_FAILED;
  124. };
  125. //******************************************************************************
  126. HX_RESULT CHXFileSpecUtils::GetFileSize(const CHXFileSpecifier& fileSpec, INT64& fSize)
  127. {
  128.     HX_RESULT result = HXR_FAIL;
  129.  
  130.     HXStatfsStruct sf;
  131.     if (kOpFsErrAny != HXStatfs(fileSpec.GetPathName(), &sf))
  132.     {
  133.         fSize = sf.size;
  134.         result = HXR_OK;
  135.     }
  136.     return result;
  137. }
  138. //******************************************************************************
  139. HX_RESULT CHXFileSpecUtils::GetDirectorySize(const CHXDirSpecifier& dirSpec, BOOL shouldDescend, INT64& fSize)
  140. {
  141. return HXR_NOTIMPL;
  142. }
  143. //******************************************************************************
  144. CHXFileSpecifier CHXFileSpecUtils::GetCurrentApplication(void)
  145. {
  146.     /* AFAIK there is no way to implement this.  Prove me wrong */
  147.     CHXFileSpecifier spec;
  148.     return spec;
  149. }
  150. //******************************************************************************
  151. CHXDirSpecifier CHXFileSpecUtils::GetCurrentApplicationDir(void)
  152. {
  153.     /* AFAIK there is no way to implement this.  Prove me wrong */
  154.     CHXDirSpecifier  dirSpec;
  155.     return dirSpec;
  156. }
  157. //******************************************************************************
  158. BOOL CHXFileSpecUtils::FileExists(const CHXFileSpecifier& fileSpec)
  159. {
  160.     BOOL result = FALSE;
  161.  
  162. HXStatfsStruct sf;
  163.     if (kOpFsErrAny != HXStatfs(fileSpec.GetPathName(), &sf))
  164. {
  165.        result = TRUE;
  166.     }
  167.     return result;
  168. }
  169. //******************************************************************************
  170. BOOL CHXFileSpecUtils::DirectoryExists(const CHXDirSpecifier& dirSpec)
  171. {
  172.     BOOL result = FALSE;
  173.  
  174. HXStatfsStruct sf;
  175.     if (kOpFsErrAny != HXStatfs(dirSpec.GetPathName(), &sf))
  176. {
  177.        result = TRUE;
  178.     }
  179.     return result;
  180. }
  181. //******************************************************************************
  182. HX_RESULT CHXFileSpecUtils::CreateDir(const CHXDirSpecifier& dirSpec)
  183. {        
  184. return HXR_NOTIMPL;;
  185. }
  186. //******************************************************************************
  187. static CHXFileSpecifier GetUniqueFileSpecInternal(const CHXDirSpecifier& locationSpec, 
  188. const char *pszNameFirst, const char *pszTemplate, 
  189. const char *pszWildcard, UINT32 nStartNum);
  190. const UINT32 kNumWrapValue = 9999+1; // limit insertions to 4-digit numbers
  191. CHXFileSpecifier CHXFileSpecUtils::GetUniqueFileSpec(const CHXDirSpecifier& locationSpec, 
  192. const char *pszNameFirst, const char *pszTemplate, 
  193. const char *pszWildcard)
  194. {
  195. return GetUniqueFileSpecInternal(locationSpec, pszNameFirst, pszTemplate, pszWildcard, 0);
  196. }
  197. CHXFileSpecifier CHXFileSpecUtils::GetUniqueTempFileSpec(const CHXDirSpecifier& locationSpec, 
  198. const char *pszTemplate, const char *pszWildcard)
  199. {
  200. CMultiplePrimeRandom  rand(HX_GET_TICKCOUNT());
  201. UINT32 num;
  202. num = rand.GetRandomNumber();
  203. num %= kNumWrapValue;
  204. if (num == 0 || num == 1) num = 2;
  205. return GetUniqueFileSpecInternal(locationSpec, NULL, pszTemplate, pszWildcard, num);
  206. }
  207. static CHXFileSpecifier GetUniqueFileSpecInternal(const CHXDirSpecifier& locationSpec, 
  208.                                                   const char *pszNameFirst, const char *pszTemplate, 
  209.                                                   const char *pszWildcard, UINT32 nStartNum)
  210. {
  211.     CHXFileSpecifier  resultFileSpec;
  212.     require_return(locationSpec.IsSet(), resultFileSpec);
  213.     require_return(pszTemplate != NULL && pszWildcard != NULL, resultFileSpec);
  214.     require_return(pszNameFirst != NULL || nStartNum != 0, resultFileSpec);
  215.     CHXFileSpecifier  testFileSpec;
  216.     CHXDirSpecifier  testDirSpec;
  217.     CHXString strNumber;
  218.     CHXString strName;
  219.     UINT32 nCurrentNum;
  220.     nCurrentNum = nStartNum;
  221.     while (1) 
  222.     {
  223.         // if the number is non-zero, make a string from the template;
  224.         // if the number is zero, user the initial name string
  225.         if (nCurrentNum == 0)
  226.         {
  227.             // replace the wildcard in the template with the number string
  228.             strName = pszNameFirst;
  229.         }
  230.         else
  231.         {
  232.             // replace the wildcard in the template with the number string
  233.             strNumber.Empty();
  234.             strNumber.AppendULONG(nCurrentNum);
  235.             strName = pszTemplate;
  236.             strName.FindAndReplace(pszWildcard, strNumber); // replace first wildcard with number string
  237.         }
  238.         // test if a file or directory exists with that name
  239.         testFileSpec = locationSpec.SpecifyChildFile(strName);
  240.         testDirSpec = locationSpec.SpecifyChildDirectory(strName);
  241.         if (CHXFileSpecUtils::FileExists(testFileSpec)
  242.             || CHXFileSpecUtils::DirectoryExists(testDirSpec))
  243.         {
  244.             // an item already has that name, so increment & wrap the number
  245.             nCurrentNum++;
  246.             nCurrentNum %= kNumWrapValue;
  247.             // don't use 0 again, and skip 1 since "MyFile2.txt" logically follows "MyFile.txt"
  248.             if (nCurrentNum == 0 || nCurrentNum == 1) 
  249.             {
  250.                 nCurrentNum = 2; 
  251.             }
  252.             // a quick sanity check
  253.             if (nCurrentNum == nStartNum)
  254.             {
  255.                 check(!"GetUniqueFileSpecInternal number wrapped");
  256.                 break;
  257.             }
  258.         }
  259.         else
  260.         {
  261.             // the name is unique
  262.             resultFileSpec = testFileSpec;
  263.             break;
  264.         }
  265.     } // while
  266.     return resultFileSpec;
  267. }
  268. //******************************************************************************
  269. CHXDirSpecifier CHXFileSpecUtils::GetSystemTempDirectory()
  270. {
  271.     return CHXDirSpecifier(getenv("TMPDIR") ? getenv("TMPDIR") : "/tmp");
  272. }
  273. BOOL CHXFileSpecUtils::MakeNameLegal(char *pszName)
  274. {
  275.     const char *badChars = "\/:*?"<>| ][()'";
  276.     const char replacementChar = '_';
  277.     const long maxNameLength = 255;
  278.     char *pCurrChar = pszName;
  279.     
  280.     BOOL bChanged;
  281.     
  282.     require_nonnull_return(pszName, FALSE);
  283.     
  284.     bChanged = FALSE;
  285.     
  286.     // replace any illegal characters
  287.     while (*pCurrChar)
  288.     {
  289.         if (strchr(badChars, *pCurrChar))
  290.         {
  291.             *pCurrChar = replacementChar;
  292.             bChanged = TRUE;
  293.         }
  294.         pCurrChar = HXGetNextChar(pCurrChar);
  295.         
  296.         // be sure the name isn't too long
  297.         if (pCurrChar - pszName >= maxNameLength)
  298.         {
  299.             if (pCurrChar - pszName >= maxNameLength + 1)
  300.                 pCurrChar = HXGetPrevChar(pszName, pCurrChar);
  301.             *pCurrChar = 0;
  302.             bChanged = TRUE;
  303.         }
  304.     }
  305.     
  306.     return bChanged;
  307. }
  308. //******************************************************************************
  309. CHXDirSpecifier 
  310. CHXFileSpecUtils::GetAppDataDir(const char* szAppName)
  311. {
  312.     return CHXDirSpecifier("/huh");
  313. }