VeraCrypt
aboutsummaryrefslogtreecommitdiff
path: root/src/Main/Forms/WaitDialog.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/Main/Forms/WaitDialog.h')
-rw-r--r--[-rwxr-xr-x]src/Main/Forms/WaitDialog.h122
1 files changed, 121 insertions, 1 deletions
diff --git a/src/Main/Forms/WaitDialog.h b/src/Main/Forms/WaitDialog.h
index c9e0d56e..b12ad028 100755..100644
--- 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 <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;
};
}