X-Git-Url: http://Server1/repobrowser/?p=xestiaab%2F.git;a=blobdiff_plain;f=source%2Factmgr%2FfrmActivityMgr.cpp;h=be5f40aa2eddd38fe7152c8d3c2100694364ddac;hp=aeb28cbb10839934ab683a8aa346340bcad9ae39;hb=ccc379ac30775d5b73698b83875a35fc1bfa56d0;hpb=108e3725dc07949bb3219644aacef219879264a7 diff --git a/source/actmgr/frmActivityMgr.cpp b/source/actmgr/frmActivityMgr.cpp index aeb28cb..be5f40a 100644 --- a/source/actmgr/frmActivityMgr.cpp +++ b/source/actmgr/frmActivityMgr.cpp @@ -24,6 +24,7 @@ #include #include #include +#include #include #include "../bitmaps.h" @@ -37,9 +38,6 @@ #include "../vcard/vcard34conv.h" #include "../vcard/vcard.h" -#ifndef FRMACTIVITYMGR_H -#define FRMACTIVITYMGR_H - DEFINE_EVENT_TYPE(ACTMGR_RESUMEPROC); DEFINE_EVENT_TYPE(ACTMGR_TOGGLECONN); DEFINE_EVENT_TYPE(ACTMGR_STARTTIMER); @@ -47,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) @@ -56,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 ) @@ -80,7 +80,7 @@ frmActivityMgrADT( parent ) ActListProcTimer.SetupPointers(&ActivityList, &ActivityListIndex, &ActivityListTaskDetail, &TasksActive, lstActivity, lblDetails, GauProgress, this, &AnimationTimer, - &ActProcessTimer, &ActivityListFinDate, &ActivityListConn); + &ActProcessTimer, &ActivityListFinDate, &ActivityListConnObject); AnimationTimer.SetBitmap(bmpActivity); AnimationTimer.SetSleepBitmap(&SleepBitmap); @@ -196,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; @@ -205,11 +213,12 @@ void frmActivityMgr::ProcessTasksThread() std::map::iterator StringTaskDetailIter; 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){ @@ -219,13 +228,22 @@ void frmActivityMgr::ProcessTasksThread() continue; } - CardDAVIter = ActivityListConn.find(iter->first); + wxCommandEvent StartAnimationEvent(ACTMGR_STARTANIMATIONTIMER); + + wxPostEvent(this, StartAnimationEvent); + + // Start the animation timer if it hasn't started. + + 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. // 0 = Queued. // 1 = Processing. @@ -237,9 +255,10 @@ void frmActivityMgr::ProcessTasksThread() // 7 = (Reserved) (UI Updated). // 8 = Completed. (UI Updated). - if (iter->second == 0){ + frmMain *frmMainPtrGet = static_cast(frmMainPtr); + XABPreferences PrefData(GetUserPrefDir()); - //CardDAVIter->second. + if (iter->second == 0){ // Wait for process to finish. @@ -252,240 +271,578 @@ 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){ - - ETag = StringETagIter->second; - ETagOriginal = StringETagOrigIter->second; + if (TypeIter->second == 0){ + + // Add a contact. + + StringDataIter = ActivityListData.find(iter->first); + StringURLIter = ActivityListURL.find(iter->first); + AccountDir = StringAccountIter->second; ContactFilename = StringFilenameIter->second; - FullFilename = StringFullFilenameIter->second; - - ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir); - - /*if (ETag == ETagOriginal){*/ - - // Compare the ETag with the Server ETag. + wxString AccountNameFriendly; - if (ETagOriginal != ETagServer){ + int AccountID = 0; - // Server ETag is different from original ETag. - // This is a conflict which the user will now - // need to resolve. - - vCard Moo1; - vCard Moo2; - - frmMain *frmMainPtrGet = static_cast(frmMainPtr); + for (int i = 0; i < PrefData.accounts.GetCount(); i++){ - vCard34Conv vCard34Obj; - - wxString ServerContactData; - vCard ClientData; - vCard ConvertedV4Data; + wxString AccountDirCheck = PrefData.accounts.GetAccountDirectory(i); - // Load the client data from the filename given. + AccountDirCheck.Trim(); + AccountDirCheck.Append(wxT(".carddav")); - CardDAVIter->second->GetServerContactData(); - ServerContactData = CardDAVIter->second->GetPageData(); + if (AccountDirCheck == StringAccountIter->second){ - // Process v3 version into v4 version. + AccountNameFriendly = PrefData.accounts.GetAccountName(i); + AccountID = i; - 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. + } + + 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; + + bool KeepUpdating = true; + + while(KeepUpdating == true){ - // Fetch Data from Server and convert. + COConnectResult ConnectResponse = ConnObjectIter->second->Connect(false); - bool *PauseMode = new bool; - int ConflictResult; - QRNotif qrn; - - *PauseMode = TRUE; - qrn.QResponse = &ConflictResult; - qrn.PausePtr = PauseMode; - - vCardProcData.QRNotifData = &qrn; + bool ExitLoop = false; - 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;*/ + if (ConnObjectIter->second->SSLVerify() == COSSL_UNABLETOVERIFY){ + + frmMainPtrGet->PauseAllTimers(); + +#if defined(__APPLE__) + + ConnObjectIter->second->BypassSSLVerification(true); + + COConnectResult ConnectionSSLResult = ConnObjectIter->second->Connect(false); + + ConnObjectIter->second->BypassSSLVerification(false); + + int SSLResult = DisplayTrustPanel(ConnObjectIter->second->BuildSSLCollection(), AccountNameFriendly); + + if (SSLResult != NSOKButton){ + + frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnObjectIter->second->BuildSSLCollection()); + iter->second = 2; + break; + + } else { + + frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnObjectIter->second->BuildSSLCollection()); + + } + +#elif defined(__WIN32__) + + ConnObjectIter->second->BypassSSLVerification(true); + + COConnectResult ConnectionSSLResult = ConnObjectIter->second->Connect(false); + + ConnObjectIter->second->BypassSSLVerification(false); + + BOOL ModifiedCertificateData = false; + CRYPTUI_VIEWCERTIFICATE_STRUCTW CertificateData = BuildCertificateData(ConnObjectIter->second, (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, ConnObjectIter->second->BuildSSLCollection()); + iter->second = 2; + break; + + } else { + + frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnObjectIter->second->BuildSSLCollection()); + + } + +#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){ - while (*PauseMode == TRUE){ - //nanosleep(&n1, &n2); - SleepFor(250000000); + // 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; + } + + } - 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, ConnObjectIter->second->BuildSSLCollection()); + +#elif defined(__WIN32__) + + frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnObjectIter->second->BuildSSLCollection()); + +#else - // Decide Later. + frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnObjectIter->second->BuildSSLCollection()); - iter->second = 4; - continue; +#endif - } else if (ConflictResult == 1){ + COServerResponse AddContactResponse = ConnObjectIter->second->AddContact(StringURLIter->second.ToStdString(), + std::string(StringDataIter->second.ToUTF8())); - // Decided to use client version. + if (AddContactResponse.RequestResult != COREQUEST_OK){ + iter->second = 2; + break; + } - CardDAVIter->second->ProcessData(); - - iter->second = 4; + // Get the entity tag for the new contact. - } else if (ConflictResult == 2){ + COServerResponse ETagGetResponse = ConnObjectIter->second->GetServerEntityTagValue(StringURLIter->second.ToStdString()); - // Decided to use server version. - - // Download server version. - - ConvertedV4Data.WriteFile(FullFilename); - - iter->second = 4; + if (ETagGetResponse.RequestResult != COREQUEST_OK){ + iter->second = 2; + break; + } - } + ETagDBPtr->UpdateETag(ContactFilename, ETagGetResponse.EntityTag, ETagGetResponse.EntityTag); + + iter->second = 4; + break; + + } - } else { + } else if (TypeIter->second == 1){ - // Update the data to the server. - - CardDAVIter->second->ProcessData(); + // Update a contact. - } - - /*} else { - - if (ETagOriginal != ETagServer){ + StringDataIter = ActivityListData.find(iter->first); + StringURLIter = ActivityListURL.find(iter->first); - // 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); + AccountDir = StringAccountIter->second; + ContactFilename = StringFilenameIter->second; + wxString AccountNameFriendly; + + int AccountID = 0; + + for (int i = 0; i < PrefData.accounts.GetCount(); i++){ - vCard34Conv vCard34Obj; - - wxString ServerContactData; - vCard ClientData; - vCard ConvertedV4Data; + wxString AccountDirCheck = PrefData.accounts.GetAccountDirectory(i); - // Load the client data from the filename given. + AccountDirCheck.Trim(); + AccountDirCheck.Append(wxT(".carddav")); - CardDAVIter->second->GetServerContactData(); - ServerContactData = CardDAVIter->second->GetPageData(); - ClientData.LoadFile(FullFilename); + if (AccountDirCheck == StringAccountIter->second){ - // Process v3 version into v4 version. + AccountNameFriendly = PrefData.accounts.GetAccountName(i); + AccountID = i; - vCard34Obj.ConvertToV4(&ServerContactData, &ConvertedV4Data); + } - vCardConflictObj vCardProcData; + } + + 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; + + bool KeepUpdating = true; + + while(KeepUpdating == true){ - vCardProcData.vCardLocalData = &ClientData; - vCardProcData.vCardServerData = &ConvertedV4Data; + COConnectResult ConnectResponse = ConnObjectIter->second->Connect(false); - bool *PauseMode = new bool; - int ConflictResult; - QRNotif qrn; - - *PauseMode = TRUE; - qrn.QResponse = &ConflictResult; - qrn.PausePtr = PauseMode; - - vCardProcData.QRNotifData = &qrn; + bool ExitLoop = false; - wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED); - event.SetClientData(&vCardProcData); - wxPostEvent(frmMainPtrGet, event); + while(ExitLoop == false){ + + if (ConnObjectIter->second->SSLVerify() == COSSL_UNABLETOVERIFY){ + + frmMainPtrGet->PauseAllTimers(); + +#if defined(__APPLE__) + + ConnObjectIter->second->BypassSSLVerification(true); + + COConnectResult ConnectionSSLResult = ConnObjectIter->second->Connect(false); + + ConnObjectIter->second->BypassSSLVerification(false); + + int SSLResult = DisplayTrustPanel(ConnObjectIter->second->BuildSSLCollection(), AccountNameFriendly); + + if (SSLResult != NSOKButton){ + + frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnObjectIter->second->BuildSSLCollection()); + iter->second = 2; + break; + + } else { + + frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnObjectIter->second->BuildSSLCollection()); + + } + +#elif defined(__WIN32__) + + ConnObjectIter->second->BypassSSLVerification(true); + + COConnectResult ConnectionSSLResult = ConnObjectIter->second->Connect(false); + + ConnObjectIter->second->BypassSSLVerification(false); + + BOOL ModifiedCertificateData = false; + CRYPTUI_VIEWCERTIFICATE_STRUCTW CertificateData = BuildCertificateData(ConnObjectIter->second, (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, ConnObjectIter->second->BuildSSLCollection()); + iter->second = 2; + break; + + } else { + + frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnObjectIter->second->BuildSSLCollection()); + + } + +#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){ + 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){ + + // 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; + + } + + } + + if (iter->second == 2 || iter->second == 3 || iter->second == 4){ + break; + } + + COServerResponse ETagGetResponse = ConnObjectIter->second->GetServerEntityTagValue(StringURLIter->second.ToStdString()); + if (ETagGetResponse.RequestResult != COREQUEST_OK){ + iter->second = 2; + break; + } + + ETagServer = ETagGetResponse.EntityTag; + + // 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 = static_cast(frmMainPtr); + + vCard34Conv vCard34Obj; + + std::string ServerContactData; + wxString wxStringServerContactData; + vCard ClientData; + vCard ConvertedV4Data; + + // Load the client data from the filename given. + + COServerResponse GetContactResponse = ConnObjectIter->second->GetContact(StringURLIter->second.ToStdString(), + &ServerContactData); + + if (GetContactResponse.RequestResult != COREQUEST_OK){ + iter->second = 2; + break; + } + + wxStringServerContactData = wxString::FromUTF8((const char*)ServerContactData.c_str()); + + // Process v3 version into v4 version. + + vCard34Obj.ConvertToV4(&wxStringServerContactData, &ConvertedV4Data); + + vCardConflictObj vCardProcData; + + vCardProcData.vCardLocalData = &ClientData; + vCardProcData.vCardServerData = &ConvertedV4Data; + ClientData.LoadFile(FullFilename); + + // Setup Conflict Resolution Dialog. + + // Fetch Data from Server and convert. + + bool *PauseMode = new bool; + int ConflictResult; + QRNotif qrn; + + *PauseMode = TRUE; + qrn.QResponse = &ConflictResult; + qrn.PausePtr = PauseMode; + + vCardProcData.QRNotifData = &qrn; + + wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED); + event.SetClientData(&vCardProcData); + wxPostEvent(frmMainPtrGet, event); + 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. - - CardDAVIter->second->ProcessData(); - //ETagServer = CardDAVIter->second.GetServerETagValueThread(); - //ETagDBPtr->UpdateETag(ContactFilename, ETagServer, ETagServer); - - iter->second = 4; - + } else if (ConflictResult == 2){ - + // Decided to use server version. + + // Download server version. + + ConvertedV4Data.WriteFile(FullFilename); + + } - // Write server version to file. + } else { - ConvertedV4Data.WriteFile(FullFilename); + // Upload the data to the server. - iter->second = 4; + COServerResponse EditContactResponse = ConnObjectIter->second->EditContact(StringURLIter->second.ToStdString(), + std::string(StringDataIter->second.ToUTF8())); + if (EditContactResponse.RequestResult != COREQUEST_OK){ + iter->second = 2; + break; } - - } else { - - // Update the data to the server. + + } - CardDAVIter->second->ProcessData(); - + ETagGetResponse = ConnObjectIter->second->GetServerEntityTagValue(StringURLIter->second.ToStdString()); + + if (ETagGetResponse.RequestResult != COREQUEST_OK){ + iter->second = 2; + break; } - - }*/ - - // Update the ETag DB. - - CardDAVIter->second->GetServerETagValueThread(); - ETagServer = CardDAVIter->second->ETagValueResult(); - ETagDBPtr->UpdateETag(ContactFilename, ETagServer, ETagServer); - - iter->second = 4; - CardDAVIter->second = NULL; + + ETagDBPtr->UpdateETag(ContactFilename, ETagGetResponse.EntityTag, ETagGetResponse.EntityTag); + + iter->second = 4; + break; + + } } else if (TypeIter->second == 2) { @@ -493,26 +850,226 @@ void frmActivityMgr::ProcessTasksThread() 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); - CardDAVIter->second->SetUploadMode(FALSE); - CardDAVIter->second->SetupData(wxT("DELETE"), ContactFilename, wxT("")); - //CardDAVIter->second.SetServerFilename(); - CardDAVIter->second->ProcessData(); - ETagDBPtr->RemoveETag(ContactFilename); + bool KeepUpdating = TRUE; + + while(KeepUpdating == TRUE){ - iter->second = 4; - CardDAVIter->second = NULL; + COConnectResult ConnectResponse = ConnObjectIter->second->Connect(false); + + bool ExitLoop = FALSE; + + while (ExitLoop == FALSE){ + + if (ConnObjectIter->second->SSLVerify() == COSSL_UNABLETOVERIFY){ + + frmMainPtrGet->PauseAllTimers(); + +#if defined(__APPLE__) + + ConnObjectIter->second->BypassSSLVerification(true); + + COConnectResult ConnectionSSLResult = ConnObjectIter->second->Connect(false); + + ConnObjectIter->second->BypassSSLVerification(false); + + int SSLResult = DisplayTrustPanel(ConnObjectIter->second->BuildSSLCollection(), AccountNameFriendly); + + if (SSLResult != NSOKButton){ + + frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnObjectIter->second->BuildSSLCollection()); + iter->second = 2; + break; + + } else { + + frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnObjectIter->second->BuildSSLCollection()); + + } + +#elif defined(__WIN32__) + + ConnObjectIter->second->BypassSSLVerification(true); + + COConnectResult ConnectionSSLResult = ConnObjectIter->second->Connect(false); + + ConnObjectIter->second->BypassSSLVerification(false); + + BOOL ModifiedCertificateData = false; + CRYPTUI_VIEWCERTIFICATE_STRUCTW CertificateData = BuildCertificateData(ConnObjectIter->second, (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, ConnObjectIter->second->BuildSSLCollection()); + iter->second = 2; + break; + + } else { + + frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnObjectIter->second->BuildSSLCollection()); + + } + +#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){ + + // 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; + + } + + } + + if (iter->second == 2 || iter->second == 3 || iter->second == 4){ + break; + } - } else if (TypeIter->second == 3) { +#if defined(__APPLE__) + + frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnObjectIter->second->BuildSSLCollection()); + +#elif defined(__WIN32__) + + frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnObjectIter->second->BuildSSLCollection()); + +#else + + frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnObjectIter->second->BuildSSLCollection()); + +#endif + + COServerResponse DeleteContactResponse = ConnObjectIter->second->DeleteContact(ContactFilename.ToStdString()); + + if (DeleteContactResponse.RequestResult != COREQUEST_OK){ + iter->second = 2; + break; + } + + ETagDBPtr->RemoveETag(ContactFilename); + + iter->second = 4; + break; + + } - frmMain *frmMainPtrGet = static_cast(frmMainPtr); + } else if (TypeIter->second == 3) { wxString AccountNameFriendly; - wxString PrefFilename = GetUserPrefDir(); - XABPreferences PrefData(PrefFilename); int AccountID = 0; for (int i = 0; i < PrefData.accounts.GetCount(); i++){ @@ -548,11 +1105,8 @@ void frmActivityMgr::ProcessTasksThread() wxArrayString vCardUpdateRemote; wxArrayString vCardUpdateLog; std::map vCardETag; - ContactListData ServerContactList; std::map vCardDownloadData; - //wxArrayString vCardDownload; - //std::map vCardDownloadData; // Get the list of vCard files locally. @@ -598,111 +1152,195 @@ void frmActivityMgr::ProcessTasksThread() std::map ETagDBData = ETagDBPtr->GetETagData(); - bool ExitLoop = FALSE; - - std::map *SCListData = NULL; - - while (ExitLoop == FALSE){ + COConnectResult ConnectResponse = ConnObjectIter->second->Connect(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(); - - if (ErrorCode != 0){ + bool ExitLoop = FALSE; - if (ErrorCode == 60 || ErrorCode == 51){ + while (ExitLoop == FALSE){ - // Invalid SSL certificate so bring up a dialog to the user - // explaining what has happened and the options available. + if (ConnObjectIter->second->SSLVerify() == COSSL_UNABLETOVERIFY){ + + frmMainPtrGet->PauseAllTimers(); + +#if defined(__APPLE__) + + ConnObjectIter->second->BypassSSLVerification(true); + + COConnectResult ConnectionSSLResult = ConnObjectIter->second->Connect(false); + + ConnObjectIter->second->BypassSSLVerification(false); + + int SSLResult = DisplayTrustPanel(ConnObjectIter->second->BuildSSLCollection(), AccountNameFriendly); - // Stop all the timers. + if (SSLResult != NSOKButton){ - frmMainPtrGet->PauseAllTimers(); + frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnObjectIter->second->BuildSSLCollection()); + iter->second = 2; + break; + + } else { + + frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnObjectIter->second->BuildSSLCollection()); + + } - // Setup the data to be sent in the wxPostEvent command. +#elif defined(__WIN32__) - SSLInvalidCertNotifObj SSLICNProcData; + ConnObjectIter->second->BypassSSLVerification(true); - bool *PauseMode = new bool; - int SSLResult; - QRNotif qrn; + COConnectResult ConnectionSSLResult = ConnObjectIter->second->Connect(false); - *PauseMode = TRUE; - qrn.QResponse = &SSLResult; - qrn.PausePtr = PauseMode; + ConnObjectIter->second->BypassSSLVerification(false); + + BOOL ModifiedCertificateData = false; + CRYPTUI_VIEWCERTIFICATE_STRUCTW CertificateData = BuildCertificateData(ConnObjectIter->second, (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, ConnObjectIter->second->BuildSSLCollection()); + iter->second = 2; + break; + + } else { + + frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnObjectIter->second->BuildSSLCollection()); + + } + +#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; - 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); - } + wxCommandEvent event(INVALIDSSLCERTSTRING); + event.SetClientData(&SSLICNProcData); + wxPostEvent(frmMainPtrGet, event); + + while (*PauseMode == TRUE){ + //nanosleep(&n1, &n2); + SleepFor(250000000); + } - // Process the response from the user. + // Process the response from the user. - if (SSLResult == 1){ + if (SSLResult == 1){ - // Accept the certificate. Write the certificate into the account - // directory (as server.crt) - will overwrite old certificate. + // Accept the Certificate. - frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, CardDAVIter->second->GetCertificateData()); - WriteServerCertificate(AccountDir, CardDAVIter->second->GetCertificateData()); + UsingSSLBypass = true; + ConnObjectIter->second->BypassSSLVerification(true); + + COConnectResult TestConnectionResult = ConnObjectIter->second->Connect(true); + WriteServerCertificate(AccountDir, certcol); - } else if (SSLResult == 2){ + ConnObjectIter->second->BypassSSLVerification(false); - // Reject the certificate, abort the task and mark as failed. + } else if (SSLResult == 2){ + + // Reject the certificate, abort the task and mark as failed. - frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, CardDAVIter->second->GetCertificateData()); - iter->second = 2; - break; + iter->second = 2; + break; - } + } + +#endif + + frmMainPtrGet->ResumeAllTimers(); + ExitLoop = true; + + } else if (ConnectResponse == COCONNECT_AUTHFAIL){ + + ConnectResponse = ConnObjectIter->second->Connect(true); - // Resume all the timers. + if (ConnectResponse == COCONNECT_OK){ + + ExitLoop = true; + break; - frmMainPtrGet->ResumeAllTimers(); - } else { - - iter->second = 4; + + ExitLoop = true; + iter->second = 2; break; + + } + + } else if (ConnectResponse == COCONNECT_OK){ + ConnectResponse = ConnObjectIter->second->Connect(true); + + if (ConnectResponse == COCONNECT_OK){ + + ExitLoop = true; + break; + + } else { + + ExitLoop = true; + iter->second = 2; + break; + } - + + ExitLoop = true; + break; + } else { - - ExitLoop = TRUE; - + + ExitLoop = true; + iter->second = 2; + break; + } } + +#if defined(__APPLE__) + + frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnObjectIter->second->BuildSSLCollection()); + +#elif defined(__WIN32__) + + frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnObjectIter->second->BuildSSLCollection()); + +#else + + frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnObjectIter->second->BuildSSLCollection()); + +#endif if (iter->second == 2 || iter->second == 3 || iter->second == 4){ break; } - - frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, CardDAVIter->second->GetCertificateData()); - + // Look in directory and see which vCards to add and delete // In short: @@ -716,46 +1354,25 @@ void frmActivityMgr::ProcessTasksThread() bool ContinueProcess = AccDir.GetFirst(&AccDirFilename, wxEmptyString, wxDIR_DEFAULT); - // Process the server data. - - if (SCListData != NULL){ - - for (std::map::iterator fsiter = SCListData->begin(); - fsiter != SCListData->end(); fsiter++){ - - // Check the mode of the file before adding. - - // Get the HTTP status of the file from the list. - - FileSyncData fsd = fsiter->second; - - if (fsd.DataFlag == 1){ + COContactList ServerContactList2 = ConnObjectIter->second->GetContactList(SyncTokenLoad.ToStdString()); - // Added or modified contact. - - //vCardAdd.Add(fsiter->first, 1); - - vCardDownloadDataFileClass vCardNewData; - vCardNewData.DataType = 0; - vCardDownloadData.insert(std::make_pair(fsiter->first, vCardNewData)); - - //} else if (fsd.DataFlag == 1){ - - // Contact has been modified on the server. - - // vCardUpdateLocal.Add(fsiter->first, 1); - - } - else if (fsd.DataFlag == 2){ - - // Contact has been deleted. - - vCardDelete.Add(fsiter->first, 1); - - } + // Process the server data. + for (std::vector::iterator ContactInfo = ServerContactList2.ListData.begin(); + ContactInfo != ServerContactList2.ListData.end(); ContactInfo++){ + + if (ContactInfo->Status == COCS_UPDATED){ + + vCardDownloadDataFileClass vCardNewData; + vCardNewData.DataType = 0; + vCardDownloadData.insert(std::make_pair(ContactInfo->Location, vCardNewData)); + + } else if (ContactInfo->Status == COCS_DELETED){ + + vCardDelete.Add(ContactInfo->Location, 1); + } - + } // Look for vCards that are missing but in the ETagDB. @@ -779,20 +1396,28 @@ void frmActivityMgr::ProcessTasksThread() // needs to updated remotely and which needs to be // updated locally. - for (std::map::iterator srviter = SCListData->begin(); - srviter != SCListData->end(); srviter++){ - - if (ETagDBData.find(srviter->first) == ETagDBData.end()){ + for (std::vector::iterator ContactInfo = ServerContactList2.ListData.begin(); + ContactInfo != ServerContactList2.ListData.end(); ContactInfo++){ + + if (ETagDBData.find(ContactInfo->Location) == ETagDBData.end()){ continue; } - - std::map::iterator lociter = ETagDBData.find(srviter->first); - + + std::map::iterator lociter = ETagDBData.find(ContactInfo->Location); + ETagData etd = lociter->second; - FileSyncData fsd = srviter->second; - - wxString ETagSrv = fsd.ETagData; + + wxString ETagSrv = ContactInfo->Data; + // 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. @@ -805,20 +1430,21 @@ void frmActivityMgr::ProcessTasksThread() vCard34Conv vCard34Obj; - wxString ServerContactData; wxString FullFilename; vCard ClientData; vCard ConvertedV4Data; + std::string ServerContactDataString; + wxString ServerContactData; + // Conflict. Bring up conflict resolution dialog. // Get the server contact data for comparison. - CardDAVIter->second->SetServerFilename(srviter->first); - CardDAVIter->second->GetServerContactData(); - ServerContactData = CardDAVIter->second->GetPageData(); + ConnObjectIter->second->GetContact(ContactInfo->Location, &ServerContactDataString); + ServerContactData = wxString::FromUTF8(ServerContactDataString.c_str()); - FullFilename = CreateFilenamePath(AccountDirFinal, srviter->first); + FullFilename = CreateFilenamePath(AccountDirFinal, ContactInfo->Location); // Convert it to v4. @@ -850,11 +1476,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); @@ -876,8 +1497,8 @@ void frmActivityMgr::ProcessTasksThread() // Decided to use client version. - vCardUpdateLocal.Remove(srviter->first); - vCardUpdateRemote.Add(srviter->first, 1); + vCardUpdateLocal.Remove(ContactInfo->Location); + vCardUpdateRemote.Add(ContactInfo->Location, 1); } else if (ConflictResult == 2){ @@ -893,7 +1514,7 @@ void frmActivityMgr::ProcessTasksThread() ConvertedV4Data.WriteFile(FullFilename); - vCardDownloadData.insert(std::make_pair(srviter->first, vCardNewData)); + vCardDownloadData.insert(std::make_pair(ContactInfo->Location, vCardNewData)); @@ -903,7 +1524,7 @@ void frmActivityMgr::ProcessTasksThread() // Send vCard to the server. - vCardUpdateRemote.Add(srviter->first, 1); + vCardUpdateRemote.Add(ContactInfo->Location, 1); } @@ -914,12 +1535,12 @@ void frmActivityMgr::ProcessTasksThread() if (etd.ETagOrigValue != ETagSrv){ - vCardUpdateLocal.Add(srviter->first, 1); + vCardUpdateLocal.Add(ContactInfo->Location, 1); } } - + } // Process the vCards that need to be downloaded and added/overwritten. @@ -949,32 +1570,34 @@ void frmActivityMgr::ProcessTasksThread() // Grab the file from the server and write the contact out. vCard34Conv vCard34Obj; - - CardDAVIter->second->SetServerFilename(additer->first); - CardDAVIter->second->GetServerContactData(); - vCardInputData = CardDAVIter->second->GetPageData(); + + wxString ServerContactData; + std::string ServerContactDataString; + + // Conflict. Bring up conflict resolution dialog. + + // Get the server contact data for comparison. + + ConnObjectIter->second->GetContact(additer->first.ToStdString(), &ServerContactDataString); + vCardInputData = wxString::FromUTF8(ServerContactDataString.c_str()); vCard34Obj.ConvertToV4(&vCardInputData, &ConvertedV4Data); ConvertedV4Data.WriteFile(vCardFilenameFinal); - // Update the ETagDB. - - //vCardFile.Open(vCardFilenameFinal, wxT("w")); - - //if (vCardFile.IsOpened()){ - - // vCardFile.Write(vCardOutputData, wxConvAuto()); - // vCardFile.Close(); - - //} - // Get the server ETag. wxString ServerETag; - CardDAVIter->second->GetServerETagValueThread(); - ServerETag = CardDAVIter->second->ETagValueResult(); - + + COServerResponse ServerEntityTag = ConnObjectIter->second->GetServerEntityTagValue(additer->first.ToStdString()); + + if (ServerEntityTag.RequestResult != COREQUEST_OK){ + iter->second = 2; + break; + } + + ServerETag = wxString::FromUTF8(ServerEntityTag.EntityTag.c_str()); + // Add to the ETag Database. ETagDBPtr->AddETag(additer->first, ServerETag, ServerETag); @@ -998,8 +1621,15 @@ void frmActivityMgr::ProcessTasksThread() // Update the ETagDB. wxString ServerETag; - CardDAVIter->second->GetServerETagValueThread(); - ServerETag = CardDAVIter->second->ETagValueResult(); + + COServerResponse ServerEntityTag = ConnObjectIter->second->GetServerEntityTagValue(additer->first.ToStdString()); + + if (ServerEntityTag.RequestResult != COREQUEST_OK){ + iter->second = 2; + break; + } + + ServerETag = wxString::FromUTF8(ServerEntityTag.EntityTag.c_str()); // Add to the ETag Database. @@ -1007,6 +1637,12 @@ void frmActivityMgr::ProcessTasksThread() } } + + // Check if any errors occured before continuing. + + if (iter->second != 1){ + break; + } // Look for vCard files which aren't in the ETagDB. @@ -1062,10 +1698,15 @@ void frmActivityMgr::ProcessTasksThread() if (ETag == ETagOriginal && ETagDBPtr->ETagExists(vCardAdd[vi])){ // Compare the ETag with the Server ETag. - - CardDAVIter->second->SetServerFilename(vCardAdd[vi]); - CardDAVIter->second->GetServerETagValueThread(); - ETagServer = CardDAVIter->second->ETagValueResult(); + + COServerResponse ServerEntityTag = ConnObjectIter->second->GetServerEntityTagValue(vCardAdd[vi].ToStdString()); + + if (ServerEntityTag.RequestResult != COREQUEST_OK){ + iter->second = 2; + break; + } + + ETagServer = wxString::FromUTF8(ServerEntityTag.EntityTag.c_str()); if (ETagOriginal != ETagServer){ @@ -1078,13 +1719,20 @@ void frmActivityMgr::ProcessTasksThread() vCard34Conv vCard34Obj; wxString ServerContactData; + std::string ServerContactDataString; vCard ClientData; vCard ConvertedV4Data; // Load the client data from the filename given. - - CardDAVIter->second->GetServerContactData(); - ServerContactData = CardDAVIter->second->GetPageData(); + + COServerResponse GetContactResponse = ConnObjectIter->second->GetContact(vCardAdd[vi].ToStdString(), &ServerContactDataString); + + if (GetContactResponse.RequestResult != COREQUEST_OK){ + iter->second = 2; + break; + } + + ServerContactData = wxString::FromUTF8(ServerContactDataString.c_str()); // Process v3 version into v4 version. @@ -1096,11 +1744,6 @@ void frmActivityMgr::ProcessTasksThread() 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. @@ -1119,11 +1762,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); @@ -1132,8 +1770,6 @@ void frmActivityMgr::ProcessTasksThread() delete PauseMode; PauseMode = NULL; - //intResult = frmMainPtrGet->ShowConflictDialog(&Moo1, &Moo2); - if (ConflictResult == 0){ // Decide Later. @@ -1145,8 +1781,13 @@ void frmActivityMgr::ProcessTasksThread() // Decided to use client version. - CardDAVIter->second->ProcessData(); + COServerResponse EditContactResponse = ConnObjectIter->second->EditContact(vCardAdd[vi].ToStdString(), std::string(ClientData.WriteString().ToUTF8())); + if (EditContactResponse.RequestResult != COREQUEST_OK){ + iter->second = 2; + break; + } + iter->second = 4; } else if (ConflictResult == 2){ @@ -1168,7 +1809,6 @@ void frmActivityMgr::ProcessTasksThread() wxString wxSFilename = CreateFilenamePath(AccountDirFinal, vCardAdd[vi]); wxString wxSCardData; wxString TaskData; - //wxString TaskURL; // Load the data from the file. @@ -1187,22 +1827,26 @@ void frmActivityMgr::ProcessTasksThread() vCard34Conv vCard34Obj; vCard34Obj.ConvertToV3(wxSFilename, &TaskData); - - // Setup the URL address. - - //TaskURL = StringTaskDetailIter->second + wxT("/") + vCardAdd[vi]; // Upload the data to the server. - - CardDAVIter->second->SetUploadMode(TRUE); - CardDAVIter->second->SetupData(wxT("PUT"), vCardAdd[vi], TaskData); - CardDAVIter->second->ProcessData(); + + COServerResponse AddContactResponse = ConnObjectIter->second->AddContact(vCardAdd[vi].ToStdString(), std::string(TaskData.ToUTF8())); + if (AddContactResponse.RequestResult != COREQUEST_OK){ + iter->second = 2; + break; + } + // Get the Server ETag and put it in the ETag database. - - CardDAVIter->second->SetServerFilename(vCardAdd[vi]); - CardDAVIter->second->GetServerETagValueThread(); - ETagServer = CardDAVIter->second->ETagValueResult(); + + COServerResponse EntityTagResponse = ConnObjectIter->second->GetServerEntityTagValue(vCardAdd[vi].ToStdString()); + + if (EntityTagResponse.RequestResult != COREQUEST_OK){ + iter->second = 2; + break; + } + + ETagServer = wxString::FromUTF8(EntityTagResponse.EntityTag.c_str()); ETagDBPtr->AddETag(vCardAdd[vi], ETagServer, ETagServer); @@ -1218,19 +1862,24 @@ void frmActivityMgr::ProcessTasksThread() frmMain *frmMainPtrGet = (frmMain *)frmMainPtr; - //ContactConflictEvent event(ContactConflictCmdEnv); - //event.SetData(ContactFilename, Moo1, Moo2); - vCard34Conv vCard34Obj; + std::string ServerContactDataString; wxString ServerContactData; vCard ClientData; vCard ConvertedV4Data; // Load the client data from the filename given. - CardDAVIter->second->GetServerContactData(); - ServerContactData = CardDAVIter->second->GetPageData(); + COServerResponse GetContactResponse = ConnObjectIter->second->GetContact(vCardAdd[vi].ToStdString(), &ServerContactDataString); + + if (GetContactResponse.RequestResult != COREQUEST_OK){ + iter->second = 2; + break; + } + + ServerContactData = wxString::FromUTF8(ServerContactDataString.c_str()); + ClientData.LoadFile(FullFilename); // Process v3 version into v4 version. @@ -1255,22 +1904,14 @@ void frmActivityMgr::ProcessTasksThread() 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. @@ -1282,10 +1923,13 @@ void frmActivityMgr::ProcessTasksThread() // Decided to use client version. - CardDAVIter->second->ProcessData(); - //ETagServer = CardDAVIter->second.GetServerETagValueThread(); - //ETagDBPtr->UpdateETag(ContactFilename, ETagServer, ETagServer); - + COServerResponse EditContactResponse = ConnObjectIter->second->EditContact(vCardAdd[vi].ToStdString(), std::string(ClientData.WriteString().ToUTF8())); + + if (EditContactResponse.RequestResult != COREQUEST_OK){ + iter->second = 2; + break; + } + iter->second = 4; } else if (ConflictResult == 2){ @@ -1307,7 +1951,6 @@ void frmActivityMgr::ProcessTasksThread() wxString wxSFilename = CreateFilenamePath(AccountDirFinal, vCardAdd[vi]); wxString wxSCardData; wxString TaskData; - //wxString TaskURL; // Load the data from the file. @@ -1326,24 +1969,25 @@ void frmActivityMgr::ProcessTasksThread() vCard34Conv vCard34Obj; vCard34Obj.ConvertToV3(wxSFilename, &TaskData); - - // Setup the URL address. - - //TaskURL = StringTaskDetailIter->second + wxT("/") + vCardAdd[vi]; // Upload the data to the server. - - CardDAVIter->second->SetUploadMode(TRUE); - CardDAVIter->second->SetupData(wxT("PUT"), vCardAdd[vi], TaskData); - CardDAVIter->second->ProcessData(); - + + COServerResponse AddContactResponse = ConnObjectIter->second->AddContact(vCardAdd[vi].ToStdString(), std::string(TaskData.ToUTF8())); + + if (AddContactResponse.RequestResult != COREQUEST_OK){ + iter->second = 2; + break; + } + // Get the Server ETag and put it in the ETag database. - CardDAVIter->second->SetServerFilename(vCardAdd[vi]); - CardDAVIter->second->GetServerETagValueThread(); - ETagServer = CardDAVIter->second->ETagValueResult(); - + COServerResponse EntityTagResponse = ConnObjectIter->second->GetServerEntityTagValue(vCardAdd[vi].ToStdString()); + if (EntityTagResponse.RequestResult != COREQUEST_OK){ + iter->second = 2; + break; + } + ETagDBPtr->AddETag(vCardAdd[vi], ETagServer, ETagServer); } @@ -1352,6 +1996,10 @@ void frmActivityMgr::ProcessTasksThread() } + if (iter->second != 1){ + break; + } + // Process the vCards to delete locally. for (int vi = 0; vi < vCardDelete.GetCount(); vi++){ @@ -1369,7 +2017,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++){ @@ -1378,21 +2026,26 @@ void frmActivityMgr::ProcessTasksThread() if (deliter->second == wxT("DELETED")){ - CardDAVIter->second->SetUploadMode(FALSE); - CardDAVIter->second->SetupData(wxT("DELETE"), deliter->first, wxT("")); - CardDAVIter->second->ProcessData(); + ConnObjectIter->second->DeleteContact(deliter->first.ToStdString()); // 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. - wxString ServerSyncToken = ServerContactList.SyncToken; + wxString ServerSyncToken = wxString::FromUTF8(ServerContactList2.SyncToken.c_str()); ServerSyncToken.Trim(); @@ -1437,49 +2090,18 @@ void frmActivityMgr::ProcessTasksThread() } else { // Update the data to the server. - - CardDAVIter->second->ProcessData(); + iter->second = 4; continue; } - /*timespec n1, n2; - - n1.tv_sec = 0; - n1.tv_nsec = 250000000L;*/ - while (iter->second == 1){ - SleepFor(250000000); - //nanosleep(&n1, &n2); + SleepFor(125000000); } - if ((iter->second == 4 && TypeIter->second == 0) || - (iter->second == 8 && TypeIter->second == 0)){ - - AccountDir = StringAccountIter->second; - ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir); - - CardDAVIter->second->GetServerETagValueThread(); - ETagServer = CardDAVIter->second->ETagValueResult(); - ETagDBPtr->UpdateETag(ContactFilename, ETagServer, ETagServer); - - } - - if ((iter->second == 4 && TypeIter->second == 1) || - (iter->second == 8 && TypeIter->second == 1)){ - - AccountDir = StringAccountIter->second; - ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir); - - CardDAVIter->second->GetServerETagValueThread(); - ETagServer = CardDAVIter->second->ETagValueResult(); - ETagDBPtr->UpdateETag(ContactFilename, ETagServer, ETagServer); - - } - break; } @@ -1495,22 +2117,17 @@ void frmActivityMgr::ProcessTasksThread() wxCommandEvent eventp(ACTMGR_STARTTIMER); wxPostEvent(this, eventp); - - //AnimationTimer.StartAnimation(); - //ActListProcTimer.Start(); } - + wxCommandEvent event(ACTMGR_STARTPROCESSTIMER); wxPostEvent(this, event); - //ActProcessTimer.Start(); - } void frmActivityMgr::ProcessTasks() { - + std::thread ProcessThread(&frmActivityMgr::ProcessTasksThread, this); ProcessThread.detach(); @@ -1541,15 +2158,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); } @@ -1557,6 +2182,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; @@ -1577,6 +2210,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); @@ -1601,6 +2254,12 @@ void frmActivityMgr::StopProcessTimer(wxCommandEvent& event){ } +void frmActivityMgr::StartAnimationTimer(wxCommandEvent& event){ + + AnimationTimer.StartAnimation(); + +} + void frmActivityMgr::UpdateStatusLabel(wxCommandEvent& event){ ActivityMgrLabelUpdate *actmgrudata = (ActivityMgrLabelUpdate*)event.GetClientData(); @@ -1609,15 +2268,9 @@ void frmActivityMgr::UpdateStatusLabel(wxCommandEvent& event){ lstActivity->SetItem(actmgrudata->ItemIndex, 2, actmgrudata->ItemLabel); - /*if (!actmgrudata->ItemDes.IsEmpty()){ - lstActivity->SetItem(actmgrudata->ItemIndex, 0, actmgrudata->ItemDes); - }*/ - delete actmgrudata; actmgrudata = NULL; } } - -#endif \ No newline at end of file