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);
49 BEGIN_EVENT_TABLE(frmActivityMgr, wxWindow)
50 EVT_COMMAND(wxID_ANY, ACTMGR_RESUMEPROC, frmActivityMgr::ResumeProcessing)
51 EVT_COMMAND(wxID_ANY, ACTMGR_TOGGLECONN, frmActivityMgr::ToggleConnectionStatus)
52 EVT_COMMAND(wxID_ANY, ACTMGR_STARTTIMER, frmActivityMgr::StartTimer)
53 EVT_COMMAND(wxID_ANY, ACTMGR_STOPTIMER, frmActivityMgr::StopTimer)
54 EVT_COMMAND(wxID_ANY, ACTMGR_STARTPROCESSTIMER, frmActivityMgr::StartProcessTimer)
55 EVT_COMMAND(wxID_ANY, ACTMGR_STOPPROCESSTIMER, frmActivityMgr::StopProcessTimer)
56 EVT_COMMAND(wxID_ANY, ACTMGR_UPDATESTATUSLABEL, frmActivityMgr::UpdateStatusLabel)
59 frmActivityMgr::frmActivityMgr( wxWindow* parent )
61 frmActivityMgrADT( parent )
64 wxMemoryInputStream istream(icons_activitywindow_png, sizeof(icons_activitywindow_png));
65 wxImage icons_activitywindow_pngi(istream, wxBITMAP_TYPE_PNG);
66 wxBitmap activityiconbmp(icons_activitywindow_pngi, -1);
68 activityicon.CopyFromBitmap(activityiconbmp);
69 this->SetIcon(activityicon);
71 wxMemoryInputStream istream2(misc_activitysleep_png, sizeof(misc_activitysleep_png));
72 wxImage misc_activitysleep_pngi(istream2, wxBITMAP_TYPE_PNG);
73 wxBitmap sleepiconbmp(misc_activitysleep_pngi, -1);
74 SleepBitmap = sleepiconbmp;
75 bmpActivity->SetBitmap(SleepBitmap);
76 ActProcessTimer.SetupPointers(this);
77 lblDetails->SetLabel(_("No activity."));
79 ActListProcTimer.SetupPointers(&ActivityList, &ActivityListIndex, &ActivityListTaskDetail,
80 &TasksActive, lstActivity, lblDetails, GauProgress, this, &AnimationTimer,
81 &ActProcessTimer, &ActivityListFinDate, &ActivityListConn);
83 AnimationTimer.SetBitmap(bmpActivity);
84 AnimationTimer.SetSleepBitmap(&SleepBitmap);
85 AnimationTimer.SetupPointer(this->GetParent());
87 wxListItem ColumnData;
89 ColumnData.SetText(_("Activity"));
90 ColumnData.SetWidth(175);
91 lstActivity->InsertColumn(0, ColumnData);
93 wxListItem ColumnData2;
95 ColumnData2.SetText(_("Account"));
96 ColumnData2.SetWidth(100);
97 lstActivity->InsertColumn(1, ColumnData2);
99 wxListItem ColumnData3;
100 ColumnData3.SetId(2);
101 ColumnData3.SetText(_("Status"));
102 ColumnData3.SetWidth(100);
103 lstActivity->InsertColumn(2, ColumnData3);
105 //AnimationTimer.StartAnimation();
107 // Create recovery database if it doesn't exist.
109 wxString RecoveryFilename = GetRecoveryDB();
113 if (wxFile::Exists(RecoveryFilename) == FALSE){
115 // Create the recovery database.
117 RecoveryDB.Open(RecoveryFilename.c_str(), wxFile::write);
119 RecoveryDB.Write(wxT("BEGIN:XAB-RECOVERYDB\r\n"), wxConvUTF8);
120 RecoveryDB.Write(wxT("VERSION:1.0\r\n"), wxConvUTF8);
121 RecoveryDB.Write(wxT("COMMENT:Please do not alter or delete this file. DATA LOSS IS POSSIBLE!\r\n"), wxConvUTF8);
122 RecoveryDB.Write(wxT("END:XAB-RECOVERYDB\r\n"), wxConvUTF8);
129 #if wxABI_VERSION < 20900
130 RecoveryDBF.Open(RecoveryFilename.c_str(), wxT("r"));
132 RecoveryDBF.Open(RecoveryFilename, wxT("r"));
135 // Load the recovery database for tasks not done.
137 if (RecoveryDBF.IsOpened() == TRUE){
139 wxString wxSRecoveryDB;
140 wxString RecoveryLine;
142 // Check if we are using wxWidgets version 2.8 or less and
143 // execute the required command accordingly.
145 RecoveryDBF.ReadAll(&wxSRecoveryDB, wxConvAuto());
149 std::map<int, wxString> RecoveryFileLines;
150 std::map<int, wxString>::iterator striter;
152 wxStringTokenizer wSTRecoveryDBLines(wxSRecoveryDB, wxT("\r\n"));
154 int RecoveryLineSeek = 0;
156 while (wSTRecoveryDBLines.HasMoreTokens() == TRUE){
158 RecoveryLine = wSTRecoveryDBLines.GetNextToken();
159 RecoveryFileLines.insert(std::make_pair(RecoveryLineSeek, RecoveryLine));
168 //TestTimer.Start(50, FALSE);
171 void frmActivityMgr::OpenWindow()
176 void frmActivityMgr::CloseWindow( wxCommandEvent& event )
182 void frmActivityMgr::CloseWindow( wxCloseEvent& event )
188 void frmActivityMgr::ProcessTasksThread()
191 if (ProcessTasksData == FALSE){
197 std::map<int,int>::iterator TypeIter;
198 std::map<int,wxString>::iterator StringIter;
199 std::map<int,wxString>::iterator StringDataIter;
200 std::map<int,wxString>::iterator StringURLIter;
201 std::map<int,wxString>::iterator StringDetailIter;
202 std::map<int,wxString>::iterator StringAccountIter;
203 std::map<int,wxString>::iterator StringFilenameIter;
204 std::map<int,wxString>::iterator StringFullFilenameIter;
205 std::map<int,wxString>::iterator StringTaskDetailIter;
206 std::map<int,wxString>::iterator StringETagIter;
207 std::map<int,wxString>::iterator StringETagOrigIter;
208 std::map<int,CardDAV*>::iterator CardDAVIter;
209 std::map<int,ActivityMgrAccountSettings>::iterator AccountSettingsIter;
210 std::map<int,long>::iterator LongIter;
211 bool TasksFoundProc = FALSE;
214 for (std::map<int,int>::iterator iter = ActivityList.begin();
215 iter != ActivityList.end(); ++iter){
217 // Check for any queued tasks and start one.
219 if (iter->second > 4){
223 CardDAVIter = ActivityListConn.find(iter->first);
224 TypeIter = ActivityListType.find(iter->first);
225 StringETagIter = ActivityListETag.find(iter->first);
226 StringETagOrigIter = ActivityListETagOriginal.find(iter->first);
227 StringAccountIter = ActivityListAccount.find(iter->first);
228 StringFilenameIter = ActivityListFilename.find(iter->first);
229 StringFullFilenameIter = ActivityListFullFilename.find(iter->first);
230 AccountSettingsIter = ActivityListAccSettings.find(iter->first);
232 // Setup the CardDAV object.
236 ConnHandle.SetupConnection(AccountSettingsIter->second.Address,
237 AccountSettingsIter->second.Port,
238 AccountSettingsIter->second.Username,
239 AccountSettingsIter->second.Password,
240 AccountSettingsIter->second.SSL,
241 AccountSettingsIter->second.Prefix,
242 AccountSettingsIter->second.Dir);
243 ConnHandle.SetupVariables(&ActivityList, iter->first);
244 ConnHandle.SetupResultBools(&BlankBool, &BlankBool);
251 // 5 = Failed (UI Updated).
252 // 6 = Stopped (UI Updated).
253 // 7 = (Reserved) (UI Updated).
254 // 8 = Completed. (UI Updated).
256 frmMain *frmMainPtrGet = static_cast<frmMain*>(frmMainPtr);
257 XABPreferences PrefData(GetUserPrefDir());
259 if (iter->second == 0){
261 //CardDAVIter->second.
263 // Wait for process to finish.
266 TasksFoundProc = TRUE;
268 wxString ETagOriginal;
271 wxString ContactFilename;
272 wxString FullFilename;
274 bool EditMode = FALSE;
278 // Compare the ETags and work out if a conflict has occured.
280 if (TypeIter->second == 0){
284 StringDataIter = ActivityListData.find(iter->first);
285 StringURLIter = ActivityListURL.find(iter->first);
287 AccountDir = StringAccountIter->second;
288 ContactFilename = StringFilenameIter->second;
289 wxString AccountNameFriendly;
293 for (int i = 0; i < PrefData.accounts.GetCount(); i++){
295 wxString AccountDirCheck = PrefData.accounts.GetAccountDirectory(i);
297 AccountDirCheck.Trim();
298 AccountDirCheck.Append(wxT(".carddav"));
300 if (AccountDirCheck == StringAccountIter->second){
302 AccountNameFriendly = PrefData.accounts.GetAccountName(i);
309 ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir);
311 ETag = StringETagIter->second;
312 ETagOriginal = StringETagOrigIter->second;
313 AccountDir = StringAccountIter->second;
314 ContactFilename = StringFilenameIter->second;
315 FullFilename = StringFullFilenameIter->second;
316 EditMode = ActivityListEditMode.find(iter->first)->second;
318 bool KeepUpdating = TRUE;
320 while(KeepUpdating == TRUE){
322 bool ExitLoop = FALSE;
324 while (ExitLoop == FALSE){
326 ConnHandle.SetUploadMode(TRUE);
327 ConnHandle.SetupData(wxT("PUT"), StringURLIter->second, StringDataIter->second);
328 ConnHandle.SetEditMode(EditMode);
329 ConnHandle.ProcessData();
331 int ErrorCode = ConnHandle.GetResultCode();
333 if (ErrorCode != CURLE_OK){
335 if (ErrorCode == CURLE_SSL_CACERT ||
336 ErrorCode == CURLE_PEER_FAILED_VERIFICATION ||
337 ErrorCode == CURLE_SSL_CONNECT_ERROR){
339 // Invalid SSL certificate so bring up a dialog to the user
340 // explaining what has happened and the options available.
342 // Stop all the timers.
344 frmMainPtrGet->PauseAllTimers();
348 #if defined(__APPLE__)
350 // Bring up the trust panel and display the SSL certificate dialog.
352 SSLResult = DisplayTrustPanel(ConnHandle.GetTrustObject(), AccountNameFriendly);
354 // Update the SSL account with the trust object.
356 if (SSLResult != NSOKButton){
358 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetTrustObject());
364 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetTrustObject());
369 // Setup the data to be sent in the wxPostEvent command.
371 SSLInvalidCertNotifObj SSLICNProcData;
373 SSLCertCollection certcol = ConnHandle.GetCertificateData();
375 bool *PauseMode = new bool;
379 qrn.QResponse = &SSLResult;
380 qrn.PausePtr = PauseMode;
382 SSLICNProcData.CertCollection = certcol;
383 SSLICNProcData.QRNotifData = &qrn;
384 SSLICNProcData.AccountName = AccountNameFriendly;
386 wxCommandEvent event(INVALIDSSLCERT);
387 event.SetClientData(&SSLICNProcData);
388 wxPostEvent(frmMainPtrGet, event);
392 // Fall asleep until we get an response.
395 n1.tv_nsec = 250000000L;*/
397 while (*PauseMode == TRUE){
398 //nanosleep(&n1, &n2);
402 // Process the response from the user.
406 // Accept the certificate. Write the certificate into the account
407 // directory (as server.crt) - will overwrite old certificate.
409 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateData());
410 WriteServerCertificate(AccountDir, ConnHandle.GetCertificateData());
412 } else if (SSLResult == 2){
414 // Reject the certificate, abort the task and mark as failed.
416 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetCertificateData());
424 // Resume all the timers.
426 frmMainPtrGet->ResumeAllTimers();
444 if (iter->second == 2 || iter->second == 3 || iter->second == 4){
448 #if defined(__APPLE__)
450 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetTrustObject());
454 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateData());
458 // Add contact to the ETag DB.
460 ConnHandle.GetServerETagValueThread();
461 ETagServer = ConnHandle.ETagValueResult();
462 ETagDBPtr->AddETag(ContactFilename, ETagServer, ETagServer);
465 CardDAVIter->second = NULL;
470 } else if (TypeIter->second == 1){
474 StringDataIter = ActivityListData.find(iter->first);
475 StringURLIter = ActivityListURL.find(iter->first);
477 AccountDir = StringAccountIter->second;
478 ContactFilename = StringFilenameIter->second;
479 wxString AccountNameFriendly;
483 for (int i = 0; i < PrefData.accounts.GetCount(); i++){
485 wxString AccountDirCheck = PrefData.accounts.GetAccountDirectory(i);
487 AccountDirCheck.Trim();
488 AccountDirCheck.Append(wxT(".carddav"));
490 if (AccountDirCheck == StringAccountIter->second){
492 AccountNameFriendly = PrefData.accounts.GetAccountName(i);
499 ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir);
501 ETag = StringETagIter->second;
502 ETagOriginal = StringETagOrigIter->second;
503 AccountDir = StringAccountIter->second;
504 ContactFilename = StringFilenameIter->second;
505 FullFilename = StringFullFilenameIter->second;
506 EditMode = ActivityListEditMode.find(iter->first)->second;
508 bool KeepUpdating = TRUE;
510 while(KeepUpdating == TRUE){
512 bool ExitLoop = FALSE;
514 while (ExitLoop == FALSE){
516 ConnHandle.SetUploadMode(TRUE);
517 ConnHandle.SetupData(wxT("PUT"), StringURLIter->second, StringDataIter->second);
518 ConnHandle.SetEditMode(EditMode);
519 ConnHandle.GetServerETagValueThread();
520 ETagServer = ConnHandle.ETagValueResult();
522 int ErrorCode = ConnHandle.GetResultCode();
524 if (ErrorCode != CURLE_OK){
526 if (ErrorCode == CURLE_SSL_CACERT ||
527 ErrorCode == CURLE_PEER_FAILED_VERIFICATION ||
528 ErrorCode == CURLE_SSL_CONNECT_ERROR){
530 // Invalid SSL certificate so bring up a dialog to the user
531 // explaining what has happened and the options available.
533 // Stop all the timers.
535 frmMainPtrGet->PauseAllTimers();
539 #if defined(__APPLE__)
541 // Bring up the trust panel and display the SSL certificate dialog.
543 SSLResult = DisplayTrustPanel(ConnHandle.GetTrustObject(), AccountNameFriendly);
545 // Update the SSL account with the trust object.
547 if (SSLResult != NSOKButton){
549 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetTrustObject());
555 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetTrustObject());
560 // Setup the data to be sent in the wxPostEvent command.
562 SSLInvalidCertNotifObj SSLICNProcData;
564 SSLCertCollection certcol = ConnHandle.GetCertificateData();
566 bool *PauseMode = new bool;
570 qrn.QResponse = &SSLResult;
571 qrn.PausePtr = PauseMode;
573 SSLICNProcData.CertCollection = certcol;
574 SSLICNProcData.QRNotifData = &qrn;
575 SSLICNProcData.AccountName = AccountNameFriendly;
577 wxCommandEvent event(INVALIDSSLCERT);
578 event.SetClientData(&SSLICNProcData);
579 wxPostEvent(frmMainPtrGet, event);
581 while (*PauseMode == TRUE){
582 //nanosleep(&n1, &n2);
586 // Process the response from the user.
590 // Accept the certificate. Write the certificate into the account
591 // directory (as server.crt) - will overwrite old certificate.
593 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateData());
594 WriteServerCertificate(AccountDir, ConnHandle.GetCertificateData());
596 } else if (SSLResult == 2){
598 // Reject the certificate, abort the task and mark as failed.
600 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetCertificateData());
608 // Resume all the timers.
610 frmMainPtrGet->ResumeAllTimers();
628 if (iter->second == 2 || iter->second == 3 || iter->second == 4){
632 #if defined(__APPLE__)
634 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetTrustObject());
638 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateData());
642 // Compare the ETag with the Server ETag.
644 if (ETagOriginal != ETagServer){
646 // Server ETag is different from original ETag.
647 // This is a conflict which the user will now
653 frmMain *frmMainPtrGet = static_cast<frmMain*>(frmMainPtr);
655 vCard34Conv vCard34Obj;
657 wxString ServerContactData;
659 vCard ConvertedV4Data;
661 // Load the client data from the filename given.
663 ConnHandle.GetServerContactData();
664 ServerContactData = ConnHandle.GetPageData();
666 // Process v3 version into v4 version.
668 vCard34Obj.ConvertToV4(&ServerContactData, &ConvertedV4Data);
670 vCardConflictObj vCardProcData;
672 vCardProcData.vCardLocalData = &ClientData;
673 vCardProcData.vCardServerData = &ConvertedV4Data;
674 ClientData.LoadFile(FullFilename);
676 //ContactConflictEvent event(ContactConflictCmdEnv);
677 //event.SetData(ContactFilename, Moo1, Moo2);
679 //wxPostEvent(frmMainPtrGet, event);
681 // Setup Conflict Resolution Dialog.
683 // Fetch Data from Server and convert.
685 bool *PauseMode = new bool;
690 qrn.QResponse = &ConflictResult;
691 qrn.PausePtr = PauseMode;
693 vCardProcData.QRNotifData = &qrn;
695 wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED);
696 event.SetClientData(&vCardProcData);
697 wxPostEvent(frmMainPtrGet, event);
699 while (*PauseMode == TRUE){
700 //nanosleep(&n1, &n2);
707 //intResult = frmMainPtrGet->ShowConflictDialog(&Moo1, &Moo2);
709 if (ConflictResult == 0){
716 } else if (ConflictResult == 1){
718 // Decided to use client version.
720 ConnHandle.ProcessData();
722 } else if (ConflictResult == 2){
724 // Decided to use server version.
726 // Download server version.
728 ConvertedV4Data.WriteFile(FullFilename);
734 // Update the data to the server.
736 ConnHandle.ProcessData();
740 // Update the ETag DB.
742 ConnHandle.GetServerETagValueThread();
743 ETagServer = ConnHandle.ETagValueResult();
744 ETagDBPtr->UpdateETag(ContactFilename, ETagServer, ETagServer);
751 } else if (TypeIter->second == 2) {
753 // Delete the contact from the server and update the ETag DB.
755 AccountDir = StringAccountIter->second;
756 ContactFilename = StringFilenameIter->second;
757 wxString AccountNameFriendly;
761 for (int i = 0; i < PrefData.accounts.GetCount(); i++){
763 wxString AccountDirCheck = PrefData.accounts.GetAccountDirectory(i);
765 AccountDirCheck.Trim();
766 AccountDirCheck.Append(wxT(".carddav"));
768 if (AccountDirCheck == StringAccountIter->second){
770 AccountNameFriendly = PrefData.accounts.GetAccountName(i);
777 ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir);
779 bool KeepUpdating = TRUE;
781 while(KeepUpdating == TRUE){
783 bool ExitLoop = FALSE;
785 while (ExitLoop == FALSE){
787 ConnHandle.SetUploadMode(FALSE);
788 ConnHandle.SetupData(wxT("DELETE"), ContactFilename, wxT(""));
789 ConnHandle.ProcessData();
790 SSLCertCollection certcol = ConnHandle.GetCertificateData();
792 // Check if any errors have occured whilst getting the data.
794 int ErrorCode = ConnHandle.GetResultCode();
796 if (ErrorCode != CURLE_OK){
798 if (ErrorCode == CURLE_SSL_CACERT ||
799 ErrorCode == CURLE_PEER_FAILED_VERIFICATION ||
800 ErrorCode == CURLE_SSL_CONNECT_ERROR){
802 // Invalid SSL certificate so bring up a dialog to the user
803 // explaining what has happened and the options available.
805 // Stop all the timers.
807 frmMainPtrGet->PauseAllTimers();
811 #if defined(__APPLE__)
813 // Bring up the trust panel and display the SSL certificate dialog.
815 SSLResult = DisplayTrustPanel(ConnHandle.GetTrustObject(), AccountNameFriendly);
817 // Update the SSL account with the trust object.
819 if (SSLResult != NSOKButton){
821 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetTrustObject());
827 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetTrustObject());
832 // Setup the data to be sent in the wxPostEvent command.
834 SSLInvalidCertNotifObj SSLICNProcData;
836 bool *PauseMode = new bool;
840 qrn.QResponse = &SSLResult;
841 qrn.PausePtr = PauseMode;
843 SSLICNProcData.CertCollection = certcol;
844 SSLICNProcData.QRNotifData = &qrn;
845 SSLICNProcData.AccountName = AccountNameFriendly;
847 wxCommandEvent event(INVALIDSSLCERT);
848 event.SetClientData(&SSLICNProcData);
849 wxPostEvent(frmMainPtrGet, event);
853 // Fall asleep until we get an response.
856 n1.tv_nsec = 250000000L;*/
858 while (*PauseMode == TRUE){
859 //nanosleep(&n1, &n2);
863 // Process the response from the user.
867 // Accept the certificate. Write the certificate into the account
868 // directory (as server.crt) - will overwrite old certificate.
870 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateData());
871 WriteServerCertificate(AccountDir, ConnHandle.GetCertificateData());
873 } else if (SSLResult == 2){
875 // Reject the certificate, abort the task and mark as failed.
877 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetCertificateData());
885 // Resume all the timers.
887 frmMainPtrGet->ResumeAllTimers();
905 if (iter->second == 2 || iter->second == 3 || iter->second == 4){
909 #if defined(__APPLE__)
911 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetTrustObject());
915 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateData());
920 ETagDBPtr->RemoveETag(ContactFilename);
923 CardDAVIter->second = NULL;
928 } else if (TypeIter->second == 3) {
930 wxString AccountNameFriendly;
934 for (int i = 0; i < PrefData.accounts.GetCount(); i++){
936 wxString AccountDirCheck = PrefData.accounts.GetAccountDirectory(i);
938 AccountDirCheck.Trim();
939 AccountDirCheck.Append(wxT(".carddav"));
941 if (AccountDirCheck == StringAccountIter->second){
943 AccountNameFriendly = PrefData.accounts.GetAccountName(i);
950 bool KeepUpdating = TRUE;
952 while (KeepUpdating == TRUE){
954 StringTaskDetailIter = ActivityListTaskDetail.find(iter->first);
956 AccountDir = StringAccountIter->second;
958 ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir);
960 wxArrayString vCardAdd;
961 wxArrayString vCardDelete;
962 wxArrayString vCardList;
963 wxArrayString vCardUpdateLocal;
964 wxArrayString vCardUpdateRemote;
965 wxArrayString vCardUpdateLog;
966 std::map<wxString,wxString> vCardETag;
967 ContactListData ServerContactList;
969 std::map<wxString,vCardDownloadDataFileClass> vCardDownloadData;
970 //wxArrayString vCardDownload;
971 //std::map<wxString,wxString> vCardDownloadData;
973 // Get the list of vCard files locally.
975 wxString AccountDirFinal;
976 wxString AccountSyncTokenFilename;
977 wxString SyncTokenLoad;
979 #if defined(__HAIKU__)
981 //preffilename = wxT("noo");
983 #elif defined(__WIN32__)
985 AccountDirFinal = GetAccountDir(AccountDir, FALSE);
986 AccountSyncTokenFilename = AccountDirFinal;
987 AccountSyncTokenFilename.Append(wxT("synctoken"));
991 AccountDirFinal = GetAccountDir(AccountDir, FALSE);
992 AccountSyncTokenFilename = AccountDirFinal;
993 AccountSyncTokenFilename.Append(wxT("synctoken"));
997 // Suppress Error Messages.
999 wxLogNull PleaseDoNotDisturb;
1002 SyncLoad.Open(AccountSyncTokenFilename, wxT("r"));
1004 if (SyncLoad.IsOpened()){
1006 SyncLoad.ReadAll(&SyncTokenLoad, wxMBConvUTF8());
1011 // Get a list of vCard files from the server.
1013 // Get the list of vCard files from the ETagDB.
1015 std::map<wxString,ETagData> ETagDBData = ETagDBPtr->GetETagData();
1017 bool ExitLoop = FALSE;
1019 std::map<wxString,FileSyncData> *SCListData = NULL;
1021 while (ExitLoop == FALSE){
1023 // Check if any errors have occured whilst getting the data.
1025 int ErrorCode = ConnHandle.SSLVerifyTest();
1027 if (ErrorCode != CURLE_OK){
1029 if (ErrorCode == CURLE_SSL_CACERT ||
1030 ErrorCode == CURLE_PEER_FAILED_VERIFICATION ||
1031 ErrorCode == CURLE_SSL_CONNECT_ERROR){
1033 // Invalid SSL certificate so bring up a dialog to the user
1034 // explaining what has happened and the options available.
1036 // Stop all the timers.
1038 frmMainPtrGet->PauseAllTimers();
1042 #if defined(__APPLE__)
1044 // Bring up the trust panel and display the SSL certificate dialog.
1046 SSLResult = DisplayTrustPanel(ConnHandle.GetTrustObject(), AccountNameFriendly);
1048 // Update the SSL account with the trust object.
1050 if (SSLResult != NSOKButton){
1052 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetTrustObject());
1058 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetTrustObject());
1062 #elif defined(__WIN32__)
1064 BOOL ModifiedCertificateData;
1065 CRYPTUI_VIEWCERTIFICATE_STRUCTW CertificateData = BuildCertificateData(&ConnHandle, (HWND)frmMainPtrGet->GetHandle());
1067 if (!CryptUIDlgViewCertificate(&CertificateData, &ModifiedCertificateData)){
1068 wxMessageBox(_("An error occured while trying to open the certificate dialog."), _("Error opening Certificate Information dialog"));
1073 // Setup the data to be sent in the wxPostEvent command.
1075 SSLInvalidCertNotifObj SSLICNProcData;
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.GetCertificateData());
1112 WriteServerCertificate(AccountDir, ConnHandle.GetCertificateData());
1114 } else if (SSLResult == 2){
1116 // Reject the certificate, abort the task and mark as failed.
1118 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetCertificateData());
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());
1156 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateData());
1160 // Look in directory and see which vCards to add and delete
1163 // vCard exists but not in ETagDB - Add (and upload).
1164 // vCard missing but in ETagDB - Delete (from server).
1166 // Start by looking for vCards that are not in the ETagDB.
1168 wxDir AccDir(AccountDirFinal);
1169 wxString AccDirFilename;
1171 bool ContinueProcess = AccDir.GetFirst(&AccDirFilename, wxEmptyString, wxDIR_DEFAULT);
1173 ServerContactList = ConnHandle.GetContactList(SyncTokenLoad.ToUTF8());
1174 SSLCertCollection certcol = ConnHandle.GetCertificateData();
1176 // Create a pointer for the std::map<wxString,FileSyncData>.
1178 SCListData = &ServerContactList.ListData;
1180 // Process the server data.
1182 if (SCListData != NULL){
1184 for (std::map<wxString, FileSyncData>::iterator fsiter = SCListData->begin();
1185 fsiter != SCListData->end(); fsiter++){
1187 // Check the mode of the file before adding.
1189 // Get the HTTP status of the file from the list.
1191 FileSyncData fsd = fsiter->second;
1193 if (fsd.DataFlag == 1){
1195 // Added or modified contact.
1197 //vCardAdd.Add(fsiter->first, 1);
1199 vCardDownloadDataFileClass vCardNewData;
1200 vCardNewData.DataType = 0;
1201 vCardDownloadData.insert(std::make_pair(fsiter->first, vCardNewData));
1203 //} else if (fsd.DataFlag == 1){
1205 // Contact has been modified on the server.
1207 // vCardUpdateLocal.Add(fsiter->first, 1);
1210 else if (fsd.DataFlag == 2){
1212 // Contact has been deleted.
1214 vCardDelete.Add(fsiter->first, 1);
1222 // Look for vCards that are missing but in the ETagDB.
1224 for (std::map<wxString,ETagData>::iterator etagiter = ETagDBData.begin();
1225 etagiter != ETagDBData.end(); etagiter++){
1227 // Check if the vCard exists.
1229 if (!wxFileExists(AccountDirFinal + etagiter->first)){
1231 // vCard doesn't exist so mark for deleting.
1233 vCardDelete.Add(etagiter->first, 1);
1239 // Compare Server with the ETag DB. Work out which
1240 // needs to updated remotely and which needs to be
1243 for (std::map<wxString,FileSyncData>::iterator srviter = SCListData->begin();
1244 srviter != SCListData->end(); srviter++){
1246 if (ETagDBData.find(srviter->first) == ETagDBData.end()){
1250 std::map<wxString,ETagData>::iterator lociter = ETagDBData.find(srviter->first);
1252 ETagData etd = lociter->second;
1253 FileSyncData fsd = srviter->second;
1255 wxString ETagSrv = fsd.ETagData;
1257 // Check if the local ETag value has 'DELETED' set and skip
1258 // checking this file if it does.
1260 if (etd.ETagValue == "DELETED"){
1266 // Compare local ETag with original local ETag.
1267 // If different, update to server is required.
1269 if (etd.ETagValue != etd.ETagOrigValue){
1271 // Check if local original ETag is different from server ETag.
1272 // If it is then throw up a conflict resolution dialog.
1274 if (etd.ETagOrigValue != ETagSrv){
1276 vCard34Conv vCard34Obj;
1278 wxString ServerContactData;
1279 wxString FullFilename;
1281 vCard ConvertedV4Data;
1283 // Conflict. Bring up conflict resolution dialog.
1285 // Get the server contact data for comparison.
1287 ConnHandle.SetServerFilename(srviter->first);
1288 ConnHandle.GetServerContactData();
1289 ServerContactData = ConnHandle.GetPageData();
1291 FullFilename = CreateFilenamePath(AccountDirFinal, srviter->first);
1293 // Convert it to v4.
1295 vCard34Obj.ConvertToV4(&ServerContactData, &ConvertedV4Data);
1297 vCardConflictObj vCardProcData;
1299 vCardProcData.vCardLocalData = &ClientData;
1300 vCardProcData.vCardServerData = &ConvertedV4Data;
1302 // Load the client data from the filename given.
1304 ClientData.LoadFile(FullFilename);
1308 bool *PauseMode = new bool;
1311 frmMain *frmMainPtrGet = static_cast<frmMain*>(frmMainPtr);
1314 qrn.QResponse = &ConflictResult;
1315 qrn.PausePtr = PauseMode;
1317 vCardProcData.QRNotifData = &qrn;
1319 wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED);
1320 event.SetClientData(&vCardProcData);
1321 wxPostEvent(frmMainPtrGet, event);
1326 n1.tv_nsec = 250000000L;*/
1328 while (*PauseMode == TRUE){
1329 //nanosleep(&n1, &n2);
1330 SleepFor(250000000);
1336 // If replacing local version, store copy for now.
1337 // Otherwise upload to server.
1339 if (ConflictResult == 0){
1345 } else if (ConflictResult == 1){
1347 // Decided to use client version.
1349 vCardUpdateLocal.Remove(srviter->first);
1350 vCardUpdateRemote.Add(srviter->first, 1);
1352 } else if (ConflictResult == 2){
1354 // Decided to use server version.
1355 // Store the converted downloaded copy for
1356 // processing later.
1358 //vCardUpdateLocal.Add(srviter->first, 1);
1360 vCardDownloadDataFileClass vCardNewData;
1361 vCardNewData.DataType = 1;
1362 vCardNewData.FileData = ConvertedV4Data.WriteString();
1364 ConvertedV4Data.WriteFile(FullFilename);
1366 vCardDownloadData.insert(std::make_pair(srviter->first, vCardNewData));
1374 // Send vCard to the server.
1376 vCardUpdateRemote.Add(srviter->first, 1);
1382 // Check if local ETag is different from server ETag.
1383 // If different, obtain the vCard from the server.
1385 if (etd.ETagOrigValue != ETagSrv){
1387 vCardUpdateLocal.Add(srviter->first, 1);
1395 // Process the vCards that need to be downloaded and added/overwritten.
1397 wxString vCardFilenameFinal;
1398 wxString vCardOutputData;
1399 wxString vCardInputData;
1400 wxString ETagFileData;
1403 for (std::map<wxString,vCardDownloadDataFileClass>::iterator additer = vCardDownloadData.begin();
1404 additer != vCardDownloadData.end(); additer++){
1406 vCardFilenameFinal.Clear();
1407 vCardInputData.Clear();
1408 vCardOutputData.Clear();
1409 ETagFileData.Clear();
1411 vCardFilenameFinal = CreateFilenamePath(AccountDirFinal, additer->first);
1413 ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir);
1415 if (additer->second.DataType == 0){
1417 vCard ConvertedV4Data;
1419 // Grab the file from the server and write the contact out.
1421 vCard34Conv vCard34Obj;
1423 ConnHandle.SetServerFilename(additer->first);
1424 ConnHandle.GetServerContactData();
1425 vCardInputData = ConnHandle.GetPageData();
1427 vCard34Obj.ConvertToV4(&vCardInputData, &ConvertedV4Data);
1429 ConvertedV4Data.WriteFile(vCardFilenameFinal);
1431 // Update the ETagDB.
1433 //vCardFile.Open(vCardFilenameFinal, wxT("w"));
1435 //if (vCardFile.IsOpened()){
1437 // vCardFile.Write(vCardOutputData, wxConvAuto());
1438 // vCardFile.Close();
1442 // Get the server ETag.
1444 wxString ServerETag;
1445 ConnHandle.GetServerETagValueThread();
1446 ServerETag = ConnHandle.ETagValueResult();
1448 // Add to the ETag Database.
1450 ETagDBPtr->AddETag(additer->first, ServerETag, ServerETag);
1452 } else if (additer->second.DataType == 1){
1454 // Write out the contact to the account directory.
1456 vCardFilenameFinal = CreateFilenamePath(AccountDirFinal, additer->first);
1457 vCardOutputData = additer->second.FileData;
1459 vCardFile.Open(vCardFilenameFinal, wxT("w"));
1461 if (vCardFile.IsOpened()){
1463 vCardFile.Write(vCardOutputData, wxConvAuto());
1468 // Update the ETagDB.
1470 wxString ServerETag;
1471 ConnHandle.GetServerETagValueThread();
1472 ServerETag = ConnHandle.ETagValueResult();
1474 // Add to the ETag Database.
1476 ETagDBPtr->AddETag(additer->first, ServerETag, ServerETag);
1481 // Look for vCard files which aren't in the ETagDB.
1483 while(ContinueProcess){
1485 // Check and make sure that the filename ends in .vcf/.vcard
1486 // Skip any file that beings with a dot.
1488 if (AccDirFilename.Left(1) == wxT(".")){
1490 ContinueProcess = AccDir.GetNext(&AccDirFilename);
1495 if (AccDirFilename.Right(4) != wxT(".vcf") &&
1496 AccDirFilename.Right(6) != wxT(".vcard")){
1498 ContinueProcess = AccDir.GetNext(&AccDirFilename);
1503 // Look in the ETagDB for the file.
1505 bool ETagExists = ETagDBPtr->CheckETagExists(AccDirFilename);
1507 if (ETagExists == FALSE){
1509 // Add the vCard to the list to be added.
1511 vCardAdd.Add(AccDirFilename, 1);
1515 ContinueProcess = AccDir.GetNext(&AccDirFilename);
1519 // Process the vCards to add/update to the server.
1521 for (int vi = 0; vi < vCardAdd.GetCount(); vi++){
1523 ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir);
1524 ETag = ETagDBPtr->GetETag(vCardAdd[vi]);
1525 ETagOriginal = ETagDBPtr->GetETagOriginal(vCardAdd[vi]);
1527 ContactFilename = vCardAdd[vi];
1528 FullFilename = CreateFilenamePath(AccountDirFinal, vCardAdd[vi]);
1530 ContactFilename.Trim();
1532 if (ETag == ETagOriginal && ETagDBPtr->ETagExists(vCardAdd[vi])){
1534 // Compare the ETag with the Server ETag.
1536 ConnHandle.SetServerFilename(vCardAdd[vi]);
1537 ConnHandle.GetServerETagValueThread();
1538 ETagServer = ConnHandle.ETagValueResult();
1540 if (ETagOriginal != ETagServer){
1542 // Server ETag is different from original ETag.
1543 // This is a conflict which the user will now
1546 frmMain *frmMainPtrGet = static_cast<frmMain*>(frmMainPtr);
1548 vCard34Conv vCard34Obj;
1550 wxString ServerContactData;
1552 vCard ConvertedV4Data;
1554 // Load the client data from the filename given.
1556 ConnHandle.GetServerContactData();
1557 ServerContactData = ConnHandle.GetPageData();
1559 // Process v3 version into v4 version.
1561 vCard34Obj.ConvertToV4(&ServerContactData, &ConvertedV4Data);
1563 vCardConflictObj vCardProcData;
1565 vCardProcData.vCardLocalData = &ClientData;
1566 vCardProcData.vCardServerData = &ConvertedV4Data;
1567 ClientData.LoadFile(FullFilename);
1569 //ContactConflictEvent event(ContactConflictCmdEnv);
1570 //event.SetData(ContactFilename, Moo1, Moo2);
1572 //wxPostEvent(frmMainPtrGet, event);
1574 // Setup Conflict Resolution Dialog.
1576 // Fetch Data from Server and convert.
1578 bool *PauseMode = new bool;
1583 qrn.QResponse = &ConflictResult;
1584 qrn.PausePtr = PauseMode;
1586 vCardProcData.QRNotifData = &qrn;
1588 wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED);
1589 event.SetClientData(&vCardProcData);
1590 wxPostEvent(frmMainPtrGet, event);
1595 n1.tv_nsec = 250000000L;*/
1597 while (*PauseMode == TRUE){
1598 //nanosleep(&n1, &n2);
1599 SleepFor(250000000);
1605 //intResult = frmMainPtrGet->ShowConflictDialog(&Moo1, &Moo2);
1607 if (ConflictResult == 0){
1614 } else if (ConflictResult == 1){
1616 // Decided to use client version.
1618 ConnHandle.ProcessData();
1622 } else if (ConflictResult == 2){
1624 // Decided to use server version.
1626 // Download server version.
1628 ConvertedV4Data.WriteFile(CreateFilenamePath(AccountDirFinal, vCardAdd[vi]));
1636 // Setup the filename for the contact being added.
1638 wxString wxSFilename = CreateFilenamePath(AccountDirFinal, vCardAdd[vi]);
1639 wxString wxSCardData;
1643 // Load the data from the file.
1646 wxFCard.Open(wxSFilename, wxT("r"));
1648 if (wxFCard.IsOpened()){
1650 wxFCard.ReadAll(&wxSCardData, wxConvAuto());
1655 // Convert the data to v3.
1657 vCard34Conv vCard34Obj;
1659 vCard34Obj.ConvertToV3(wxSFilename, &TaskData);
1661 // Setup the URL address.
1663 //TaskURL = StringTaskDetailIter->second + wxT("/") + vCardAdd[vi];
1665 // Upload the data to the server.
1667 ConnHandle.SetUploadMode(TRUE);
1668 ConnHandle.SetupData(wxT("PUT"), vCardAdd[vi], TaskData);
1669 ConnHandle.ProcessData();
1671 // Get the Server ETag and put it in the ETag database.
1673 ConnHandle.SetServerFilename(vCardAdd[vi]);
1674 ConnHandle.GetServerETagValueThread();
1675 ETagServer = ConnHandle.ETagValueResult();
1677 ETagDBPtr->AddETag(vCardAdd[vi], ETagServer, ETagServer);
1683 if (ETagOriginal != ETagServer){
1685 // Server ETag is different from original ETag.
1686 // This is a conflict which the user will now
1689 frmMain *frmMainPtrGet = (frmMain *)frmMainPtr;
1691 //ContactConflictEvent event(ContactConflictCmdEnv);
1692 //event.SetData(ContactFilename, Moo1, Moo2);
1694 vCard34Conv vCard34Obj;
1696 wxString ServerContactData;
1698 vCard ConvertedV4Data;
1700 // Load the client data from the filename given.
1702 ConnHandle.GetServerContactData();
1703 ServerContactData = ConnHandle.GetPageData();
1704 ClientData.LoadFile(FullFilename);
1706 // Process v3 version into v4 version.
1708 vCard34Obj.ConvertToV4(&ServerContactData, &ConvertedV4Data);
1710 vCardConflictObj vCardProcData;
1712 vCardProcData.vCardLocalData = &ClientData;
1713 vCardProcData.vCardServerData = &ConvertedV4Data;
1715 bool *PauseMode = new bool;
1720 qrn.QResponse = &ConflictResult;
1721 qrn.PausePtr = PauseMode;
1723 vCardProcData.QRNotifData = &qrn;
1725 wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED);
1726 event.SetClientData(&vCardProcData);
1727 wxPostEvent(frmMainPtrGet, event);
1732 n1.tv_nsec = 250000000L;*/
1734 while (*PauseMode == TRUE){
1735 //nanosleep(&n1, &n2);
1736 SleepFor(250000000);
1742 //intResult = frmMainPtrGet->ShowConflictDialog(&Moo1, &Moo2);
1744 if (ConflictResult == 0){
1751 } else if (ConflictResult == 1){
1753 // Decided to use client version.
1755 ConnHandle.ProcessData();
1756 //ETagServer = CardDAVIter->second.GetServerETagValueThread();
1757 //ETagDBPtr->UpdateETag(ContactFilename, ETagServer, ETagServer);
1761 } else if (ConflictResult == 2){
1763 // Decided to use server version.
1765 // Write server version to file.
1767 ConvertedV4Data.WriteFile(CreateFilenamePath(AccountDirFinal, vCardAdd[vi]));
1775 // Setup the filename for the contact being added.
1777 wxString wxSFilename = CreateFilenamePath(AccountDirFinal, vCardAdd[vi]);
1778 wxString wxSCardData;
1782 // Load the data from the file.
1785 wxFCard.Open(wxSFilename, wxT("r"));
1787 if (wxFCard.IsOpened()){
1789 wxFCard.ReadAll(&wxSCardData, wxConvAuto());
1794 // Convert the data to v3.
1796 vCard34Conv vCard34Obj;
1798 vCard34Obj.ConvertToV3(wxSFilename, &TaskData);
1800 // Setup the URL address.
1802 //TaskURL = StringTaskDetailIter->second + wxT("/") + vCardAdd[vi];
1804 // Upload the data to the server.
1806 ConnHandle.SetUploadMode(TRUE);
1807 ConnHandle.SetupData(wxT("PUT"), vCardAdd[vi], TaskData);
1808 ConnHandle.ProcessData();
1810 // Get the Server ETag and put it in the ETag database.
1812 ConnHandle.SetServerFilename(vCardAdd[vi]);
1813 ConnHandle.GetServerETagValueThread();
1814 ETagServer = ConnHandle.ETagValueResult();
1817 ETagDBPtr->AddETag(vCardAdd[vi], ETagServer, ETagServer);
1825 // Process the vCards to delete locally.
1827 for (int vi = 0; vi < vCardDelete.GetCount(); vi++){
1829 if (!wxRemoveFile(CreateFilenamePath(AccountDirFinal, vCardDelete[vi]))){
1833 ETagDBPtr->RemoveETag(vCardDelete[vi]);
1839 // Process the vCards to delete from the server.
1841 std::map<wxString,wxString> *ETagFilenameMap = ETagDBPtr->GetFilenamePointer();
1842 std::list<wxString> DeleteList;
1844 for (std::map<wxString,wxString>::iterator deliter = ETagFilenameMap->begin();
1845 deliter != ETagFilenameMap->end(); deliter++){
1847 // Look through the ETagDB and find contacts which are marked as DELETED.
1849 if (deliter->second == wxT("DELETED")){
1851 ConnHandle.SetUploadMode(FALSE);
1852 ConnHandle.SetupData(wxT("DELETE"), deliter->first, wxT(""));
1853 ConnHandle.ProcessDataThread();
1855 // Delete the ETag as the file has now been deleted.
1857 DeleteList.push_back(deliter->first);
1863 for (std::list<wxString>::iterator removeetagiter = DeleteList.begin();
1864 removeetagiter != DeleteList.end(); removeetagiter++){
1866 ETagDBPtr->RemoveETag(*removeetagiter);
1870 // Write out the update server sync token.
1872 wxString ServerSyncToken = ServerContactList.SyncToken;
1874 ServerSyncToken.Trim();
1876 if (!ServerSyncToken.IsEmpty()){
1879 SyncWrite.Open(AccountSyncTokenFilename, wxT("w"));
1881 if (SyncWrite.IsOpened()){
1883 SyncWrite.Write(ServerSyncToken, wxConvAuto());
1890 // Check for another sync token. If there is another
1891 // sync token then repeat this. If token matches then stop processing.
1893 if (SyncTokenLoad == ServerSyncToken){
1895 KeepUpdating = FALSE;
1901 // Mark as completed.
1903 wxString AccountNameFinal;
1904 AccountNameFinal = PrefData.accounts.GetAccountDirectory(AccountID);
1905 AccountNameFinal.Append(wxT(".carddav"));
1907 wxCommandEvent reloadevent(RELOADCONTACTLIST);
1908 reloadevent.SetString(AccountNameFinal);
1909 wxPostEvent(this->GetParent(), reloadevent);
1916 // Update the data to the server.
1918 ConnHandle.ProcessData();
1927 n1.tv_nsec = 250000000L;*/
1929 while (iter->second == 1){
1931 SleepFor(250000000);
1932 //nanosleep(&n1, &n2);
1936 if ((iter->second == 4 && TypeIter->second == 0) ||
1937 (iter->second == 8 && TypeIter->second == 0)){
1939 AccountDir = StringAccountIter->second;
1940 ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir);
1942 ConnHandle.GetServerETagValueThread();
1943 ETagServer = ConnHandle.ETagValueResult();
1944 ETagDBPtr->UpdateETag(ContactFilename, ETagServer, ETagServer);
1948 if ((iter->second == 4 && TypeIter->second == 1) ||
1949 (iter->second == 8 && TypeIter->second == 1)){
1951 AccountDir = StringAccountIter->second;
1952 ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir);
1954 ConnHandle.GetServerETagValueThread();
1955 ETagServer = ConnHandle.ETagValueResult();
1956 ETagDBPtr->UpdateETag(ContactFilename, ETagServer, ETagServer);
1966 if (TasksFoundProc == FALSE){
1968 TasksActive = FALSE;
1969 ProcessTasksData = FALSE;
1973 wxCommandEvent eventp(ACTMGR_STARTTIMER);
1974 wxPostEvent(this, eventp);
1976 //AnimationTimer.StartAnimation();
1977 //ActListProcTimer.Start();
1981 wxCommandEvent event(ACTMGR_STARTPROCESSTIMER);
1982 wxPostEvent(this, event);
1984 //ActProcessTimer.Start();
1988 void frmActivityMgr::ProcessTasks()
1991 std::thread ProcessThread(&frmActivityMgr::ProcessTasksThread, this);
1992 ProcessThread.detach();
1996 void frmActivityMgr::SetupPointers(wxETagProcessTimer *ETagTmrPtrInc, void *frmMainPtrInc)
1999 ETagTmrPtr = ETagTmrPtrInc;
2001 frmMainPtr = frmMainPtrInc;
2005 void frmActivityMgr::ResumeProcessing(wxCommandEvent &event){
2007 QRNotif *qrn = (QRNotif *)event.GetClientData();
2009 int *QRes = qrn->QResponse;
2011 *qrn->PausePtr = FALSE;
2013 *QRes = event.GetInt();
2017 void frmActivityMgr::ToggleConnectionStatus( wxCommandEvent &event ){
2019 wxCommandEvent connevent(CONNSTAT_UPDATE);
2021 if (SleepMode == FALSE){
2023 connevent.SetInt(1);
2028 connevent.SetInt(0);
2033 wxPostEvent(GetParent(), connevent);
2037 void frmActivityMgr::WriteServerCertificate(wxString AccountName, SSLCertCollection SSLCertInc){
2039 wxString ServerCertFinal;
2041 // Get the Cert section of the certificate and write it to the file.
2043 ServerCertFinal = GetAccountDir(AccountName, TRUE);
2047 std::map<int, SSLCertData>::iterator SSLCDIter = SSLCertInc.SSLCollection.find(0);
2048 std::multimap<wxString,wxString>::iterator SSLDataIter = SSLCDIter->second.CertData.find(wxT("Cert"));
2050 CertFile.Open(ServerCertFinal, wxFile::write);
2052 CertFile.Write(SSLDataIter->second, wxConvUTF8);
2057 void frmActivityMgr::StartTimer(wxCommandEvent& event){
2059 ActListProcTimer.Start(1000, FALSE);
2063 void frmActivityMgr::StopTimer(wxCommandEvent& event){
2065 ActListProcTimer.Stop();
2069 void frmActivityMgr::StartProcessTimer(wxCommandEvent& event){
2071 ActProcessTimer.Start(1000, FALSE);
2075 void frmActivityMgr::StopProcessTimer(wxCommandEvent& event){
2077 ActProcessTimer.Stop();
2081 void frmActivityMgr::UpdateStatusLabel(wxCommandEvent& event){
2083 ActivityMgrLabelUpdate *actmgrudata = (ActivityMgrLabelUpdate*)event.GetClientData();
2085 if (actmgrudata != NULL){
2087 lstActivity->SetItem(actmgrudata->ItemIndex, 2, actmgrudata->ItemLabel);
2089 /*if (!actmgrudata->ItemDes.IsEmpty()){
2090 lstActivity->SetItem(actmgrudata->ItemIndex, 0, actmgrudata->ItemDes);