X-Git-Url: http://Server1/repobrowser/?a=blobdiff_plain;f=source%2Factmgr%2FfrmActivityMgr.cpp;h=546795a34636352f4965eb7067e9003eabdfd094;hb=5dc7381334ba760443a08c4ee47bfc1ed859eca1;hp=b63d827c3ad13f0069c72e6cf72750cc200e9fa8;hpb=b73b96cf9e05a5d975626969977559a97230eec2;p=xestiaab%2F.git diff --git a/source/actmgr/frmActivityMgr.cpp b/source/actmgr/frmActivityMgr.cpp index b63d827..546795a 100644 --- a/source/actmgr/frmActivityMgr.cpp +++ b/source/actmgr/frmActivityMgr.cpp @@ -45,6 +45,7 @@ DEFINE_EVENT_TYPE(ACTMGR_STOPTIMER); DEFINE_EVENT_TYPE(ACTMGR_STARTPROCESSTIMER); DEFINE_EVENT_TYPE(ACTMGR_STOPPROCESSTIMER); DEFINE_EVENT_TYPE(ACTMGR_UPDATESTATUSLABEL); +DEFINE_EVENT_TYPE(ACTMGR_STARTANIMATIONTIMER); BEGIN_EVENT_TABLE(frmActivityMgr, wxWindow) EVT_COMMAND(wxID_ANY, ACTMGR_RESUMEPROC, frmActivityMgr::ResumeProcessing) @@ -54,6 +55,7 @@ BEGIN_EVENT_TABLE(frmActivityMgr, wxWindow) EVT_COMMAND(wxID_ANY, ACTMGR_STARTPROCESSTIMER, frmActivityMgr::StartProcessTimer) EVT_COMMAND(wxID_ANY, ACTMGR_STOPPROCESSTIMER, frmActivityMgr::StopProcessTimer) EVT_COMMAND(wxID_ANY, ACTMGR_UPDATESTATUSLABEL, frmActivityMgr::UpdateStatusLabel) + EVT_COMMAND(wxID_ANY, ACTMGR_STARTANIMATIONTIMER, frmActivityMgr::StartAnimationTimer) END_EVENT_TABLE() frmActivityMgr::frmActivityMgr( wxWindow* parent ) @@ -194,6 +196,12 @@ void frmActivityMgr::ProcessTasksThread() } + if (ApplicationSleepMode == TRUE){ + + return; + + } + std::map::iterator TypeIter; std::map::iterator StringIter; std::map::iterator StringDataIter; @@ -210,6 +218,7 @@ void frmActivityMgr::ProcessTasksThread() std::map::iterator LongIter; bool TasksFoundProc = FALSE; wxString TaskDetail; + XABPreferences PrefData(GetUserPrefDir()); for (std::map::iterator iter = ActivityList.begin(); iter != ActivityList.end(); ++iter){ @@ -220,6 +229,12 @@ void frmActivityMgr::ProcessTasksThread() continue; } + wxCommandEvent StartAnimationEvent(ACTMGR_STARTANIMATIONTIMER); + + wxPostEvent(this, StartAnimationEvent); + + // Start the animation timer if it hasn't started. + CardDAVIter = ActivityListConn.find(iter->first); TypeIter = ActivityListType.find(iter->first); StringETagIter = ActivityListETag.find(iter->first); @@ -254,7 +269,6 @@ void frmActivityMgr::ProcessTasksThread() // 8 = Completed. (UI Updated). frmMain *frmMainPtrGet = static_cast(frmMainPtr); - XABPreferences PrefData(GetUserPrefDir()); if (iter->second == 0){ @@ -323,16 +337,15 @@ void frmActivityMgr::ProcessTasksThread() while (ExitLoop == FALSE){ - ConnHandle.SetUploadMode(TRUE); - ConnHandle.SetupData(wxT("PUT"), StringURLIter->second, StringDataIter->second); - ConnHandle.SetEditMode(EditMode); - ConnHandle.ProcessData(); - - int ErrorCode = ConnHandle.GetResultCode(); + // Verify that we have a trusted SSL connection first. - if (ErrorCode != 0){ + int ErrorCode = ConnHandle.SSLVerifyTest(); + + if (ErrorCode != CURLE_OK){ - if (ErrorCode == 60 || ErrorCode == 51){ + if (ErrorCode == CURLE_SSL_CACERT || + ErrorCode == CURLE_PEER_FAILED_VERIFICATION || + ErrorCode == CURLE_SSL_CONNECT_ERROR){ // Invalid SSL certificate so bring up a dialog to the user // explaining what has happened and the options available. @@ -361,14 +374,37 @@ void frmActivityMgr::ProcessTasksThread() frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetTrustObject()); + + } + +#elif defined(__WIN32__) + + BOOL ModifiedCertificateData; + CRYPTUI_VIEWCERTIFICATE_STRUCTW CertificateData = BuildCertificateData(&ConnHandle, (HWND)frmMainPtrGet->GetHandle()); + + if (!CryptUIDlgViewCertificate(&CertificateData, &ModifiedCertificateData)){ + wxMessageBox(_("An error occured while trying to open the certificate dialog."), _("Error opening Certificate Information dialog")); + } + + if (ModifiedCertificateData == FALSE){ + + frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetCertificateContextPointer()); + iter->second = 2; + break; + + } else { + + frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateContextPointer()); + } + #else // Setup the data to be sent in the wxPostEvent command. SSLInvalidCertNotifObj SSLICNProcData; - SSLCertCollection certcol = ConnHandle.GetCertificateData(); + SSLCertCollection certcol = ConnHandle.GetSSLVerifyResults(); bool *PauseMode = new bool; QRNotif qrn; @@ -446,13 +482,31 @@ void frmActivityMgr::ProcessTasksThread() #if defined(__APPLE__) frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetTrustObject()); - + +#elif defined(__WIN32__) + + frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateContextPointer()); + #else frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateData()); #endif + ConnHandle.SetUploadMode(TRUE); + ConnHandle.SetupData(wxT("PUT"), StringURLIter->second, StringDataIter->second); + ConnHandle.SetEditMode(EditMode); + ConnHandle.ProcessData(); + + int ErrorCode = ConnHandle.GetResultCode(); + + if (ErrorCode != CURLE_OK){ + + iter->second = 4; + break; + + } + // Add contact to the ETag DB. ConnHandle.GetServerETagValueThread(); @@ -460,7 +514,6 @@ void frmActivityMgr::ProcessTasksThread() ETagDBPtr->AddETag(ContactFilename, ETagServer, ETagServer); iter->second = 4; - CardDAVIter->second = NULL; break; } @@ -510,18 +563,14 @@ void frmActivityMgr::ProcessTasksThread() bool ExitLoop = FALSE; while (ExitLoop == FALSE){ + + int ErrorCode = ConnHandle.SSLVerifyTest(); - ConnHandle.SetUploadMode(TRUE); - ConnHandle.SetupData(wxT("PUT"), StringURLIter->second, StringDataIter->second); - ConnHandle.SetEditMode(EditMode); - ConnHandle.GetServerETagValueThread(); - ETagServer = ConnHandle.ETagValueResult(); - - int ErrorCode = ConnHandle.GetResultCode(); - - if (ErrorCode != 0){ + if (ErrorCode != CURLE_OK){ - if (ErrorCode == 60 || ErrorCode == 51){ + if (ErrorCode == CURLE_SSL_CACERT || + ErrorCode == CURLE_PEER_FAILED_VERIFICATION || + ErrorCode == CURLE_SSL_CONNECT_ERROR){ // Invalid SSL certificate so bring up a dialog to the user // explaining what has happened and the options available. @@ -551,13 +600,35 @@ void frmActivityMgr::ProcessTasksThread() frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetTrustObject()); } + +#elif defined(__WIN32__) + + BOOL ModifiedCertificateData; + CRYPTUI_VIEWCERTIFICATE_STRUCTW CertificateData = BuildCertificateData(&ConnHandle, (HWND)frmMainPtrGet->GetHandle()); + + if (!CryptUIDlgViewCertificate(&CertificateData, &ModifiedCertificateData)){ + wxMessageBox(_("An error occured while trying to open the certificate dialog."), _("Error opening Certificate Information dialog")); + } + + if (ModifiedCertificateData == FALSE){ + + frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetCertificateContextPointer()); + iter->second = 2; + break; + + } else { + + frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateContextPointer()); + + } + #else // Setup the data to be sent in the wxPostEvent command. SSLInvalidCertNotifObj SSLICNProcData; - SSLCertCollection certcol = ConnHandle.GetCertificateData(); + SSLCertCollection certcol = ConnHandle.GetSSLVerifyResults(); bool *PauseMode = new bool; QRNotif qrn; @@ -586,14 +657,14 @@ void frmActivityMgr::ProcessTasksThread() // Accept the certificate. Write the certificate into the account // directory (as server.crt) - will overwrite old certificate. - frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateData()); - WriteServerCertificate(AccountDir, ConnHandle.GetCertificateData()); + frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetSSLVerifyResults()); + WriteServerCertificate(AccountDir, ConnHandle.GetSSLVerifyResults()); } else if (SSLResult == 2){ // Reject the certificate, abort the task and mark as failed. - frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetCertificateData()); + frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetSSLVerifyResults()); iter->second = 2; break; @@ -628,13 +699,30 @@ void frmActivityMgr::ProcessTasksThread() #if defined(__APPLE__) frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetTrustObject()); - + +#elif defined(__WIN32__) + + frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateContextPointer()); + #else - frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateData()); + frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetSSLVerifyResults()); #endif + ConnHandle.SetUploadMode(TRUE); + ConnHandle.SetupData(wxT("PUT"), StringURLIter->second, StringDataIter->second); + ConnHandle.SetEditMode(EditMode); + ConnHandle.GetServerETagValueThread(); + ETagServer = ConnHandle.ETagValueResult(); + + int ErrorCode = ConnHandle.GetResultCode(); + + if (ErrorCode != CURLE_OK){ + iter->second = 2; + break; + } + // Compare the ETag with the Server ETag. if (ETagOriginal != ETagServer){ @@ -780,18 +868,13 @@ void frmActivityMgr::ProcessTasksThread() while (ExitLoop == FALSE){ - ConnHandle.SetUploadMode(FALSE); - ConnHandle.SetupData(wxT("DELETE"), ContactFilename, wxT("")); - ConnHandle.ProcessData(); - SSLCertCollection certcol = ConnHandle.GetCertificateData(); - - // Check if any errors have occured whilst getting the data. - - int ErrorCode = ConnHandle.GetResultCode(); - - if (ErrorCode != 0){ + int ErrorCode = ConnHandle.SSLVerifyTest(); + + if (ErrorCode != CURLE_OK){ - if (ErrorCode == 60 || ErrorCode == 51){ + if (ErrorCode == CURLE_SSL_CACERT || + ErrorCode == CURLE_PEER_FAILED_VERIFICATION || + ErrorCode == CURLE_SSL_CONNECT_ERROR){ // Invalid SSL certificate so bring up a dialog to the user // explaining what has happened and the options available. @@ -821,12 +904,36 @@ void frmActivityMgr::ProcessTasksThread() frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetTrustObject()); } + +#elif defined(__WIN32__) + + BOOL ModifiedCertificateData; + CRYPTUI_VIEWCERTIFICATE_STRUCTW CertificateData = BuildCertificateData(&ConnHandle, (HWND)frmMainPtrGet->GetHandle()); + + if (!CryptUIDlgViewCertificate(&CertificateData, &ModifiedCertificateData)){ + wxMessageBox(_("An error occured while trying to open the certificate dialog."), _("Error opening Certificate Information dialog")); + } + + if (ModifiedCertificateData == FALSE){ + + frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetCertificateContextPointer()); + iter->second = 2; + break; + + } else { + + frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateContextPointer()); + + } + #else // Setup the data to be sent in the wxPostEvent command. SSLInvalidCertNotifObj SSLICNProcData; + SSLCertCollection certcol = ConnHandle.GetSSLVerifyResults(); + bool *PauseMode = new bool; QRNotif qrn; @@ -861,14 +968,14 @@ void frmActivityMgr::ProcessTasksThread() // Accept the certificate. Write the certificate into the account // directory (as server.crt) - will overwrite old certificate. - frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateData()); - WriteServerCertificate(AccountDir, ConnHandle.GetCertificateData()); + frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetSSLVerifyResults()); + WriteServerCertificate(AccountDir, ConnHandle.GetSSLVerifyResults()); } else if (SSLResult == 2){ // Reject the certificate, abort the task and mark as failed. - frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetCertificateData()); + frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetSSLVerifyResults()); iter->second = 2; break; @@ -903,13 +1010,31 @@ void frmActivityMgr::ProcessTasksThread() #if defined(__APPLE__) frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetTrustObject()); - + +#elif defined(__WIN32__) + + frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateContextPointer()); + #else - frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateData()); + frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetSSLVerifyResults()); #endif + ConnHandle.SetUploadMode(FALSE); + ConnHandle.SetupData(wxT("DELETE"), ContactFilename, wxT("")); + ConnHandle.ProcessData(); + + SSLCertCollection certcol = ConnHandle.GetCertificateData(); + + // Check if any errors have occured whilst getting the data. + + int ErrorCode = ConnHandle.GetResultCode(); + + if (ErrorCode != CURLE_OK){ + iter->second = 2; + break; + } ETagDBPtr->RemoveETag(ContactFilename); @@ -1013,21 +1138,16 @@ void frmActivityMgr::ProcessTasksThread() std::map *SCListData = NULL; while (ExitLoop == FALSE){ - - ServerContactList = ConnHandle.GetContactList(SyncTokenLoad.ToUTF8()); - SSLCertCollection certcol = ConnHandle.GetCertificateData(); - - // Create a pointer for the std::map. - - SCListData = &ServerContactList.ListData; // Check if any errors have occured whilst getting the data. - int ErrorCode = ConnHandle.GetResultCode(); + int ErrorCode = ConnHandle.SSLVerifyTest(); - if (ErrorCode != 0){ + if (ErrorCode != CURLE_OK){ - if (ErrorCode == 60 || ErrorCode == 51){ + if (ErrorCode == CURLE_SSL_CACERT || + ErrorCode == CURLE_PEER_FAILED_VERIFICATION || + ErrorCode == CURLE_SSL_CONNECT_ERROR){ // Invalid SSL certificate so bring up a dialog to the user // explaining what has happened and the options available. @@ -1057,12 +1177,35 @@ void frmActivityMgr::ProcessTasksThread() frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetTrustObject()); } + +#elif defined(__WIN32__) + + BOOL ModifiedCertificateData; + CRYPTUI_VIEWCERTIFICATE_STRUCTW CertificateData = BuildCertificateData(&ConnHandle, (HWND)frmMainPtrGet->GetHandle()); + + if (!CryptUIDlgViewCertificate(&CertificateData, &ModifiedCertificateData)){ + wxMessageBox(_("An error occured while trying to open the certificate dialog."), _("Error opening Certificate Information dialog")); + } + + if (ModifiedCertificateData == FALSE){ + + frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetCertificateContextPointer()); + iter->second = 2; + break; + + } else { + + frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateContextPointer()); + + } #else // Setup the data to be sent in the wxPostEvent command. SSLInvalidCertNotifObj SSLICNProcData; + SSLCertCollection certcol = ConnHandle.GetSSLVerifyResults(); + bool *PauseMode = new bool; QRNotif qrn; @@ -1078,13 +1221,6 @@ void frmActivityMgr::ProcessTasksThread() event.SetClientData(&SSLICNProcData); wxPostEvent(frmMainPtrGet, event); - /*timespec n1, n2; - - // Fall asleep until we get an response. - - n1.tv_sec = 0; - n1.tv_nsec = 250000000L;*/ - while (*PauseMode == TRUE){ //nanosleep(&n1, &n2); SleepFor(250000000); @@ -1097,14 +1233,14 @@ void frmActivityMgr::ProcessTasksThread() // Accept the certificate. Write the certificate into the account // directory (as server.crt) - will overwrite old certificate. - frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateData()); - WriteServerCertificate(AccountDir, ConnHandle.GetCertificateData()); + frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetSSLVerifyResults()); + WriteServerCertificate(AccountDir, ConnHandle.GetSSLVerifyResults()); } else if (SSLResult == 2){ // Reject the certificate, abort the task and mark as failed. - frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetCertificateData()); + frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetSSLVerifyResults()); iter->second = 2; break; @@ -1139,10 +1275,14 @@ void frmActivityMgr::ProcessTasksThread() #if defined(__APPLE__) frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetTrustObject()); - + +#elif defined(__WIN32__) + + frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateContextPointer()); + #else - frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateData()); + frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetSSLVerifyResults()); #endif @@ -1159,6 +1299,23 @@ void frmActivityMgr::ProcessTasksThread() bool ContinueProcess = AccDir.GetFirst(&AccDirFilename, wxEmptyString, wxDIR_DEFAULT); + ServerContactList = ConnHandle.GetContactList(SyncTokenLoad.ToUTF8()); + + int ErrorCode = ConnHandle.GetResultCode(); + + if (ErrorCode != CURLE_OK){ + + iter->second = 4; + break; + + } + + SSLCertCollection certcol = ConnHandle.GetCertificateData(); + + // Create a pointer for the std::map. + + SCListData = &ServerContactList.ListData; + // Process the server data. if (SCListData != NULL){ @@ -1302,11 +1459,6 @@ void frmActivityMgr::ProcessTasksThread() event.SetClientData(&vCardProcData); wxPostEvent(frmMainPtrGet, event); - /*timespec n1, n2; - - n1.tv_sec = 0; - n1.tv_nsec = 250000000L;*/ - while (*PauseMode == TRUE){ //nanosleep(&n1, &n2); SleepFor(250000000); @@ -1571,11 +1723,6 @@ void frmActivityMgr::ProcessTasksThread() event.SetClientData(&vCardProcData); wxPostEvent(frmMainPtrGet, event); - /*timespec n1, n2; - - n1.tv_sec = 0; - n1.tv_nsec = 250000000L;*/ - while (*PauseMode == TRUE){ //nanosleep(&n1, &n2); SleepFor(250000000); @@ -1708,11 +1855,6 @@ void frmActivityMgr::ProcessTasksThread() event.SetClientData(&vCardProcData); wxPostEvent(frmMainPtrGet, event); - /*timespec n1, n2; - - n1.tv_sec = 0; - n1.tv_nsec = 250000000L;*/ - while (*PauseMode == TRUE){ //nanosleep(&n1, &n2); SleepFor(250000000); @@ -1877,11 +2019,11 @@ void frmActivityMgr::ProcessTasksThread() KeepUpdating = FALSE; } - + } - + // Mark as completed. - + wxString AccountNameFinal; AccountNameFinal = PrefData.accounts.GetAccountDirectory(AccountID); AccountNameFinal.Append(wxT(".carddav")); @@ -1889,7 +2031,7 @@ void frmActivityMgr::ProcessTasksThread() wxCommandEvent reloadevent(RELOADCONTACTLIST); reloadevent.SetString(AccountNameFinal); wxPostEvent(this->GetParent(), reloadevent); - + iter->second = 4; continue; @@ -1959,7 +2101,7 @@ void frmActivityMgr::ProcessTasksThread() //ActListProcTimer.Start(); } - + wxCommandEvent event(ACTMGR_STARTPROCESSTIMER); wxPostEvent(this, event); @@ -1969,7 +2111,7 @@ void frmActivityMgr::ProcessTasksThread() void frmActivityMgr::ProcessTasks() { - + std::thread ProcessThread(&frmActivityMgr::ProcessTasksThread, this); ProcessThread.detach(); @@ -2000,15 +2142,23 @@ void frmActivityMgr::ToggleConnectionStatus( wxCommandEvent &event ){ wxCommandEvent connevent(CONNSTAT_UPDATE); - if (SleepMode == FALSE){ + if (ApplicationSleepMode == FALSE){ connevent.SetInt(1); - SleepMode = TRUE; + ApplicationSleepMode = TRUE; + mnuSleepMode->Check(true); } else { connevent.SetInt(0); - SleepMode = FALSE; + ApplicationSleepMode = FALSE; + mnuSleepMode->Check(false); + + wxCommandEvent event(ACTMGR_STARTTIMER); + wxPostEvent(this, event); + + wxCommandEvent eventp(ACTMGR_STARTPROCESSTIMER); + wxPostEvent(this, eventp); } @@ -2016,6 +2166,14 @@ void frmActivityMgr::ToggleConnectionStatus( wxCommandEvent &event ){ } +void frmActivityMgr::SleepMode( wxCommandEvent &event ){ + + wxCommandEvent connevent(ACTMGR_TOGGLECONN); + + wxPostEvent(this, connevent); + +} + void frmActivityMgr::WriteServerCertificate(wxString AccountName, SSLCertCollection SSLCertInc){ wxString ServerCertFinal; @@ -2060,6 +2218,12 @@ void frmActivityMgr::StopProcessTimer(wxCommandEvent& event){ } +void frmActivityMgr::StartAnimationTimer(wxCommandEvent& event){ + + AnimationTimer.StartAnimation(); + +} + void frmActivityMgr::UpdateStatusLabel(wxCommandEvent& event){ ActivityMgrLabelUpdate *actmgrudata = (ActivityMgrLabelUpdate*)event.GetClientData();