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

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 <sys/stat.h>
  36. #include <errno.h>
  37. #if defined (_SOLARIS) || defined (_FREEBSD) || defined (_OPENBSD) || defined (_NETBSD)
  38. #include <dirent.h>
  39. #elif defined (__hpux)
  40. #include <sys/dirent.h>
  41. #else
  42. #include <sys/dir.h>
  43. #endif
  44. #ifdef _BEOS
  45. #include <fcntl.h>
  46. #endif
  47. #include "findfile.h"
  48. #include "hxdir.h"
  49. #include "hxstrutl.h"
  50. #include "hxheap.h"
  51. #ifdef _DEBUG
  52. #undef HX_THIS_FILE
  53. static const char HX_THIS_FILE[] = __FILE__;
  54. #endif
  55. CHXDirectory::CHXDirectory()
  56.     : m_pFileFinder(NULL)
  57. {
  58. }
  59. CHXDirectory::~CHXDirectory()
  60. {
  61.     HX_DELETE(m_pFileFinder);
  62. }
  63. // Locate a writable spot for a temp directory.
  64. // This is done by checking a number of possible locations
  65. // in the following order of preference:
  66. //
  67. // 1) the current working directory
  68. // 2) "/tmp"
  69. static BOOL
  70. isWritable(const char* szPath)
  71. {
  72.     struct stat statbuf;
  73.     stat(szPath, &statbuf);
  74.     if ((statbuf.st_mode & S_IWRITE) != 0)
  75.         return TRUE;
  76.     else
  77. return FALSE;
  78. }
  79. BOOL
  80. CHXDirectory::SetTempPath(HXXHANDLE /* hpsHandle */, const char* szRelPath)
  81. {
  82.     // caller must specify a sub-directory
  83.     if (szRelPath == NULL || szRelPath[0] == '') return FALSE;
  84.     m_strPath.Empty();
  85.     // try current working directory
  86.     if (!SetCurrentDir() || !isWritable(m_strPath))
  87.     {
  88. // go with /tmp
  89. m_strPath = "/tmp";
  90. if (!isWritable(m_strPath)) return FALSE;
  91.     }
  92.     
  93.     // now append the sub-directory, separating if necessary
  94.     if (m_strPath.Right(1) != OS_SEPARATOR_STRING && szRelPath[0] != OS_SEPARATOR_CHAR)
  95.     {
  96. m_strPath += OS_SEPARATOR_STRING;
  97.     }
  98.     m_strPath += szRelPath;
  99.     return TRUE;
  100. }
  101. /* Creates directory. */
  102. BOOL 
  103. CHXDirectory::Create()
  104. {
  105.     mkdir((const char*)m_strPath, 0755);
  106.     return IsValid();
  107. }
  108. /* Checks if directory exists. */    
  109. BOOL 
  110. CHXDirectory::IsValid()
  111. {
  112.     DIR* pDir = NULL;
  113.     if(m_strPath.IsEmpty())
  114.         return FALSE;
  115.     pDir = opendir(m_strPath);
  116.     if (pDir)
  117.     {
  118. closedir(pDir);
  119. return TRUE;
  120.     }
  121.     return FALSE;
  122. }
  123. /* Deletes empty directory. */
  124. BOOL 
  125. CHXDirectory::DeleteDirectory()
  126. {
  127.     if(!rmdir(m_strPath))
  128.         return TRUE;
  129.     return FALSE;
  130. }
  131. /* Starts enumeration process. */
  132. CHXDirectory::FSOBJ 
  133. CHXDirectory::FindFirst(const char* szPattern, char* szPath, UINT16 nSize)
  134. {
  135.     FSOBJ RetVal = FSOBJ_NOTVALID;
  136.     char* szMatch = NULL;
  137.     char* szMatchPath = NULL;
  138.     BOOL  bDone = FALSE;
  139.     struct stat statbuf;
  140.     // Find the first file that matches the specified pattern
  141.     HX_DELETE(m_pFileFinder); 
  142.     m_pFileFinder = CFindFile::CreateFindFile(m_strPath, 0, szPattern);
  143.     if (!m_pFileFinder)
  144.     {
  145. return RetVal;
  146.     }
  147.     szMatch = m_pFileFinder->FindFirst();
  148.     while (szMatch && !bDone)
  149.     {
  150. szMatchPath = m_pFileFinder->GetCurFilePath();
  151. if (lstat(szMatchPath, &statbuf) < 0)
  152. {
  153.     return RetVal;
  154. }
  155. if (S_ISDIR(statbuf.st_mode) != 0 && IsValidFileDirName(szMatch))
  156. {
  157.     RetVal = FSOBJ_DIRECTORY;
  158.     bDone = TRUE;
  159. }
  160. else if (IsValidFileDirName(szMatch))
  161. {
  162.     RetVal = FSOBJ_FILE;
  163.     bDone = TRUE;
  164. }
  165. else
  166. {
  167.     // If we couldn't use this one, find another
  168.     szMatch = m_pFileFinder->FindNext();
  169. }
  170. if (RetVal != FSOBJ_NOTVALID)
  171. {
  172.     SafeStrCpy(szPath, szMatchPath, nSize);
  173. }
  174.     }
  175.     return RetVal;
  176. }
  177. /* Continues enumeration process. */
  178. CHXDirectory::FSOBJ 
  179. CHXDirectory::FindNext(char* szPath, UINT16 nSize)
  180. {
  181.     FSOBJ RetVal = FSOBJ_NOTVALID;
  182.     char* szMatch = NULL;
  183.     char* szMatchPath = NULL;
  184.     BOOL  bDone = FALSE;
  185.     struct stat statbuf;
  186.     
  187.     szMatch = m_pFileFinder->FindNext();
  188.     while (szMatch && !bDone)
  189.     {
  190. szMatchPath = m_pFileFinder->GetCurFilePath();
  191. if (lstat(szMatchPath, &statbuf) < 0)
  192. {
  193.     return RetVal;
  194. }
  195. if (S_ISDIR(statbuf.st_mode) != 0 && IsValidFileDirName(szMatch))
  196. {
  197.     RetVal = FSOBJ_DIRECTORY;
  198.     bDone = TRUE;
  199. }
  200. else if (IsValidFileDirName(szMatch))
  201. {
  202.     RetVal = FSOBJ_FILE;
  203.     bDone = TRUE;
  204. }
  205. else
  206. {
  207.     // If we couldn't use this one, find another
  208.     szMatch = m_pFileFinder->FindNext();
  209. }
  210. if (RetVal != FSOBJ_NOTVALID)
  211. {
  212.     SafeStrCpy(szPath, szMatchPath, nSize);
  213. }
  214.     }
  215.     return RetVal;
  216. }
  217. BOOL 
  218. CHXDirectory::DeleteFile(const char* szRelPath)
  219. {
  220.     BOOL RetVal = FALSE;
  221.     CHXString strPath;
  222.     if(!szRelPath)
  223.         return FALSE;
  224.     strPath = szRelPath;
  225.     chmod((const char*)strPath, S_IREAD | S_IWRITE);
  226.     if(!unlink((const char*)strPath) || errno != EACCES)
  227.         RetVal = TRUE;
  228.     return RetVal;
  229. }
  230. /* Sets itself to current directory. */
  231. BOOL 
  232. CHXDirectory::SetCurrentDir()
  233. {
  234.     BOOL bRetVal = TRUE;
  235.     if(!getcwd(m_strPath.GetBuffer(_MAX_PATH + 1), _MAX_PATH))
  236.         bRetVal = FALSE;
  237.     m_strPath.ReleaseBuffer();
  238.     return bRetVal;
  239. }
  240. /* Makes itself a current directory. */
  241. BOOL 
  242. CHXDirectory::MakeCurrentDir()
  243. {
  244.     if(!chdir((const char*)m_strPath))
  245.         return TRUE;
  246.     return FALSE;
  247. }
  248. UINT32 
  249. CHXDirectory::Rename(const char* szOldName, const char* szNewName)
  250. {
  251.     if ((szOldName == NULL) || (szNewName == NULL))
  252.     {
  253.         HX_ASSERT(FALSE);
  254.         return (UINT32)HXR_FAIL;
  255.     }
  256.     UINT32 theError = (UINT32)HXR_FAIL;
  257.     if(unlink(szNewName) == -1 && errno == EACCES)
  258.     {
  259.         chmod(szNewName, S_IREAD | S_IWRITE);
  260.         if(unlink(szNewName) == -1 && errno == EACCES)
  261.             return (UINT32)HXR_FAIL;                          
  262.         if(!rename(szOldName, szNewName))
  263.             theError = (UINT32)HXR_OK;
  264.         chmod(szNewName, S_IREAD);                  
  265.     }
  266.     else
  267.     {
  268.         if(!rename(szOldName, szNewName))
  269.             theError = (UINT32)HXR_OK;
  270.     }
  271.     return theError;
  272. }
  273. BOOL 
  274. CHXDirectory::IsValidFileDirName(const char* szPath)
  275. {
  276.     if(!strcmp(szPath, ".") || !strcmp(szPath, ".."))
  277.         return FALSE;
  278.     return TRUE;
  279. }