+#endif
+
+ ConnHandle.SetUploadMode(TRUE);
+ ConnHandle.SetupData(wxT("PUT"), StringURLIter->second, StringDataIter->second);
+ ConnHandle.SetEditMode(EditMode);
+ ConnHandle.ProcessData();
+
+ int ErrorCode = ConnHandle.GetResultCode();
+
+ if (ErrorCode != CURLE_OK){
+
+ iter->second = 4;
+ break;
+
+ }
+
+ // Add contact to the ETag DB.
+
+ ConnHandle.GetServerETagValueThread();
+ ETagServer = ConnHandle.ETagValueResult();*/
+
+ // TODO: Get the entity tag for the new contact.
+
+ COServerResponse ETagGetResponse = ConnObjectIter->second->GetServerEntityTagValue(StringURLIter->second.ToStdString());
+
+ if (ETagGetResponse.RequestResult != COREQUEST_OK){
+ iter->second = 2;
+ break;
+ }
+
+ std::cout << ETagGetResponse.EntityTag << std::endl;
+
+ ETagDBPtr->UpdateETag(ContactFilename, ETagGetResponse.EntityTag, ETagGetResponse.EntityTag);
+
+ 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){
+
+ 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;
+
+ bool KeepUpdating = true;
+
+ while(KeepUpdating == true){
+
+ COConnectResult ConnectResponse = ConnObjectIter->second->Connect(false);
+
+ bool ExitLoop = false;
+
+ while(ExitLoop == false){
+
+ 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){
+
+ // 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<frmMain*>(frmMainPtr);
+
+ vCard34Conv vCard34Obj;
+
+ std::string ServerContactData;
+ wxString wxStringServerContactData;
+ vCard ClientData;
+ vCard ConvertedV4Data;
+
+ // Load the client data from the filename given.
+
+ //ConnHandle.GetServerContactData();
+ //ServerContactData = ConnHandle.GetPageData();
+
+ 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){
+ SleepFor(250000000);
+ }
+
+ delete PauseMode;
+ PauseMode = NULL;
+
+ if (ConflictResult == 0){
+
+ // Decide Later.
+
+ iter->second = 4;
+ break;
+
+ } else if (ConflictResult == 1){
+
+ // Decided to use client version.
+
+ } else if (ConflictResult == 2){
+
+ // Decided to use server version.
+
+ // Download server version.
+
+ ConvertedV4Data.WriteFile(FullFilename);
+
+ }
+
+ } else {
+
+ // Upload the data to the server.
+
+ COServerResponse EditContactResponse = ConnObjectIter->second->EditContact(StringURLIter->second.ToStdString(),
+ StringDataIter->second.ToStdString());
+
+ if (EditContactResponse.RequestResult != COREQUEST_OK){
+ iter->second = 2;
+ break;
+ }
+
+ }
+
+ /*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;
+
+ }
+
+ }