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

Symbian

开发平台:

Visual C++

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