diff options
author | Daniel Wilhelm <daniel@wili.li> | 2014-04-18 17:08:06 +0200 |
---|---|---|
committer | Daniel Wilhelm <daniel@wili.li> | 2014-04-18 17:08:06 +0200 |
commit | fbe76102e941b9f1edaf236788e42678f05fdf9a (patch) | |
tree | f5f538316019fa89be8dc478103490c3a826f3ac /shared/file_id.h | |
parent | 3.8 (diff) | |
download | FreeFileSync-fbe76102e941b9f1edaf236788e42678f05fdf9a.tar.gz FreeFileSync-fbe76102e941b9f1edaf236788e42678f05fdf9a.tar.bz2 FreeFileSync-fbe76102e941b9f1edaf236788e42678f05fdf9a.zip |
3.9
Diffstat (limited to 'shared/file_id.h')
-rw-r--r-- | shared/file_id.h | 200 |
1 files changed, 200 insertions, 0 deletions
diff --git a/shared/file_id.h b/shared/file_id.h new file mode 100644 index 00000000..d00ca20a --- /dev/null +++ b/shared/file_id.h @@ -0,0 +1,200 @@ +// ************************************************************************** +// * This file is part of the FreeFileSync project. It is distributed under * +// * GNU General Public License: http://www.gnu.org/licenses/gpl.html * +// * Copyright (C) 2008-2010 ZenJu (zhnmju123 AT gmx.de) * +// ************************************************************************** +// +#ifndef FILEID_H_INCLUDED +#define FILEID_H_INCLUDED + +#include <wx/stream.h> +#include "zstring.h" + +#ifdef FFS_WIN +#elif defined FFS_LINUX +#include <sys/stat.h> +#endif + + +//unique file identifier +namespace util +{ +class FileID +{ +public: + //standard copy constructor and assignment operator are okay! + + FileID(wxInputStream& stream); //read + void toStream(wxOutputStream& stream) const; //write + + bool isNull() const; + bool operator==(const FileID& rhs) const; + bool operator!=(const FileID& rhs) const; + bool operator<(const FileID& rhs) const; + + FileID(); +#ifdef FFS_WIN + typedef unsigned long DWORD_FFS; //we don't want do include "windows.h" or "<wx/msw/wrapwin.h>" here, do we? + + FileID(DWORD_FFS dwVolumeSN, + DWORD_FFS fileIndexHi, + DWORD_FFS fileIndexLo); +#elif defined FFS_LINUX + FileID(dev_t devId, + ino_t inId); +#endif +private: +#ifdef FFS_WIN + DWORD_FFS dwVolumeSerialNumber; + DWORD_FFS nFileIndexHigh; + DWORD_FFS nFileIndexLow; +#elif defined FFS_LINUX + dev_t deviceId; + ino_t inodeId; +#endif +}; + +//get unique file id (symbolic link handling: opens the link!!!) +//error condition: returns FileID () +FileID retrieveFileID(const Zstring& filename); + +//test whether two distinct paths point to the same file or directory: +// true: paths point to same files/dirs +// false: error occurred OR point to different files/dirs +bool sameFileSpecified(const Zstring& file1, const Zstring& file2); +} + + + + + + + + + + + + + + + + + + + +//---------------Inline Implementation--------------------------------------------------- +#ifdef FFS_WIN +inline +util::FileID::FileID() : + dwVolumeSerialNumber(0), + nFileIndexHigh(0), + nFileIndexLow(0) {} + +inline +util::FileID::FileID(DWORD_FFS dwVolumeSN, + DWORD_FFS fileIndexHi, + DWORD_FFS fileIndexLo) : + dwVolumeSerialNumber(dwVolumeSN), + nFileIndexHigh(fileIndexHi), + nFileIndexLow(fileIndexLo) {} + +inline +bool util::FileID::isNull() const +{ + return dwVolumeSerialNumber == 0 && + nFileIndexHigh == 0 && + nFileIndexLow == 0; +} + +inline +bool util::FileID::operator==(const FileID& rhs) const +{ + return dwVolumeSerialNumber == rhs.dwVolumeSerialNumber && + nFileIndexHigh == rhs.nFileIndexHigh && + nFileIndexLow == rhs.nFileIndexLow; +} + +inline +bool util::FileID::operator<(const FileID& rhs) const +{ + if (dwVolumeSerialNumber != rhs.dwVolumeSerialNumber) + return dwVolumeSerialNumber < rhs.dwVolumeSerialNumber; + + if (nFileIndexHigh != rhs.nFileIndexHigh) + return nFileIndexHigh < rhs.nFileIndexHigh; + + return nFileIndexLow < rhs.nFileIndexLow; +} + +inline +util::FileID::FileID(wxInputStream& stream) //read +{ + stream.Read(&dwVolumeSerialNumber, sizeof(dwVolumeSerialNumber)); + stream.Read(&nFileIndexHigh, sizeof(nFileIndexHigh)); + stream.Read(&nFileIndexLow, sizeof(nFileIndexLow)); +} + +inline +void util::FileID::toStream(wxOutputStream& stream) const //write +{ + stream.Write(&dwVolumeSerialNumber, sizeof(dwVolumeSerialNumber)); + stream.Write(&nFileIndexHigh, sizeof(nFileIndexHigh)); + stream.Write(&nFileIndexLow, sizeof(nFileIndexLow)); +} + +#elif defined FFS_LINUX +inline +util::FileID::FileID() : + deviceId(0), + inodeId(0) {} + +inline +util::FileID::FileID(dev_t devId, + ino_t inId) : + deviceId(devId), + inodeId(inId) {} + +inline +bool util::FileID::isNull() const +{ + return deviceId == 0 && + inodeId == 0; +} + +inline +bool util::FileID::operator==(const FileID& rhs) const +{ + return deviceId == rhs.deviceId && + inodeId == rhs.inodeId; +} + +inline +bool util::FileID::operator<(const FileID& rhs) const +{ + if (deviceId != rhs.deviceId) + return deviceId < rhs.deviceId; + + return inodeId < rhs.inodeId; +} + +inline +util::FileID::FileID(wxInputStream& stream) //read +{ + stream.Read(&deviceId, sizeof(deviceId)); + stream.Read(&inodeId, sizeof(inodeId)); +} + +inline +void util::FileID::toStream(wxOutputStream& stream) const //write +{ + stream.Write(&deviceId, sizeof(deviceId)); + stream.Write(&inodeId, sizeof(inodeId)); +} +#endif +inline +bool util::FileID::operator!=(const FileID& rhs) const +{ + return !(*this == rhs); +} + +#endif // FILEID_H_INCLUDED |