VeraCrypt
aboutsummaryrefslogtreecommitdiff
path: root/src/Core
diff options
context:
space:
mode:
authorMounir IDRASSI <mounir.idrassi@idrix.fr>2014-12-25 22:54:14 +0100
committerMounir IDRASSI <mounir.idrassi@idrix.fr>2014-12-26 00:51:52 +0100
commitd90d9f0c401a21c85a525aaca0b97df8f7955db8 (patch)
tree699016cd3928010352b3cbad97c1a7c94c4e8f13 /src/Core
parentbbcc944855d7824812af3a10fd447ccefc534a71 (diff)
downloadVeraCrypt-d90d9f0c401a21c85a525aaca0b97df8f7955db8.tar.gz
VeraCrypt-d90d9f0c401a21c85a525aaca0b97df8f7955db8.zip
Linux/MacOSX: Implement waiting dialog for lengthy operations in order to have a better user experience.
Diffstat (limited to 'src/Core')
-rw-r--r--src/Core/Core.h132
-rwxr-xr-xsrc/Core/CoreBase.h1
2 files changed, 133 insertions, 0 deletions
diff --git a/src/Core/Core.h b/src/Core/Core.h
index 5f218775..1a7a1611 100644
--- a/src/Core/Core.h
+++ b/src/Core/Core.h
@@ -15,6 +15,138 @@ namespace VeraCrypt
{
extern auto_ptr <CoreBase> Core;
extern auto_ptr <CoreBase> CoreDirect;
+
+ class WaitThreadRoutine
+ {
+ public:
+ Exception* m_pException;
+ WaitThreadRoutine() : m_pException(NULL) {}
+ virtual ~WaitThreadRoutine() {if (m_pException) delete m_pException;}
+ bool HasException () { return m_pException != NULL;}
+ Exception* GetException () const { return m_pException;}
+ void Execute(void)
+ {
+ try
+ {
+ ExecutionCode();
+ }
+ catch(Exception& ex)
+ {
+ m_pException = ex.CloneNew();
+ }
+ catch(...)
+ {
+ m_pException = new UnknownException (SRC_POS);
+ }
+ }
+ virtual void ExecutionCode(void) = 0;
+ };
+
+ class MountThreadRoutine : public WaitThreadRoutine
+ {
+ public:
+ MountOptions& m_options;
+ shared_ptr <VolumeInfo> m_pVolume;
+ MountThreadRoutine(MountOptions &options) : m_options(options) {}
+ virtual ~MountThreadRoutine() { }
+ virtual void ExecutionCode(void) { m_pVolume = Core->MountVolume(m_options); }
+ };
+
+ class VolumeCreatorThreadRoutine : public WaitThreadRoutine
+ {
+ public:
+ shared_ptr <VolumeCreationOptions> m_options;
+ shared_ptr <VolumeCreator> m_pCreator;
+ VolumeCreatorThreadRoutine(shared_ptr <VolumeCreationOptions> options, shared_ptr <VolumeCreator> pCreator)
+ : m_options(options), m_pCreator(pCreator) {}
+ virtual ~VolumeCreatorThreadRoutine() { }
+ virtual void ExecutionCode(void) { m_pCreator->CreateVolume (m_options); }
+ };
+
+ class ChangePasswordThreadRoutine : public WaitThreadRoutine
+ {
+ public:
+ shared_ptr <VolumePath> m_volumePath;
+ bool m_preserveTimestamps;
+ shared_ptr <VolumePassword> m_password;
+ shared_ptr <Pkcs5Kdf> m_kdf;
+ shared_ptr <KeyfileList> m_keyfiles;
+ shared_ptr <VolumePassword> m_newPassword;
+ shared_ptr <KeyfileList> m_newKeyfiles;
+ shared_ptr <Pkcs5Kdf> m_newPkcs5Kdf;
+ int m_wipeCount;
+ ChangePasswordThreadRoutine(shared_ptr <VolumePath> volumePath, bool preserveTimestamps, shared_ptr <VolumePassword> password, shared_ptr <Pkcs5Kdf> kdf, shared_ptr <KeyfileList> keyfiles, shared_ptr <VolumePassword> newPassword, shared_ptr <KeyfileList> newKeyfiles, shared_ptr <Pkcs5Kdf> newPkcs5Kdf, int wipeCount) : m_volumePath(volumePath), m_preserveTimestamps(preserveTimestamps), m_password(password), m_kdf(kdf), m_keyfiles(keyfiles), m_newPassword(newPassword), m_newKeyfiles(newKeyfiles), m_newPkcs5Kdf(newPkcs5Kdf), m_wipeCount(wipeCount) {}
+ virtual ~ChangePasswordThreadRoutine() { }
+ virtual void ExecutionCode(void) { Core->ChangePassword(m_volumePath, m_preserveTimestamps, m_password, m_kdf, m_keyfiles, m_newPassword, m_newKeyfiles, m_newPkcs5Kdf, m_wipeCount); }
+ };
+
+ class OpenVolumeThreadRoutine : public WaitThreadRoutine
+ {
+ public:
+ shared_ptr <VolumePath> m_volumePath;
+ bool m_preserveTimestamps;
+ shared_ptr <VolumePassword> m_password;
+ shared_ptr<Pkcs5Kdf> m_Kdf;
+ shared_ptr <KeyfileList> m_keyfiles;
+ VolumeProtection::Enum m_protection;
+ shared_ptr <VolumePassword> m_protectionPassword;
+ shared_ptr<Pkcs5Kdf> m_protectionKdf;
+ shared_ptr <KeyfileList> m_protectionKeyfiles;
+ bool m_sharedAccessAllowed;
+ VolumeType::Enum m_volumeType;
+ bool m_useBackupHeaders;
+ bool m_partitionInSystemEncryptionScope;
+ shared_ptr <Volume> m_pVolume;
+
+ OpenVolumeThreadRoutine(shared_ptr <VolumePath> volumePath, bool preserveTimestamps, shared_ptr <VolumePassword> password, shared_ptr<Pkcs5Kdf> Kdf, shared_ptr <KeyfileList> keyfiles, VolumeProtection::Enum protection = VolumeProtection::None, shared_ptr <VolumePassword> protectionPassword = shared_ptr <VolumePassword> (), shared_ptr<Pkcs5Kdf> protectionKdf = shared_ptr<Pkcs5Kdf> (), shared_ptr <KeyfileList> protectionKeyfiles = shared_ptr <KeyfileList> (), bool sharedAccessAllowed = false, VolumeType::Enum volumeType = VolumeType::Unknown, bool useBackupHeaders = false, bool partitionInSystemEncryptionScope = false):
+ m_volumePath(volumePath), m_preserveTimestamps(preserveTimestamps), m_password(password), m_Kdf(Kdf), m_keyfiles(keyfiles),
+ m_protection(protection), m_protectionPassword(protectionPassword), m_protectionKdf(protectionKdf), m_protectionKeyfiles(protectionKeyfiles), m_sharedAccessAllowed(sharedAccessAllowed), m_volumeType(volumeType),m_useBackupHeaders(useBackupHeaders),
+ m_partitionInSystemEncryptionScope(partitionInSystemEncryptionScope) {}
+
+ ~OpenVolumeThreadRoutine() {}
+
+ virtual void ExecutionCode(void) { m_pVolume = Core->OpenVolume(m_volumePath,m_preserveTimestamps,m_password,m_Kdf,m_keyfiles, m_protection,m_protectionPassword,m_protectionKdf, m_protectionKeyfiles,m_sharedAccessAllowed,m_volumeType,m_useBackupHeaders, m_partitionInSystemEncryptionScope); }
+
+ };
+
+ class ReEncryptHeaderThreadRoutine : public WaitThreadRoutine
+ {
+ public:
+ const BufferPtr &m_newHeaderBuffer;
+ shared_ptr <VolumeHeader> m_header;
+ shared_ptr <VolumePassword> m_password;
+ shared_ptr <KeyfileList> m_keyfiles;
+ ReEncryptHeaderThreadRoutine(const BufferPtr &newHeaderBuffer, shared_ptr <VolumeHeader> header, shared_ptr <VolumePassword> password, shared_ptr <KeyfileList> keyfiles)
+ : m_newHeaderBuffer(newHeaderBuffer), m_header(header), m_password(password), m_keyfiles(keyfiles) {}
+ virtual ~ReEncryptHeaderThreadRoutine() { }
+ virtual void ExecutionCode(void) { Core->ReEncryptVolumeHeaderWithNewSalt (m_newHeaderBuffer, m_header, m_password, m_keyfiles); }
+ };
+
+ class DecryptThreadRoutine : public WaitThreadRoutine
+ {
+ public:
+ shared_ptr <VolumeHeader> m_pHeader;
+ const ConstBufferPtr &m_encryptedData;
+ const VolumePassword &m_password;
+ shared_ptr <Pkcs5Kdf> m_kdf;
+ const Pkcs5KdfList &m_keyDerivationFunctions;
+ const EncryptionAlgorithmList &m_encryptionAlgorithms;
+ const EncryptionModeList &m_encryptionModes;
+ bool m_bResult;
+ DecryptThreadRoutine(shared_ptr <VolumeHeader> header, const ConstBufferPtr &encryptedData, const VolumePassword &password, shared_ptr <Pkcs5Kdf> kdf, const Pkcs5KdfList &keyDerivationFunctions, const EncryptionAlgorithmList &encryptionAlgorithms, const EncryptionModeList &encryptionModes)
+ : m_pHeader(header), m_encryptedData(encryptedData), m_password(password), m_kdf(kdf), m_keyDerivationFunctions(keyDerivationFunctions), m_encryptionAlgorithms(encryptionAlgorithms), m_encryptionModes(encryptionModes), m_bResult(false){}
+ virtual ~DecryptThreadRoutine() { }
+ virtual void ExecutionCode(void) { m_bResult = m_pHeader->Decrypt(m_encryptedData, m_password, m_kdf, m_keyDerivationFunctions, m_encryptionAlgorithms, m_encryptionModes); }
+ };
+
+ class WaitThreadUI
+ {
+ public:
+ WaitThreadUI(WaitThreadRoutine* pRoutine): m_pRoutine(pRoutine) {}
+ virtual ~WaitThreadUI() {}
+ virtual void Run(void) { m_pRoutine->ExecutionCode();}
+ WaitThreadRoutine* m_pRoutine;
+ };
}
#endif // TC_HEADER_Core_Core
diff --git a/src/Core/CoreBase.h b/src/Core/CoreBase.h
index 0d52e5b9..d7dbcd0e 100755
--- a/src/Core/CoreBase.h
+++ b/src/Core/CoreBase.h
@@ -20,6 +20,7 @@
#include "CoreException.h"
#include "HostDevice.h"
#include "MountOptions.h"
+#include "VolumeCreator.h"
namespace VeraCrypt
{