Index: src/ch/FileInfo.h =================================================================== diff -u -r8cb15f097b81ca387f3ae122dd355f3c397b7842 -r22573f5fa8bfbf68a19deb7631962e026f028045 --- src/ch/FileInfo.h (.../FileInfo.h) (revision 8cb15f097b81ca387f3ae122dd355f3c397b7842) +++ src/ch/FileInfo.h (.../FileInfo.h) (revision 22573f5fa8bfbf68a19deb7631962e026f028045) @@ -1,5 +1,5 @@ /*************************************************************************** -* Copyright (C) 2001-2008 by J�zef Starosczyk * +* Copyright (C) 2001-2008 by Jozef Starosczyk * * ixen@copyhandler.com * * * * This program is free software; you can redistribute it and/or modify * @@ -23,12 +23,14 @@ #define __FILEINFO_H__ #include "DestPath.h" +#include +#include void FindFreeSubstituteName(CString strSrcPath, CString strDstPath, CString* pstrResult); extern void GetDriveData(LPCTSTR lpszPath, int *piDrvNum, UINT *puiDrvType); // CFileInfo flags -// flag stating that file has been processed (used to determine if file can be deleted at the end of copying) +// flag stating that file has been processed (used to determine if file can be deleted at the end of copying) #define FIF_PROCESSED 0x00000001 class CFiltersArray; @@ -43,6 +45,7 @@ void SetPath(const CString& strPath); void CalcBufferIndex(const CDestPath& dpDestPath); const CString& GetPath() const { return m_strPath; } + CString GetFileName() const; void SetMove(bool bValue) { m_bMove=bValue; } bool GetMove() { return m_bMove; } @@ -52,7 +55,20 @@ int GetBufferIndex() const { return m_iBufferIndex; } - void Serialize(icpf::archive& ar, bool bData); + template + void Serialize(Archive& ar, unsigned int /*uiVersion*/, bool bData) + { + if(bData) + { + ar & m_strPath; + ar & m_bMove; + ar & m_iDriveNumber; + ar & m_uiDriveType; + ar & m_iBufferIndex; + } + else + ar & m_vDstPaths; + } void AddDestinationPath(const CString& strPath); size_t GetDestinationPathsCount() const; @@ -70,26 +86,74 @@ std::vector m_vDstPaths; // dest paths table for this group of paths }; +typedef boost::shared_ptr CClipboardEntryPtr; + ////////////////////////////////////////////////////////////////////////// // CClipboardArray class CClipboardArray { public: ~CClipboardArray(); - - void Serialize(icpf::archive& ar, bool bData); - CClipboardEntry* GetAt(int iPos); + template + void Store(Archive& ar, unsigned int /*uiVersion*/, bool bData) const + { + boost::shared_lock lock(m_lock); + // write data + size_t stCount = m_vEntries.size(); + ar << stCount; + + BOOST_FOREACH(const CClipboardEntryPtr& spEntry, m_vEntries) + { + spEntry->Serialize(ar, 0, bData); + } + } - int GetSize() const; - void Add(CClipboardEntry* pEntry); - void SetAt(int nIndex, CClipboardEntry* pEntry); - void RemoveAt(int nIndex, int nCount = 1); + template + void Load(Archive& ar, unsigned int /*uiVersion*/, bool bData) + { + size_t stCount; + ar >> stCount; + + boost::unique_lock lock(m_lock); + + if(!bData && m_vEntries.size() != stCount) + THROW(_T("Count of entries with data differs from the count of state entries"), 0, 0, 0); + + if(bData) + { + m_vEntries.clear(); + m_vEntries.reserve(stCount); + } + + CClipboardEntryPtr spEntry; + for(size_t stIndex = 0; stIndex < stCount; ++stIndex) + { + if(bData) + spEntry.reset(new CClipboardEntry); + else + spEntry = m_vEntries.at(stIndex); + spEntry->Serialize(ar, 0, bData); + + if(bData) + m_vEntries.push_back(spEntry); + } + } + + CClipboardEntryPtr GetAt(size_t iPos) const; + + size_t GetSize() const; + void Add(const CClipboardEntryPtr& pEntry); + void SetAt(size_t nIndex, const CClipboardEntryPtr& pEntry); + void RemoveAt(size_t nIndex, size_t nCount = 1); void RemoveAll(); + int ReplacePathsPrefix(CString strOld, CString strNew); + protected: - std::vector m_vEntries; + std::vector m_vEntries; + mutable boost::shared_mutex m_lock; }; class CFileInfo @@ -101,43 +165,43 @@ // static member static bool Exist(CString strPath); // check for file or folder existence - - void Create(const WIN32_FIND_DATA* pwfd, LPCTSTR pszFilePath, int iSrcIndex); - bool Create(CString strFilePath, int iSrcIndex); - + + void Create(const WIN32_FIND_DATA* pwfd, LPCTSTR pszFilePath, size_t stSrcIndex); + bool Create(CString strFilePath, size_t stSrcIndex); + ULONGLONG GetLength64() const { return m_uhFileSize; } void SetLength64(ULONGLONG uhSize) { m_uhFileSize=uhSize; } // disk - path and disk number (-1 if none - ie. net disk) CString GetFileDrive(void) const; // returns string with src disk int GetDriveNumber() const; // disk number A - 0, b-1, c-2, ... UINT GetDriveType() const; // drive type - + CString GetFileDir() const; // @rdesc Returns \WINDOWS\ for C:\WINDOWS\WIN.INI CString GetFileTitle() const; // @cmember returns WIN for C:\WINDOWS\WIN.INI CString GetFileExt() const; /** @cmember returns INI for C:\WINDOWS\WIN.INI */ CString GetFileRoot() const; /** @cmember returns C:\WINDOWS\ for C:\WINDOWS\WIN.INI */ CString GetFileName() const; /** @cmember returns WIN.INI for C:\WINDOWS\WIN.INI */ - + const CString& GetFilePath(void) const { return m_strFilePath; } // returns path with m_strFilePath (probably not full) CString GetFullFilePath() const; /** @cmember returns C:\WINDOWS\WIN.INI for C:\WINDOWS\WIN.INI */ void SetFilePath(LPCTSTR lpszPath) { m_strFilePath=lpszPath; }; - + /* Get File times info (equivalent to CFindFile members) */ - const COleDateTime& GetCreationTime() const { return m_timCreation; }; - const COleDateTime& GetLastAccessTime() const { return m_timLastAccess; }; - const COleDateTime& GetLastWriteTime() const { return m_timLastWrite; }; - + const FILETIME& GetCreationTime() const { return m_ftCreation; }; + const FILETIME& GetLastAccessTime() const { return m_ftLastAccess; }; + const FILETIME& GetLastWriteTime() const { return m_ftLastWrite; }; + /* Get File attributes info (equivalent to CFindFile members) */ - DWORD GetAttributes(void) const { return m_dwAttributes; } - bool IsDirectory(void) const { return (m_dwAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0; } - bool IsArchived(void) const { return (m_dwAttributes & FILE_ATTRIBUTE_ARCHIVE) != 0; } - bool IsReadOnly(void) const { return (m_dwAttributes & FILE_ATTRIBUTE_READONLY) != 0; } - bool IsCompressed(void) const { return (m_dwAttributes & FILE_ATTRIBUTE_COMPRESSED) != 0; } - bool IsSystem(void) const { return (m_dwAttributes & FILE_ATTRIBUTE_SYSTEM) != 0; } - bool IsHidden(void) const { return (m_dwAttributes & FILE_ATTRIBUTE_HIDDEN) != 0; } - bool IsTemporary(void) const { return (m_dwAttributes & FILE_ATTRIBUTE_TEMPORARY) != 0; } - bool IsNormal(void) const { return m_dwAttributes == 0; } + DWORD GetAttributes() const { return m_dwAttributes; } + bool IsDirectory() const { return (m_dwAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0; } + bool IsArchived() const { return (m_dwAttributes & FILE_ATTRIBUTE_ARCHIVE) != 0; } + bool IsReadOnly() const { return (m_dwAttributes & FILE_ATTRIBUTE_READONLY) != 0; } + bool IsCompressed() const { return (m_dwAttributes & FILE_ATTRIBUTE_COMPRESSED) != 0; } + bool IsSystem() const { return (m_dwAttributes & FILE_ATTRIBUTE_SYSTEM) != 0; } + bool IsHidden() const { return (m_dwAttributes & FILE_ATTRIBUTE_HIDDEN) != 0; } + bool IsTemporary() const { return (m_dwAttributes & FILE_ATTRIBUTE_TEMPORARY) != 0; } + bool IsNormal() const { return m_dwAttributes == 0; } uint_t GetFlags() const { return m_uiFlags; } void SetFlags(uint_t uiFlags, uint_t uiMask = 0xffffffff) { m_uiFlags = (m_uiFlags & ~(uiFlags & uiMask)) | (uiFlags & uiMask); } @@ -146,38 +210,50 @@ void SetClipboard(CClipboardArray *pClipboard) { m_pClipboard=pClipboard; }; CString GetDestinationPath(CString strPath, unsigned char ucCopyNumber, int iFlags); - void SetSrcIndex(int iIndex) { m_iSrcIndex=iIndex; }; - int GetSrcIndex() const { return m_iSrcIndex; }; + void SetSrcIndex(size_t stIndex) { m_stSrcIndex = stIndex; }; + size_t GetSrcIndex() const { return m_stSrcIndex; }; - bool GetMove() { if (m_iSrcIndex != -1) return m_pClipboard->GetAt(m_iSrcIndex)->GetMove(); else return true; }; + bool GetMove() { if (m_stSrcIndex != std::numeric_limits::max()) return m_pClipboard->GetAt(m_stSrcIndex)->GetMove(); else return true; }; int GetBufferIndex() const; // operators bool operator==(const CFileInfo& rInfo); - - // (re)/store data - void Store(icpf::archive& ar); - void Load(icpf::archive& ar); + template + void serialize(Archive& ar, unsigned int /*uiVersion*/) + { + ar & m_strFilePath; + ar & m_stSrcIndex; + ar & m_dwAttributes; + ar & m_uhFileSize; + ar & m_ftCreation.dwHighDateTime; + ar & m_ftCreation.dwLowDateTime; + ar & m_ftLastAccess.dwHighDateTime; + ar & m_ftLastAccess.dwLowDateTime; + ar & m_ftLastWrite.dwHighDateTime; + ar & m_ftLastWrite.dwLowDateTime; + ar & m_uiFlags; + } + private: CString m_strFilePath; // contains relative path (first path is in CClipboardArray) - int m_iSrcIndex; // index in CClipboardArray table (which contains the first part of the path) - + size_t m_stSrcIndex; // index in CClipboardArray table (which contains the first part of the path) + DWORD m_dwAttributes; // attributes ULONGLONG m_uhFileSize; - COleDateTime m_timCreation; - COleDateTime m_timLastAccess; - COleDateTime m_timLastWrite; + FILETIME m_ftCreation; + FILETIME m_ftLastAccess; + FILETIME m_ftLastWrite; uint_t m_uiFlags; + // ptrs to elements providing data CClipboardArray* m_pClipboard; -}; +}; -/** -* @class Allows to retrieve s from files/directories in a directory -*/ +typedef boost::shared_ptr CFileInfoPtr; + class CFileInfoArray { public: @@ -186,28 +262,71 @@ { } - void AddDir(CString strDirName, const CFiltersArray* pFilters, int iSrcIndex, - const bool bRecurse, const bool bIncludeDirs, const volatile bool* pbAbort=NULL); - - void AddFile(CString strFilePath, int iSrcIndex); - - void AddFileInfo(const CFileInfo& rFileInfo); + void AddFileInfo(const CFileInfoPtr& spFileInfo); - void AppendArray(const CFileInfoArray& arrFiles); - size_t GetSize() const; - CFileInfo& GetAt(size_t stIndex); - + CFileInfoPtr GetAt(size_t stIndex) const; + CFileInfo GetCopyAt(size_t stIndex) const; + void Clear(); // store/restore - void Store(icpf::archive& ar, bool bOnlyFlags); + template + void Store(Archive& ar, unsigned int /*uiVersion*/, bool bOnlyFlags) + { + size_t stCount = m_vFiles.size(); + ar << stCount; + for(std::vector::iterator iterFile = m_vFiles.begin(); iterFile != m_vFiles.end(); ++iterFile) + { + if(bOnlyFlags) + { + uint_t uiFlags = (*iterFile)->GetFlags(); + ar << uiFlags; + } + else + ar << *(*iterFile); + } + } - void Load(icpf::archive& ar, bool bOnlyFlags); + template + void Load(Archive& ar, unsigned int /*uiVersion*/, bool bOnlyFlags) + { + size_t stCount; + ar >> stCount; + if(!bOnlyFlags) + { + m_vFiles.clear(); + m_vFiles.reserve(stCount); + } + else if(stCount != m_vFiles.size()) + THROW(_T("Invalid count of flags received"), 0, 0, 0); + + CFileInfoPtr spFileInfo; + + uint_t uiFlags = 0; + for(size_t stIndex = 0; stIndex < stCount; stIndex++) + { + if(bOnlyFlags) + { + CFileInfoPtr& spFileInfo = m_vFiles.at(stIndex); + ar >> uiFlags; + spFileInfo->SetFlags(uiFlags); + } + else + { + spFileInfo.reset(new CFileInfo); + spFileInfo->SetClipboard(&m_rClipboard); + ar >> *spFileInfo; + m_vFiles.push_back(spFileInfo); + } + } + } + protected: CClipboardArray& m_rClipboard; - std::vector m_vFiles; + std::vector m_vFiles; + mutable boost::shared_mutex m_lock; }; - + #endif