1 // frmActivityMgr.cpp - Activity Manager form.
3 // (c) 2012-2015 Xestia Software Development.
5 // This file is part of Xestia Address Book.
7 // Xestia Address Book is free software: you can redistribute it and/or modify
8 // it under the terms of the GNU General Public License as published by the
9 // Free Software Foundation, version 3 of the license.
11 // Xestia Address Book is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 // GNU General Public License for more details.
16 // You should have received a copy of the GNU General Public License along
17 // with Xestia Address Book. If not, see <http://www.gnu.org/licenses/>
19 #include "frmActivityMgr.h"
20 #include <wx/mstream.h>
23 #include <wx/tokenzr.h>
25 #include <wx/filefn.h>
28 #include <curl/curl.h>
30 #include "../bitmaps.h"
32 #include "../common/preferences.h"
33 #include "../frmConflictResolution.h"
34 #include "../frmInvalidSSLCertificate.h"
35 #include "../frmMain.h"
36 #include "../common/events.h"
37 #include "../common/filename.h"
38 #include "../vcard/vcard34conv.h"
39 #include "../vcard/vcard.h"
41 DEFINE_EVENT_TYPE(ACTMGR_RESUMEPROC);
42 DEFINE_EVENT_TYPE(ACTMGR_TOGGLECONN);
43 DEFINE_EVENT_TYPE(ACTMGR_STARTTIMER);
44 DEFINE_EVENT_TYPE(ACTMGR_STOPTIMER);
45 DEFINE_EVENT_TYPE(ACTMGR_STARTPROCESSTIMER);
46 DEFINE_EVENT_TYPE(ACTMGR_STOPPROCESSTIMER);
47 DEFINE_EVENT_TYPE(ACTMGR_UPDATESTATUSLABEL);
48 DEFINE_EVENT_TYPE(ACTMGR_STARTANIMATIONTIMER);
50 BEGIN_EVENT_TABLE(frmActivityMgr, wxWindow)
51 EVT_COMMAND(wxID_ANY, ACTMGR_RESUMEPROC, frmActivityMgr::ResumeProcessing)
52 EVT_COMMAND(wxID_ANY, ACTMGR_TOGGLECONN, frmActivityMgr::ToggleConnectionStatus)
53 EVT_COMMAND(wxID_ANY, ACTMGR_STARTTIMER, frmActivityMgr::StartTimer)
54 EVT_COMMAND(wxID_ANY, ACTMGR_STOPTIMER, frmActivityMgr::StopTimer)
55 EVT_COMMAND(wxID_ANY, ACTMGR_STARTPROCESSTIMER, frmActivityMgr::StartProcessTimer)
56 EVT_COMMAND(wxID_ANY, ACTMGR_STOPPROCESSTIMER, frmActivityMgr::StopProcessTimer)
57 EVT_COMMAND(wxID_ANY, ACTMGR_UPDATESTATUSLABEL, frmActivityMgr::UpdateStatusLabel)
58 EVT_COMMAND(wxID_ANY, ACTMGR_STARTANIMATIONTIMER, frmActivityMgr::StartAnimationTimer)
61 frmActivityMgr::frmActivityMgr( wxWindow* parent )
63 frmActivityMgrADT( parent )
66 wxMemoryInputStream istream(icons_activitywindow_png, sizeof(icons_activitywindow_png));
67 wxImage icons_activitywindow_pngi(istream, wxBITMAP_TYPE_PNG);
68 wxBitmap activityiconbmp(icons_activitywindow_pngi, -1);
70 activityicon.CopyFromBitmap(activityiconbmp);
71 this->SetIcon(activityicon);
73 wxMemoryInputStream istream2(misc_activitysleep_png, sizeof(misc_activitysleep_png));
74 wxImage misc_activitysleep_pngi(istream2, wxBITMAP_TYPE_PNG);
75 wxBitmap sleepiconbmp(misc_activitysleep_pngi, -1);
76 SleepBitmap = sleepiconbmp;
77 bmpActivity->SetBitmap(SleepBitmap);
78 ActProcessTimer.SetupPointers(this);
79 lblDetails->SetLabel(_("No activity."));
81 ActListProcTimer.SetupPointers(&ActivityList, &ActivityListIndex, &ActivityListTaskDetail,
82 &TasksActive, lstActivity, lblDetails, GauProgress, this, &AnimationTimer,
83 &ActProcessTimer, &ActivityListFinDate, &ActivityListConn);
85 AnimationTimer.SetBitmap(bmpActivity);
86 AnimationTimer.SetSleepBitmap(&SleepBitmap);
87 AnimationTimer.SetupPointer(this->GetParent());
89 wxListItem ColumnData;
91 ColumnData.SetText(_("Activity"));
92 ColumnData.SetWidth(175);
93 lstActivity->InsertColumn(0, ColumnData);
95 wxListItem ColumnData2;
97 ColumnData2.SetText(_("Account"));
98 ColumnData2.SetWidth(100);
99 lstActivity->InsertColumn(1, ColumnData2);
101 wxListItem ColumnData3;
102 ColumnData3.SetId(2);
103 ColumnData3.SetText(_("Status"));
104 ColumnData3.SetWidth(100);
105 lstActivity->InsertColumn(2, ColumnData3);
107 //AnimationTimer.StartAnimation();
109 // Create recovery database if it doesn't exist.
111 wxString RecoveryFilename = GetRecoveryDB();
115 if (wxFile::Exists(RecoveryFilename) == FALSE){
117 // Create the recovery database.
119 RecoveryDB.Open(RecoveryFilename.c_str(), wxFile::write);
121 RecoveryDB.Write(wxT("BEGIN:XAB-RECOVERYDB\r\n"), wxConvUTF8);
122 RecoveryDB.Write(wxT("VERSION:1.0\r\n"), wxConvUTF8);
123 RecoveryDB.Write(wxT("COMMENT:Please do not alter or delete this file. DATA LOSS IS POSSIBLE!\r\n"), wxConvUTF8);
124 RecoveryDB.Write(wxT("END:XAB-RECOVERYDB\r\n"), wxConvUTF8);
131 #if wxABI_VERSION < 20900
132 RecoveryDBF.Open(RecoveryFilename.c_str(), wxT("r"));
134 RecoveryDBF.Open(RecoveryFilename, wxT("r"));
137 // Load the recovery database for tasks not done.
139 if (RecoveryDBF.IsOpened() == TRUE){
141 wxString wxSRecoveryDB;
142 wxString RecoveryLine;
144 // Check if we are using wxWidgets version 2.8 or less and
145 // execute the required command accordingly.
147 RecoveryDBF.ReadAll(&wxSRecoveryDB, wxConvAuto());
151 std::map<int, wxString> RecoveryFileLines;
152 std::map<int, wxString>::iterator striter;
154 wxStringTokenizer wSTRecoveryDBLines(wxSRecoveryDB, wxT("\r\n"));
156 int RecoveryLineSeek = 0;
158 while (wSTRecoveryDBLines.HasMoreTokens() == TRUE){
160 RecoveryLine = wSTRecoveryDBLines.GetNextToken();
161 RecoveryFileLines.insert(std::make_pair(RecoveryLineSeek, RecoveryLine));
170 //TestTimer.Start(50, FALSE);
173 void frmActivityMgr::OpenWindow()
178 void frmActivityMgr::CloseWindow( wxCommandEvent& event )
184 void frmActivityMgr::CloseWindow( wxCloseEvent& event )
190 void frmActivityMgr::ProcessTasksThread()
193 if (ProcessTasksData == FALSE){
199 if (ApplicationSleepMode == TRUE){
205 std::map<int,int>::iterator TypeIter;
206 std::map<int,wxString>::iterator StringIter;
207 std::map<int,wxString>::iterator StringDataIter;
208 std::map<int,wxString>::iterator StringURLIter;
209 std::map<int,wxString>::iterator StringDetailIter;
210 std::map<int,wxString>::iterator StringAccountIter;
211 std::map<int,wxString>::iterator StringFilenameIter;
212 std::map<int,wxString>::iterator StringFullFilenameIter;
213 std::map<int,wxString>::iterator StringTaskDetailIter;
214 std::map<int,wxString>::iterator StringETagIter;
215 std::map<int,wxString>::iterator StringETagOrigIter;
216 std::map<int,CardDAV*>::iterator CardDAVIter;
217 std::map<int,ConnectionObject*>::iterator ConnObjectIter;
218 std::map<int,ActivityMgrAccountSettings>::iterator AccountSettingsIter;
219 std::map<int,long>::iterator LongIter;
220 bool TasksFoundProc = FALSE;
223 for (std::map<int,int>::iterator iter = ActivityList.begin();
224 iter != ActivityList.end(); ++iter){
226 // Check for any queued tasks and start one.
228 if (iter->second > 4){
232 wxCommandEvent StartAnimationEvent(ACTMGR_STARTANIMATIONTIMER);
234 wxPostEvent(this, StartAnimationEvent);
236 // Start the animation timer if it hasn't started.
238 CardDAVIter = ActivityListConn.find(iter->first);
239 ConnObjectIter = ActivityListConnObject.find(iter->first);
240 TypeIter = ActivityListType.find(iter->first);
241 StringETagIter = ActivityListETag.find(iter->first);
242 StringETagOrigIter = ActivityListETagOriginal.find(iter->first);
243 StringAccountIter = ActivityListAccount.find(iter->first);
244 StringFilenameIter = ActivityListFilename.find(iter->first);
245 StringFullFilenameIter = ActivityListFullFilename.find(iter->first);
246 AccountSettingsIter = ActivityListAccSettings.find(iter->first);
248 // Setup the CardDAV object.
252 ConnHandle.SetupConnection(AccountSettingsIter->second.Address,
253 AccountSettingsIter->second.Port,
254 AccountSettingsIter->second.Username,
255 AccountSettingsIter->second.Password,
256 AccountSettingsIter->second.SSL,
257 AccountSettingsIter->second.Prefix,
258 AccountSettingsIter->second.Dir);
259 ConnHandle.SetupVariables(&ActivityList, iter->first);
260 ConnHandle.SetupResultBools(&BlankBool, &BlankBool);
267 // 5 = Failed (UI Updated).
268 // 6 = Stopped (UI Updated).
269 // 7 = (Reserved) (UI Updated).
270 // 8 = Completed. (UI Updated).
272 frmMain *frmMainPtrGet = static_cast<frmMain*>(frmMainPtr);
273 XABPreferences PrefData(GetUserPrefDir());
275 if (iter->second == 0){
277 //CardDAVIter->second.
279 // Wait for process to finish.
282 TasksFoundProc = TRUE;
284 wxString ETagOriginal;
287 wxString ContactFilename;
288 wxString FullFilename;
290 bool EditMode = FALSE;
294 // Compare the ETags and work out if a conflict has occured.
296 if (TypeIter->second == 0){
300 StringDataIter = ActivityListData.find(iter->first);
301 StringURLIter = ActivityListURL.find(iter->first);
303 AccountDir = StringAccountIter->second;
304 ContactFilename = StringFilenameIter->second;
305 wxString AccountNameFriendly;
309 for (int i = 0; i < PrefData.accounts.GetCount(); i++){
311 wxString AccountDirCheck = PrefData.accounts.GetAccountDirectory(i);
313 AccountDirCheck.Trim();
314 AccountDirCheck.Append(wxT(".carddav"));
316 if (AccountDirCheck == StringAccountIter->second){
318 AccountNameFriendly = PrefData.accounts.GetAccountName(i);
325 ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir);
327 ETag = StringETagIter->second;
328 ETagOriginal = StringETagOrigIter->second;
329 AccountDir = StringAccountIter->second;
330 ContactFilename = StringFilenameIter->second;
331 FullFilename = StringFullFilenameIter->second;
332 EditMode = ActivityListEditMode.find(iter->first)->second;
334 bool KeepUpdating = true;
336 while(KeepUpdating == true){
338 COConnectResult ConnectResponse = ConnObjectIter->second->Connect(false);
340 bool ExitLoop = false;
342 while (ExitLoop == false){
344 if (ConnObjectIter->second->SSLVerify() == COSSL_UNABLETOVERIFY){
346 frmMainPtrGet->PauseAllTimers();
348 #if defined(__APPLE__)
349 #elif defined(__WIN32__)
352 bool UsingSSLBypass = false;
355 // Connect again and fetch SSL certificate information.
357 ConnObjectIter->second->BypassSSLVerification(true);
359 COConnectResult ConnectionSSLResult = ConnObjectIter->second->Connect(false);
361 ConnObjectIter->second->BypassSSLVerification(false);
363 SSLInvalidCertNotifObjString SSLICNProcData;
365 SSLCertCollectionString certcol = ConnObjectIter->second->BuildSSLCollection();
367 bool *PauseMode = new bool;
371 qrn.QResponse = &SSLResult;
372 qrn.PausePtr = PauseMode;
374 SSLICNProcData.CertCollection = certcol;
375 SSLICNProcData.QRNotifData = &qrn;
376 SSLICNProcData.AccountName = AccountNameFriendly;
378 wxCommandEvent event(INVALIDSSLCERTSTRING);
379 event.SetClientData(&SSLICNProcData);
380 wxPostEvent(frmMainPtrGet, event);
382 while (*PauseMode == TRUE){
383 //nanosleep(&n1, &n2);
387 // Process the response from the user.
391 // Accept the Certificate.
393 UsingSSLBypass = true;
394 ConnObjectIter->second->BypassSSLVerification(true);
396 COConnectResult TestConnectionResult = ConnObjectIter->second->Connect(true);
397 WriteServerCertificate(AccountDir, certcol);
399 ConnObjectIter->second->BypassSSLVerification(false);
401 } else if (SSLResult == 2){
403 // Reject the certificate, abort the task and mark as failed.
412 frmMainPtrGet->ResumeAllTimers();
415 } else if (ConnectResponse == COCONNECT_AUTHFAIL){
417 ConnectResponse = ConnObjectIter->second->Connect(true);
419 if (ConnectResponse == COCONNECT_OK){
432 } else if (ConnectResponse == COCONNECT_OK){
434 ConnectResponse = ConnObjectIter->second->Connect(true);
449 if (iter->second == 2 || iter->second == 3 || iter->second == 4){
453 #if defined(__APPLE__)
455 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetTrustObject());
457 #elif defined(__WIN32__)
459 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateContextPointer());
463 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateData());
467 COServerResponse AddContactResponse = ConnObjectIter->second->AddContact(StringURLIter->second.ToStdString(),
468 StringDataIter->second.ToStdString());
470 if (AddContactResponse.RequestResult != COREQUEST_OK){
475 /*while (ExitLoop == FALSE){
477 // Verify that we have a trusted SSL connection first.
479 int ErrorCode = ConnHandle.SSLVerifyTest();
481 if (ErrorCode != CURLE_OK){
483 if (ErrorCode == CURLE_SSL_CACERT ||
484 ErrorCode == CURLE_PEER_FAILED_VERIFICATION ||
485 ErrorCode == CURLE_SSL_CONNECT_ERROR){
487 // Invalid SSL certificate so bring up a dialog to the user
488 // explaining what has happened and the options available.
490 // Stop all the timers.
492 frmMainPtrGet->PauseAllTimers();
496 #if defined(__APPLE__)
498 // Bring up the trust panel and display the SSL certificate dialog.
500 SSLResult = DisplayTrustPanel(ConnHandle.GetTrustObject(), AccountNameFriendly);
502 // Update the SSL account with the trust object.
504 if (SSLResult != NSOKButton){
506 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetTrustObject());
512 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetTrustObject());
517 #elif defined(__WIN32__)
519 BOOL ModifiedCertificateData;
520 CRYPTUI_VIEWCERTIFICATE_STRUCTW CertificateData = BuildCertificateData(&ConnHandle, (HWND)frmMainPtrGet->GetHandle());
522 if (!CryptUIDlgViewCertificate(&CertificateData, &ModifiedCertificateData)){
523 wxMessageBox(_("An error occured while trying to open the certificate dialog."), _("Error opening Certificate Information dialog"));
526 if (ModifiedCertificateData == FALSE){
528 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetCertificateContextPointer());
534 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateContextPointer());
540 // Setup the data to be sent in the wxPostEvent command.
542 SSLInvalidCertNotifObj SSLICNProcData;
544 SSLCertCollection certcol = ConnHandle.GetSSLVerifyResults();
546 bool *PauseMode = new bool;
550 qrn.QResponse = &SSLResult;
551 qrn.PausePtr = PauseMode;
553 SSLICNProcData.CertCollection = certcol;
554 SSLICNProcData.QRNotifData = &qrn;
555 SSLICNProcData.AccountName = AccountNameFriendly;
557 wxCommandEvent event(INVALIDSSLCERT);
558 event.SetClientData(&SSLICNProcData);
559 wxPostEvent(frmMainPtrGet, event);
561 while (*PauseMode == TRUE){
562 //nanosleep(&n1, &n2);
566 // Process the response from the user.
570 // Accept the certificate. Write the certificate into the account
571 // directory (as server.crt) - will overwrite old certificate.
573 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateData());
574 WriteServerCertificate(AccountDir, ConnHandle.GetCertificateData());
576 } else if (SSLResult == 2){
578 // Reject the certificate, abort the task and mark as failed.
580 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetCertificateData());
588 // Resume all the timers.
590 frmMainPtrGet->ResumeAllTimers();
608 if (iter->second == 2 || iter->second == 3 || iter->second == 4){
612 #if defined(__APPLE__)
614 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetTrustObject());
616 #elif defined(__WIN32__)
618 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateContextPointer());
622 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateData());
626 ConnHandle.SetUploadMode(TRUE);
627 ConnHandle.SetupData(wxT("PUT"), StringURLIter->second, StringDataIter->second);
628 ConnHandle.SetEditMode(EditMode);
629 ConnHandle.ProcessData();
631 int ErrorCode = ConnHandle.GetResultCode();
633 if (ErrorCode != CURLE_OK){
640 // Add contact to the ETag DB.
642 ConnHandle.GetServerETagValueThread();
643 ETagServer = ConnHandle.ETagValueResult();*/
645 // TODO: Get the entity tag for the new contact.
647 COServerResponse ETagGetResponse = ConnObjectIter->second->GetServerEntityTagValue(StringURLIter->second.ToStdString());
649 if (AddContactResponse.RequestResult != COREQUEST_OK){
654 ETagDBPtr->AddETag(ContactFilename, ETagGetResponse.EntityTag, ETagGetResponse.EntityTag);
661 } else if (TypeIter->second == 1){
665 StringDataIter = ActivityListData.find(iter->first);
666 StringURLIter = ActivityListURL.find(iter->first);
668 AccountDir = StringAccountIter->second;
669 ContactFilename = StringFilenameIter->second;
670 wxString AccountNameFriendly;
674 for (int i = 0; i < PrefData.accounts.GetCount(); i++){
676 wxString AccountDirCheck = PrefData.accounts.GetAccountDirectory(i);
678 AccountDirCheck.Trim();
679 AccountDirCheck.Append(wxT(".carddav"));
681 if (AccountDirCheck == StringAccountIter->second){
683 AccountNameFriendly = PrefData.accounts.GetAccountName(i);
690 ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir);
692 ETag = StringETagIter->second;
693 ETagOriginal = StringETagOrigIter->second;
694 AccountDir = StringAccountIter->second;
695 ContactFilename = StringFilenameIter->second;
696 FullFilename = StringFullFilenameIter->second;
697 EditMode = ActivityListEditMode.find(iter->first)->second;
699 bool KeepUpdating = TRUE;
701 while(KeepUpdating == TRUE){
703 bool ExitLoop = FALSE;
705 while (ExitLoop == FALSE){
707 int ErrorCode = ConnHandle.SSLVerifyTest();
709 if (ErrorCode != CURLE_OK){
711 if (ErrorCode == CURLE_SSL_CACERT ||
712 ErrorCode == CURLE_PEER_FAILED_VERIFICATION ||
713 ErrorCode == CURLE_SSL_CONNECT_ERROR){
715 // Invalid SSL certificate so bring up a dialog to the user
716 // explaining what has happened and the options available.
718 // Stop all the timers.
720 frmMainPtrGet->PauseAllTimers();
724 #if defined(__APPLE__)
726 // Bring up the trust panel and display the SSL certificate dialog.
728 SSLResult = DisplayTrustPanel(ConnHandle.GetTrustObject(), AccountNameFriendly);
730 // Update the SSL account with the trust object.
732 if (SSLResult != NSOKButton){
734 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetTrustObject());
740 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetTrustObject());
744 #elif defined(__WIN32__)
746 BOOL ModifiedCertificateData;
747 CRYPTUI_VIEWCERTIFICATE_STRUCTW CertificateData = BuildCertificateData(&ConnHandle, (HWND)frmMainPtrGet->GetHandle());
749 if (!CryptUIDlgViewCertificate(&CertificateData, &ModifiedCertificateData)){
750 wxMessageBox(_("An error occured while trying to open the certificate dialog."), _("Error opening Certificate Information dialog"));
753 if (ModifiedCertificateData == FALSE){
755 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetCertificateContextPointer());
761 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateContextPointer());
767 // Setup the data to be sent in the wxPostEvent command.
769 SSLInvalidCertNotifObj SSLICNProcData;
771 SSLCertCollection certcol = ConnHandle.GetSSLVerifyResults();
773 bool *PauseMode = new bool;
777 qrn.QResponse = &SSLResult;
778 qrn.PausePtr = PauseMode;
780 SSLICNProcData.CertCollection = certcol;
781 SSLICNProcData.QRNotifData = &qrn;
782 SSLICNProcData.AccountName = AccountNameFriendly;
784 wxCommandEvent event(INVALIDSSLCERT);
785 event.SetClientData(&SSLICNProcData);
786 wxPostEvent(frmMainPtrGet, event);
788 while (*PauseMode == TRUE){
789 //nanosleep(&n1, &n2);
793 // Process the response from the user.
797 // Accept the certificate. Write the certificate into the account
798 // directory (as server.crt) - will overwrite old certificate.
800 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetSSLVerifyResults());
801 WriteServerCertificate(AccountDir, ConnHandle.GetSSLVerifyResults());
803 } else if (SSLResult == 2){
805 // Reject the certificate, abort the task and mark as failed.
807 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetSSLVerifyResults());
815 // Resume all the timers.
817 frmMainPtrGet->ResumeAllTimers();
835 if (iter->second == 2 || iter->second == 3 || iter->second == 4){
839 #if defined(__APPLE__)
841 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetTrustObject());
843 #elif defined(__WIN32__)
845 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateContextPointer());
849 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetSSLVerifyResults());
853 ConnHandle.SetUploadMode(TRUE);
854 ConnHandle.SetupData(wxT("PUT"), StringURLIter->second, StringDataIter->second);
855 ConnHandle.SetEditMode(EditMode);
856 ConnHandle.GetServerETagValueThread();
857 ETagServer = ConnHandle.ETagValueResult();
859 int ErrorCode = ConnHandle.GetResultCode();
861 if (ErrorCode != CURLE_OK){
866 // Compare the ETag with the Server ETag.
868 if (ETagOriginal != ETagServer){
870 // Server ETag is different from original ETag.
871 // This is a conflict which the user will now
877 frmMain *frmMainPtrGet = static_cast<frmMain*>(frmMainPtr);
879 vCard34Conv vCard34Obj;
881 wxString ServerContactData;
883 vCard ConvertedV4Data;
885 // Load the client data from the filename given.
887 ConnHandle.GetServerContactData();
888 ServerContactData = ConnHandle.GetPageData();
890 // Process v3 version into v4 version.
892 vCard34Obj.ConvertToV4(&ServerContactData, &ConvertedV4Data);
894 vCardConflictObj vCardProcData;
896 vCardProcData.vCardLocalData = &ClientData;
897 vCardProcData.vCardServerData = &ConvertedV4Data;
898 ClientData.LoadFile(FullFilename);
900 //ContactConflictEvent event(ContactConflictCmdEnv);
901 //event.SetData(ContactFilename, Moo1, Moo2);
903 //wxPostEvent(frmMainPtrGet, event);
905 // Setup Conflict Resolution Dialog.
907 // Fetch Data from Server and convert.
909 bool *PauseMode = new bool;
914 qrn.QResponse = &ConflictResult;
915 qrn.PausePtr = PauseMode;
917 vCardProcData.QRNotifData = &qrn;
919 wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED);
920 event.SetClientData(&vCardProcData);
921 wxPostEvent(frmMainPtrGet, event);
923 while (*PauseMode == TRUE){
924 //nanosleep(&n1, &n2);
931 //intResult = frmMainPtrGet->ShowConflictDialog(&Moo1, &Moo2);
933 if (ConflictResult == 0){
940 } else if (ConflictResult == 1){
942 // Decided to use client version.
944 ConnHandle.ProcessData();
946 } else if (ConflictResult == 2){
948 // Decided to use server version.
950 // Download server version.
952 ConvertedV4Data.WriteFile(FullFilename);
958 // Update the data to the server.
960 ConnHandle.ProcessData();
964 // Update the ETag DB.
966 ConnHandle.GetServerETagValueThread();
967 ETagServer = ConnHandle.ETagValueResult();
968 ETagDBPtr->UpdateETag(ContactFilename, ETagServer, ETagServer);
975 } else if (TypeIter->second == 2) {
977 // Delete the contact from the server and update the ETag DB.
979 AccountDir = StringAccountIter->second;
980 ContactFilename = StringFilenameIter->second;
981 wxString AccountNameFriendly;
985 for (int i = 0; i < PrefData.accounts.GetCount(); i++){
987 wxString AccountDirCheck = PrefData.accounts.GetAccountDirectory(i);
989 AccountDirCheck.Trim();
990 AccountDirCheck.Append(wxT(".carddav"));
992 if (AccountDirCheck == StringAccountIter->second){
994 AccountNameFriendly = PrefData.accounts.GetAccountName(i);
1001 ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir);
1003 bool KeepUpdating = TRUE;
1005 while(KeepUpdating == TRUE){
1007 bool ExitLoop = FALSE;
1009 while (ExitLoop == FALSE){
1011 int ErrorCode = ConnHandle.SSLVerifyTest();
1013 if (ErrorCode != CURLE_OK){
1015 if (ErrorCode == CURLE_SSL_CACERT ||
1016 ErrorCode == CURLE_PEER_FAILED_VERIFICATION ||
1017 ErrorCode == CURLE_SSL_CONNECT_ERROR){
1019 // Invalid SSL certificate so bring up a dialog to the user
1020 // explaining what has happened and the options available.
1022 // Stop all the timers.
1024 frmMainPtrGet->PauseAllTimers();
1028 #if defined(__APPLE__)
1030 // Bring up the trust panel and display the SSL certificate dialog.
1032 SSLResult = DisplayTrustPanel(ConnHandle.GetTrustObject(), AccountNameFriendly);
1034 // Update the SSL account with the trust object.
1036 if (SSLResult != NSOKButton){
1038 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetTrustObject());
1044 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetTrustObject());
1048 #elif defined(__WIN32__)
1050 BOOL ModifiedCertificateData;
1051 CRYPTUI_VIEWCERTIFICATE_STRUCTW CertificateData = BuildCertificateData(&ConnHandle, (HWND)frmMainPtrGet->GetHandle());
1053 if (!CryptUIDlgViewCertificate(&CertificateData, &ModifiedCertificateData)){
1054 wxMessageBox(_("An error occured while trying to open the certificate dialog."), _("Error opening Certificate Information dialog"));
1057 if (ModifiedCertificateData == FALSE){
1059 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetCertificateContextPointer());
1065 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateContextPointer());
1071 // Setup the data to be sent in the wxPostEvent command.
1073 SSLInvalidCertNotifObj SSLICNProcData;
1075 SSLCertCollection certcol = ConnHandle.GetSSLVerifyResults();
1077 bool *PauseMode = new bool;
1081 qrn.QResponse = &SSLResult;
1082 qrn.PausePtr = PauseMode;
1084 SSLICNProcData.CertCollection = certcol;
1085 SSLICNProcData.QRNotifData = &qrn;
1086 SSLICNProcData.AccountName = AccountNameFriendly;
1088 wxCommandEvent event(INVALIDSSLCERT);
1089 event.SetClientData(&SSLICNProcData);
1090 wxPostEvent(frmMainPtrGet, event);
1094 // Fall asleep until we get an response.
1097 n1.tv_nsec = 250000000L;*/
1099 while (*PauseMode == TRUE){
1100 //nanosleep(&n1, &n2);
1101 SleepFor(250000000);
1104 // Process the response from the user.
1106 if (SSLResult == 1){
1108 // Accept the certificate. Write the certificate into the account
1109 // directory (as server.crt) - will overwrite old certificate.
1111 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetSSLVerifyResults());
1112 WriteServerCertificate(AccountDir, ConnHandle.GetSSLVerifyResults());
1114 } else if (SSLResult == 2){
1116 // Reject the certificate, abort the task and mark as failed.
1118 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetSSLVerifyResults());
1126 // Resume all the timers.
1128 frmMainPtrGet->ResumeAllTimers();
1146 if (iter->second == 2 || iter->second == 3 || iter->second == 4){
1150 #if defined(__APPLE__)
1152 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetTrustObject());
1154 #elif defined(__WIN32__)
1156 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateContextPointer());
1160 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetSSLVerifyResults());
1164 ConnHandle.SetUploadMode(FALSE);
1165 ConnHandle.SetupData(wxT("DELETE"), ContactFilename, wxT(""));
1166 ConnHandle.ProcessData();
1168 SSLCertCollection certcol = ConnHandle.GetCertificateData();
1170 // Check if any errors have occured whilst getting the data.
1172 int ErrorCode = ConnHandle.GetResultCode();
1174 if (ErrorCode != CURLE_OK){
1179 ETagDBPtr->RemoveETag(ContactFilename);
1182 CardDAVIter->second = NULL;
1187 } else if (TypeIter->second == 3) {
1189 wxString AccountNameFriendly;
1193 for (int i = 0; i < PrefData.accounts.GetCount(); i++){
1195 wxString AccountDirCheck = PrefData.accounts.GetAccountDirectory(i);
1197 AccountDirCheck.Trim();
1198 AccountDirCheck.Append(wxT(".carddav"));
1200 if (AccountDirCheck == StringAccountIter->second){
1202 AccountNameFriendly = PrefData.accounts.GetAccountName(i);
1209 bool KeepUpdating = TRUE;
1211 while (KeepUpdating == TRUE){
1213 StringTaskDetailIter = ActivityListTaskDetail.find(iter->first);
1215 AccountDir = StringAccountIter->second;
1217 ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir);
1219 wxArrayString vCardAdd;
1220 wxArrayString vCardDelete;
1221 wxArrayString vCardList;
1222 wxArrayString vCardUpdateLocal;
1223 wxArrayString vCardUpdateRemote;
1224 wxArrayString vCardUpdateLog;
1225 std::map<wxString,wxString> vCardETag;
1226 ContactListData ServerContactList;
1228 std::map<wxString,vCardDownloadDataFileClass> vCardDownloadData;
1229 //wxArrayString vCardDownload;
1230 //std::map<wxString,wxString> vCardDownloadData;
1232 // Get the list of vCard files locally.
1234 wxString AccountDirFinal;
1235 wxString AccountSyncTokenFilename;
1236 wxString SyncTokenLoad;
1238 #if defined(__HAIKU__)
1240 //preffilename = wxT("noo");
1242 #elif defined(__WIN32__)
1244 AccountDirFinal = GetAccountDir(AccountDir, FALSE);
1245 AccountSyncTokenFilename = AccountDirFinal;
1246 AccountSyncTokenFilename.Append(wxT("synctoken"));
1250 AccountDirFinal = GetAccountDir(AccountDir, FALSE);
1251 AccountSyncTokenFilename = AccountDirFinal;
1252 AccountSyncTokenFilename.Append(wxT("synctoken"));
1256 // Suppress Error Messages.
1258 wxLogNull PleaseDoNotDisturb;
1261 SyncLoad.Open(AccountSyncTokenFilename, wxT("r"));
1263 if (SyncLoad.IsOpened()){
1265 SyncLoad.ReadAll(&SyncTokenLoad, wxMBConvUTF8());
1270 // Get a list of vCard files from the server.
1272 // Get the list of vCard files from the ETagDB.
1274 std::map<wxString,ETagData> ETagDBData = ETagDBPtr->GetETagData();
1276 bool ExitLoop = FALSE;
1278 std::map<wxString,FileSyncData> *SCListData = NULL;
1280 while (ExitLoop == FALSE){
1282 // Check if any errors have occured whilst getting the data.
1284 int ErrorCode = ConnHandle.SSLVerifyTest();
1286 if (ErrorCode != CURLE_OK){
1288 if (ErrorCode == CURLE_SSL_CACERT ||
1289 ErrorCode == CURLE_PEER_FAILED_VERIFICATION ||
1290 ErrorCode == CURLE_SSL_CONNECT_ERROR){
1292 // Invalid SSL certificate so bring up a dialog to the user
1293 // explaining what has happened and the options available.
1295 // Stop all the timers.
1297 frmMainPtrGet->PauseAllTimers();
1301 #if defined(__APPLE__)
1303 // Bring up the trust panel and display the SSL certificate dialog.
1305 SSLResult = DisplayTrustPanel(ConnHandle.GetTrustObject(), AccountNameFriendly);
1307 // Update the SSL account with the trust object.
1309 if (SSLResult != NSOKButton){
1311 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetTrustObject());
1317 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetTrustObject());
1321 #elif defined(__WIN32__)
1323 BOOL ModifiedCertificateData;
1324 CRYPTUI_VIEWCERTIFICATE_STRUCTW CertificateData = BuildCertificateData(&ConnHandle, (HWND)frmMainPtrGet->GetHandle());
1326 if (!CryptUIDlgViewCertificate(&CertificateData, &ModifiedCertificateData)){
1327 wxMessageBox(_("An error occured while trying to open the certificate dialog."), _("Error opening Certificate Information dialog"));
1330 if (ModifiedCertificateData == FALSE){
1332 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetCertificateContextPointer());
1338 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateContextPointer());
1343 // Setup the data to be sent in the wxPostEvent command.
1345 SSLInvalidCertNotifObj SSLICNProcData;
1347 SSLCertCollection certcol = ConnHandle.GetSSLVerifyResults();
1349 bool *PauseMode = new bool;
1353 qrn.QResponse = &SSLResult;
1354 qrn.PausePtr = PauseMode;
1356 SSLICNProcData.CertCollection = certcol;
1357 SSLICNProcData.QRNotifData = &qrn;
1358 SSLICNProcData.AccountName = AccountNameFriendly;
1360 wxCommandEvent event(INVALIDSSLCERT);
1361 event.SetClientData(&SSLICNProcData);
1362 wxPostEvent(frmMainPtrGet, event);
1366 // Fall asleep until we get an response.
1369 n1.tv_nsec = 250000000L;*/
1371 while (*PauseMode == TRUE){
1372 //nanosleep(&n1, &n2);
1373 SleepFor(250000000);
1376 // Process the response from the user.
1378 if (SSLResult == 1){
1380 // Accept the certificate. Write the certificate into the account
1381 // directory (as server.crt) - will overwrite old certificate.
1383 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetSSLVerifyResults());
1384 WriteServerCertificate(AccountDir, ConnHandle.GetSSLVerifyResults());
1386 } else if (SSLResult == 2){
1388 // Reject the certificate, abort the task and mark as failed.
1390 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetSSLVerifyResults());
1398 // Resume all the timers.
1400 frmMainPtrGet->ResumeAllTimers();
1418 if (iter->second == 2 || iter->second == 3 || iter->second == 4){
1422 #if defined(__APPLE__)
1424 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetTrustObject());
1426 #elif defined(__WIN32__)
1428 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateContextPointer());
1432 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetSSLVerifyResults());
1436 // Look in directory and see which vCards to add and delete
1439 // vCard exists but not in ETagDB - Add (and upload).
1440 // vCard missing but in ETagDB - Delete (from server).
1442 // Start by looking for vCards that are not in the ETagDB.
1444 wxDir AccDir(AccountDirFinal);
1445 wxString AccDirFilename;
1447 bool ContinueProcess = AccDir.GetFirst(&AccDirFilename, wxEmptyString, wxDIR_DEFAULT);
1449 ServerContactList = ConnHandle.GetContactList(SyncTokenLoad.ToUTF8());
1451 int ErrorCode = ConnHandle.GetResultCode();
1453 if (ErrorCode != CURLE_OK){
1460 SSLCertCollection certcol = ConnHandle.GetCertificateData();
1462 // Create a pointer for the std::map<wxString,FileSyncData>.
1464 SCListData = &ServerContactList.ListData;
1466 // Process the server data.
1468 if (SCListData != NULL){
1470 for (std::map<wxString, FileSyncData>::iterator fsiter = SCListData->begin();
1471 fsiter != SCListData->end(); fsiter++){
1473 // Check the mode of the file before adding.
1475 // Get the HTTP status of the file from the list.
1477 FileSyncData fsd = fsiter->second;
1479 if (fsd.DataFlag == 1){
1481 // Added or modified contact.
1483 //vCardAdd.Add(fsiter->first, 1);
1485 vCardDownloadDataFileClass vCardNewData;
1486 vCardNewData.DataType = 0;
1487 vCardDownloadData.insert(std::make_pair(fsiter->first, vCardNewData));
1489 //} else if (fsd.DataFlag == 1){
1491 // Contact has been modified on the server.
1493 // vCardUpdateLocal.Add(fsiter->first, 1);
1496 else if (fsd.DataFlag == 2){
1498 // Contact has been deleted.
1500 vCardDelete.Add(fsiter->first, 1);
1508 // Look for vCards that are missing but in the ETagDB.
1510 for (std::map<wxString,ETagData>::iterator etagiter = ETagDBData.begin();
1511 etagiter != ETagDBData.end(); etagiter++){
1513 // Check if the vCard exists.
1515 if (!wxFileExists(AccountDirFinal + etagiter->first)){
1517 // vCard doesn't exist so mark for deleting.
1519 vCardDelete.Add(etagiter->first, 1);
1525 // Compare Server with the ETag DB. Work out which
1526 // needs to updated remotely and which needs to be
1529 for (std::map<wxString,FileSyncData>::iterator srviter = SCListData->begin();
1530 srviter != SCListData->end(); srviter++){
1532 if (ETagDBData.find(srviter->first) == ETagDBData.end()){
1536 std::map<wxString,ETagData>::iterator lociter = ETagDBData.find(srviter->first);
1538 ETagData etd = lociter->second;
1539 FileSyncData fsd = srviter->second;
1541 wxString ETagSrv = fsd.ETagData;
1543 // Check if the local ETag value has 'DELETED' set and skip
1544 // checking this file if it does.
1546 if (etd.ETagValue == "DELETED"){
1552 // Compare local ETag with original local ETag.
1553 // If different, update to server is required.
1555 if (etd.ETagValue != etd.ETagOrigValue){
1557 // Check if local original ETag is different from server ETag.
1558 // If it is then throw up a conflict resolution dialog.
1560 if (etd.ETagOrigValue != ETagSrv){
1562 vCard34Conv vCard34Obj;
1564 wxString ServerContactData;
1565 wxString FullFilename;
1567 vCard ConvertedV4Data;
1569 // Conflict. Bring up conflict resolution dialog.
1571 // Get the server contact data for comparison.
1573 ConnHandle.SetServerFilename(srviter->first);
1574 ConnHandle.GetServerContactData();
1575 ServerContactData = ConnHandle.GetPageData();
1577 FullFilename = CreateFilenamePath(AccountDirFinal, srviter->first);
1579 // Convert it to v4.
1581 vCard34Obj.ConvertToV4(&ServerContactData, &ConvertedV4Data);
1583 vCardConflictObj vCardProcData;
1585 vCardProcData.vCardLocalData = &ClientData;
1586 vCardProcData.vCardServerData = &ConvertedV4Data;
1588 // Load the client data from the filename given.
1590 ClientData.LoadFile(FullFilename);
1594 bool *PauseMode = new bool;
1597 frmMain *frmMainPtrGet = static_cast<frmMain*>(frmMainPtr);
1600 qrn.QResponse = &ConflictResult;
1601 qrn.PausePtr = PauseMode;
1603 vCardProcData.QRNotifData = &qrn;
1605 wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED);
1606 event.SetClientData(&vCardProcData);
1607 wxPostEvent(frmMainPtrGet, event);
1612 n1.tv_nsec = 250000000L;*/
1614 while (*PauseMode == TRUE){
1615 //nanosleep(&n1, &n2);
1616 SleepFor(250000000);
1622 // If replacing local version, store copy for now.
1623 // Otherwise upload to server.
1625 if (ConflictResult == 0){
1631 } else if (ConflictResult == 1){
1633 // Decided to use client version.
1635 vCardUpdateLocal.Remove(srviter->first);
1636 vCardUpdateRemote.Add(srviter->first, 1);
1638 } else if (ConflictResult == 2){
1640 // Decided to use server version.
1641 // Store the converted downloaded copy for
1642 // processing later.
1644 //vCardUpdateLocal.Add(srviter->first, 1);
1646 vCardDownloadDataFileClass vCardNewData;
1647 vCardNewData.DataType = 1;
1648 vCardNewData.FileData = ConvertedV4Data.WriteString();
1650 ConvertedV4Data.WriteFile(FullFilename);
1652 vCardDownloadData.insert(std::make_pair(srviter->first, vCardNewData));
1660 // Send vCard to the server.
1662 vCardUpdateRemote.Add(srviter->first, 1);
1668 // Check if local ETag is different from server ETag.
1669 // If different, obtain the vCard from the server.
1671 if (etd.ETagOrigValue != ETagSrv){
1673 vCardUpdateLocal.Add(srviter->first, 1);
1681 // Process the vCards that need to be downloaded and added/overwritten.
1683 wxString vCardFilenameFinal;
1684 wxString vCardOutputData;
1685 wxString vCardInputData;
1686 wxString ETagFileData;
1689 for (std::map<wxString,vCardDownloadDataFileClass>::iterator additer = vCardDownloadData.begin();
1690 additer != vCardDownloadData.end(); additer++){
1692 vCardFilenameFinal.Clear();
1693 vCardInputData.Clear();
1694 vCardOutputData.Clear();
1695 ETagFileData.Clear();
1697 vCardFilenameFinal = CreateFilenamePath(AccountDirFinal, additer->first);
1699 ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir);
1701 if (additer->second.DataType == 0){
1703 vCard ConvertedV4Data;
1705 // Grab the file from the server and write the contact out.
1707 vCard34Conv vCard34Obj;
1709 ConnHandle.SetServerFilename(additer->first);
1710 ConnHandle.GetServerContactData();
1711 vCardInputData = ConnHandle.GetPageData();
1713 vCard34Obj.ConvertToV4(&vCardInputData, &ConvertedV4Data);
1715 ConvertedV4Data.WriteFile(vCardFilenameFinal);
1717 // Update the ETagDB.
1719 //vCardFile.Open(vCardFilenameFinal, wxT("w"));
1721 //if (vCardFile.IsOpened()){
1723 // vCardFile.Write(vCardOutputData, wxConvAuto());
1724 // vCardFile.Close();
1728 // Get the server ETag.
1730 wxString ServerETag;
1731 ConnHandle.GetServerETagValueThread();
1732 ServerETag = ConnHandle.ETagValueResult();
1734 // Add to the ETag Database.
1736 ETagDBPtr->AddETag(additer->first, ServerETag, ServerETag);
1738 } else if (additer->second.DataType == 1){
1740 // Write out the contact to the account directory.
1742 vCardFilenameFinal = CreateFilenamePath(AccountDirFinal, additer->first);
1743 vCardOutputData = additer->second.FileData;
1745 vCardFile.Open(vCardFilenameFinal, wxT("w"));
1747 if (vCardFile.IsOpened()){
1749 vCardFile.Write(vCardOutputData, wxConvAuto());
1754 // Update the ETagDB.
1756 wxString ServerETag;
1757 ConnHandle.GetServerETagValueThread();
1758 ServerETag = ConnHandle.ETagValueResult();
1760 // Add to the ETag Database.
1762 ETagDBPtr->AddETag(additer->first, ServerETag, ServerETag);
1767 // Look for vCard files which aren't in the ETagDB.
1769 while(ContinueProcess){
1771 // Check and make sure that the filename ends in .vcf/.vcard
1772 // Skip any file that beings with a dot.
1774 if (AccDirFilename.Left(1) == wxT(".")){
1776 ContinueProcess = AccDir.GetNext(&AccDirFilename);
1781 if (AccDirFilename.Right(4) != wxT(".vcf") &&
1782 AccDirFilename.Right(6) != wxT(".vcard")){
1784 ContinueProcess = AccDir.GetNext(&AccDirFilename);
1789 // Look in the ETagDB for the file.
1791 bool ETagExists = ETagDBPtr->CheckETagExists(AccDirFilename);
1793 if (ETagExists == FALSE){
1795 // Add the vCard to the list to be added.
1797 vCardAdd.Add(AccDirFilename, 1);
1801 ContinueProcess = AccDir.GetNext(&AccDirFilename);
1805 // Process the vCards to add/update to the server.
1807 for (int vi = 0; vi < vCardAdd.GetCount(); vi++){
1809 ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir);
1810 ETag = ETagDBPtr->GetETag(vCardAdd[vi]);
1811 ETagOriginal = ETagDBPtr->GetETagOriginal(vCardAdd[vi]);
1813 ContactFilename = vCardAdd[vi];
1814 FullFilename = CreateFilenamePath(AccountDirFinal, vCardAdd[vi]);
1816 ContactFilename.Trim();
1818 if (ETag == ETagOriginal && ETagDBPtr->ETagExists(vCardAdd[vi])){
1820 // Compare the ETag with the Server ETag.
1822 ConnHandle.SetServerFilename(vCardAdd[vi]);
1823 ConnHandle.GetServerETagValueThread();
1824 ETagServer = ConnHandle.ETagValueResult();
1826 if (ETagOriginal != ETagServer){
1828 // Server ETag is different from original ETag.
1829 // This is a conflict which the user will now
1832 frmMain *frmMainPtrGet = static_cast<frmMain*>(frmMainPtr);
1834 vCard34Conv vCard34Obj;
1836 wxString ServerContactData;
1838 vCard ConvertedV4Data;
1840 // Load the client data from the filename given.
1842 ConnHandle.GetServerContactData();
1843 ServerContactData = ConnHandle.GetPageData();
1845 // Process v3 version into v4 version.
1847 vCard34Obj.ConvertToV4(&ServerContactData, &ConvertedV4Data);
1849 vCardConflictObj vCardProcData;
1851 vCardProcData.vCardLocalData = &ClientData;
1852 vCardProcData.vCardServerData = &ConvertedV4Data;
1853 ClientData.LoadFile(FullFilename);
1855 //ContactConflictEvent event(ContactConflictCmdEnv);
1856 //event.SetData(ContactFilename, Moo1, Moo2);
1858 //wxPostEvent(frmMainPtrGet, event);
1860 // Setup Conflict Resolution Dialog.
1862 // Fetch Data from Server and convert.
1864 bool *PauseMode = new bool;
1869 qrn.QResponse = &ConflictResult;
1870 qrn.PausePtr = PauseMode;
1872 vCardProcData.QRNotifData = &qrn;
1874 wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED);
1875 event.SetClientData(&vCardProcData);
1876 wxPostEvent(frmMainPtrGet, event);
1881 n1.tv_nsec = 250000000L;*/
1883 while (*PauseMode == TRUE){
1884 //nanosleep(&n1, &n2);
1885 SleepFor(250000000);
1891 //intResult = frmMainPtrGet->ShowConflictDialog(&Moo1, &Moo2);
1893 if (ConflictResult == 0){
1900 } else if (ConflictResult == 1){
1902 // Decided to use client version.
1904 ConnHandle.ProcessData();
1908 } else if (ConflictResult == 2){
1910 // Decided to use server version.
1912 // Download server version.
1914 ConvertedV4Data.WriteFile(CreateFilenamePath(AccountDirFinal, vCardAdd[vi]));
1922 // Setup the filename for the contact being added.
1924 wxString wxSFilename = CreateFilenamePath(AccountDirFinal, vCardAdd[vi]);
1925 wxString wxSCardData;
1929 // Load the data from the file.
1932 wxFCard.Open(wxSFilename, wxT("r"));
1934 if (wxFCard.IsOpened()){
1936 wxFCard.ReadAll(&wxSCardData, wxConvAuto());
1941 // Convert the data to v3.
1943 vCard34Conv vCard34Obj;
1945 vCard34Obj.ConvertToV3(wxSFilename, &TaskData);
1947 // Setup the URL address.
1949 //TaskURL = StringTaskDetailIter->second + wxT("/") + vCardAdd[vi];
1951 // Upload the data to the server.
1953 ConnHandle.SetUploadMode(TRUE);
1954 ConnHandle.SetupData(wxT("PUT"), vCardAdd[vi], TaskData);
1955 ConnHandle.ProcessData();
1957 // Get the Server ETag and put it in the ETag database.
1959 ConnHandle.SetServerFilename(vCardAdd[vi]);
1960 ConnHandle.GetServerETagValueThread();
1961 ETagServer = ConnHandle.ETagValueResult();
1963 ETagDBPtr->AddETag(vCardAdd[vi], ETagServer, ETagServer);
1969 if (ETagOriginal != ETagServer){
1971 // Server ETag is different from original ETag.
1972 // This is a conflict which the user will now
1975 frmMain *frmMainPtrGet = (frmMain *)frmMainPtr;
1977 //ContactConflictEvent event(ContactConflictCmdEnv);
1978 //event.SetData(ContactFilename, Moo1, Moo2);
1980 vCard34Conv vCard34Obj;
1982 wxString ServerContactData;
1984 vCard ConvertedV4Data;
1986 // Load the client data from the filename given.
1988 ConnHandle.GetServerContactData();
1989 ServerContactData = ConnHandle.GetPageData();
1990 ClientData.LoadFile(FullFilename);
1992 // Process v3 version into v4 version.
1994 vCard34Obj.ConvertToV4(&ServerContactData, &ConvertedV4Data);
1996 vCardConflictObj vCardProcData;
1998 vCardProcData.vCardLocalData = &ClientData;
1999 vCardProcData.vCardServerData = &ConvertedV4Data;
2001 bool *PauseMode = new bool;
2006 qrn.QResponse = &ConflictResult;
2007 qrn.PausePtr = PauseMode;
2009 vCardProcData.QRNotifData = &qrn;
2011 wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED);
2012 event.SetClientData(&vCardProcData);
2013 wxPostEvent(frmMainPtrGet, event);
2018 n1.tv_nsec = 250000000L;*/
2020 while (*PauseMode == TRUE){
2021 //nanosleep(&n1, &n2);
2022 SleepFor(250000000);
2028 //intResult = frmMainPtrGet->ShowConflictDialog(&Moo1, &Moo2);
2030 if (ConflictResult == 0){
2037 } else if (ConflictResult == 1){
2039 // Decided to use client version.
2041 ConnHandle.ProcessData();
2042 //ETagServer = CardDAVIter->second.GetServerETagValueThread();
2043 //ETagDBPtr->UpdateETag(ContactFilename, ETagServer, ETagServer);
2047 } else if (ConflictResult == 2){
2049 // Decided to use server version.
2051 // Write server version to file.
2053 ConvertedV4Data.WriteFile(CreateFilenamePath(AccountDirFinal, vCardAdd[vi]));
2061 // Setup the filename for the contact being added.
2063 wxString wxSFilename = CreateFilenamePath(AccountDirFinal, vCardAdd[vi]);
2064 wxString wxSCardData;
2068 // Load the data from the file.
2071 wxFCard.Open(wxSFilename, wxT("r"));
2073 if (wxFCard.IsOpened()){
2075 wxFCard.ReadAll(&wxSCardData, wxConvAuto());
2080 // Convert the data to v3.
2082 vCard34Conv vCard34Obj;
2084 vCard34Obj.ConvertToV3(wxSFilename, &TaskData);
2086 // Setup the URL address.
2088 //TaskURL = StringTaskDetailIter->second + wxT("/") + vCardAdd[vi];
2090 // Upload the data to the server.
2092 ConnHandle.SetUploadMode(TRUE);
2093 ConnHandle.SetupData(wxT("PUT"), vCardAdd[vi], TaskData);
2094 ConnHandle.ProcessData();
2096 // Get the Server ETag and put it in the ETag database.
2098 ConnHandle.SetServerFilename(vCardAdd[vi]);
2099 ConnHandle.GetServerETagValueThread();
2100 ETagServer = ConnHandle.ETagValueResult();
2103 ETagDBPtr->AddETag(vCardAdd[vi], ETagServer, ETagServer);
2111 // Process the vCards to delete locally.
2113 for (int vi = 0; vi < vCardDelete.GetCount(); vi++){
2115 if (!wxRemoveFile(CreateFilenamePath(AccountDirFinal, vCardDelete[vi]))){
2119 ETagDBPtr->RemoveETag(vCardDelete[vi]);
2125 // Process the vCards to delete from the server.
2127 std::map<wxString,wxString> *ETagFilenameMap = ETagDBPtr->GetFilenamePointer();
2128 std::list<wxString> DeleteList;
2130 for (std::map<wxString,wxString>::iterator deliter = ETagFilenameMap->begin();
2131 deliter != ETagFilenameMap->end(); deliter++){
2133 // Look through the ETagDB and find contacts which are marked as DELETED.
2135 if (deliter->second == wxT("DELETED")){
2137 ConnHandle.SetUploadMode(FALSE);
2138 ConnHandle.SetupData(wxT("DELETE"), deliter->first, wxT(""));
2139 ConnHandle.ProcessDataThread();
2141 // Delete the ETag as the file has now been deleted.
2143 DeleteList.push_back(deliter->first);
2149 for (std::list<wxString>::iterator removeetagiter = DeleteList.begin();
2150 removeetagiter != DeleteList.end(); removeetagiter++){
2152 ETagDBPtr->RemoveETag(*removeetagiter);
2156 // Write out the update server sync token.
2158 wxString ServerSyncToken = ServerContactList.SyncToken;
2160 ServerSyncToken.Trim();
2162 if (!ServerSyncToken.IsEmpty()){
2165 SyncWrite.Open(AccountSyncTokenFilename, wxT("w"));
2167 if (SyncWrite.IsOpened()){
2169 SyncWrite.Write(ServerSyncToken, wxConvAuto());
2176 // Check for another sync token. If there is another
2177 // sync token then repeat this. If token matches then stop processing.
2179 if (SyncTokenLoad == ServerSyncToken){
2181 KeepUpdating = FALSE;
2187 // Mark as completed.
2189 wxString AccountNameFinal;
2190 AccountNameFinal = PrefData.accounts.GetAccountDirectory(AccountID);
2191 AccountNameFinal.Append(wxT(".carddav"));
2193 wxCommandEvent reloadevent(RELOADCONTACTLIST);
2194 reloadevent.SetString(AccountNameFinal);
2195 wxPostEvent(this->GetParent(), reloadevent);
2202 // Update the data to the server.
2204 ConnHandle.ProcessData();
2213 n1.tv_nsec = 250000000L;*/
2215 while (iter->second == 1){
2217 SleepFor(250000000);
2218 //nanosleep(&n1, &n2);
2222 if ((iter->second == 4 && TypeIter->second == 0) ||
2223 (iter->second == 8 && TypeIter->second == 0)){
2225 AccountDir = StringAccountIter->second;
2226 ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir);
2228 ConnHandle.GetServerETagValueThread();
2229 ETagServer = ConnHandle.ETagValueResult();
2230 ETagDBPtr->UpdateETag(ContactFilename, ETagServer, ETagServer);
2234 if ((iter->second == 4 && TypeIter->second == 1) ||
2235 (iter->second == 8 && TypeIter->second == 1)){
2237 AccountDir = StringAccountIter->second;
2238 ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir);
2240 ConnHandle.GetServerETagValueThread();
2241 ETagServer = ConnHandle.ETagValueResult();
2242 ETagDBPtr->UpdateETag(ContactFilename, ETagServer, ETagServer);
2252 if (TasksFoundProc == FALSE){
2254 TasksActive = FALSE;
2255 ProcessTasksData = FALSE;
2259 wxCommandEvent eventp(ACTMGR_STARTTIMER);
2260 wxPostEvent(this, eventp);
2262 //AnimationTimer.StartAnimation();
2263 //ActListProcTimer.Start();
2267 wxCommandEvent event(ACTMGR_STARTPROCESSTIMER);
2268 wxPostEvent(this, event);
2270 //ActProcessTimer.Start();
2274 void frmActivityMgr::ProcessTasks()
2277 std::thread ProcessThread(&frmActivityMgr::ProcessTasksThread, this);
2278 ProcessThread.detach();
2282 void frmActivityMgr::SetupPointers(wxETagProcessTimer *ETagTmrPtrInc, void *frmMainPtrInc)
2285 ETagTmrPtr = ETagTmrPtrInc;
2287 frmMainPtr = frmMainPtrInc;
2291 void frmActivityMgr::ResumeProcessing(wxCommandEvent &event){
2293 QRNotif *qrn = (QRNotif *)event.GetClientData();
2295 int *QRes = qrn->QResponse;
2297 *qrn->PausePtr = FALSE;
2299 *QRes = event.GetInt();
2303 void frmActivityMgr::ToggleConnectionStatus( wxCommandEvent &event ){
2305 wxCommandEvent connevent(CONNSTAT_UPDATE);
2307 if (ApplicationSleepMode == FALSE){
2309 connevent.SetInt(1);
2310 ApplicationSleepMode = TRUE;
2311 mnuSleepMode->Check(true);
2315 connevent.SetInt(0);
2316 ApplicationSleepMode = FALSE;
2317 mnuSleepMode->Check(false);
2319 wxCommandEvent event(ACTMGR_STARTTIMER);
2320 wxPostEvent(this, event);
2322 wxCommandEvent eventp(ACTMGR_STARTPROCESSTIMER);
2323 wxPostEvent(this, eventp);
2327 wxPostEvent(GetParent(), connevent);
2331 void frmActivityMgr::SleepMode( wxCommandEvent &event ){
2333 wxCommandEvent connevent(ACTMGR_TOGGLECONN);
2335 wxPostEvent(this, connevent);
2339 void frmActivityMgr::WriteServerCertificate(wxString AccountName, SSLCertCollection SSLCertInc){
2341 wxString ServerCertFinal;
2343 // Get the Cert section of the certificate and write it to the file.
2345 ServerCertFinal = GetAccountDir(AccountName, TRUE);
2349 std::map<int, SSLCertData>::iterator SSLCDIter = SSLCertInc.SSLCollection.find(0);
2350 std::multimap<wxString,wxString>::iterator SSLDataIter = SSLCDIter->second.CertData.find(wxT("Cert"));
2352 CertFile.Open(ServerCertFinal, wxFile::write);
2354 CertFile.Write(SSLDataIter->second, wxConvUTF8);
2359 void frmActivityMgr::WriteServerCertificate(wxString AccountName, SSLCertCollectionString SSLCertInc){
2361 wxString ServerCertFinal;
2363 // Get the Cert section of the certificate and write it to the file.
2365 ServerCertFinal = GetAccountDir(AccountName, TRUE);
2369 std::map<int, SSLCertDataString>::iterator SSLCDIter = SSLCertInc.SSLCollection.find(0);
2370 std::multimap<string,string>::iterator SSLDataIter = SSLCDIter->second.CertData.find("Cert");
2372 CertFile.Open(ServerCertFinal, wxFile::write);
2374 CertFile.Write(SSLDataIter->second, wxConvUTF8);
2379 void frmActivityMgr::StartTimer(wxCommandEvent& event){
2381 ActListProcTimer.Start(1000, FALSE);
2385 void frmActivityMgr::StopTimer(wxCommandEvent& event){
2387 ActListProcTimer.Stop();
2391 void frmActivityMgr::StartProcessTimer(wxCommandEvent& event){
2393 ActProcessTimer.Start(1000, FALSE);
2397 void frmActivityMgr::StopProcessTimer(wxCommandEvent& event){
2399 ActProcessTimer.Stop();
2403 void frmActivityMgr::StartAnimationTimer(wxCommandEvent& event){
2405 AnimationTimer.StartAnimation();
2409 void frmActivityMgr::UpdateStatusLabel(wxCommandEvent& event){
2411 ActivityMgrLabelUpdate *actmgrudata = (ActivityMgrLabelUpdate*)event.GetClientData();
2413 if (actmgrudata != NULL){
2415 lstActivity->SetItem(actmgrudata->ItemIndex, 2, actmgrudata->ItemLabel);
2417 /*if (!actmgrudata->ItemDes.IsEmpty()){
2418 lstActivity->SetItem(actmgrudata->ItemIndex, 0, actmgrudata->ItemDes);