From c178e325b807258199ae45b2c50c265b4d7ce7af Mon Sep 17 00:00:00 2001 From: Mounir IDRASSI Date: Tue, 30 Dec 2014 17:01:49 +0100 Subject: 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. --- src/Main/Forms/WaitDialog.h | 122 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 121 insertions(+), 1 deletion(-) mode change 100755 => 100644 src/Main/Forms/WaitDialog.h (limited to 'src/Main/Forms/WaitDialog.h') diff --git a/src/Main/Forms/WaitDialog.h b/src/Main/Forms/WaitDialog.h old mode 100755 new mode 100644 index c9e0d56e..b12ad028 --- a/src/Main/Forms/WaitDialog.h +++ b/src/Main/Forms/WaitDialog.h @@ -11,11 +11,16 @@ #include "Forms.h" #include "Main/Main.h" +#include "Main/Application.h" +#include 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 m_queue; }; } -- cgit v1.2.3