X-Git-Url: http://Server1/repobrowser/?a=blobdiff_plain;f=source%2Factmgr%2FfrmActivityMgr.cpp;h=1b63314d1b78ce8017d1c17f45b0b64776c65355;hb=b1467ce3cde3c61f79030bf4329f7037904043e1;hp=69ae3c74854a05a8fa937260266bb0b40e5a9563;hpb=c5497d20f788e33420ad719bdee7f9f558478b08;p=xestiaab%2F.git diff --git a/source/actmgr/frmActivityMgr.cpp b/source/actmgr/frmActivityMgr.cpp index 69ae3c7..1b63314 100644 --- a/source/actmgr/frmActivityMgr.cpp +++ b/source/actmgr/frmActivityMgr.cpp @@ -24,23 +24,19 @@ #include #include #include +#include #include -#include "bitmaps.h" -#include "enums.h" -#include "common/preferences.h" -#include "frmConflictResolution.h" -#include "frmInvalidSSLCertificate.h" -#include "frmMain.h" -#include "common/events.h" -#include "common/filename.h" -#include "common/dirs.h" -#include "vcard/vcard34conv.h" -#include "vcard/vcard.h" - - -#ifndef FRMACTIVITYMGR_H -#define FRMACTIVITYMGR_H +#include "../bitmaps.h" +#include "../enums.h" +#include "../common/preferences.h" +#include "../frmConflictResolution.h" +#include "../frmInvalidSSLCertificate.h" +#include "../frmMain.h" +#include "../common/events.h" +#include "../common/filename.h" +#include "../vcard/vcard34conv.h" +#include "../vcard/vcard.h" DEFINE_EVENT_TYPE(ACTMGR_RESUMEPROC); DEFINE_EVENT_TYPE(ACTMGR_TOGGLECONN); @@ -49,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) @@ -58,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 ) @@ -172,297 +170,6 @@ frmActivityMgrADT( parent ) //TestTimer.Start(50, FALSE); } -int frmActivityMgr::AddTask(int TaskType, wxString TaskDetail, wxString TaskAccount, - wxString TaskURL, wxString TaskFilename, wxString TaskFullFilename, - wxString TaskData){ - - ActivityTaskID++; - - wxListItem coldata; - long itemindex = -1; - CardDAV* CardDAVConn = new CardDAV; - - coldata.SetId(ActivityTaskID); - coldata.SetData(ActivityTaskID); - - AnimationTimer.StartAnimation(); - - // Get the preferences file. - - wxString PrefFilename = GetUserPrefDir(); - - XABPreferences PrefData(PrefFilename); - - wxString AccountName; - wxString AccountDir; - wxString AccountAddress; - int AccountPort = 0; - wxString AccountUsername; - wxString AccountPassword; - bool AccountSSL = FALSE; - wxString AccountPrefix; - - // Look for the account and get the friendly name for the account. - - for (int i = 0; i < PrefData.accounts.GetCount(); i++){ - - AccountDir = PrefData.accounts.GetAccountDirectory(i); - - AccountDir.Trim(); - AccountDir.Append(wxT(".carddav")); - - if (AccountDir == TaskAccount){ - - AccountName = PrefData.accounts.GetAccountName(i); - AccountAddress = PrefData.accounts.GetAccountAddress(i); - AccountPort = PrefData.accounts.GetAccountPort(i); - AccountUsername = PrefData.accounts.GetAccountUsername(i); - AccountPassword = PrefData.accounts.GetAccountPassword(i); - AccountPrefix = PrefData.accounts.GetAccountDirPrefix(i); - AccountSSL = PrefData.accounts.GetAccountSSL(i); - - AccountName.Trim(); - AccountAddress.Trim(); - //AccountPort.Trim(); - AccountUsername.Trim(); - AccountPassword.Trim(); - AccountPrefix.Trim(); - break; - - } - - } - - CardDAVConn->SetupConnection(AccountAddress, AccountPort, AccountUsername, AccountPassword, AccountSSL, AccountPrefix, AccountDir); - CardDAVConn->SetupVariables(&ActivityList, ActivityTaskID); - CardDAVConn->SetupResultBools(&BlankBool, &BlankBool); - - // TaskType: - // 0 - Add a contact. - // 1 - Update a contact. - // 2 - Delete a contact. - // 3 - Account syncronisation. - - if (TaskType == 0){ - - coldata.SetText(_("Adding Contact '") + TaskDetail + _("'")); - itemindex = lstActivity->InsertItem(coldata); - - lstActivity->SetItem(itemindex, 1, AccountName); - lstActivity->SetItem(itemindex, 2, _("Queued")); - - CardDAVConn->SetUploadMode(TRUE); - CardDAVConn->SetupData(wxT("PUT"), TaskURL, TaskData); - - // Setup all of the task details. - - ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir); - - ActivityListType.insert(std::make_pair(ActivityTaskID, 0)); - ActivityListData.insert(std::make_pair(ActivityTaskID, TaskData)); - ActivityListConn.insert(std::make_pair(ActivityTaskID, CardDAVConn)); - ActivityListIndex.insert(std::make_pair(ActivityTaskID, itemindex)); - ActivityListTaskDetail.insert(std::make_pair(ActivityTaskID, TaskDetail)); - ActivityListAccount.insert(std::make_pair(ActivityTaskID, TaskAccount)); - ActivityListFilename.insert(std::make_pair(ActivityTaskID, TaskFilename)); - ActivityListFullFilename.insert(std::make_pair(ActivityTaskID, TaskFullFilename)); - - ActivityListETag.insert(std::make_pair(ActivityTaskID, ETagDBPtr->GetETag(TaskFilename))); - ActivityListETagOriginal.insert(std::make_pair(ActivityTaskID, ETagDBPtr->GetETagOriginal(TaskFilename))); - ActivityList.insert(std::make_pair(ActivityTaskID, 0)); - - } else if (TaskType == 1){ - - coldata.SetText(_("Updating Contact '") + TaskDetail + _("'")); - itemindex = lstActivity->InsertItem(coldata); - - lstActivity->SetItem(itemindex, 1, AccountName); - lstActivity->SetItem(itemindex, 2, _("Queued")); - - CardDAVConn->SetUploadMode(TRUE); - CardDAVConn->SetupData(wxT("PUT"), TaskURL, TaskData); - CardDAVConn->SetEditMode(TRUE); - - ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir); - - ActivityListType.insert(std::make_pair(ActivityTaskID, 1)); - ActivityListData.insert(std::make_pair(ActivityTaskID, TaskData)); - ActivityListConn.insert(std::make_pair(ActivityTaskID, CardDAVConn)); - ActivityListIndex.insert(std::make_pair(ActivityTaskID, itemindex)); - ActivityListTaskDetail.insert(std::make_pair(ActivityTaskID, TaskDetail)); - ActivityListAccount.insert(std::make_pair(ActivityTaskID, TaskAccount)); - ActivityListFilename.insert(std::make_pair(ActivityTaskID, TaskFilename)); - ActivityListFullFilename.insert(std::make_pair(ActivityTaskID, TaskFullFilename)); - - ActivityListETag.insert(std::make_pair(ActivityTaskID, ETagDBPtr->GetETag(TaskFilename))); - ActivityListETagOriginal.insert(std::make_pair(ActivityTaskID, ETagDBPtr->GetETagOriginal(TaskFilename))); - ActivityList.insert(std::make_pair(ActivityTaskID, 0)); - - } else if (TaskType == 2){ - - coldata.SetText(_("Deleting Contact '") + TaskDetail + _("'")); - itemindex = lstActivity->InsertItem(coldata); - - lstActivity->SetItem(itemindex, 1, AccountName); - lstActivity->SetItem(itemindex, 2, _("Queued")); - - ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir); - - ActivityList.insert(std::make_pair(ActivityTaskID, 0)); - ActivityListType.insert(std::make_pair(ActivityTaskID, 2)); - ActivityListData.insert(std::make_pair(ActivityTaskID, TaskData)); - ActivityListAccount.insert(std::make_pair(ActivityTaskID, TaskAccount)); - ActivityListConn.insert(std::make_pair(ActivityTaskID, CardDAVConn)); - ActivityListFilename.insert(std::make_pair(ActivityTaskID, TaskFilename)); - ActivityListIndex.insert(std::make_pair(ActivityTaskID, itemindex)); - - } else if (TaskType == 3){ - - coldata.SetText(_("Syncronising All Contacts")); - itemindex = lstActivity->InsertItem(coldata); - - lstActivity->SetItem(itemindex, 1, AccountName); - lstActivity->SetItem(itemindex, 2, _("Queued")); - - ActivityList.insert(std::make_pair(ActivityTaskID, 0)); - ActivityListType.insert(std::make_pair(ActivityTaskID, 3)); - ActivityListData.insert(std::make_pair(ActivityTaskID, TaskData)); - ActivityListConn.insert(std::make_pair(ActivityTaskID, CardDAVConn)); - ActivityListTaskDetail.insert(std::make_pair(ActivityTaskID, AccountPrefix)); - ActivityListAccount.insert(std::make_pair(ActivityTaskID, TaskAccount)); - ActivityListIndex.insert(std::make_pair(ActivityTaskID, itemindex)); - - } - - ProcessTasksData = TRUE; - - if (!ActProcessTimer.IsRunning()) { - - wxCommandEvent event(ACTMGR_STARTTIMER); - wxPostEvent(this, event); - - wxCommandEvent eventp(ACTMGR_STARTPROCESSTIMER); - wxPostEvent(this, eventp); - - //ActProcessTimer.Start(1000, FALSE); - //ActListProcTimer.Start(1000, FALSE); - - } - - // Update the recovery database. - - return ActivityTaskID; - -} - -void frmActivityMgr::RemoveTask(){ - - // Remove task from the recovery database. - -} - -void frmActivityMgr::StopTask( wxCommandEvent& event ){ - - // Check if activity has been completed already before stopping. - - long longSelected = -1; - int intSelectedData = 0; - - longSelected = lstActivity->GetNextItem(longSelected, - wxLIST_NEXT_ALL, - wxLIST_STATE_SELECTED); - - intSelectedData = (int)lstActivity->GetItemData(longSelected); - - if (longSelected == -1){ - return; - } - - std::map::iterator CDAVter; - - CDAVter = ActivityListConn.find(intSelectedData); - - CDAVter->second->Abort(); - - lstActivity->SetItem(longSelected, 2, _("Stopped")); - -} - -void frmActivityMgr::StopAllTasks( wxCommandEvent& event ){ - - // Check if activity has been completed already before stopping. - - // TODO: Look through for '1' and stop the running task(s). - - long longSelected = -1; - int intSelectedData = 0; - - longSelected = lstActivity->GetNextItem(longSelected, - wxLIST_NEXT_ALL, - wxLIST_STATE_SELECTED); - - intSelectedData = (int)lstActivity->GetItemData(longSelected); - - if (longSelected == -1){ - return; - } - - std::map::iterator CDAVter; - - CDAVter = ActivityListConn.find(intSelectedData); - - CDAVter->second->Abort(); - - lstActivity->SetItem(longSelected, 2, _("Stopped")); - AnimationTimer.StopAnimation(); - bmpActivity->SetBitmap(SleepBitmap); - lblDetails->SetLabel(_("No activity.")); - -} - -void frmActivityMgr::RetryTask( wxCommandEvent& event ){ - - // Check if activity has been completed already before retrying. - - long longSelected = -1; - int intSelectedData = 0; - - longSelected = lstActivity->GetNextItem(longSelected, - wxLIST_NEXT_ALL, - wxLIST_STATE_SELECTED); - - intSelectedData = (int)lstActivity->GetItemData(longSelected); - - if (longSelected == -1){ - return; - } - - std::map::iterator CDAVter; - - CDAVter = ActivityListConn.find(intSelectedData); - - // Restart the task. - - //CDAVter->second.Abort(); - - std::map::iterator Iter; - Iter = ActivityList.find(intSelectedData); - - Iter->second = 0; - - AnimationTimer.StartAnimation(); - - if (!ActProcessTimer.IsRunning()) { - - ActProcessTimer.Start(150, FALSE); - ActListProcTimer.Start(150, FALSE); - - } - - //lstActivity->SetItem(longSelected, 2, _("Processing...")); - -} - void frmActivityMgr::OpenWindow() { WindowOpen = TRUE; @@ -489,8 +196,16 @@ void frmActivityMgr::ProcessTasksThread() } + if (ApplicationSleepMode == TRUE){ + + return; + + } + std::map::iterator TypeIter; std::map::iterator StringIter; + std::map::iterator StringDataIter; + std::map::iterator StringURLIter; std::map::iterator StringDetailIter; std::map::iterator StringAccountIter; std::map::iterator StringFilenameIter; @@ -499,10 +214,12 @@ void frmActivityMgr::ProcessTasksThread() std::map::iterator StringETagIter; std::map::iterator StringETagOrigIter; std::map::iterator CardDAVIter; + std::map::iterator ConnObjectIter; + std::map::iterator AccountSettingsIter; std::map::iterator LongIter; bool TasksFoundProc = FALSE; wxString TaskDetail; - + for (std::map::iterator iter = ActivityList.begin(); iter != ActivityList.end(); ++iter){ @@ -512,13 +229,35 @@ 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); + ConnObjectIter = ActivityListConnObject.find(iter->first); TypeIter = ActivityListType.find(iter->first); StringETagIter = ActivityListETag.find(iter->first); StringETagOrigIter = ActivityListETagOriginal.find(iter->first); StringAccountIter = ActivityListAccount.find(iter->first); StringFilenameIter = ActivityListFilename.find(iter->first); StringFullFilenameIter = ActivityListFullFilename.find(iter->first); + AccountSettingsIter = ActivityListAccSettings.find(iter->first); + + // Setup the CardDAV object. + + CardDAV ConnHandle; + + ConnHandle.SetupConnection(AccountSettingsIter->second.Address, + AccountSettingsIter->second.Port, + AccountSettingsIter->second.Username, + AccountSettingsIter->second.Password, + AccountSettingsIter->second.SSL, + AccountSettingsIter->second.Prefix, + AccountSettingsIter->second.Dir); + ConnHandle.SetupVariables(&ActivityList, iter->first); + ConnHandle.SetupResultBools(&BlankBool, &BlankBool); // 0 = Queued. // 1 = Processing. @@ -530,6 +269,9 @@ void frmActivityMgr::ProcessTasksThread() // 7 = (Reserved) (UI Updated). // 8 = Completed. (UI Updated). + frmMain *frmMainPtrGet = static_cast(frmMainPtr); + XABPreferences PrefData(GetUserPrefDir()); + if (iter->second == 0){ //CardDAVIter->second. @@ -545,272 +287,902 @@ void frmActivityMgr::ProcessTasksThread() wxString ContactFilename; wxString FullFilename; wxString ETagResult; + bool EditMode = FALSE; iter->second = 1; - if (TypeIter->second == 1){ - CardDAVIter->second->GetServerETagValueThread(); - ETagServer = CardDAVIter->second->ETagValueResult(); - } - // Compare the ETags and work out if a conflict has occured. - if (TypeIter->second == 1){ - + if (TypeIter->second == 0){ + + // Add a contact. + + StringDataIter = ActivityListData.find(iter->first); + StringURLIter = ActivityListURL.find(iter->first); + + AccountDir = StringAccountIter->second; + ContactFilename = StringFilenameIter->second; + wxString AccountNameFriendly; + + int AccountID = 0; + + for (int i = 0; i < PrefData.accounts.GetCount(); i++){ + + wxString AccountDirCheck = PrefData.accounts.GetAccountDirectory(i); + + AccountDirCheck.Trim(); + AccountDirCheck.Append(wxT(".carddav")); + + if (AccountDirCheck == StringAccountIter->second){ + + AccountNameFriendly = PrefData.accounts.GetAccountName(i); + AccountID = i; + + } + + } + + ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir); + ETag = StringETagIter->second; ETagOriginal = StringETagOrigIter->second; AccountDir = StringAccountIter->second; ContactFilename = StringFilenameIter->second; FullFilename = StringFullFilenameIter->second; + EditMode = ActivityListEditMode.find(iter->first)->second; - ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir); - - if (ETag == ETagOriginal){ - - // Compare the ETag with the Server ETag. - - if (ETagOriginal != ETagServer){ + bool KeepUpdating = true; - // Server ETag is different from original ETag. - // This is a conflict which the user will now - // need to resolve. + while(KeepUpdating == true){ - vCard Moo1; - vCard Moo2; + COConnectResult ConnectResponse = ConnObjectIter->second->Connect(false); - frmMain *frmMainPtrGet = static_cast(frmMainPtr); + bool ExitLoop = false; - vCard34Conv vCard34Obj; + while (ExitLoop == false){ - wxString ServerContactData; - vCard ClientData; - vCard ConvertedV4Data; - - // Load the client data from the filename given. - - CardDAVIter->second->GetServerContactData(); - ServerContactData = CardDAVIter->second->GetPageData(); + if (ConnObjectIter->second->SSLVerify() == COSSL_UNABLETOVERIFY){ + + frmMainPtrGet->PauseAllTimers(); + +#if defined(__APPLE__) +#elif defined(__WIN32__) +#else + + bool UsingSSLBypass = false; + int SSLResult = 0; + + // Connect again and fetch SSL certificate information. + + ConnObjectIter->second->BypassSSLVerification(true); + + COConnectResult ConnectionSSLResult = ConnObjectIter->second->Connect(false); + + ConnObjectIter->second->BypassSSLVerification(false); + + SSLInvalidCertNotifObjString SSLICNProcData; + + SSLCertCollectionString certcol = ConnObjectIter->second->BuildSSLCollection(); + + bool *PauseMode = new bool; + QRNotif qrn; + + *PauseMode = TRUE; + qrn.QResponse = &SSLResult; + qrn.PausePtr = PauseMode; + + SSLICNProcData.CertCollection = certcol; + SSLICNProcData.QRNotifData = &qrn; + SSLICNProcData.AccountName = AccountNameFriendly; + + wxCommandEvent event(INVALIDSSLCERTSTRING); + event.SetClientData(&SSLICNProcData); + wxPostEvent(frmMainPtrGet, event); + + while (*PauseMode == TRUE){ + //nanosleep(&n1, &n2); + SleepFor(250000000); + } + + // Process the response from the user. + + if (SSLResult == 1){ + + // Accept the Certificate. + + UsingSSLBypass = true; + ConnObjectIter->second->BypassSSLVerification(true); + + COConnectResult TestConnectionResult = ConnObjectIter->second->Connect(true); + WriteServerCertificate(AccountDir, certcol); + + ConnObjectIter->second->BypassSSLVerification(false); + + } else if (SSLResult == 2){ - // Process v3 version into v4 version. + // Reject the certificate, abort the task and mark as failed. + + iter->second = 2; + break; + + } + +#endif + + frmMainPtrGet->ResumeAllTimers(); + ExitLoop = true; + + } else if (ConnectResponse == COCONNECT_AUTHFAIL){ + + ConnectResponse = ConnObjectIter->second->Connect(true); + + if (ConnectResponse == COCONNECT_OK){ + + ExitLoop = true; + break; + + } else { + + ExitLoop = true; + iter->second = 2; + break; + + } + + } else if (ConnectResponse == COCONNECT_OK){ + + ConnectResponse = ConnObjectIter->second->Connect(true); + + ExitLoop = true; + break; + + } else { + + ExitLoop = true; + iter->second = 2; + break; + + } - vCard34Obj.ConvertToV4(&ServerContactData, &ConvertedV4Data); + } - vCardConflictObj vCardProcData; + if (iter->second == 2 || iter->second == 3 || iter->second == 4){ + break; + } - vCardProcData.vCardLocalData = &ClientData; - vCardProcData.vCardServerData = &ConvertedV4Data; - ClientData.LoadFile(FullFilename); +#if defined(__APPLE__) + + frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetTrustObject()); - //ContactConflictEvent event(ContactConflictCmdEnv); - //event.SetData(ContactFilename, Moo1, Moo2); +#elif defined(__WIN32__) + + frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateContextPointer()); + +#else - //wxPostEvent(frmMainPtrGet, event); + frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateData()); - // Setup Conflict Resolution Dialog. +#endif - // Fetch Data from Server and convert. + COServerResponse AddContactResponse = ConnObjectIter->second->AddContact(StringURLIter->second.ToStdString(), + StringDataIter->second.ToStdString()); - bool *PauseMode = new bool; - int ConflictResult; - QRNotif qrn; - - *PauseMode = TRUE; - qrn.QResponse = &ConflictResult; - qrn.PausePtr = PauseMode; - - vCardProcData.QRNotifData = &qrn; + if (AddContactResponse.RequestResult != COREQUEST_OK){ + iter->second = 2; + break; + } - wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED); - event.SetClientData(&vCardProcData); - wxPostEvent(frmMainPtrGet, event); - - /*timespec n1, n2; + /*while (ExitLoop == FALSE){ - n1.tv_sec = 0; - n1.tv_nsec = 250000000L;*/ + // Verify that we have a trusted SSL connection first. - while (*PauseMode == TRUE){ - //nanosleep(&n1, &n2); - SleepFor(250000000); + int ErrorCode = ConnHandle.SSLVerifyTest(); + + if (ErrorCode != CURLE_OK){ + + 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. + + // Stop all the timers. + + frmMainPtrGet->PauseAllTimers(); + + int SSLResult; + +#if defined(__APPLE__) + + // Bring up the trust panel and display the SSL certificate dialog. + + SSLResult = DisplayTrustPanel(ConnHandle.GetTrustObject(), AccountNameFriendly); + + // Update the SSL account with the trust object. + + if (SSLResult != NSOKButton){ + + frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetTrustObject()); + iter->second = 2; + break; + + } else { + + 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; + + *PauseMode = TRUE; + qrn.QResponse = &SSLResult; + qrn.PausePtr = PauseMode; + + SSLICNProcData.CertCollection = certcol; + SSLICNProcData.QRNotifData = &qrn; + SSLICNProcData.AccountName = AccountNameFriendly; + + wxCommandEvent event(INVALIDSSLCERT); + event.SetClientData(&SSLICNProcData); + wxPostEvent(frmMainPtrGet, event); + + while (*PauseMode == TRUE){ + //nanosleep(&n1, &n2); + SleepFor(250000000); + } + + // Process the response from the user. + + if (SSLResult == 1){ + + // 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()); + + } else if (SSLResult == 2){ + + // Reject the certificate, abort the task and mark as failed. + + frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetCertificateData()); + iter->second = 2; + break; + + } + +#endif + + // Resume all the timers. + + frmMainPtrGet->ResumeAllTimers(); + ExitLoop = TRUE; + + } else { + + iter->second = 2; + break; + + } + + } else { + + ExitLoop = TRUE; + } + + } - delete PauseMode; - PauseMode = NULL; + if (iter->second == 2 || iter->second == 3 || iter->second == 4){ + break; + } - //intResult = frmMainPtrGet->ShowConflictDialog(&Moo1, &Moo2); +#if defined(__APPLE__) - if (ConflictResult == 0){ + frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetTrustObject()); + +#elif defined(__WIN32__) + + frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateContextPointer()); + +#else - // Decide Later. + frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateData()); - iter->second = 4; - continue; +#endif - } else if (ConflictResult == 1){ + 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. - // Decided to use client version. + ConnHandle.GetServerETagValueThread(); + ETagServer = ConnHandle.ETagValueResult();*/ - CardDAVIter->second->ProcessData(); - - iter->second = 4; + // TODO: Get the entity tag for the new contact. - } else if (ConflictResult == 2){ - // Decided to use server version. - - // Download server version. + + ETagDBPtr->AddETag(ContactFilename, ETagServer, ETagServer); + + iter->second = 4; + break; + + } + + } else if (TypeIter->second == 1){ + + // Update a contact. + + StringDataIter = ActivityListData.find(iter->first); + StringURLIter = ActivityListURL.find(iter->first); + + AccountDir = StringAccountIter->second; + ContactFilename = StringFilenameIter->second; + wxString AccountNameFriendly; + + int AccountID = 0; + + for (int i = 0; i < PrefData.accounts.GetCount(); i++){ + + wxString AccountDirCheck = PrefData.accounts.GetAccountDirectory(i); + + AccountDirCheck.Trim(); + AccountDirCheck.Append(wxT(".carddav")); + + if (AccountDirCheck == StringAccountIter->second){ - ConvertedV4Data.WriteFile(FullFilename); + AccountNameFriendly = PrefData.accounts.GetAccountName(i); + AccountID = i; - iter->second = 4; + } - } + } - } else { + ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir); - // Update the data to the server. - - CardDAVIter->second->ProcessData(); + ETag = StringETagIter->second; + ETagOriginal = StringETagOrigIter->second; + AccountDir = StringAccountIter->second; + ContactFilename = StringFilenameIter->second; + FullFilename = StringFullFilenameIter->second; + EditMode = ActivityListEditMode.find(iter->first)->second; + bool KeepUpdating = TRUE; + + while(KeepUpdating == TRUE){ + + bool ExitLoop = FALSE; + + while (ExitLoop == FALSE){ + + int ErrorCode = ConnHandle.SSLVerifyTest(); + + if (ErrorCode != CURLE_OK){ + + 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. + + // Stop all the timers. + + frmMainPtrGet->PauseAllTimers(); + + int SSLResult; + +#if defined(__APPLE__) + + // Bring up the trust panel and display the SSL certificate dialog. + + SSLResult = DisplayTrustPanel(ConnHandle.GetTrustObject(), AccountNameFriendly); + + // Update the SSL account with the trust object. + + if (SSLResult != NSOKButton){ + + frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetTrustObject()); + iter->second = 2; + break; + + } else { + + 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; + + *PauseMode = TRUE; + qrn.QResponse = &SSLResult; + qrn.PausePtr = PauseMode; + + SSLICNProcData.CertCollection = certcol; + SSLICNProcData.QRNotifData = &qrn; + SSLICNProcData.AccountName = AccountNameFriendly; + + wxCommandEvent event(INVALIDSSLCERT); + event.SetClientData(&SSLICNProcData); + wxPostEvent(frmMainPtrGet, event); + + while (*PauseMode == TRUE){ + //nanosleep(&n1, &n2); + SleepFor(250000000); + } + + // Process the response from the user. + + if (SSLResult == 1){ + + // Accept the certificate. Write the certificate into the account + // directory (as server.crt) - will overwrite old certificate. + + 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.GetSSLVerifyResults()); + iter->second = 2; + break; + + } + +#endif + + // Resume all the timers. + + frmMainPtrGet->ResumeAllTimers(); + ExitLoop = TRUE; + + } else { + + iter->second = 2; + break; + + } + + } else { + + ExitLoop = TRUE; + + } + } - - } else { - + + if (iter->second == 2 || iter->second == 3 || iter->second == 4){ + break; + } + +#if defined(__APPLE__) + + frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetTrustObject()); + +#elif defined(__WIN32__) + + frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateContextPointer()); + +#else + + 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){ - + // Server ETag is different from original ETag. // This is a conflict which the user will now // need to resolve. - - frmMain *frmMainPtrGet = (frmMain *)frmMainPtr; - - //ContactConflictEvent event(ContactConflictCmdEnv); - //event.SetData(ContactFilename, Moo1, Moo2); - + + vCard Moo1; + vCard Moo2; + + frmMain *frmMainPtrGet = static_cast(frmMainPtr); + vCard34Conv vCard34Obj; wxString ServerContactData; vCard ClientData; vCard ConvertedV4Data; - + // Load the client data from the filename given. - - CardDAVIter->second->GetServerContactData(); - ServerContactData = CardDAVIter->second->GetPageData(); - ClientData.LoadFile(FullFilename); + + ConnHandle.GetServerContactData(); + ServerContactData = ConnHandle.GetPageData(); // Process v3 version into v4 version. vCard34Obj.ConvertToV4(&ServerContactData, &ConvertedV4Data); - + vCardConflictObj vCardProcData; - + vCardProcData.vCardLocalData = &ClientData; vCardProcData.vCardServerData = &ConvertedV4Data; - + ClientData.LoadFile(FullFilename); + + //ContactConflictEvent event(ContactConflictCmdEnv); + //event.SetData(ContactFilename, Moo1, Moo2); + + //wxPostEvent(frmMainPtrGet, event); + + // Setup Conflict Resolution Dialog. + + // Fetch Data from Server and convert. + bool *PauseMode = new bool; int ConflictResult; QRNotif qrn; - - *PauseMode = TRUE; + + *PauseMode = TRUE; qrn.QResponse = &ConflictResult; qrn.PausePtr = PauseMode; vCardProcData.QRNotifData = &qrn; - + wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED); 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); } - + delete PauseMode; PauseMode = NULL; - + //intResult = frmMainPtrGet->ShowConflictDialog(&Moo1, &Moo2); - + if (ConflictResult == 0){ - + // Decide Later. - + iter->second = 4; - continue; + break; + + } else if (ConflictResult == 1){ + + // Decided to use client version. + + ConnHandle.ProcessData(); + + } else if (ConflictResult == 2){ + + // Decided to use server version. + + // Download server version. + + ConvertedV4Data.WriteFile(FullFilename); + + } + + } else { + + // Update the data to the server. + + ConnHandle.ProcessData(); + + } + + // Update the ETag DB. + + ConnHandle.GetServerETagValueThread(); + ETagServer = ConnHandle.ETagValueResult(); + ETagDBPtr->UpdateETag(ContactFilename, ETagServer, ETagServer); + + iter->second = 4; + break; + + } + + } else if (TypeIter->second == 2) { + + // Delete the contact from the server and update the ETag DB. + + AccountDir = StringAccountIter->second; + ContactFilename = StringFilenameIter->second; + wxString AccountNameFriendly; + + int AccountID = 0; + + for (int i = 0; i < PrefData.accounts.GetCount(); i++){ - } else if (ConflictResult == 1){ + wxString AccountDirCheck = PrefData.accounts.GetAccountDirectory(i); - // Decided to use client version. + AccountDirCheck.Trim(); + AccountDirCheck.Append(wxT(".carddav")); - CardDAVIter->second->ProcessData(); - //ETagServer = CardDAVIter->second.GetServerETagValueThread(); - //ETagDBPtr->UpdateETag(ContactFilename, ETagServer, ETagServer); + if (AccountDirCheck == StringAccountIter->second){ - iter->second = 4; + AccountNameFriendly = PrefData.accounts.GetAccountName(i); + AccountID = i; + + } - } else if (ConflictResult == 2){ + } + + ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir); + + bool KeepUpdating = TRUE; + + while(KeepUpdating == TRUE){ + + bool ExitLoop = FALSE; - // Decided to use server version. + while (ExitLoop == FALSE){ + + int ErrorCode = ConnHandle.SSLVerifyTest(); + + if (ErrorCode != CURLE_OK){ + + 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. + + // Stop all the timers. + + frmMainPtrGet->PauseAllTimers(); + + int SSLResult; + +#if defined(__APPLE__) + + // Bring up the trust panel and display the SSL certificate dialog. + + SSLResult = DisplayTrustPanel(ConnHandle.GetTrustObject(), AccountNameFriendly); + + // Update the SSL account with the trust object. + + if (SSLResult != NSOKButton){ + + frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetTrustObject()); + iter->second = 2; + break; + + } else { + + 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; + + *PauseMode = TRUE; + qrn.QResponse = &SSLResult; + qrn.PausePtr = PauseMode; + + SSLICNProcData.CertCollection = certcol; + SSLICNProcData.QRNotifData = &qrn; + SSLICNProcData.AccountName = AccountNameFriendly; + + wxCommandEvent event(INVALIDSSLCERT); + 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); + } + + // Process the response from the user. + + if (SSLResult == 1){ + + // Accept the certificate. Write the certificate into the account + // directory (as server.crt) - will overwrite old certificate. + + 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.GetSSLVerifyResults()); + iter->second = 2; + break; + + } + +#endif + + // Resume all the timers. + + frmMainPtrGet->ResumeAllTimers(); + ExitLoop = TRUE; + + } else { + + iter->second = 4; + break; + + } - // Write server version to file. + } else { - ConvertedV4Data.WriteFile(FullFilename); + ExitLoop = TRUE; - iter->second = 4; - } - - } else { - - // Update the data to the server. - CardDAVIter->second->ProcessData(); + } + if (iter->second == 2 || iter->second == 3 || iter->second == 4){ + break; } - } +#if defined(__APPLE__) - // Update the ETag DB. + frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetTrustObject()); + +#elif defined(__WIN32__) + + frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateContextPointer()); + +#else - CardDAVIter->second->GetServerETagValueThread(); - ETagServer = CardDAVIter->second->ETagValueResult(); - ETagDBPtr->UpdateETag(ContactFilename, ETagServer, ETagServer); - - iter->second = 4; - CardDAVIter->second = NULL; - - } else if (TypeIter->second == 2) { - - // Delete the contact from the server and update the ETag DB. + frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetSSLVerifyResults()); - AccountDir = StringAccountIter->second; - ContactFilename = StringFilenameIter->second; - - ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir); +#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; + } - CardDAVIter->second->SetUploadMode(FALSE); - CardDAVIter->second->SetupData(wxT("DELETE"), ContactFilename, wxT("")); - //CardDAVIter->second.SetServerFilename(); - CardDAVIter->second->ProcessData(); - ETagDBPtr->RemoveETag(ContactFilename); + ETagDBPtr->RemoveETag(ContactFilename); - iter->second = 4; - CardDAVIter->second = NULL; + iter->second = 4; + CardDAVIter->second = NULL; + break; + + } } else if (TypeIter->second == 3) { - - frmMain *frmMainPtrGet = static_cast(frmMainPtr); wxString AccountNameFriendly; - wxString PrefFilename = GetUserPrefDir(); - XABPreferences PrefData(PrefFilename); int AccountID = 0; for (int i = 0; i < PrefData.accounts.GetCount(); i++){ @@ -901,21 +1273,16 @@ void frmActivityMgr::ProcessTasksThread() std::map *SCListData = NULL; while (ExitLoop == FALSE){ - - ServerContactList = CardDAVIter->second->GetContactList(SyncTokenLoad.ToUTF8()); - SSLCertCollection certcol = CardDAVIter->second->GetCertificateData(); - - // Create a pointer for the std::map. - - SCListData = &ServerContactList.ListData; // Check if any errors have occured whilst getting the data. - int ErrorCode = CardDAVIter->second->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. @@ -924,12 +1291,57 @@ void frmActivityMgr::ProcessTasksThread() frmMainPtrGet->PauseAllTimers(); + int SSLResult; + +#if defined(__APPLE__) + + // Bring up the trust panel and display the SSL certificate dialog. + + SSLResult = DisplayTrustPanel(ConnHandle.GetTrustObject(), AccountNameFriendly); + + // Update the SSL account with the trust object. + + if (SSLResult != NSOKButton){ + + frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetTrustObject()); + iter->second = 2; + break; + + } else { + + 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; - int SSLResult; QRNotif qrn; *PauseMode = TRUE; @@ -963,22 +1375,25 @@ void frmActivityMgr::ProcessTasksThread() // Accept the certificate. Write the certificate into the account // directory (as server.crt) - will overwrite old certificate. - frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, CardDAVIter->second->GetCertificateData()); - WriteServerCertificate(AccountDir, CardDAVIter->second->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, CardDAVIter->second->GetCertificateData()); + frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetSSLVerifyResults()); iter->second = 2; break; } + +#endif // Resume all the timers. frmMainPtrGet->ResumeAllTimers(); + ExitLoop = TRUE; } else { @@ -999,8 +1414,20 @@ void frmActivityMgr::ProcessTasksThread() break; } - frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, CardDAVIter->second->GetCertificateData()); - +#if defined(__APPLE__) + + frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetTrustObject()); + +#elif defined(__WIN32__) + + frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateContextPointer()); + +#else + + frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetSSLVerifyResults()); + +#endif + // Look in directory and see which vCards to add and delete // In short: @@ -1014,6 +1441,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){ @@ -1091,6 +1535,15 @@ void frmActivityMgr::ProcessTasksThread() wxString ETagSrv = fsd.ETagData; + // Check if the local ETag value has 'DELETED' set and skip + // checking this file if it does. + + if (etd.ETagValue == "DELETED"){ + + continue; + + } + // Compare local ETag with original local ETag. // If different, update to server is required. @@ -1112,9 +1565,9 @@ void frmActivityMgr::ProcessTasksThread() // Get the server contact data for comparison. - CardDAVIter->second->SetServerFilename(srviter->first); - CardDAVIter->second->GetServerContactData(); - ServerContactData = CardDAVIter->second->GetPageData(); + ConnHandle.SetServerFilename(srviter->first); + ConnHandle.GetServerContactData(); + ServerContactData = ConnHandle.GetPageData(); FullFilename = CreateFilenamePath(AccountDirFinal, srviter->first); @@ -1248,9 +1701,9 @@ void frmActivityMgr::ProcessTasksThread() vCard34Conv vCard34Obj; - CardDAVIter->second->SetServerFilename(additer->first); - CardDAVIter->second->GetServerContactData(); - vCardInputData = CardDAVIter->second->GetPageData(); + ConnHandle.SetServerFilename(additer->first); + ConnHandle.GetServerContactData(); + vCardInputData = ConnHandle.GetPageData(); vCard34Obj.ConvertToV4(&vCardInputData, &ConvertedV4Data); @@ -1270,8 +1723,8 @@ void frmActivityMgr::ProcessTasksThread() // Get the server ETag. wxString ServerETag; - CardDAVIter->second->GetServerETagValueThread(); - ServerETag = CardDAVIter->second->ETagValueResult(); + ConnHandle.GetServerETagValueThread(); + ServerETag = ConnHandle.ETagValueResult(); // Add to the ETag Database. @@ -1296,8 +1749,8 @@ void frmActivityMgr::ProcessTasksThread() // Update the ETagDB. wxString ServerETag; - CardDAVIter->second->GetServerETagValueThread(); - ServerETag = CardDAVIter->second->ETagValueResult(); + ConnHandle.GetServerETagValueThread(); + ServerETag = ConnHandle.ETagValueResult(); // Add to the ETag Database. @@ -1361,9 +1814,9 @@ void frmActivityMgr::ProcessTasksThread() // Compare the ETag with the Server ETag. - CardDAVIter->second->SetServerFilename(vCardAdd[vi]); - CardDAVIter->second->GetServerETagValueThread(); - ETagServer = CardDAVIter->second->ETagValueResult(); + ConnHandle.SetServerFilename(vCardAdd[vi]); + ConnHandle.GetServerETagValueThread(); + ETagServer = ConnHandle.ETagValueResult(); if (ETagOriginal != ETagServer){ @@ -1381,8 +1834,8 @@ void frmActivityMgr::ProcessTasksThread() // Load the client data from the filename given. - CardDAVIter->second->GetServerContactData(); - ServerContactData = CardDAVIter->second->GetPageData(); + ConnHandle.GetServerContactData(); + ServerContactData = ConnHandle.GetPageData(); // Process v3 version into v4 version. @@ -1443,7 +1896,7 @@ void frmActivityMgr::ProcessTasksThread() // Decided to use client version. - CardDAVIter->second->ProcessData(); + ConnHandle.ProcessData(); iter->second = 4; @@ -1492,15 +1945,15 @@ void frmActivityMgr::ProcessTasksThread() // Upload the data to the server. - CardDAVIter->second->SetUploadMode(TRUE); - CardDAVIter->second->SetupData(wxT("PUT"), vCardAdd[vi], TaskData); - CardDAVIter->second->ProcessData(); + ConnHandle.SetUploadMode(TRUE); + ConnHandle.SetupData(wxT("PUT"), vCardAdd[vi], TaskData); + ConnHandle.ProcessData(); // Get the Server ETag and put it in the ETag database. - CardDAVIter->second->SetServerFilename(vCardAdd[vi]); - CardDAVIter->second->GetServerETagValueThread(); - ETagServer = CardDAVIter->second->ETagValueResult(); + ConnHandle.SetServerFilename(vCardAdd[vi]); + ConnHandle.GetServerETagValueThread(); + ETagServer = ConnHandle.ETagValueResult(); ETagDBPtr->AddETag(vCardAdd[vi], ETagServer, ETagServer); @@ -1527,8 +1980,8 @@ void frmActivityMgr::ProcessTasksThread() // Load the client data from the filename given. - CardDAVIter->second->GetServerContactData(); - ServerContactData = CardDAVIter->second->GetPageData(); + ConnHandle.GetServerContactData(); + ServerContactData = ConnHandle.GetPageData(); ClientData.LoadFile(FullFilename); // Process v3 version into v4 version. @@ -1580,7 +2033,7 @@ void frmActivityMgr::ProcessTasksThread() // Decided to use client version. - CardDAVIter->second->ProcessData(); + ConnHandle.ProcessData(); //ETagServer = CardDAVIter->second.GetServerETagValueThread(); //ETagDBPtr->UpdateETag(ContactFilename, ETagServer, ETagServer); @@ -1631,15 +2084,15 @@ void frmActivityMgr::ProcessTasksThread() // Upload the data to the server. - CardDAVIter->second->SetUploadMode(TRUE); - CardDAVIter->second->SetupData(wxT("PUT"), vCardAdd[vi], TaskData); - CardDAVIter->second->ProcessData(); + ConnHandle.SetUploadMode(TRUE); + ConnHandle.SetupData(wxT("PUT"), vCardAdd[vi], TaskData); + ConnHandle.ProcessData(); // Get the Server ETag and put it in the ETag database. - CardDAVIter->second->SetServerFilename(vCardAdd[vi]); - CardDAVIter->second->GetServerETagValueThread(); - ETagServer = CardDAVIter->second->ETagValueResult(); + ConnHandle.SetServerFilename(vCardAdd[vi]); + ConnHandle.GetServerETagValueThread(); + ETagServer = ConnHandle.ETagValueResult(); ETagDBPtr->AddETag(vCardAdd[vi], ETagServer, ETagServer); @@ -1667,7 +2120,7 @@ void frmActivityMgr::ProcessTasksThread() // Process the vCards to delete from the server. std::map *ETagFilenameMap = ETagDBPtr->GetFilenamePointer(); - + std::list DeleteList; for (std::map::iterator deliter = ETagFilenameMap->begin(); deliter != ETagFilenameMap->end(); deliter++){ @@ -1676,17 +2129,24 @@ void frmActivityMgr::ProcessTasksThread() if (deliter->second == wxT("DELETED")){ - CardDAVIter->second->SetUploadMode(FALSE); - CardDAVIter->second->SetupData(wxT("DELETE"), deliter->first, wxT("")); - CardDAVIter->second->ProcessData(); + ConnHandle.SetUploadMode(FALSE); + ConnHandle.SetupData(wxT("DELETE"), deliter->first, wxT("")); + ConnHandle.ProcessDataThread(); // Delete the ETag as the file has now been deleted. - ETagDBPtr->RemoveETag(deliter->first); + DeleteList.push_back(deliter->first); } } + + for (std::list::iterator removeetagiter = DeleteList.begin(); + removeetagiter != DeleteList.end(); removeetagiter++){ + + ETagDBPtr->RemoveETag(*removeetagiter); + + } // Write out the update server sync token. @@ -1736,7 +2196,7 @@ void frmActivityMgr::ProcessTasksThread() // Update the data to the server. - CardDAVIter->second->ProcessData(); + ConnHandle.ProcessData(); iter->second = 4; continue; @@ -1760,8 +2220,8 @@ void frmActivityMgr::ProcessTasksThread() AccountDir = StringAccountIter->second; ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir); - CardDAVIter->second->GetServerETagValueThread(); - ETagServer = CardDAVIter->second->ETagValueResult(); + ConnHandle.GetServerETagValueThread(); + ETagServer = ConnHandle.ETagValueResult(); ETagDBPtr->UpdateETag(ContactFilename, ETagServer, ETagServer); } @@ -1772,8 +2232,8 @@ void frmActivityMgr::ProcessTasksThread() AccountDir = StringAccountIter->second; ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir); - CardDAVIter->second->GetServerETagValueThread(); - ETagServer = CardDAVIter->second->ETagValueResult(); + ConnHandle.GetServerETagValueThread(); + ETagServer = ConnHandle.ETagValueResult(); ETagDBPtr->UpdateETag(ContactFilename, ETagServer, ETagServer); } @@ -1798,7 +2258,7 @@ void frmActivityMgr::ProcessTasksThread() //ActListProcTimer.Start(); } - + wxCommandEvent event(ACTMGR_STARTPROCESSTIMER); wxPostEvent(this, event); @@ -1808,7 +2268,7 @@ void frmActivityMgr::ProcessTasksThread() void frmActivityMgr::ProcessTasks() { - + std::thread ProcessThread(&frmActivityMgr::ProcessTasksThread, this); ProcessThread.detach(); @@ -1835,36 +2295,27 @@ void frmActivityMgr::ResumeProcessing(wxCommandEvent &event){ } -int frmActivityMgr::GetTaskStatus(int intTaskID){ - - int intResult = 2; - - if (ActivityList.find(intTaskID) == ActivityList.end()){ - - return intResult; - - } - - std::map::iterator taskiter = ActivityList.find(intTaskID); - intResult = taskiter->second; - - return intResult; - -} - 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); } @@ -1872,6 +2323,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; @@ -1892,6 +2351,26 @@ void frmActivityMgr::WriteServerCertificate(wxString AccountName, SSLCertCollect } +void frmActivityMgr::WriteServerCertificate(wxString AccountName, SSLCertCollectionString SSLCertInc){ + + wxString ServerCertFinal; + + // Get the Cert section of the certificate and write it to the file. + + ServerCertFinal = GetAccountDir(AccountName, TRUE); + + wxFile CertFile; + + std::map::iterator SSLCDIter = SSLCertInc.SSLCollection.find(0); + std::multimap::iterator SSLDataIter = SSLCDIter->second.CertData.find("Cert"); + + CertFile.Open(ServerCertFinal, wxFile::write); + + CertFile.Write(SSLDataIter->second, wxConvUTF8); + CertFile.Close(); + +} + void frmActivityMgr::StartTimer(wxCommandEvent& event){ ActListProcTimer.Start(1000, FALSE); @@ -1916,6 +2395,12 @@ void frmActivityMgr::StopProcessTimer(wxCommandEvent& event){ } +void frmActivityMgr::StartAnimationTimer(wxCommandEvent& event){ + + AnimationTimer.StartAnimation(); + +} + void frmActivityMgr::UpdateStatusLabel(wxCommandEvent& event){ ActivityMgrLabelUpdate *actmgrudata = (ActivityMgrLabelUpdate*)event.GetClientData(); @@ -1933,6 +2418,4 @@ void frmActivityMgr::UpdateStatusLabel(wxCommandEvent& event){ } -} - -#endif \ No newline at end of file +} \ No newline at end of file