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

Symbian

开发平台:

Visual C++

  1. /************************************************************************
  2.  * chxavfilestore.h
  3.  * ----------------
  4.  *
  5.  * Synopsis:
  6.  * simple file system abstraction for manipulating files and folders;
  7.  * maintains 'root' (relative to true filesystem) 'current' folder
  8.  * state
  9.  *
  10.  * root path is stored in full form, e.g.: c:realmedia
  11.  * folder is stored in relative form, fully specified, e.g.:
  12.  *     = root
  13.  * music     = subfolder music
  14.  * 
  15.  * the term 'item' (as used in this class) refers to a file or folder
  16.  * that is in the current entry list; the entry list contains a list
  17.  * of files and folders within the current folder
  18.  *
  19.  * Target:
  20.  * Symbian OS
  21.  *
  22.  *
  23.  * (c) 1995-2003 RealNetworks, Inc. Patents pending. All rights reserved.
  24.  *
  25.  ************************************************************************/
  26. #ifndef _chxavfilestore_h_
  27. #define _chxavfilestore_h_
  28. // Symbian includes...
  29. #include <apgcli.h>
  30. #include <apmrec.h>
  31. // Helix includes...
  32. #include "unkimp.h"
  33. #include "ihxpckts.h"
  34. #include "hxstring.h"
  35. #include "hxurl.h"
  36. #include "hxwintyp.h"
  37. #include "hxcom.h"
  38. #include "hxcomm.h"
  39. #include "hxmon.h"
  40. #include "hxfiles.h"
  41. #include "hxcore.h"
  42. #include "hxwin.h"
  43. // Includes from this project...
  44. #include "chxavcompositecommand.h"
  45. #include "chxavfilesystemwatcher.h"
  46. #include "chxavfileutil.h"
  47. #include "chxavvector.h"
  48. #include "chxavactivecompletiondispatch.h"
  49. #include "chxsmartptr.h"
  50. #include "chxavcleanupstack.h"
  51. #include "chxavmisc.h"
  52. #include "chxbody.h"
  53. //#define ASYNC_COPYMOVE //not fully implemented
  54. // class FileStoreOperationObserver
  55. class FileStoreOperationObserver
  56. {
  57. public:
  58.     enum OperationType
  59.     {
  60.         otCopy,
  61.         otMove,
  62.         otWhoCares
  63.     };
  64.     //
  65.     // these are called on separate thread if async fileman operations are used
  66.     //
  67.     virtual void OnFileOpStart(OperationType type, const TDesC& source, const TDesC& target) = 0;
  68.     virtual bool OnFileOpTick(OperationType type, const TDesC& source, const TDesC& target, TInt64 cbCopied) = 0;
  69.     virtual void OnFileOpEnd(OperationType type, TInt err, const TDesC& source, const TDesC& target) = 0;
  70.     OperationType TranslateFileManAction(CFileMan::TAction action);
  71. };
  72. // forward decl
  73. class CFileMan;
  74. // class CHXAvFileStore
  75. class CHXAvFileStore
  76. : public CHXBody
  77. , public MFileManObserver
  78. , public FileStoreOperationObserver
  79. {
  80. public:
  81.     typedef CHXAvVector<CHXAvFile::FileInfo> Entries;
  82. public:
  83. // ctor and dtor
  84.     CHXAvFileStore();
  85.     virtual ~CHXAvFileStore();
  86.     void ConstructL(const TDesC& root, const TDesC& path = KPathSep,
  87.                     bool bAutoCreateRoot = false);
  88.     void SetObserver(FileStoreOperationObserver* pObserver);
  89. // handler for filesystem events
  90.     CHXAvCompositeCommand& GetEventHandler();
  91. // path set and get
  92.     void SetRootL(const TDesC& path, bool bAutoCreateRoot = false);
  93.     void SetCurrentPathL(const TDesC& path);
  94.     const TDesC& GetRoot() const;
  95.     const TDesC& GetCurrentPath() const;
  96.     const TDesC& GetFullPath() const;
  97. // current folder actions
  98.     void SwitchToParentFolderL();
  99.     void SwitchToChildFolderL(const TDesC& folder);
  100. // item actions
  101.     TInt CreateChildFolderL(const TDesC& folder, bool bAllowOverwrite);
  102.     TInt DeleteItemL(TInt idxItem);
  103.     TInt MoveItemL(TInt idxItem, 
  104. const TDesC& targetPath, 
  105. const TDesC& targetName,
  106. bool bAllowOverwrite, bool bRename = false);
  107.     TInt MoveItemL(TInt idxItem, const TDesC& newName, bool bAllowOverwrite, bool bRename = false);
  108. // file actions; paths may be relative (to store) or absolute
  109.     FILE* OpenFileL(const TDesC& path, 
  110. const TDesC& fileName, 
  111. const char* pMode);
  112.     TInt CopyFileL(const TDesC& pathDest, 
  113.     const TDesC& fileNameDest,
  114.     const TDesC& fullPathSource,
  115.     bool bAllowOverwrite); 
  116.     TInt CopyFileAlternateL(const TDesC& pathDest, 
  117.     const TDesC& fileNameDest,
  118.     const TDesC& fullPathSource,
  119.                     bool bAllowOverwrite);
  120.     TInt DeleteFileL(const TDesC& pathDest, const TDesC& name, CHXAvFile::NameType type = CHXAvFile::ntUnspecified);
  121.     TInt DeleteFileL(const TDesC& fullPath, CHXAvFile::NameType type = CHXAvFile::ntUnspecified);
  122. #if defined(ASYNC_COPYMOVE)
  123.     // cancel async file operation (move, copy)
  124.     void CancelAsyncFileOp();
  125. #endif
  126. // misc 
  127.     bool IsAtRoot() const;
  128.     bool IsUpToDate() const;
  129.     bool IsFolderEmpty() const;
  130.     TInt GetCurrentFolderFileCount() const;
  131.     
  132.     bool PathExistsL(const TDesC& targetPath, const TDesC& name, CHXAvFile::NameType type = CHXAvFile::ntUnspecified);
  133.     bool NameExistsInTargetPathL(const TDesC& targetPath, TInt idxItem, CHXAvFile::NameType type);
  134.     bool NameExistsInTargetPathL(const TDesC& targetPath, TInt idxItem);
  135.     bool NameExistsInTargetPathL(const TDesC& targetPath, const TDesC& name);
  136.     bool IsSafeFileNameLengthL(const TDesC& path, TInt idxItem);
  137.     bool IsSafeFileNameLengthL(const TDesC& path, const TDesC& name, CHXAvFile::NameType type = CHXAvFile::ntFile);
  138.     bool IsSamePathL(const TDesC& pathDest, TInt idxItem);
  139.     bool IsImmediateChild(const TDesC& fullPathChild);
  140.     bool IsParent(const TDesC& fullPathParent);
  141. // entries
  142.     void SetNeedsRefreshNextUpdate();
  143.     //const Entries& RemoveEntries(const CHXAvVector<TInt>& removeIndexes);
  144.     const Entries& UpdateEntriesL();
  145.     const Entries& GetEntries() const;
  146.     Entries CopyEntriesL() const;
  147.     
  148. // callback for filesystem watcher
  149.     void OnFileSystemEvent();
  150.     TFileName* AllocFullPathL(TInt idxItem);
  151.     TFileName* AllocFullPathL(const TDesC& path, const TDesC& name, CHXAvFile::NameType type = CHXAvFile::ntFile);
  152. public:
  153. // for use with SUSPEND_REFRESH macro
  154. class RefreshSuspenderL
  155. {
  156. public:
  157.     RefreshSuspenderL(CHXAvFileStore* pStore) 
  158.         : m_pStore(pStore)
  159.     { 
  160.         CleanupStack::PushL(TCleanupItem(CleanupSuspendRefresh, pStore));
  161.         m_pStore->SuspendRefresh(true);
  162.     }
  163.     ~RefreshSuspenderL()
  164.     {
  165.         m_pStore->SuspendRefresh(false);
  166.         CleanupStack::Pop();
  167.     }
  168. private:
  169.     CHXAvFileStore* m_pStore;
  170. }; //RefreshSuspenderL
  171. protected:
  172.     // for RefreshSuspenderL
  173.     friend class RefreshSuspenderL;
  174.     static void CleanupSuspendRefresh(TAny* p);
  175.     void SuspendRefresh(bool bSuspend);
  176. private:
  177. // MFileManObserver
  178.     TControl NotifyFileManStarted();
  179.     TControl NotifyFileManOperation();
  180.     TControl NotifyFileManEnded();
  181. // FileStoreOperationObserver
  182.     void OnFileOpStart(FileStoreOperationObserver::OperationType type, const TDesC& source, const TDesC& target);
  183.     bool OnFileOpTick(FileStoreOperationObserver::OperationType type, const TDesC& source, const TDesC& target, TInt64 cbCopied);
  184.     void OnFileOpEnd(FileStoreOperationObserver::OperationType type, TInt err, const TDesC& source, const TDesC& target);
  185. #if defined(ASYNC_COPYMOVE)
  186.     // active object for handling async CFileMan ops
  187.     void OnFileOpAsyncComplete(TInt status);
  188.     void OnFileOpAsyncCancel(TInt status);
  189. #endif
  190. // disallow copy
  191.     CHXAvFileStore& operator=(const CHXAvFileStore& other);
  192.     CHXAvFileStore(const CHXAvFileStore& other);
  193. //
  194. // implementation helpers
  195. //
  196.     const TDesC& UpdateFullPathL();
  197.     void RefreshEntryInfoL();
  198.     void RefreshEntryInfoHelper(const CDir* pFiles, bool bIncludeFolders);
  199.     
  200.     void EnsureEntryInfoIsUpToDate();
  201.     TFileName* AllocFullTargetPathL(const TDesC& targetPath, TInt idxItem, const TDesC& targetName = KNullDesC);
  202. private:
  203.      
  204.     CFileMan* m_pFileMan;
  205.     CHXAvVector<CHXAvFile::FileInfo> m_entryInfo;
  206.     TParse m_root;
  207.     TFileName m_curPath;
  208.     TFileName* m_pFullPath;
  209.     CHXAvFileSystemWatcher m_fsWatcher;
  210.     bool m_bNeedRefresh;
  211.     CHXAvCompositeCommand m_eventHandler;
  212.     RApaLsSession       m_apaLsSess;
  213.     TInt64              m_cbFileOp;
  214. #if defined(ASYNC_COPYMOVE)
  215.     CHXAvActiveCmplPtr       m_pFileOpCompletion;
  216. #endif
  217.     FileStoreOperationObserver* m_pObserver;
  218.     TInt m_suspendRefreshSem;
  219.     bool m_bHaveOutstandingFileSystemEvent;
  220. };
  221. // see SuspendRefresh()
  222. #define SUSPEND_REFRESH(p) CHXAvFileStore::RefreshSuspenderL makevar__(__LINE__) (p.raw_ptr());
  223. typedef CHXSmartPtr<CHXAvFileStore> CHXAvFileStorePtr;
  224. ////////////////////////////////////////////////////
  225. // force refresh next time entries are updated; theoretically
  226. // you should never need this because we watch the filesystem
  227. // for changes
  228. inline
  229. void CHXAvFileStore::SetNeedsRefreshNextUpdate()
  230. {
  231.     m_bNeedRefresh = true;
  232. }
  233. ////////////////////////////////////////////////////
  234. // return event handler object so handlers may be
  235. // added/removed
  236. inline
  237. CHXAvCompositeCommand& CHXAvFileStore::GetEventHandler()
  238. {
  239.     return m_eventHandler;
  240. }
  241. ////////////////////////////////////////////////////
  242. // true if showing contents for root level folder
  243. inline
  244. bool CHXAvFileStore::IsAtRoot() const
  245. {
  246.     return 0 == m_curPath.Compare(KPathSep);
  247. }
  248. ////////////////////////////////////////////////////////////
  249. // return true if current entries are out of date (or we can't be sure)
  250. inline
  251. bool CHXAvFileStore::IsUpToDate() const
  252. {
  253.     return !m_bNeedRefresh;
  254. ////////////////////////////////////////////////////////////
  255. // return true if the current folder is empty
  256. inline
  257. bool CHXAvFileStore::IsFolderEmpty() const
  258. {
  259.     return m_entryInfo.Nelements() == 0;
  260. }
  261. ////////////////////////////////////////////////////////////
  262. // return full path to current folder
  263. inline
  264. const TDesC& CHXAvFileStore::GetFullPath() const
  265. {
  266.     return *m_pFullPath;
  267. }
  268. ////////////////////////////////////////////
  269. // return absolute path to root
  270. //
  271. // e.g.:
  272. //
  273. // 'c:realnetworksmedia'
  274. //
  275. inline
  276. const TDesC& CHXAvFileStore::GetRoot() const
  277. {
  278.     return m_root.FullName(); 
  279. }
  280. ////////////////////////////////////////////
  281. // relative to the root; should start with ''
  282. //
  283. // e.g.:
  284. //
  285. // '' 
  286. // 'foo' 
  287. //
  288. inline 
  289. const TDesC& CHXAvFileStore::GetCurrentPath() const
  290. {
  291.     return m_curPath;
  292. }
  293. ///////////////////////////////////////////
  294. //
  295. inline
  296. void CHXAvFileStore::EnsureEntryInfoIsUpToDate()
  297. {
  298.     if(m_bNeedRefresh)
  299.     {
  300. RefreshEntryInfoL();
  301. HX_ASSERT(!m_bNeedRefresh); // impossible
  302.     }
  303. }
  304. ////////////////////////////////////////////
  305. // refresh entries to match current state of
  306. // the current folder on disk
  307. //
  308. inline
  309. const CHXAvFileStore::Entries& CHXAvFileStore::UpdateEntriesL()
  310. {
  311.     EnsureEntryInfoIsUpToDate();
  312.     return m_entryInfo;
  313. }
  314. ////////////////////////////////////////////
  315. // get entries without refresh
  316. //
  317. // list is up-to-date (valid) until one of following occurs:
  318. //
  319. // a) external file system event
  320. // b) you call a method that changes the state of the folder contents
  321. // c) you call a method that changes the current root and/or folder
  322. //
  323. inline
  324. const CHXAvFileStore::Entries& CHXAvFileStore::GetEntries() const
  325. {
  326.     return m_entryInfo;
  327. }
  328. inline
  329. CHXAvFileStore::Entries CHXAvFileStore::CopyEntriesL() const
  330. {
  331.     Entries entries;
  332.     entries.Copy(m_entryInfo);
  333.     return entries;
  334. }
  335. inline
  336. void CHXAvFileStore::SetObserver(FileStoreOperationObserver* pObserver)
  337. {
  338.     m_pObserver = pObserver;
  339. }
  340. #endif // _chxavfilestore_h_