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.
649 ETagDBPtr->AddETag(ContactFilename, ETagServer, ETagServer);
656 } else if (TypeIter->second == 1){
660 StringDataIter = ActivityListData.find(iter->first);
661 StringURLIter = ActivityListURL.find(iter->first);
663 AccountDir = StringAccountIter->second;
664 ContactFilename = StringFilenameIter->second;
665 wxString AccountNameFriendly;
669 for (int i = 0; i < PrefData.accounts.GetCount(); i++){
671 wxString AccountDirCheck = PrefData.accounts.GetAccountDirectory(i);
673 AccountDirCheck.Trim();
674 AccountDirCheck.Append(wxT(".carddav"));
676 if (AccountDirCheck == StringAccountIter->second){
678 AccountNameFriendly = PrefData.accounts.GetAccountName(i);
685 ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir);
687 ETag = StringETagIter->second;
688 ETagOriginal = StringETagOrigIter->second;
689 AccountDir = StringAccountIter->second;
690 ContactFilename = StringFilenameIter->second;
691 FullFilename = StringFullFilenameIter->second;
692 EditMode = ActivityListEditMode.find(iter->first)->second;
694 bool KeepUpdating = TRUE;
696 while(KeepUpdating == TRUE){
698 bool ExitLoop = FALSE;
700 while (ExitLoop == FALSE){
702 int ErrorCode = ConnHandle.SSLVerifyTest();
704 if (ErrorCode != CURLE_OK){
706 if (ErrorCode == CURLE_SSL_CACERT ||
707 ErrorCode == CURLE_PEER_FAILED_VERIFICATION ||
708 ErrorCode == CURLE_SSL_CONNECT_ERROR){
710 // Invalid SSL certificate so bring up a dialog to the user
711 // explaining what has happened and the options available.
713 // Stop all the timers.
715 frmMainPtrGet->PauseAllTimers();
719 #if defined(__APPLE__)
721 // Bring up the trust panel and display the SSL certificate dialog.
723 SSLResult = DisplayTrustPanel(ConnHandle.GetTrustObject(), AccountNameFriendly);
725 // Update the SSL account with the trust object.
727 if (SSLResult != NSOKButton){
729 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetTrustObject());
735 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetTrustObject());
739 #elif defined(__WIN32__)
741 BOOL ModifiedCertificateData;
742 CRYPTUI_VIEWCERTIFICATE_STRUCTW CertificateData = BuildCertificateData(&ConnHandle, (HWND)frmMainPtrGet->GetHandle());
744 if (!CryptUIDlgViewCertificate(&CertificateData, &ModifiedCertificateData)){
745 wxMessageBox(_("An error occured while trying to open the certificate dialog."), _("Error opening Certificate Information dialog"));
748 if (ModifiedCertificateData == FALSE){
750 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetCertificateContextPointer());
756 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateContextPointer());
762 // Setup the data to be sent in the wxPostEvent command.
764 SSLInvalidCertNotifObj SSLICNProcData;
766 SSLCertCollection certcol = ConnHandle.GetSSLVerifyResults();
768 bool *PauseMode = new bool;
772 qrn.QResponse = &SSLResult;
773 qrn.PausePtr = PauseMode;
775 SSLICNProcData.CertCollection = certcol;
776 SSLICNProcData.QRNotifData = &qrn;
777 SSLICNProcData.AccountName = AccountNameFriendly;
779 wxCommandEvent event(INVALIDSSLCERT);
780 event.SetClientData(&SSLICNProcData);
781 wxPostEvent(frmMainPtrGet, event);
783 while (*PauseMode == TRUE){
784 //nanosleep(&n1, &n2);
788 // Process the response from the user.
792 // Accept the certificate. Write the certificate into the account
793 // directory (as server.crt) - will overwrite old certificate.
795 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetSSLVerifyResults());
796 WriteServerCertificate(AccountDir, ConnHandle.GetSSLVerifyResults());
798 } else if (SSLResult == 2){
800 // Reject the certificate, abort the task and mark as failed.
802 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetSSLVerifyResults());
810 // Resume all the timers.
812 frmMainPtrGet->ResumeAllTimers();
830 if (iter->second == 2 || iter->second == 3 || iter->second == 4){
834 #if defined(__APPLE__)
836 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetTrustObject());
838 #elif defined(__WIN32__)
840 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateContextPointer());
844 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetSSLVerifyResults());
848 ConnHandle.SetUploadMode(TRUE);
849 ConnHandle.SetupData(wxT("PUT"), StringURLIter->second, StringDataIter->second);
850 ConnHandle.SetEditMode(EditMode);
851 ConnHandle.GetServerETagValueThread();
852 ETagServer = ConnHandle.ETagValueResult();
854 int ErrorCode = ConnHandle.GetResultCode();
856 if (ErrorCode != CURLE_OK){
861 // Compare the ETag with the Server ETag.
863 if (ETagOriginal != ETagServer){
865 // Server ETag is different from original ETag.
866 // This is a conflict which the user will now
872 frmMain *frmMainPtrGet = static_cast<frmMain*>(frmMainPtr);
874 vCard34Conv vCard34Obj;
876 wxString ServerContactData;
878 vCard ConvertedV4Data;
880 // Load the client data from the filename given.
882 ConnHandle.GetServerContactData();
883 ServerContactData = ConnHandle.GetPageData();
885 // Process v3 version into v4 version.
887 vCard34Obj.ConvertToV4(&ServerContactData, &ConvertedV4Data);
889 vCardConflictObj vCardProcData;
891 vCardProcData.vCardLocalData = &ClientData;
892 vCardProcData.vCardServerData = &ConvertedV4Data;
893 ClientData.LoadFile(FullFilename);
895 //ContactConflictEvent event(ContactConflictCmdEnv);
896 //event.SetData(ContactFilename, Moo1, Moo2);
898 //wxPostEvent(frmMainPtrGet, event);
900 // Setup Conflict Resolution Dialog.
902 // Fetch Data from Server and convert.
904 bool *PauseMode = new bool;
909 qrn.QResponse = &ConflictResult;
910 qrn.PausePtr = PauseMode;
912 vCardProcData.QRNotifData = &qrn;
914 wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED);
915 event.SetClientData(&vCardProcData);
916 wxPostEvent(frmMainPtrGet, event);
918 while (*PauseMode == TRUE){
919 //nanosleep(&n1, &n2);
926 //intResult = frmMainPtrGet->ShowConflictDialog(&Moo1, &Moo2);
928 if (ConflictResult == 0){
935 } else if (ConflictResult == 1){
937 // Decided to use client version.
939 ConnHandle.ProcessData();
941 } else if (ConflictResult == 2){
943 // Decided to use server version.
945 // Download server version.
947 ConvertedV4Data.WriteFile(FullFilename);
953 // Update the data to the server.
955 ConnHandle.ProcessData();
959 // Update the ETag DB.
961 ConnHandle.GetServerETagValueThread();
962 ETagServer = ConnHandle.ETagValueResult();
963 ETagDBPtr->UpdateETag(ContactFilename, ETagServer, ETagServer);
970 } else if (TypeIter->second == 2) {
972 // Delete the contact from the server and update the ETag DB.
974 AccountDir = StringAccountIter->second;
975 ContactFilename = StringFilenameIter->second;
976 wxString AccountNameFriendly;
980 for (int i = 0; i < PrefData.accounts.GetCount(); i++){
982 wxString AccountDirCheck = PrefData.accounts.GetAccountDirectory(i);
984 AccountDirCheck.Trim();
985 AccountDirCheck.Append(wxT(".carddav"));
987 if (AccountDirCheck == StringAccountIter->second){
989 AccountNameFriendly = PrefData.accounts.GetAccountName(i);
996 ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir);
998 bool KeepUpdating = TRUE;
1000 while(KeepUpdating == TRUE){
1002 bool ExitLoop = FALSE;
1004 while (ExitLoop == FALSE){
1006 int ErrorCode = ConnHandle.SSLVerifyTest();
1008 if (ErrorCode != CURLE_OK){
1010 if (ErrorCode == CURLE_SSL_CACERT ||
1011 ErrorCode == CURLE_PEER_FAILED_VERIFICATION ||
1012 ErrorCode == CURLE_SSL_CONNECT_ERROR){
1014 // Invalid SSL certificate so bring up a dialog to the user
1015 // explaining what has happened and the options available.
1017 // Stop all the timers.
1019 frmMainPtrGet->PauseAllTimers();
1023 #if defined(__APPLE__)
1025 // Bring up the trust panel and display the SSL certificate dialog.
1027 SSLResult = DisplayTrustPanel(ConnHandle.GetTrustObject(), AccountNameFriendly);
1029 // Update the SSL account with the trust object.
1031 if (SSLResult != NSOKButton){
1033 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetTrustObject());
1039 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetTrustObject());
1043 #elif defined(__WIN32__)
1045 BOOL ModifiedCertificateData;
1046 CRYPTUI_VIEWCERTIFICATE_STRUCTW CertificateData = BuildCertificateData(&ConnHandle, (HWND)frmMainPtrGet->GetHandle());
1048 if (!CryptUIDlgViewCertificate(&CertificateData, &ModifiedCertificateData)){
1049 wxMessageBox(_("An error occured while trying to open the certificate dialog."), _("Error opening Certificate Information dialog"));
1052 if (ModifiedCertificateData == FALSE){
1054 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetCertificateContextPointer());
1060 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateContextPointer());
1066 // Setup the data to be sent in the wxPostEvent command.
1068 SSLInvalidCertNotifObj SSLICNProcData;
1070 SSLCertCollection certcol = ConnHandle.GetSSLVerifyResults();
1072 bool *PauseMode = new bool;
1076 qrn.QResponse = &SSLResult;
1077 qrn.PausePtr = PauseMode;
1079 SSLICNProcData.CertCollection = certcol;
1080 SSLICNProcData.QRNotifData = &qrn;
1081 SSLICNProcData.AccountName = AccountNameFriendly;
1083 wxCommandEvent event(INVALIDSSLCERT);
1084 event.SetClientData(&SSLICNProcData);
1085 wxPostEvent(frmMainPtrGet, event);
1089 // Fall asleep until we get an response.
1092 n1.tv_nsec = 250000000L;*/
1094 while (*PauseMode == TRUE){
1095 //nanosleep(&n1, &n2);
1096 SleepFor(250000000);
1099 // Process the response from the user.
1101 if (SSLResult == 1){
1103 // Accept the certificate. Write the certificate into the account
1104 // directory (as server.crt) - will overwrite old certificate.
1106 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetSSLVerifyResults());
1107 WriteServerCertificate(AccountDir, ConnHandle.GetSSLVerifyResults());
1109 } else if (SSLResult == 2){
1111 // Reject the certificate, abort the task and mark as failed.
1113 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetSSLVerifyResults());
1121 // Resume all the timers.
1123 frmMainPtrGet->ResumeAllTimers();
1141 if (iter->second == 2 || iter->second == 3 || iter->second == 4){
1145 #if defined(__APPLE__)
1147 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetTrustObject());
1149 #elif defined(__WIN32__)
1151 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateContextPointer());
1155 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetSSLVerifyResults());
1159 ConnHandle.SetUploadMode(FALSE);
1160 ConnHandle.SetupData(wxT("DELETE"), ContactFilename, wxT(""));
1161 ConnHandle.ProcessData();
1163 SSLCertCollection certcol = ConnHandle.GetCertificateData();
1165 // Check if any errors have occured whilst getting the data.
1167 int ErrorCode = ConnHandle.GetResultCode();
1169 if (ErrorCode != CURLE_OK){
1174 ETagDBPtr->RemoveETag(ContactFilename);
1177 CardDAVIter->second = NULL;
1182 } else if (TypeIter->second == 3) {
1184 wxString AccountNameFriendly;
1188 for (int i = 0; i < PrefData.accounts.GetCount(); i++){
1190 wxString AccountDirCheck = PrefData.accounts.GetAccountDirectory(i);
1192 AccountDirCheck.Trim();
1193 AccountDirCheck.Append(wxT(".carddav"));
1195 if (AccountDirCheck == StringAccountIter->second){
1197 AccountNameFriendly = PrefData.accounts.GetAccountName(i);
1204 bool KeepUpdating = TRUE;
1206 while (KeepUpdating == TRUE){
1208 StringTaskDetailIter = ActivityListTaskDetail.find(iter->first);
1210 AccountDir = StringAccountIter->second;
1212 ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir);
1214 wxArrayString vCardAdd;
1215 wxArrayString vCardDelete;
1216 wxArrayString vCardList;
1217 wxArrayString vCardUpdateLocal;
1218 wxArrayString vCardUpdateRemote;
1219 wxArrayString vCardUpdateLog;
1220 std::map<wxString,wxString> vCardETag;
1221 ContactListData ServerContactList;
1223 std::map<wxString,vCardDownloadDataFileClass> vCardDownloadData;
1224 //wxArrayString vCardDownload;
1225 //std::map<wxString,wxString> vCardDownloadData;
1227 // Get the list of vCard files locally.
1229 wxString AccountDirFinal;
1230 wxString AccountSyncTokenFilename;
1231 wxString SyncTokenLoad;
1233 #if defined(__HAIKU__)
1235 //preffilename = wxT("noo");
1237 #elif defined(__WIN32__)
1239 AccountDirFinal = GetAccountDir(AccountDir, FALSE);
1240 AccountSyncTokenFilename = AccountDirFinal;
1241 AccountSyncTokenFilename.Append(wxT("synctoken"));
1245 AccountDirFinal = GetAccountDir(AccountDir, FALSE);
1246 AccountSyncTokenFilename = AccountDirFinal;
1247 AccountSyncTokenFilename.Append(wxT("synctoken"));
1251 // Suppress Error Messages.
1253 wxLogNull PleaseDoNotDisturb;
1256 SyncLoad.Open(AccountSyncTokenFilename, wxT("r"));
1258 if (SyncLoad.IsOpened()){
1260 SyncLoad.ReadAll(&SyncTokenLoad, wxMBConvUTF8());
1265 // Get a list of vCard files from the server.
1267 // Get the list of vCard files from the ETagDB.
1269 std::map<wxString,ETagData> ETagDBData = ETagDBPtr->GetETagData();
1271 bool ExitLoop = FALSE;
1273 std::map<wxString,FileSyncData> *SCListData = NULL;
1275 while (ExitLoop == FALSE){
1277 // Check if any errors have occured whilst getting the data.
1279 int ErrorCode = ConnHandle.SSLVerifyTest();
1281 if (ErrorCode != CURLE_OK){
1283 if (ErrorCode == CURLE_SSL_CACERT ||
1284 ErrorCode == CURLE_PEER_FAILED_VERIFICATION ||
1285 ErrorCode == CURLE_SSL_CONNECT_ERROR){
1287 // Invalid SSL certificate so bring up a dialog to the user
1288 // explaining what has happened and the options available.
1290 // Stop all the timers.
1292 frmMainPtrGet->PauseAllTimers();
1296 #if defined(__APPLE__)
1298 // Bring up the trust panel and display the SSL certificate dialog.
1300 SSLResult = DisplayTrustPanel(ConnHandle.GetTrustObject(), AccountNameFriendly);
1302 // Update the SSL account with the trust object.
1304 if (SSLResult != NSOKButton){
1306 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetTrustObject());
1312 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetTrustObject());
1316 #elif defined(__WIN32__)
1318 BOOL ModifiedCertificateData;
1319 CRYPTUI_VIEWCERTIFICATE_STRUCTW CertificateData = BuildCertificateData(&ConnHandle, (HWND)frmMainPtrGet->GetHandle());
1321 if (!CryptUIDlgViewCertificate(&CertificateData, &ModifiedCertificateData)){
1322 wxMessageBox(_("An error occured while trying to open the certificate dialog."), _("Error opening Certificate Information dialog"));
1325 if (ModifiedCertificateData == FALSE){
1327 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetCertificateContextPointer());
1333 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateContextPointer());
1338 // Setup the data to be sent in the wxPostEvent command.
1340 SSLInvalidCertNotifObj SSLICNProcData;
1342 SSLCertCollection certcol = ConnHandle.GetSSLVerifyResults();
1344 bool *PauseMode = new bool;
1348 qrn.QResponse = &SSLResult;
1349 qrn.PausePtr = PauseMode;
1351 SSLICNProcData.CertCollection = certcol;
1352 SSLICNProcData.QRNotifData = &qrn;
1353 SSLICNProcData.AccountName = AccountNameFriendly;
1355 wxCommandEvent event(INVALIDSSLCERT);
1356 event.SetClientData(&SSLICNProcData);
1357 wxPostEvent(frmMainPtrGet, event);
1361 // Fall asleep until we get an response.
1364 n1.tv_nsec = 250000000L;*/
1366 while (*PauseMode == TRUE){
1367 //nanosleep(&n1, &n2);
1368 SleepFor(250000000);
1371 // Process the response from the user.
1373 if (SSLResult == 1){
1375 // Accept the certificate. Write the certificate into the account
1376 // directory (as server.crt) - will overwrite old certificate.
1378 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetSSLVerifyResults());
1379 WriteServerCertificate(AccountDir, ConnHandle.GetSSLVerifyResults());
1381 } else if (SSLResult == 2){
1383 // Reject the certificate, abort the task and mark as failed.
1385 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetSSLVerifyResults());
1393 // Resume all the timers.
1395 frmMainPtrGet->ResumeAllTimers();
1413 if (iter->second == 2 || iter->second == 3 || iter->second == 4){
1417 #if defined(__APPLE__)
1419 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetTrustObject());
1421 #elif defined(__WIN32__)
1423 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateContextPointer());
1427 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetSSLVerifyResults());
1431 // Look in directory and see which vCards to add and delete
1434 // vCard exists but not in ETagDB - Add (and upload).
1435 // vCard missing but in ETagDB - Delete (from server).
1437 // Start by looking for vCards that are not in the ETagDB.
1439 wxDir AccDir(AccountDirFinal);
1440 wxString AccDirFilename;
1442 bool ContinueProcess = AccDir.GetFirst(&AccDirFilename, wxEmptyString, wxDIR_DEFAULT);
1444 ServerContactList = ConnHandle.GetContactList(SyncTokenLoad.ToUTF8());
1446 int ErrorCode = ConnHandle.GetResultCode();
1448 if (ErrorCode != CURLE_OK){
1455 SSLCertCollection certcol = ConnHandle.GetCertificateData();
1457 // Create a pointer for the std::map<wxString,FileSyncData>.
1459 SCListData = &ServerContactList.ListData;
1461 // Process the server data.
1463 if (SCListData != NULL){
1465 for (std::map<wxString, FileSyncData>::iterator fsiter = SCListData->begin();
1466 fsiter != SCListData->end(); fsiter++){
1468 // Check the mode of the file before adding.
1470 // Get the HTTP status of the file from the list.
1472 FileSyncData fsd = fsiter->second;
1474 if (fsd.DataFlag == 1){
1476 // Added or modified contact.
1478 //vCardAdd.Add(fsiter->first, 1);
1480 vCardDownloadDataFileClass vCardNewData;
1481 vCardNewData.DataType = 0;
1482 vCardDownloadData.insert(std::make_pair(fsiter->first, vCardNewData));
1484 //} else if (fsd.DataFlag == 1){
1486 // Contact has been modified on the server.
1488 // vCardUpdateLocal.Add(fsiter->first, 1);
1491 else if (fsd.DataFlag == 2){
1493 // Contact has been deleted.
1495 vCardDelete.Add(fsiter->first, 1);
1503 // Look for vCards that are missing but in the ETagDB.
1505 for (std::map<wxString,ETagData>::iterator etagiter = ETagDBData.begin();
1506 etagiter != ETagDBData.end(); etagiter++){
1508 // Check if the vCard exists.
1510 if (!wxFileExists(AccountDirFinal + etagiter->first)){
1512 // vCard doesn't exist so mark for deleting.
1514 vCardDelete.Add(etagiter->first, 1);
1520 // Compare Server with the ETag DB. Work out which
1521 // needs to updated remotely and which needs to be
1524 for (std::map<wxString,FileSyncData>::iterator srviter = SCListData->begin();
1525 srviter != SCListData->end(); srviter++){
1527 if (ETagDBData.find(srviter->first) == ETagDBData.end()){
1531 std::map<wxString,ETagData>::iterator lociter = ETagDBData.find(srviter->first);
1533 ETagData etd = lociter->second;
1534 FileSyncData fsd = srviter->second;
1536 wxString ETagSrv = fsd.ETagData;
1538 // Check if the local ETag value has 'DELETED' set and skip
1539 // checking this file if it does.
1541 if (etd.ETagValue == "DELETED"){
1547 // Compare local ETag with original local ETag.
1548 // If different, update to server is required.
1550 if (etd.ETagValue != etd.ETagOrigValue){
1552 // Check if local original ETag is different from server ETag.
1553 // If it is then throw up a conflict resolution dialog.
1555 if (etd.ETagOrigValue != ETagSrv){
1557 vCard34Conv vCard34Obj;
1559 wxString ServerContactData;
1560 wxString FullFilename;
1562 vCard ConvertedV4Data;
1564 // Conflict. Bring up conflict resolution dialog.
1566 // Get the server contact data for comparison.
1568 ConnHandle.SetServerFilename(srviter->first);
1569 ConnHandle.GetServerContactData();
1570 ServerContactData = ConnHandle.GetPageData();
1572 FullFilename = CreateFilenamePath(AccountDirFinal, srviter->first);
1574 // Convert it to v4.
1576 vCard34Obj.ConvertToV4(&ServerContactData, &ConvertedV4Data);
1578 vCardConflictObj vCardProcData;
1580 vCardProcData.vCardLocalData = &ClientData;
1581 vCardProcData.vCardServerData = &ConvertedV4Data;
1583 // Load the client data from the filename given.
1585 ClientData.LoadFile(FullFilename);
1589 bool *PauseMode = new bool;
1592 frmMain *frmMainPtrGet = static_cast<frmMain*>(frmMainPtr);
1595 qrn.QResponse = &ConflictResult;
1596 qrn.PausePtr = PauseMode;
1598 vCardProcData.QRNotifData = &qrn;
1600 wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED);
1601 event.SetClientData(&vCardProcData);
1602 wxPostEvent(frmMainPtrGet, event);
1607 n1.tv_nsec = 250000000L;*/
1609 while (*PauseMode == TRUE){
1610 //nanosleep(&n1, &n2);
1611 SleepFor(250000000);
1617 // If replacing local version, store copy for now.
1618 // Otherwise upload to server.
1620 if (ConflictResult == 0){
1626 } else if (ConflictResult == 1){
1628 // Decided to use client version.
1630 vCardUpdateLocal.Remove(srviter->first);
1631 vCardUpdateRemote.Add(srviter->first, 1);
1633 } else if (ConflictResult == 2){
1635 // Decided to use server version.
1636 // Store the converted downloaded copy for
1637 // processing later.
1639 //vCardUpdateLocal.Add(srviter->first, 1);
1641 vCardDownloadDataFileClass vCardNewData;
1642 vCardNewData.DataType = 1;
1643 vCardNewData.FileData = ConvertedV4Data.WriteString();
1645 ConvertedV4Data.WriteFile(FullFilename);
1647 vCardDownloadData.insert(std::make_pair(srviter->first, vCardNewData));
1655 // Send vCard to the server.
1657 vCardUpdateRemote.Add(srviter->first, 1);
1663 // Check if local ETag is different from server ETag.
1664 // If different, obtain the vCard from the server.
1666 if (etd.ETagOrigValue != ETagSrv){
1668 vCardUpdateLocal.Add(srviter->first, 1);
1676 // Process the vCards that need to be downloaded and added/overwritten.
1678 wxString vCardFilenameFinal;
1679 wxString vCardOutputData;
1680 wxString vCardInputData;
1681 wxString ETagFileData;
1684 for (std::map<wxString,vCardDownloadDataFileClass>::iterator additer = vCardDownloadData.begin();
1685 additer != vCardDownloadData.end(); additer++){
1687 vCardFilenameFinal.Clear();
1688 vCardInputData.Clear();
1689 vCardOutputData.Clear();
1690 ETagFileData.Clear();
1692 vCardFilenameFinal = CreateFilenamePath(AccountDirFinal, additer->first);
1694 ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir);
1696 if (additer->second.DataType == 0){
1698 vCard ConvertedV4Data;
1700 // Grab the file from the server and write the contact out.
1702 vCard34Conv vCard34Obj;
1704 ConnHandle.SetServerFilename(additer->first);
1705 ConnHandle.GetServerContactData();
1706 vCardInputData = ConnHandle.GetPageData();
1708 vCard34Obj.ConvertToV4(&vCardInputData, &ConvertedV4Data);
1710 ConvertedV4Data.WriteFile(vCardFilenameFinal);
1712 // Update the ETagDB.
1714 //vCardFile.Open(vCardFilenameFinal, wxT("w"));
1716 //if (vCardFile.IsOpened()){
1718 // vCardFile.Write(vCardOutputData, wxConvAuto());
1719 // vCardFile.Close();
1723 // Get the server ETag.
1725 wxString ServerETag;
1726 ConnHandle.GetServerETagValueThread();
1727 ServerETag = ConnHandle.ETagValueResult();
1729 // Add to the ETag Database.
1731 ETagDBPtr->AddETag(additer->first, ServerETag, ServerETag);
1733 } else if (additer->second.DataType == 1){
1735 // Write out the contact to the account directory.
1737 vCardFilenameFinal = CreateFilenamePath(AccountDirFinal, additer->first);
1738 vCardOutputData = additer->second.FileData;
1740 vCardFile.Open(vCardFilenameFinal, wxT("w"));
1742 if (vCardFile.IsOpened()){
1744 vCardFile.Write(vCardOutputData, wxConvAuto());
1749 // Update the ETagDB.
1751 wxString ServerETag;
1752 ConnHandle.GetServerETagValueThread();
1753 ServerETag = ConnHandle.ETagValueResult();
1755 // Add to the ETag Database.
1757 ETagDBPtr->AddETag(additer->first, ServerETag, ServerETag);
1762 // Look for vCard files which aren't in the ETagDB.
1764 while(ContinueProcess){
1766 // Check and make sure that the filename ends in .vcf/.vcard
1767 // Skip any file that beings with a dot.
1769 if (AccDirFilename.Left(1) == wxT(".")){
1771 ContinueProcess = AccDir.GetNext(&AccDirFilename);
1776 if (AccDirFilename.Right(4) != wxT(".vcf") &&
1777 AccDirFilename.Right(6) != wxT(".vcard")){
1779 ContinueProcess = AccDir.GetNext(&AccDirFilename);
1784 // Look in the ETagDB for the file.
1786 bool ETagExists = ETagDBPtr->CheckETagExists(AccDirFilename);
1788 if (ETagExists == FALSE){
1790 // Add the vCard to the list to be added.
1792 vCardAdd.Add(AccDirFilename, 1);
1796 ContinueProcess = AccDir.GetNext(&AccDirFilename);
1800 // Process the vCards to add/update to the server.
1802 for (int vi = 0; vi < vCardAdd.GetCount(); vi++){
1804 ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir);
1805 ETag = ETagDBPtr->GetETag(vCardAdd[vi]);
1806 ETagOriginal = ETagDBPtr->GetETagOriginal(vCardAdd[vi]);
1808 ContactFilename = vCardAdd[vi];
1809 FullFilename = CreateFilenamePath(AccountDirFinal, vCardAdd[vi]);
1811 ContactFilename.Trim();
1813 if (ETag == ETagOriginal && ETagDBPtr->ETagExists(vCardAdd[vi])){
1815 // Compare the ETag with the Server ETag.
1817 ConnHandle.SetServerFilename(vCardAdd[vi]);
1818 ConnHandle.GetServerETagValueThread();
1819 ETagServer = ConnHandle.ETagValueResult();
1821 if (ETagOriginal != ETagServer){
1823 // Server ETag is different from original ETag.
1824 // This is a conflict which the user will now
1827 frmMain *frmMainPtrGet = static_cast<frmMain*>(frmMainPtr);
1829 vCard34Conv vCard34Obj;
1831 wxString ServerContactData;
1833 vCard ConvertedV4Data;
1835 // Load the client data from the filename given.
1837 ConnHandle.GetServerContactData();
1838 ServerContactData = ConnHandle.GetPageData();
1840 // Process v3 version into v4 version.
1842 vCard34Obj.ConvertToV4(&ServerContactData, &ConvertedV4Data);
1844 vCardConflictObj vCardProcData;
1846 vCardProcData.vCardLocalData = &ClientData;
1847 vCardProcData.vCardServerData = &ConvertedV4Data;
1848 ClientData.LoadFile(FullFilename);
1850 //ContactConflictEvent event(ContactConflictCmdEnv);
1851 //event.SetData(ContactFilename, Moo1, Moo2);
1853 //wxPostEvent(frmMainPtrGet, event);
1855 // Setup Conflict Resolution Dialog.
1857 // Fetch Data from Server and convert.
1859 bool *PauseMode = new bool;
1864 qrn.QResponse = &ConflictResult;
1865 qrn.PausePtr = PauseMode;
1867 vCardProcData.QRNotifData = &qrn;
1869 wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED);
1870 event.SetClientData(&vCardProcData);
1871 wxPostEvent(frmMainPtrGet, event);
1876 n1.tv_nsec = 250000000L;*/
1878 while (*PauseMode == TRUE){
1879 //nanosleep(&n1, &n2);
1880 SleepFor(250000000);
1886 //intResult = frmMainPtrGet->ShowConflictDialog(&Moo1, &Moo2);
1888 if (ConflictResult == 0){
1895 } else if (ConflictResult == 1){
1897 // Decided to use client version.
1899 ConnHandle.ProcessData();
1903 } else if (ConflictResult == 2){
1905 // Decided to use server version.
1907 // Download server version.
1909 ConvertedV4Data.WriteFile(CreateFilenamePath(AccountDirFinal, vCardAdd[vi]));
1917 // Setup the filename for the contact being added.
1919 wxString wxSFilename = CreateFilenamePath(AccountDirFinal, vCardAdd[vi]);
1920 wxString wxSCardData;
1924 // Load the data from the file.
1927 wxFCard.Open(wxSFilename, wxT("r"));
1929 if (wxFCard.IsOpened()){
1931 wxFCard.ReadAll(&wxSCardData, wxConvAuto());
1936 // Convert the data to v3.
1938 vCard34Conv vCard34Obj;
1940 vCard34Obj.ConvertToV3(wxSFilename, &TaskData);
1942 // Setup the URL address.
1944 //TaskURL = StringTaskDetailIter->second + wxT("/") + vCardAdd[vi];
1946 // Upload the data to the server.
1948 ConnHandle.SetUploadMode(TRUE);
1949 ConnHandle.SetupData(wxT("PUT"), vCardAdd[vi], TaskData);
1950 ConnHandle.ProcessData();
1952 // Get the Server ETag and put it in the ETag database.
1954 ConnHandle.SetServerFilename(vCardAdd[vi]);
1955 ConnHandle.GetServerETagValueThread();
1956 ETagServer = ConnHandle.ETagValueResult();
1958 ETagDBPtr->AddETag(vCardAdd[vi], ETagServer, ETagServer);
1964 if (ETagOriginal != ETagServer){
1966 // Server ETag is different from original ETag.
1967 // This is a conflict which the user will now
1970 frmMain *frmMainPtrGet = (frmMain *)frmMainPtr;
1972 //ContactConflictEvent event(ContactConflictCmdEnv);
1973 //event.SetData(ContactFilename, Moo1, Moo2);
1975 vCard34Conv vCard34Obj;
1977 wxString ServerContactData;
1979 vCard ConvertedV4Data;
1981 // Load the client data from the filename given.
1983 ConnHandle.GetServerContactData();
1984 ServerContactData = ConnHandle.GetPageData();
1985 ClientData.LoadFile(FullFilename);
1987 // Process v3 version into v4 version.
1989 vCard34Obj.ConvertToV4(&ServerContactData, &ConvertedV4Data);
1991 vCardConflictObj vCardProcData;
1993 vCardProcData.vCardLocalData = &ClientData;
1994 vCardProcData.vCardServerData = &ConvertedV4Data;
1996 bool *PauseMode = new bool;
2001 qrn.QResponse = &ConflictResult;
2002 qrn.PausePtr = PauseMode;
2004 vCardProcData.QRNotifData = &qrn;
2006 wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED);
2007 event.SetClientData(&vCardProcData);
2008 wxPostEvent(frmMainPtrGet, event);
2013 n1.tv_nsec = 250000000L;*/
2015 while (*PauseMode == TRUE){
2016 //nanosleep(&n1, &n2);
2017 SleepFor(250000000);
2023 //intResult = frmMainPtrGet->ShowConflictDialog(&Moo1, &Moo2);
2025 if (ConflictResult == 0){
2032 } else if (ConflictResult == 1){
2034 // Decided to use client version.
2036 ConnHandle.ProcessData();
2037 //ETagServer = CardDAVIter->second.GetServerETagValueThread();
2038 //ETagDBPtr->UpdateETag(ContactFilename, ETagServer, ETagServer);
2042 } else if (ConflictResult == 2){
2044 // Decided to use server version.
2046 // Write server version to file.
2048 ConvertedV4Data.WriteFile(CreateFilenamePath(AccountDirFinal, vCardAdd[vi]));
2056 // Setup the filename for the contact being added.
2058 wxString wxSFilename = CreateFilenamePath(AccountDirFinal, vCardAdd[vi]);
2059 wxString wxSCardData;
2063 // Load the data from the file.
2066 wxFCard.Open(wxSFilename, wxT("r"));
2068 if (wxFCard.IsOpened()){
2070 wxFCard.ReadAll(&wxSCardData, wxConvAuto());
2075 // Convert the data to v3.
2077 vCard34Conv vCard34Obj;
2079 vCard34Obj.ConvertToV3(wxSFilename, &TaskData);
2081 // Setup the URL address.
2083 //TaskURL = StringTaskDetailIter->second + wxT("/") + vCardAdd[vi];
2085 // Upload the data to the server.
2087 ConnHandle.SetUploadMode(TRUE);
2088 ConnHandle.SetupData(wxT("PUT"), vCardAdd[vi], TaskData);
2089 ConnHandle.ProcessData();
2091 // Get the Server ETag and put it in the ETag database.
2093 ConnHandle.SetServerFilename(vCardAdd[vi]);
2094 ConnHandle.GetServerETagValueThread();
2095 ETagServer = ConnHandle.ETagValueResult();
2098 ETagDBPtr->AddETag(vCardAdd[vi], ETagServer, ETagServer);
2106 // Process the vCards to delete locally.
2108 for (int vi = 0; vi < vCardDelete.GetCount(); vi++){
2110 if (!wxRemoveFile(CreateFilenamePath(AccountDirFinal, vCardDelete[vi]))){
2114 ETagDBPtr->RemoveETag(vCardDelete[vi]);
2120 // Process the vCards to delete from the server.
2122 std::map<wxString,wxString> *ETagFilenameMap = ETagDBPtr->GetFilenamePointer();
2123 std::list<wxString> DeleteList;
2125 for (std::map<wxString,wxString>::iterator deliter = ETagFilenameMap->begin();
2126 deliter != ETagFilenameMap->end(); deliter++){
2128 // Look through the ETagDB and find contacts which are marked as DELETED.
2130 if (deliter->second == wxT("DELETED")){
2132 ConnHandle.SetUploadMode(FALSE);
2133 ConnHandle.SetupData(wxT("DELETE"), deliter->first, wxT(""));
2134 ConnHandle.ProcessDataThread();
2136 // Delete the ETag as the file has now been deleted.
2138 DeleteList.push_back(deliter->first);
2144 for (std::list<wxString>::iterator removeetagiter = DeleteList.begin();
2145 removeetagiter != DeleteList.end(); removeetagiter++){
2147 ETagDBPtr->RemoveETag(*removeetagiter);
2151 // Write out the update server sync token.
2153 wxString ServerSyncToken = ServerContactList.SyncToken;
2155 ServerSyncToken.Trim();
2157 if (!ServerSyncToken.IsEmpty()){
2160 SyncWrite.Open(AccountSyncTokenFilename, wxT("w"));
2162 if (SyncWrite.IsOpened()){
2164 SyncWrite.Write(ServerSyncToken, wxConvAuto());
2171 // Check for another sync token. If there is another
2172 // sync token then repeat this. If token matches then stop processing.
2174 if (SyncTokenLoad == ServerSyncToken){
2176 KeepUpdating = FALSE;
2182 // Mark as completed.
2184 wxString AccountNameFinal;
2185 AccountNameFinal = PrefData.accounts.GetAccountDirectory(AccountID);
2186 AccountNameFinal.Append(wxT(".carddav"));
2188 wxCommandEvent reloadevent(RELOADCONTACTLIST);
2189 reloadevent.SetString(AccountNameFinal);
2190 wxPostEvent(this->GetParent(), reloadevent);
2197 // Update the data to the server.
2199 ConnHandle.ProcessData();
2208 n1.tv_nsec = 250000000L;*/
2210 while (iter->second == 1){
2212 SleepFor(250000000);
2213 //nanosleep(&n1, &n2);
2217 if ((iter->second == 4 && TypeIter->second == 0) ||
2218 (iter->second == 8 && TypeIter->second == 0)){
2220 AccountDir = StringAccountIter->second;
2221 ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir);
2223 ConnHandle.GetServerETagValueThread();
2224 ETagServer = ConnHandle.ETagValueResult();
2225 ETagDBPtr->UpdateETag(ContactFilename, ETagServer, ETagServer);
2229 if ((iter->second == 4 && TypeIter->second == 1) ||
2230 (iter->second == 8 && TypeIter->second == 1)){
2232 AccountDir = StringAccountIter->second;
2233 ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir);
2235 ConnHandle.GetServerETagValueThread();
2236 ETagServer = ConnHandle.ETagValueResult();
2237 ETagDBPtr->UpdateETag(ContactFilename, ETagServer, ETagServer);
2247 if (TasksFoundProc == FALSE){
2249 TasksActive = FALSE;
2250 ProcessTasksData = FALSE;
2254 wxCommandEvent eventp(ACTMGR_STARTTIMER);
2255 wxPostEvent(this, eventp);
2257 //AnimationTimer.StartAnimation();
2258 //ActListProcTimer.Start();
2262 wxCommandEvent event(ACTMGR_STARTPROCESSTIMER);
2263 wxPostEvent(this, event);
2265 //ActProcessTimer.Start();
2269 void frmActivityMgr::ProcessTasks()
2272 std::thread ProcessThread(&frmActivityMgr::ProcessTasksThread, this);
2273 ProcessThread.detach();
2277 void frmActivityMgr::SetupPointers(wxETagProcessTimer *ETagTmrPtrInc, void *frmMainPtrInc)
2280 ETagTmrPtr = ETagTmrPtrInc;
2282 frmMainPtr = frmMainPtrInc;
2286 void frmActivityMgr::ResumeProcessing(wxCommandEvent &event){
2288 QRNotif *qrn = (QRNotif *)event.GetClientData();
2290 int *QRes = qrn->QResponse;
2292 *qrn->PausePtr = FALSE;
2294 *QRes = event.GetInt();
2298 void frmActivityMgr::ToggleConnectionStatus( wxCommandEvent &event ){
2300 wxCommandEvent connevent(CONNSTAT_UPDATE);
2302 if (ApplicationSleepMode == FALSE){
2304 connevent.SetInt(1);
2305 ApplicationSleepMode = TRUE;
2306 mnuSleepMode->Check(true);
2310 connevent.SetInt(0);
2311 ApplicationSleepMode = FALSE;
2312 mnuSleepMode->Check(false);
2314 wxCommandEvent event(ACTMGR_STARTTIMER);
2315 wxPostEvent(this, event);
2317 wxCommandEvent eventp(ACTMGR_STARTPROCESSTIMER);
2318 wxPostEvent(this, eventp);
2322 wxPostEvent(GetParent(), connevent);
2326 void frmActivityMgr::SleepMode( wxCommandEvent &event ){
2328 wxCommandEvent connevent(ACTMGR_TOGGLECONN);
2330 wxPostEvent(this, connevent);
2334 void frmActivityMgr::WriteServerCertificate(wxString AccountName, SSLCertCollection SSLCertInc){
2336 wxString ServerCertFinal;
2338 // Get the Cert section of the certificate and write it to the file.
2340 ServerCertFinal = GetAccountDir(AccountName, TRUE);
2344 std::map<int, SSLCertData>::iterator SSLCDIter = SSLCertInc.SSLCollection.find(0);
2345 std::multimap<wxString,wxString>::iterator SSLDataIter = SSLCDIter->second.CertData.find(wxT("Cert"));
2347 CertFile.Open(ServerCertFinal, wxFile::write);
2349 CertFile.Write(SSLDataIter->second, wxConvUTF8);
2354 void frmActivityMgr::WriteServerCertificate(wxString AccountName, SSLCertCollectionString SSLCertInc){
2356 wxString ServerCertFinal;
2358 // Get the Cert section of the certificate and write it to the file.
2360 ServerCertFinal = GetAccountDir(AccountName, TRUE);
2364 std::map<int, SSLCertDataString>::iterator SSLCDIter = SSLCertInc.SSLCollection.find(0);
2365 std::multimap<string,string>::iterator SSLDataIter = SSLCDIter->second.CertData.find("Cert");
2367 CertFile.Open(ServerCertFinal, wxFile::write);
2369 CertFile.Write(SSLDataIter->second, wxConvUTF8);
2374 void frmActivityMgr::StartTimer(wxCommandEvent& event){
2376 ActListProcTimer.Start(1000, FALSE);
2380 void frmActivityMgr::StopTimer(wxCommandEvent& event){
2382 ActListProcTimer.Stop();
2386 void frmActivityMgr::StartProcessTimer(wxCommandEvent& event){
2388 ActProcessTimer.Start(1000, FALSE);
2392 void frmActivityMgr::StopProcessTimer(wxCommandEvent& event){
2394 ActProcessTimer.Stop();
2398 void frmActivityMgr::StartAnimationTimer(wxCommandEvent& event){
2400 AnimationTimer.StartAnimation();
2404 void frmActivityMgr::UpdateStatusLabel(wxCommandEvent& event){
2406 ActivityMgrLabelUpdate *actmgrudata = (ActivityMgrLabelUpdate*)event.GetClientData();
2408 if (actmgrudata != NULL){
2410 lstActivity->SetItem(actmgrudata->ItemIndex, 2, actmgrudata->ItemLabel);
2412 /*if (!actmgrudata->ItemDes.IsEmpty()){
2413 lstActivity->SetItem(actmgrudata->ItemIndex, 0, actmgrudata->ItemDes);