VeraCrypt
aboutsummaryrefslogtreecommitdiff
path: root/src/Platform/Event.h
blob: 5aef36219318fd760af54665756011f36d977cb5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
/*
 Derived from source code of TrueCrypt 7.1a, which is
 Copyright (c) 2008-2012 TrueCrypt Developers Association and which is governed
 by the TrueCrypt License 3.0.

 Modifications and additions to the original source code (contained in this file)
 and all other portions of this file are Copyright (c) 2013-2016 IDRIX
 and are governed by the Apache License 2.0 the full text of which is
 contained in the file License.txt included in VeraCrypt binary and source
 code distribution packages.
*/

#ifndef TC_HEADER_Platform_Event
#define TC_HEADER_Platform_Event

#include "PlatformBase.h"
#include "ForEach.h"
#include "Mutex.h"
#include "SharedPtr.h"

namespace VeraCrypt
{
	struct EventArgs
	{
		virtual ~EventArgs () { }
	};

	class EventConnectorBase
	{
	public:
		virtual ~EventConnectorBase () { }
		virtual void operator() (EventArgs &args) = 0;

		virtual EventConnectorBase *CloneNew () const = 0;
		virtual void *GetHandler () const = 0;
	};

	typedef list < shared_ptr <EventConnectorBase> > EventHandlerList;

	template <class T>
	class EventConnector : public EventConnectorBase
	{
	public:
		typedef void (T::*EventHandlerFunction) (EventArgs &);

		EventConnector (T *handler, EventHandlerFunction function)
			: Handler (handler), Function (function) { }

		virtual void operator() (EventArgs &args) { (Handler->*Function) (args); }

		virtual EventConnectorBase *CloneNew () const { return new EventConnector <T> (*this); }
		virtual void *GetHandler () const { return Handler; }

	protected:
		T *Handler;
		EventHandlerFunction Function;
	};

	class Event
	{
	public:
		Event () { }
		virtual ~Event () { }

		void Connect (const EventConnectorBase &connector);
		void Disconnect (void *handler);
		void Raise ();
		void Raise (EventArgs &args);

	protected:
		EventHandlerList ConnectedHandlers;
		Mutex HandlersMutex;

	private:
		Event (const Event &);
		Event &operator= (const Event &);
	};

	struct ExceptionEventArgs : public EventArgs
	{
		ExceptionEventArgs (exception &ex) : mException (ex) { }
		exception &mException;

	private:
		ExceptionEventArgs (const ExceptionEventArgs &);
		ExceptionEventArgs &operator= (const ExceptionEventArgs &);
	};
}

#endif // TC_HEADER_Platform_Event
="p">} uint64 GetHiddenVolumeDataSize () const { return HiddenVolumeDataSize; } static size_t GetLargestSerializedKeySize (); shared_ptr <Pkcs5Kdf> GetPkcs5Kdf () const { return Pkcs5; } uint16 GetRequiredMinProgramVersion () const { return RequiredMinProgramVersion; } size_t GetSectorSize () const { return SectorSize; } static uint32 GetSaltSize () { return SaltSize; } uint64 GetVolumeDataSize () const { return VolumeDataSize; } VolumeTime GetVolumeCreationTime () const { return VolumeCreationTime; } void SetSize (uint32 headerSize); protected: bool Deserialize (const ConstBufferPtr &header, shared_ptr <EncryptionAlgorithm> &ea, shared_ptr <EncryptionMode> &mode, bool truecryptMode); template <typename T> T DeserializeEntry (const ConstBufferPtr &header, size_t &offset) const; template <typename T> T DeserializeEntryAt (const ConstBufferPtr &header, const size_t &offset) const; void Init (); void Serialize (const BufferPtr &header) const; template <typename T> void SerializeEntry (const T &entry, const BufferPtr &header, size_t &offset) const; uint32 HeaderSize; static const uint16 CurrentHeaderVersion = VOLUME_HEADER_VERSION; static const uint16 CurrentRequiredMinProgramVersion = TC_VOLUME_MIN_REQUIRED_PROGRAM_VERSION; static const uint16 MinAllowedHeaderVersion = 1; static const int SaltOffset = 0; static const uint32 SaltSize = 64; static const int EncryptedHeaderDataOffset = SaltOffset + SaltSize; uint32 EncryptedHeaderDataSize; static const uint32 LegacyEncryptionModeKeyAreaSize = 32; static const int DataKeyAreaMaxSize = 256; static const uint32 DataAreaKeyOffset = DataKeyAreaMaxSize - EncryptedHeaderDataOffset; shared_ptr <EncryptionAlgorithm> EA; shared_ptr <Pkcs5Kdf> Pkcs5; uint16 HeaderVersion; uint16 RequiredMinProgramVersion; uint32 VolumeKeyAreaCrc32; VolumeTime VolumeCreationTime; VolumeTime HeaderCreationTime; VolumeType::Enum mVolumeType; uint64 HiddenVolumeDataSize; uint64 VolumeDataSize; uint64 EncryptedAreaStart; uint64 EncryptedAreaLength; uint32 Flags; uint32 SectorSize; SecureBuffer DataAreaKey; private: VolumeHeader (const VolumeHeader &); VolumeHeader &operator= (const VolumeHeader &); }; } #endif // TC_HEADER_Volume_VolumeHeader