summaryrefslogtreecommitdiff
path: root/library/shadow.cpp
diff options
context:
space:
mode:
authorDaniel Wilhelm <daniel@wili.li>2014-04-18 17:00:50 +0200
committerDaniel Wilhelm <daniel@wili.li>2014-04-18 17:00:50 +0200
commit4ecfd41e36533d858c98d051ef70cab80e69e972 (patch)
treeca07d8745967d2c6a7123a5d32269cfbfaa7bd6c /library/shadow.cpp
parent2.2 (diff)
downloadFreeFileSync-4ecfd41e36533d858c98d051ef70cab80e69e972.tar.gz
FreeFileSync-4ecfd41e36533d858c98d051ef70cab80e69e972.tar.bz2
FreeFileSync-4ecfd41e36533d858c98d051ef70cab80e69e972.zip
2.3
Diffstat (limited to 'library/shadow.cpp')
-rw-r--r--library/shadow.cpp148
1 files changed, 0 insertions, 148 deletions
diff --git a/library/shadow.cpp b/library/shadow.cpp
deleted file mode 100644
index c353bcb2..00000000
--- a/library/shadow.cpp
+++ /dev/null
@@ -1,148 +0,0 @@
-#include "shadow.h"
-#include <wx/msw/wrapwin.h> //includes "windows.h"
-#include <wx/intl.h>
-#include "../structures.h"
-
-using FreeFileSync::ShadowCopy;
-
-
-class ShadowlDllHandler //dynamically load windows API functions
-{
- typedef bool (*CreateShadowCopyFct)( //volumeName must end with "\", while shadowVolName does not end with "\"
- const wchar_t* volumeName,
- wchar_t* shadowVolName,
- unsigned int shadowBufferLen,
- void** backupHandle,
- wchar_t* errorMessage,
- unsigned int errorBufferLen);
-
- typedef void (*ReleaseShadowCopyFct)(void* backupHandle);
-
-public:
- static const ShadowlDllHandler& getInstance()
- {
- static ShadowlDllHandler instance;
- return instance;
- }
-
- CreateShadowCopyFct createShadowCopy;
- ReleaseShadowCopyFct releaseShadowCopy;
-
-private:
- ShadowlDllHandler() :
- createShadowCopy(NULL),
- releaseShadowCopy(NULL),
- hShadow(NULL)
- {
- //get a handle to the DLL module containing the required functionality
- hShadow = ::LoadLibrary(L"Shadow.dll");
- if (hShadow)
- {
- createShadowCopy = reinterpret_cast<CreateShadowCopyFct>(::GetProcAddress(hShadow, "createShadowCopy"));
- releaseShadowCopy = reinterpret_cast<ReleaseShadowCopyFct>(::GetProcAddress(hShadow, "releaseShadowCopy"));
- }
- }
-
- ~ShadowlDllHandler()
- {
- if (hShadow) ::FreeLibrary(hShadow);
- }
-
- HINSTANCE hShadow;
-};
-
-
-ShadowCopy::ShadowCopy() :
- backupHandle(NULL) {}
-
-
-ShadowCopy::~ShadowCopy()
-{
- if (backupHandle != NULL)
- ShadowlDllHandler::getInstance().releaseShadowCopy(backupHandle);
-}
-
-
-bool ShadowCopy::isOkay()
-{
- //check that all functions could be loaded
- return ShadowlDllHandler::getInstance().createShadowCopy != NULL &&
- ShadowlDllHandler::getInstance().releaseShadowCopy != NULL;
-}
-
-
-Zstring ShadowCopy::makeShadowCopy(const Zstring& inputFile) throw(FreeFileSync::FileError)
-{
- //check if shadow copy dll was loaded correctly
- if (!isOkay())
- throw FileError(Zstring(_("Error copying locked file %x!")).Replace(wxT("%x"), Zstring(wxT("\"")) + inputFile + wxT("\"")) + wxT("\n\n") +
- _("Error starting Volume Shadow Copy Service!") + wxT("\n") +
- _("Please copy the appropriate \"Shadow.dll\" (located in \"Shadow.zip\" archive) into the FreeFileSync installation directory to enable this feature."));
-
-
- wchar_t volumeNameRaw[1000];
-
- if (!GetVolumePathName(inputFile.c_str(), //__in LPCTSTR lpszFileName,
- volumeNameRaw, //__out LPTSTR lpszVolumePathName,
- 1000)) //__in DWORD cchBufferLength
- throw FileError(Zstring(_("Error copying locked file %x!")).Replace(wxT("%x"), Zstring(wxT("\"")) + inputFile + wxT("\"")) + wxT("\n\n") +
- _("Could not determine volume name for file:") + wxT("\n\"") + inputFile + wxT("\""));
-
- Zstring volumeNameFormatted = volumeNameRaw;
- if (!volumeNameFormatted.EndsWith(FreeFileSync::FILE_NAME_SEPARATOR))
- volumeNameFormatted += FreeFileSync::FILE_NAME_SEPARATOR;
-
- if (volumeNameFormatted != realVolumeLast)
- {
- //release old shadow copy
- if (backupHandle != NULL)
- {
- ShadowlDllHandler::getInstance().releaseShadowCopy(backupHandle);
- backupHandle = NULL;
- }
- realVolumeLast.clear(); //...if next call fails...
- shadowVolumeLast.clear(); //...if next call fails...
-
- //start shadow volume copy service:
- wchar_t shadowVolName[1000];
- void* backupHandleTmp = NULL;
- wchar_t errorMessage[1000];
-
- if (!ShadowlDllHandler::getInstance().createShadowCopy(
- volumeNameFormatted.c_str(),
- shadowVolName,
- 1000,
- &backupHandleTmp,
- errorMessage,
- 1000))
- throw FileError(Zstring(_("Error copying locked file %x!")).Replace(wxT("%x"), Zstring(wxT("\"")) + inputFile + wxT("\"")) + wxT("\n\n") +
- _("Error starting Volume Shadow Copy Service!") + wxT("\n") +
- wxT("(") + errorMessage + wxT(")"));
-
- realVolumeLast = volumeNameFormatted;
- shadowVolumeLast = Zstring(shadowVolName) + FreeFileSync::FILE_NAME_SEPARATOR; //shadowVolName NEVER has a trailing backslash
- backupHandle = backupHandleTmp;
- }
-
- const size_t pos = inputFile.find(volumeNameFormatted);
- if (pos == Zstring::npos)
- {
- Zstring msg = _("Volume name %x not part of filename %y!");
- msg.Replace(wxT("%x"), Zstring(wxT("\"")) + volumeNameFormatted + wxT("\""), false);
- msg.Replace(wxT("%y"), Zstring(wxT("\"")) + inputFile + wxT("\""), false);
- throw FileError(Zstring(_("Error copying locked file %x!")).Replace(wxT("%x"), Zstring(wxT("\"")) + inputFile + wxT("\"")) + wxT("\n\n") +
- msg);
- }
-
- //return filename alias on shadow copy volume
- return shadowVolumeLast + Zstring(inputFile.c_str() + pos + volumeNameFormatted.length());
-}
-
-
-
-
-
-
-
-
-
bgstack15