1
0
mirror of https://github.com/veracrypt/VeraCrypt.git synced 2025-11-12 19:38:26 -06:00

Linux/MacOSX: Implement TrueCrypt conversion and loading support. Correct many GTK issues linked to multi-threaded origine of events by implementing an automatic mechanism for handling such requests in the main thread.

This commit is contained in:
Mounir IDRASSI
2014-12-30 17:01:49 +01:00
parent 8d787dcd71
commit c178e325b8
39 changed files with 540 additions and 172 deletions

122
src/Main/Forms/WaitDialog.h Executable file → Normal file
View File

@@ -11,11 +11,16 @@
#include "Forms.h"
#include "Main/Main.h"
#include "Main/Application.h"
#include <wx/msgqueue.h>
namespace VeraCrypt
{
DECLARE_LOCAL_EVENT_TYPE(wxEVT_COMMAND_WAITDIALOGTHREAD_COMPLETED, -1);
DECLARE_LOCAL_EVENT_TYPE(wxEVT_COMMAND_WAITDIALOG_ADMIN_PASSWORD, -1);
DECLARE_LOCAL_EVENT_TYPE(wxEVT_COMMAND_WAITDIALOG_PIN, -1);
DECLARE_LOCAL_EVENT_TYPE(wxEVT_COMMAND_WAITDIALOG_SHOW_MSG, -1);
class WaitDialog;
@@ -50,6 +55,10 @@ namespace VeraCrypt
GetSizer()->Fit( this );
Centre( wxBOTH );
Connect( wxID_ANY, wxEVT_COMMAND_WAITDIALOGTHREAD_COMPLETED, wxCommandEventHandler( WaitDialog::OnThreadCompletion ) );
Connect( wxID_ANY, wxEVT_COMMAND_WAITDIALOG_ADMIN_PASSWORD, wxCommandEventHandler( WaitDialog::OnAdminPasswordRequest ) );
Connect( wxID_ANY, wxEVT_COMMAND_WAITDIALOG_PIN, wxCommandEventHandler( WaitDialog::OnPinRequest ) );
Connect( wxID_ANY, wxEVT_COMMAND_WAITDIALOG_SHOW_MSG, wxCommandEventHandler( WaitDialog::OnShowMsg ) );
Connect( wxEVT_TIMER, wxTimerEventHandler( WaitDialog::OnProgressTimer ), NULL, this );
m_thread = new WaitThread(this, pRoutine);
}
@@ -58,6 +67,9 @@ namespace VeraCrypt
{
Disconnect( wxEVT_TIMER, wxTimerEventHandler( WaitDialog::OnProgressTimer ));
Disconnect( wxID_ANY, wxEVT_COMMAND_WAITDIALOGTHREAD_COMPLETED, wxCommandEventHandler( WaitDialog::OnThreadCompletion ) );
Disconnect( wxID_ANY, wxEVT_COMMAND_WAITDIALOG_ADMIN_PASSWORD, wxCommandEventHandler( WaitDialog::OnAdminPasswordRequest ) );
Disconnect( wxID_ANY, wxEVT_COMMAND_WAITDIALOG_PIN, wxCommandEventHandler( WaitDialog::OnPinRequest ) );
Disconnect( wxID_ANY, wxEVT_COMMAND_WAITDIALOG_SHOW_MSG, wxCommandEventHandler( WaitDialog::OnShowMsg ) );
}
virtual void OnWaitDialogInit( wxInitDialogEvent& event )
@@ -65,12 +77,119 @@ namespace VeraCrypt
m_thread->Run();
m_timer.Start(100);
}
int GetCharWidth (wxWindow *window) const
{
int width;
int height;
window->GetTextExtent (L"a", &width, &height);
if (width < 1)
return 7;
return width;
}
class ShowMessageParam
{
public:
wxString m_message;
wxString m_caption;
long m_style;
bool m_topMost;
ShowMessageParam(const wxString &message, const wxString &caption,long style, bool topMost)
: m_message(message), m_caption(caption), m_style(style), m_topMost(topMost)
{}
};
int RequestShowMessage (const wxString &message, const wxString &caption,long style, bool topMost)
{
long lResult = -1;
if (m_queue.IsOk())
{
wxString sResult;
ShowMessageParam* pParam = new ShowMessageParam(message, caption, style, topMost);
wxCommandEvent* pEvent = new wxCommandEvent( wxEVT_COMMAND_WAITDIALOG_SHOW_MSG,0);
pEvent->SetClientData (pParam);
wxQueueEvent (this, pEvent);
m_queue.Receive (sResult);
sResult.ToLong(&lResult);
}
return (int) lResult;
}
void RequestAdminPassword (wxString& adminPassword)
{
if (m_queue.IsOk())
{
wxQueueEvent (this, new wxCommandEvent( wxEVT_COMMAND_WAITDIALOG_ADMIN_PASSWORD,0));
if (wxMSGQUEUE_NO_ERROR != m_queue.Receive (adminPassword))
adminPassword = wxT("");
}
else
adminPassword = wxT("");
}
void RequestPin (wxString& pin)
{
if (m_queue.IsOk())
{
wxCommandEvent* pEvent = new wxCommandEvent( wxEVT_COMMAND_WAITDIALOG_PIN,0);
pEvent->SetString (pin);
wxQueueEvent (this, pEvent);
if (wxMSGQUEUE_NO_ERROR != m_queue.Receive (pin))
pin = wxT("");
}
else
pin = wxT("");
}
// virtual void OnWaitDialogClose( wxCloseEvent& event ) { }
void OnThreadCompletion(wxCommandEvent &)
{
m_queue.Clear();
EndModal(0);
}
void OnAdminPasswordRequest(wxCommandEvent &)
{
wxPasswordEntryDialog dialog (this, _("Enter your user password or administrator password:"), _("Administrator privileges required"));
if (dialog.ShowModal() != wxID_OK)
m_queue.Post(wxT(""));
else
m_queue.Post(dialog.GetValue());
}
void OnPinRequest(wxCommandEvent &e)
{
wxPasswordEntryDialog dialog (this, wxString::Format (LangString["ENTER_TOKEN_PASSWORD"], e.GetString()), LangString["IDD_TOKEN_PASSWORD"]);
dialog.SetSize (wxSize (GetCharWidth (&dialog) * 50, -1));
if (dialog.ShowModal() != wxID_OK)
m_queue.Post(wxT(""));
else
m_queue.Post(dialog.GetValue());
}
void OnShowMsg(wxCommandEvent &e)
{
ShowMessageParam* pParam = (ShowMessageParam*) e.GetClientData();
if (pParam->m_topMost)
{
if (!IsActive())
RequestUserAttention (wxUSER_ATTENTION_ERROR);
pParam->m_style |= wxSTAY_ON_TOP;
}
int iResult = wxMessageBox (pParam->m_message, pParam->m_caption, pParam->m_style, this);
delete pParam;
m_queue.Post(wxString::Format(wxT("%d"), iResult));
}
void OnProgressTimer(wxTimerEvent& event)
{
@@ -83,7 +202,8 @@ namespace VeraCrypt
protected:
WaitThread* m_thread;
wxTimer m_timer;
wxTimer m_timer;
wxMessageQueue<wxString> m_queue;
};
}