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();
335 if (ErrorCode == 60 || ErrorCode == 51){
337 // Invalid SSL certificate so bring up a dialog to the user
338 // explaining what has happened and the options available.
340 // Stop all the timers.
342 frmMainPtrGet->PauseAllTimers();
346 #if defined(__APPLE__)
348 // Bring up the trust panel and display the SSL certificate dialog.
350 SSLResult = DisplayTrustPanel(ConnHandle.GetTrustObject(), AccountNameFriendly);
352 // Update the SSL account with the trust object.
354 if (SSLResult != NSOKButton){
356 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetTrustObject());
362 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetTrustObject());
367 // Setup the data to be sent in the wxPostEvent command.
369 SSLInvalidCertNotifObj SSLICNProcData;
371 SSLCertCollection certcol = ConnHandle.GetCertificateData();
373 bool *PauseMode = new bool;
377 qrn.QResponse = &SSLResult;
378 qrn.PausePtr = PauseMode;
380 SSLICNProcData.CertCollection = certcol;
381 SSLICNProcData.QRNotifData = &qrn;
382 SSLICNProcData.AccountName = AccountNameFriendly;
384 wxCommandEvent event(INVALIDSSLCERT);
385 event.SetClientData(&SSLICNProcData);
386 wxPostEvent(frmMainPtrGet, event);
390 // Fall asleep until we get an response.
393 n1.tv_nsec = 250000000L;*/
395 while (*PauseMode == TRUE){
396 //nanosleep(&n1, &n2);
400 // Process the response from the user.
404 // Accept the certificate. Write the certificate into the account
405 // directory (as server.crt) - will overwrite old certificate.
407 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateData());
408 WriteServerCertificate(AccountDir, ConnHandle.GetCertificateData());
410 } else if (SSLResult == 2){
412 // Reject the certificate, abort the task and mark as failed.
414 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetCertificateData());
422 // Resume all the timers.
424 frmMainPtrGet->ResumeAllTimers();
442 if (iter->second == 2 || iter->second == 3 || iter->second == 4){
446 #if defined(__APPLE__)
448 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetTrustObject());
452 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateData());
456 // Add contact to the ETag DB.
458 ConnHandle.GetServerETagValueThread();
459 ETagServer = ConnHandle.ETagValueResult();
460 ETagDBPtr->AddETag(ContactFilename, ETagServer, ETagServer);
463 CardDAVIter->second = NULL;
468 } else if (TypeIter->second == 1){
472 StringDataIter = ActivityListData.find(iter->first);
473 StringURLIter = ActivityListURL.find(iter->first);
475 AccountDir = StringAccountIter->second;
476 ContactFilename = StringFilenameIter->second;
477 wxString AccountNameFriendly;
481 for (int i = 0; i < PrefData.accounts.GetCount(); i++){
483 wxString AccountDirCheck = PrefData.accounts.GetAccountDirectory(i);
485 AccountDirCheck.Trim();
486 AccountDirCheck.Append(wxT(".carddav"));
488 if (AccountDirCheck == StringAccountIter->second){
490 AccountNameFriendly = PrefData.accounts.GetAccountName(i);
497 ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir);
499 ETag = StringETagIter->second;
500 ETagOriginal = StringETagOrigIter->second;
501 AccountDir = StringAccountIter->second;
502 ContactFilename = StringFilenameIter->second;
503 FullFilename = StringFullFilenameIter->second;
504 EditMode = ActivityListEditMode.find(iter->first)->second;
506 bool KeepUpdating = TRUE;
508 while(KeepUpdating == TRUE){
510 bool ExitLoop = FALSE;
512 while (ExitLoop == FALSE){
514 ConnHandle.SetUploadMode(TRUE);
515 ConnHandle.SetupData(wxT("PUT"), StringURLIter->second, StringDataIter->second);
516 ConnHandle.SetEditMode(EditMode);
517 ConnHandle.GetServerETagValueThread();
518 ETagServer = ConnHandle.ETagValueResult();
520 int ErrorCode = ConnHandle.GetResultCode();
524 if (ErrorCode == 60 || ErrorCode == 51){
526 // Invalid SSL certificate so bring up a dialog to the user
527 // explaining what has happened and the options available.
529 // Stop all the timers.
531 frmMainPtrGet->PauseAllTimers();
535 #if defined(__APPLE__)
537 // Bring up the trust panel and display the SSL certificate dialog.
539 SSLResult = DisplayTrustPanel(ConnHandle.GetTrustObject(), AccountNameFriendly);
541 // Update the SSL account with the trust object.
543 if (SSLResult != NSOKButton){
545 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetTrustObject());
551 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetTrustObject());
556 // Setup the data to be sent in the wxPostEvent command.
558 SSLInvalidCertNotifObj SSLICNProcData;
560 SSLCertCollection certcol = ConnHandle.GetCertificateData();
562 bool *PauseMode = new bool;
566 qrn.QResponse = &SSLResult;
567 qrn.PausePtr = PauseMode;
569 SSLICNProcData.CertCollection = certcol;
570 SSLICNProcData.QRNotifData = &qrn;
571 SSLICNProcData.AccountName = AccountNameFriendly;
573 wxCommandEvent event(INVALIDSSLCERT);
574 event.SetClientData(&SSLICNProcData);
575 wxPostEvent(frmMainPtrGet, event);
577 while (*PauseMode == TRUE){
578 //nanosleep(&n1, &n2);
582 // Process the response from the user.
586 // Accept the certificate. Write the certificate into the account
587 // directory (as server.crt) - will overwrite old certificate.
589 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateData());
590 WriteServerCertificate(AccountDir, ConnHandle.GetCertificateData());
592 } else if (SSLResult == 2){
594 // Reject the certificate, abort the task and mark as failed.
596 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetCertificateData());
604 // Resume all the timers.
606 frmMainPtrGet->ResumeAllTimers();
624 if (iter->second == 2 || iter->second == 3 || iter->second == 4){
628 #if defined(__APPLE__)
630 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetTrustObject());
634 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateData());
638 // Compare the ETag with the Server ETag.
640 if (ETagOriginal != ETagServer){
642 // Server ETag is different from original ETag.
643 // This is a conflict which the user will now
649 frmMain *frmMainPtrGet = static_cast<frmMain*>(frmMainPtr);
651 vCard34Conv vCard34Obj;
653 wxString ServerContactData;
655 vCard ConvertedV4Data;
657 // Load the client data from the filename given.
659 ConnHandle.GetServerContactData();
660 ServerContactData = ConnHandle.GetPageData();
662 // Process v3 version into v4 version.
664 vCard34Obj.ConvertToV4(&ServerContactData, &ConvertedV4Data);
666 vCardConflictObj vCardProcData;
668 vCardProcData.vCardLocalData = &ClientData;
669 vCardProcData.vCardServerData = &ConvertedV4Data;
670 ClientData.LoadFile(FullFilename);
672 //ContactConflictEvent event(ContactConflictCmdEnv);
673 //event.SetData(ContactFilename, Moo1, Moo2);
675 //wxPostEvent(frmMainPtrGet, event);
677 // Setup Conflict Resolution Dialog.
679 // Fetch Data from Server and convert.
681 bool *PauseMode = new bool;
686 qrn.QResponse = &ConflictResult;
687 qrn.PausePtr = PauseMode;
689 vCardProcData.QRNotifData = &qrn;
691 wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED);
692 event.SetClientData(&vCardProcData);
693 wxPostEvent(frmMainPtrGet, event);
695 while (*PauseMode == TRUE){
696 //nanosleep(&n1, &n2);
703 //intResult = frmMainPtrGet->ShowConflictDialog(&Moo1, &Moo2);
705 if (ConflictResult == 0){
712 } else if (ConflictResult == 1){
714 // Decided to use client version.
716 ConnHandle.ProcessData();
718 } else if (ConflictResult == 2){
720 // Decided to use server version.
722 // Download server version.
724 ConvertedV4Data.WriteFile(FullFilename);
730 // Update the data to the server.
732 ConnHandle.ProcessData();
736 // Update the ETag DB.
738 ConnHandle.GetServerETagValueThread();
739 ETagServer = ConnHandle.ETagValueResult();
740 ETagDBPtr->UpdateETag(ContactFilename, ETagServer, ETagServer);
747 } else if (TypeIter->second == 2) {
749 // Delete the contact from the server and update the ETag DB.
751 AccountDir = StringAccountIter->second;
752 ContactFilename = StringFilenameIter->second;
753 wxString AccountNameFriendly;
757 for (int i = 0; i < PrefData.accounts.GetCount(); i++){
759 wxString AccountDirCheck = PrefData.accounts.GetAccountDirectory(i);
761 AccountDirCheck.Trim();
762 AccountDirCheck.Append(wxT(".carddav"));
764 if (AccountDirCheck == StringAccountIter->second){
766 AccountNameFriendly = PrefData.accounts.GetAccountName(i);
773 ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir);
775 bool KeepUpdating = TRUE;
777 while(KeepUpdating == TRUE){
779 bool ExitLoop = FALSE;
781 while (ExitLoop == FALSE){
783 ConnHandle.SetUploadMode(FALSE);
784 ConnHandle.SetupData(wxT("DELETE"), ContactFilename, wxT(""));
785 ConnHandle.ProcessData();
786 SSLCertCollection certcol = ConnHandle.GetCertificateData();
788 // Check if any errors have occured whilst getting the data.
790 int ErrorCode = ConnHandle.GetResultCode();
794 if (ErrorCode == 60 || ErrorCode == 51){
796 // Invalid SSL certificate so bring up a dialog to the user
797 // explaining what has happened and the options available.
799 // Stop all the timers.
801 frmMainPtrGet->PauseAllTimers();
805 #if defined(__APPLE__)
807 // Bring up the trust panel and display the SSL certificate dialog.
809 SSLResult = DisplayTrustPanel(ConnHandle.GetTrustObject(), AccountNameFriendly);
811 // Update the SSL account with the trust object.
813 if (SSLResult != NSOKButton){
815 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetTrustObject());
821 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetTrustObject());
826 // Setup the data to be sent in the wxPostEvent command.
828 SSLInvalidCertNotifObj SSLICNProcData;
830 bool *PauseMode = new bool;
834 qrn.QResponse = &SSLResult;
835 qrn.PausePtr = PauseMode;
837 SSLICNProcData.CertCollection = certcol;
838 SSLICNProcData.QRNotifData = &qrn;
839 SSLICNProcData.AccountName = AccountNameFriendly;
841 wxCommandEvent event(INVALIDSSLCERT);
842 event.SetClientData(&SSLICNProcData);
843 wxPostEvent(frmMainPtrGet, event);
847 // Fall asleep until we get an response.
850 n1.tv_nsec = 250000000L;*/
852 while (*PauseMode == TRUE){
853 //nanosleep(&n1, &n2);
857 // Process the response from the user.
861 // Accept the certificate. Write the certificate into the account
862 // directory (as server.crt) - will overwrite old certificate.
864 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateData());
865 WriteServerCertificate(AccountDir, ConnHandle.GetCertificateData());
867 } else if (SSLResult == 2){
869 // Reject the certificate, abort the task and mark as failed.
871 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetCertificateData());
879 // Resume all the timers.
881 frmMainPtrGet->ResumeAllTimers();
899 if (iter->second == 2 || iter->second == 3 || iter->second == 4){
903 #if defined(__APPLE__)
905 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetTrustObject());
909 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateData());
914 ETagDBPtr->RemoveETag(ContactFilename);
917 CardDAVIter->second = NULL;
922 } else if (TypeIter->second == 3) {
924 wxString AccountNameFriendly;
928 for (int i = 0; i < PrefData.accounts.GetCount(); i++){
930 wxString AccountDirCheck = PrefData.accounts.GetAccountDirectory(i);
932 AccountDirCheck.Trim();
933 AccountDirCheck.Append(wxT(".carddav"));
935 if (AccountDirCheck == StringAccountIter->second){
937 AccountNameFriendly = PrefData.accounts.GetAccountName(i);
944 bool KeepUpdating = TRUE;
946 while (KeepUpdating == TRUE){
948 StringTaskDetailIter = ActivityListTaskDetail.find(iter->first);
950 AccountDir = StringAccountIter->second;
952 ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir);
954 wxArrayString vCardAdd;
955 wxArrayString vCardDelete;
956 wxArrayString vCardList;
957 wxArrayString vCardUpdateLocal;
958 wxArrayString vCardUpdateRemote;
959 wxArrayString vCardUpdateLog;
960 std::map<wxString,wxString> vCardETag;
961 ContactListData ServerContactList;
963 std::map<wxString,vCardDownloadDataFileClass> vCardDownloadData;
964 //wxArrayString vCardDownload;
965 //std::map<wxString,wxString> vCardDownloadData;
967 // Get the list of vCard files locally.
969 wxString AccountDirFinal;
970 wxString AccountSyncTokenFilename;
971 wxString SyncTokenLoad;
973 #if defined(__HAIKU__)
975 //preffilename = wxT("noo");
977 #elif defined(__WIN32__)
979 AccountDirFinal = GetAccountDir(AccountDir, FALSE);
980 AccountSyncTokenFilename = AccountDirFinal;
981 AccountSyncTokenFilename.Append(wxT("synctoken"));
985 AccountDirFinal = GetAccountDir(AccountDir, FALSE);
986 AccountSyncTokenFilename = AccountDirFinal;
987 AccountSyncTokenFilename.Append(wxT("synctoken"));
991 // Suppress Error Messages.
993 wxLogNull PleaseDoNotDisturb;
996 SyncLoad.Open(AccountSyncTokenFilename, wxT("r"));
998 if (SyncLoad.IsOpened()){
1000 SyncLoad.ReadAll(&SyncTokenLoad, wxMBConvUTF8());
1005 // Get a list of vCard files from the server.
1007 // Get the list of vCard files from the ETagDB.
1009 std::map<wxString,ETagData> ETagDBData = ETagDBPtr->GetETagData();
1011 bool ExitLoop = FALSE;
1013 std::map<wxString,FileSyncData> *SCListData = NULL;
1015 while (ExitLoop == FALSE){
1017 // Check if any errors have occured whilst getting the data.
1019 int ErrorCode = ConnHandle.SSLVerifyTest();
1021 if (ErrorCode != CURLE_OK){
1023 if (ErrorCode == CURLE_SSL_CACERT ||
1024 ErrorCode == CURLE_PEER_FAILED_VERIFICATION ||
1025 ErrorCode == CURLE_SSL_CONNECT_ERROR){
1027 // Invalid SSL certificate so bring up a dialog to the user
1028 // explaining what has happened and the options available.
1030 // Stop all the timers.
1032 frmMainPtrGet->PauseAllTimers();
1036 #if defined(__APPLE__)
1038 // Bring up the trust panel and display the SSL certificate dialog.
1040 SSLResult = DisplayTrustPanel(ConnHandle.GetTrustObject(), AccountNameFriendly);
1042 // Update the SSL account with the trust object.
1044 if (SSLResult != NSOKButton){
1046 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetTrustObject());
1052 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetTrustObject());
1056 #elif defined(__WIN32__)
1058 BOOL ModifiedCertificateData;
1059 CRYPTUI_VIEWCERTIFICATE_STRUCTW CertificateData = BuildCertificateData(&ConnHandle, (HWND)frmMainPtrGet->GetHandle());
1061 if (!CryptUIDlgViewCertificate(&CertificateData, &ModifiedCertificateData)){
1062 wxMessageBox(_("An error occured while trying to open the certificate dialog."), _("Error opening Certificate Information dialog"));
1067 // Setup the data to be sent in the wxPostEvent command.
1069 SSLInvalidCertNotifObj SSLICNProcData;
1071 bool *PauseMode = new bool;
1075 qrn.QResponse = &SSLResult;
1076 qrn.PausePtr = PauseMode;
1078 SSLICNProcData.CertCollection = certcol;
1079 SSLICNProcData.QRNotifData = &qrn;
1080 SSLICNProcData.AccountName = AccountNameFriendly;
1082 wxCommandEvent event(INVALIDSSLCERT);
1083 event.SetClientData(&SSLICNProcData);
1084 wxPostEvent(frmMainPtrGet, event);
1088 // Fall asleep until we get an response.
1091 n1.tv_nsec = 250000000L;*/
1093 while (*PauseMode == TRUE){
1094 //nanosleep(&n1, &n2);
1095 SleepFor(250000000);
1098 // Process the response from the user.
1100 if (SSLResult == 1){
1102 // Accept the certificate. Write the certificate into the account
1103 // directory (as server.crt) - will overwrite old certificate.
1105 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateData());
1106 WriteServerCertificate(AccountDir, ConnHandle.GetCertificateData());
1108 } else if (SSLResult == 2){
1110 // Reject the certificate, abort the task and mark as failed.
1112 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetCertificateData());
1120 // Resume all the timers.
1122 frmMainPtrGet->ResumeAllTimers();
1140 if (iter->second == 2 || iter->second == 3 || iter->second == 4){
1144 #if defined(__APPLE__)
1146 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetTrustObject());
1150 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateData());
1154 // Look in directory and see which vCards to add and delete
1157 // vCard exists but not in ETagDB - Add (and upload).
1158 // vCard missing but in ETagDB - Delete (from server).
1160 // Start by looking for vCards that are not in the ETagDB.
1162 wxDir AccDir(AccountDirFinal);
1163 wxString AccDirFilename;
1165 bool ContinueProcess = AccDir.GetFirst(&AccDirFilename, wxEmptyString, wxDIR_DEFAULT);
1167 ServerContactList = ConnHandle.GetContactList(SyncTokenLoad.ToUTF8());
1168 SSLCertCollection certcol = ConnHandle.GetCertificateData();
1170 // Create a pointer for the std::map<wxString,FileSyncData>.
1172 SCListData = &ServerContactList.ListData;
1174 // Process the server data.
1176 if (SCListData != NULL){
1178 for (std::map<wxString, FileSyncData>::iterator fsiter = SCListData->begin();
1179 fsiter != SCListData->end(); fsiter++){
1181 // Check the mode of the file before adding.
1183 // Get the HTTP status of the file from the list.
1185 FileSyncData fsd = fsiter->second;
1187 if (fsd.DataFlag == 1){
1189 // Added or modified contact.
1191 //vCardAdd.Add(fsiter->first, 1);
1193 vCardDownloadDataFileClass vCardNewData;
1194 vCardNewData.DataType = 0;
1195 vCardDownloadData.insert(std::make_pair(fsiter->first, vCardNewData));
1197 //} else if (fsd.DataFlag == 1){
1199 // Contact has been modified on the server.
1201 // vCardUpdateLocal.Add(fsiter->first, 1);
1204 else if (fsd.DataFlag == 2){
1206 // Contact has been deleted.
1208 vCardDelete.Add(fsiter->first, 1);
1216 // Look for vCards that are missing but in the ETagDB.
1218 for (std::map<wxString,ETagData>::iterator etagiter = ETagDBData.begin();
1219 etagiter != ETagDBData.end(); etagiter++){
1221 // Check if the vCard exists.
1223 if (!wxFileExists(AccountDirFinal + etagiter->first)){
1225 // vCard doesn't exist so mark for deleting.
1227 vCardDelete.Add(etagiter->first, 1);
1233 // Compare Server with the ETag DB. Work out which
1234 // needs to updated remotely and which needs to be
1237 for (std::map<wxString,FileSyncData>::iterator srviter = SCListData->begin();
1238 srviter != SCListData->end(); srviter++){
1240 if (ETagDBData.find(srviter->first) == ETagDBData.end()){
1244 std::map<wxString,ETagData>::iterator lociter = ETagDBData.find(srviter->first);
1246 ETagData etd = lociter->second;
1247 FileSyncData fsd = srviter->second;
1249 wxString ETagSrv = fsd.ETagData;
1251 // Check if the local ETag value has 'DELETED' set and skip
1252 // checking this file if it does.
1254 if (etd.ETagValue == "DELETED"){
1260 // Compare local ETag with original local ETag.
1261 // If different, update to server is required.
1263 if (etd.ETagValue != etd.ETagOrigValue){
1265 // Check if local original ETag is different from server ETag.
1266 // If it is then throw up a conflict resolution dialog.
1268 if (etd.ETagOrigValue != ETagSrv){
1270 vCard34Conv vCard34Obj;
1272 wxString ServerContactData;
1273 wxString FullFilename;
1275 vCard ConvertedV4Data;
1277 // Conflict. Bring up conflict resolution dialog.
1279 // Get the server contact data for comparison.
1281 ConnHandle.SetServerFilename(srviter->first);
1282 ConnHandle.GetServerContactData();
1283 ServerContactData = ConnHandle.GetPageData();
1285 FullFilename = CreateFilenamePath(AccountDirFinal, srviter->first);
1287 // Convert it to v4.
1289 vCard34Obj.ConvertToV4(&ServerContactData, &ConvertedV4Data);
1291 vCardConflictObj vCardProcData;
1293 vCardProcData.vCardLocalData = &ClientData;
1294 vCardProcData.vCardServerData = &ConvertedV4Data;
1296 // Load the client data from the filename given.
1298 ClientData.LoadFile(FullFilename);
1302 bool *PauseMode = new bool;
1305 frmMain *frmMainPtrGet = static_cast<frmMain*>(frmMainPtr);
1308 qrn.QResponse = &ConflictResult;
1309 qrn.PausePtr = PauseMode;
1311 vCardProcData.QRNotifData = &qrn;
1313 wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED);
1314 event.SetClientData(&vCardProcData);
1315 wxPostEvent(frmMainPtrGet, event);
1320 n1.tv_nsec = 250000000L;*/
1322 while (*PauseMode == TRUE){
1323 //nanosleep(&n1, &n2);
1324 SleepFor(250000000);
1330 // If replacing local version, store copy for now.
1331 // Otherwise upload to server.
1333 if (ConflictResult == 0){
1339 } else if (ConflictResult == 1){
1341 // Decided to use client version.
1343 vCardUpdateLocal.Remove(srviter->first);
1344 vCardUpdateRemote.Add(srviter->first, 1);
1346 } else if (ConflictResult == 2){
1348 // Decided to use server version.
1349 // Store the converted downloaded copy for
1350 // processing later.
1352 //vCardUpdateLocal.Add(srviter->first, 1);
1354 vCardDownloadDataFileClass vCardNewData;
1355 vCardNewData.DataType = 1;
1356 vCardNewData.FileData = ConvertedV4Data.WriteString();
1358 ConvertedV4Data.WriteFile(FullFilename);
1360 vCardDownloadData.insert(std::make_pair(srviter->first, vCardNewData));
1368 // Send vCard to the server.
1370 vCardUpdateRemote.Add(srviter->first, 1);
1376 // Check if local ETag is different from server ETag.
1377 // If different, obtain the vCard from the server.
1379 if (etd.ETagOrigValue != ETagSrv){
1381 vCardUpdateLocal.Add(srviter->first, 1);
1389 // Process the vCards that need to be downloaded and added/overwritten.
1391 wxString vCardFilenameFinal;
1392 wxString vCardOutputData;
1393 wxString vCardInputData;
1394 wxString ETagFileData;
1397 for (std::map<wxString,vCardDownloadDataFileClass>::iterator additer = vCardDownloadData.begin();
1398 additer != vCardDownloadData.end(); additer++){
1400 vCardFilenameFinal.Clear();
1401 vCardInputData.Clear();
1402 vCardOutputData.Clear();
1403 ETagFileData.Clear();
1405 vCardFilenameFinal = CreateFilenamePath(AccountDirFinal, additer->first);
1407 ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir);
1409 if (additer->second.DataType == 0){
1411 vCard ConvertedV4Data;
1413 // Grab the file from the server and write the contact out.
1415 vCard34Conv vCard34Obj;
1417 ConnHandle.SetServerFilename(additer->first);
1418 ConnHandle.GetServerContactData();
1419 vCardInputData = ConnHandle.GetPageData();
1421 vCard34Obj.ConvertToV4(&vCardInputData, &ConvertedV4Data);
1423 ConvertedV4Data.WriteFile(vCardFilenameFinal);
1425 // Update the ETagDB.
1427 //vCardFile.Open(vCardFilenameFinal, wxT("w"));
1429 //if (vCardFile.IsOpened()){
1431 // vCardFile.Write(vCardOutputData, wxConvAuto());
1432 // vCardFile.Close();
1436 // Get the server ETag.
1438 wxString ServerETag;
1439 ConnHandle.GetServerETagValueThread();
1440 ServerETag = ConnHandle.ETagValueResult();
1442 // Add to the ETag Database.
1444 ETagDBPtr->AddETag(additer->first, ServerETag, ServerETag);
1446 } else if (additer->second.DataType == 1){
1448 // Write out the contact to the account directory.
1450 vCardFilenameFinal = CreateFilenamePath(AccountDirFinal, additer->first);
1451 vCardOutputData = additer->second.FileData;
1453 vCardFile.Open(vCardFilenameFinal, wxT("w"));
1455 if (vCardFile.IsOpened()){
1457 vCardFile.Write(vCardOutputData, wxConvAuto());
1462 // Update the ETagDB.
1464 wxString ServerETag;
1465 ConnHandle.GetServerETagValueThread();
1466 ServerETag = ConnHandle.ETagValueResult();
1468 // Add to the ETag Database.
1470 ETagDBPtr->AddETag(additer->first, ServerETag, ServerETag);
1475 // Look for vCard files which aren't in the ETagDB.
1477 while(ContinueProcess){
1479 // Check and make sure that the filename ends in .vcf/.vcard
1480 // Skip any file that beings with a dot.
1482 if (AccDirFilename.Left(1) == wxT(".")){
1484 ContinueProcess = AccDir.GetNext(&AccDirFilename);
1489 if (AccDirFilename.Right(4) != wxT(".vcf") &&
1490 AccDirFilename.Right(6) != wxT(".vcard")){
1492 ContinueProcess = AccDir.GetNext(&AccDirFilename);
1497 // Look in the ETagDB for the file.
1499 bool ETagExists = ETagDBPtr->CheckETagExists(AccDirFilename);
1501 if (ETagExists == FALSE){
1503 // Add the vCard to the list to be added.
1505 vCardAdd.Add(AccDirFilename, 1);
1509 ContinueProcess = AccDir.GetNext(&AccDirFilename);
1513 // Process the vCards to add/update to the server.
1515 for (int vi = 0; vi < vCardAdd.GetCount(); vi++){
1517 ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir);
1518 ETag = ETagDBPtr->GetETag(vCardAdd[vi]);
1519 ETagOriginal = ETagDBPtr->GetETagOriginal(vCardAdd[vi]);
1521 ContactFilename = vCardAdd[vi];
1522 FullFilename = CreateFilenamePath(AccountDirFinal, vCardAdd[vi]);
1524 ContactFilename.Trim();
1526 if (ETag == ETagOriginal && ETagDBPtr->ETagExists(vCardAdd[vi])){
1528 // Compare the ETag with the Server ETag.
1530 ConnHandle.SetServerFilename(vCardAdd[vi]);
1531 ConnHandle.GetServerETagValueThread();
1532 ETagServer = ConnHandle.ETagValueResult();
1534 if (ETagOriginal != ETagServer){
1536 // Server ETag is different from original ETag.
1537 // This is a conflict which the user will now
1540 frmMain *frmMainPtrGet = static_cast<frmMain*>(frmMainPtr);
1542 vCard34Conv vCard34Obj;
1544 wxString ServerContactData;
1546 vCard ConvertedV4Data;
1548 // Load the client data from the filename given.
1550 ConnHandle.GetServerContactData();
1551 ServerContactData = ConnHandle.GetPageData();
1553 // Process v3 version into v4 version.
1555 vCard34Obj.ConvertToV4(&ServerContactData, &ConvertedV4Data);
1557 vCardConflictObj vCardProcData;
1559 vCardProcData.vCardLocalData = &ClientData;
1560 vCardProcData.vCardServerData = &ConvertedV4Data;
1561 ClientData.LoadFile(FullFilename);
1563 //ContactConflictEvent event(ContactConflictCmdEnv);
1564 //event.SetData(ContactFilename, Moo1, Moo2);
1566 //wxPostEvent(frmMainPtrGet, event);
1568 // Setup Conflict Resolution Dialog.
1570 // Fetch Data from Server and convert.
1572 bool *PauseMode = new bool;
1577 qrn.QResponse = &ConflictResult;
1578 qrn.PausePtr = PauseMode;
1580 vCardProcData.QRNotifData = &qrn;
1582 wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED);
1583 event.SetClientData(&vCardProcData);
1584 wxPostEvent(frmMainPtrGet, event);
1589 n1.tv_nsec = 250000000L;*/
1591 while (*PauseMode == TRUE){
1592 //nanosleep(&n1, &n2);
1593 SleepFor(250000000);
1599 //intResult = frmMainPtrGet->ShowConflictDialog(&Moo1, &Moo2);
1601 if (ConflictResult == 0){
1608 } else if (ConflictResult == 1){
1610 // Decided to use client version.
1612 ConnHandle.ProcessData();
1616 } else if (ConflictResult == 2){
1618 // Decided to use server version.
1620 // Download server version.
1622 ConvertedV4Data.WriteFile(CreateFilenamePath(AccountDirFinal, vCardAdd[vi]));
1630 // Setup the filename for the contact being added.
1632 wxString wxSFilename = CreateFilenamePath(AccountDirFinal, vCardAdd[vi]);
1633 wxString wxSCardData;
1637 // Load the data from the file.
1640 wxFCard.Open(wxSFilename, wxT("r"));
1642 if (wxFCard.IsOpened()){
1644 wxFCard.ReadAll(&wxSCardData, wxConvAuto());
1649 // Convert the data to v3.
1651 vCard34Conv vCard34Obj;
1653 vCard34Obj.ConvertToV3(wxSFilename, &TaskData);
1655 // Setup the URL address.
1657 //TaskURL = StringTaskDetailIter->second + wxT("/") + vCardAdd[vi];
1659 // Upload the data to the server.
1661 ConnHandle.SetUploadMode(TRUE);
1662 ConnHandle.SetupData(wxT("PUT"), vCardAdd[vi], TaskData);
1663 ConnHandle.ProcessData();
1665 // Get the Server ETag and put it in the ETag database.
1667 ConnHandle.SetServerFilename(vCardAdd[vi]);
1668 ConnHandle.GetServerETagValueThread();
1669 ETagServer = ConnHandle.ETagValueResult();
1671 ETagDBPtr->AddETag(vCardAdd[vi], ETagServer, ETagServer);
1677 if (ETagOriginal != ETagServer){
1679 // Server ETag is different from original ETag.
1680 // This is a conflict which the user will now
1683 frmMain *frmMainPtrGet = (frmMain *)frmMainPtr;
1685 //ContactConflictEvent event(ContactConflictCmdEnv);
1686 //event.SetData(ContactFilename, Moo1, Moo2);
1688 vCard34Conv vCard34Obj;
1690 wxString ServerContactData;
1692 vCard ConvertedV4Data;
1694 // Load the client data from the filename given.
1696 ConnHandle.GetServerContactData();
1697 ServerContactData = ConnHandle.GetPageData();
1698 ClientData.LoadFile(FullFilename);
1700 // Process v3 version into v4 version.
1702 vCard34Obj.ConvertToV4(&ServerContactData, &ConvertedV4Data);
1704 vCardConflictObj vCardProcData;
1706 vCardProcData.vCardLocalData = &ClientData;
1707 vCardProcData.vCardServerData = &ConvertedV4Data;
1709 bool *PauseMode = new bool;
1714 qrn.QResponse = &ConflictResult;
1715 qrn.PausePtr = PauseMode;
1717 vCardProcData.QRNotifData = &qrn;
1719 wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED);
1720 event.SetClientData(&vCardProcData);
1721 wxPostEvent(frmMainPtrGet, event);
1726 n1.tv_nsec = 250000000L;*/
1728 while (*PauseMode == TRUE){
1729 //nanosleep(&n1, &n2);
1730 SleepFor(250000000);
1736 //intResult = frmMainPtrGet->ShowConflictDialog(&Moo1, &Moo2);
1738 if (ConflictResult == 0){
1745 } else if (ConflictResult == 1){
1747 // Decided to use client version.
1749 ConnHandle.ProcessData();
1750 //ETagServer = CardDAVIter->second.GetServerETagValueThread();
1751 //ETagDBPtr->UpdateETag(ContactFilename, ETagServer, ETagServer);
1755 } else if (ConflictResult == 2){
1757 // Decided to use server version.
1759 // Write server version to file.
1761 ConvertedV4Data.WriteFile(CreateFilenamePath(AccountDirFinal, vCardAdd[vi]));
1769 // Setup the filename for the contact being added.
1771 wxString wxSFilename = CreateFilenamePath(AccountDirFinal, vCardAdd[vi]);
1772 wxString wxSCardData;
1776 // Load the data from the file.
1779 wxFCard.Open(wxSFilename, wxT("r"));
1781 if (wxFCard.IsOpened()){
1783 wxFCard.ReadAll(&wxSCardData, wxConvAuto());
1788 // Convert the data to v3.
1790 vCard34Conv vCard34Obj;
1792 vCard34Obj.ConvertToV3(wxSFilename, &TaskData);
1794 // Setup the URL address.
1796 //TaskURL = StringTaskDetailIter->second + wxT("/") + vCardAdd[vi];
1798 // Upload the data to the server.
1800 ConnHandle.SetUploadMode(TRUE);
1801 ConnHandle.SetupData(wxT("PUT"), vCardAdd[vi], TaskData);
1802 ConnHandle.ProcessData();
1804 // Get the Server ETag and put it in the ETag database.
1806 ConnHandle.SetServerFilename(vCardAdd[vi]);
1807 ConnHandle.GetServerETagValueThread();
1808 ETagServer = ConnHandle.ETagValueResult();
1811 ETagDBPtr->AddETag(vCardAdd[vi], ETagServer, ETagServer);
1819 // Process the vCards to delete locally.
1821 for (int vi = 0; vi < vCardDelete.GetCount(); vi++){
1823 if (!wxRemoveFile(CreateFilenamePath(AccountDirFinal, vCardDelete[vi]))){
1827 ETagDBPtr->RemoveETag(vCardDelete[vi]);
1833 // Process the vCards to delete from the server.
1835 std::map<wxString,wxString> *ETagFilenameMap = ETagDBPtr->GetFilenamePointer();
1836 std::list<wxString> DeleteList;
1838 for (std::map<wxString,wxString>::iterator deliter = ETagFilenameMap->begin();
1839 deliter != ETagFilenameMap->end(); deliter++){
1841 // Look through the ETagDB and find contacts which are marked as DELETED.
1843 if (deliter->second == wxT("DELETED")){
1845 ConnHandle.SetUploadMode(FALSE);
1846 ConnHandle.SetupData(wxT("DELETE"), deliter->first, wxT(""));
1847 ConnHandle.ProcessDataThread();
1849 // Delete the ETag as the file has now been deleted.
1851 DeleteList.push_back(deliter->first);
1857 for (std::list<wxString>::iterator removeetagiter = DeleteList.begin();
1858 removeetagiter != DeleteList.end(); removeetagiter++){
1860 ETagDBPtr->RemoveETag(*removeetagiter);
1864 // Write out the update server sync token.
1866 wxString ServerSyncToken = ServerContactList.SyncToken;
1868 ServerSyncToken.Trim();
1870 if (!ServerSyncToken.IsEmpty()){
1873 SyncWrite.Open(AccountSyncTokenFilename, wxT("w"));
1875 if (SyncWrite.IsOpened()){
1877 SyncWrite.Write(ServerSyncToken, wxConvAuto());
1884 // Check for another sync token. If there is another
1885 // sync token then repeat this. If token matches then stop processing.
1887 if (SyncTokenLoad == ServerSyncToken){
1889 KeepUpdating = FALSE;
1895 // Mark as completed.
1897 wxString AccountNameFinal;
1898 AccountNameFinal = PrefData.accounts.GetAccountDirectory(AccountID);
1899 AccountNameFinal.Append(wxT(".carddav"));
1901 wxCommandEvent reloadevent(RELOADCONTACTLIST);
1902 reloadevent.SetString(AccountNameFinal);
1903 wxPostEvent(this->GetParent(), reloadevent);
1910 // Update the data to the server.
1912 ConnHandle.ProcessData();
1921 n1.tv_nsec = 250000000L;*/
1923 while (iter->second == 1){
1925 SleepFor(250000000);
1926 //nanosleep(&n1, &n2);
1930 if ((iter->second == 4 && TypeIter->second == 0) ||
1931 (iter->second == 8 && TypeIter->second == 0)){
1933 AccountDir = StringAccountIter->second;
1934 ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir);
1936 ConnHandle.GetServerETagValueThread();
1937 ETagServer = ConnHandle.ETagValueResult();
1938 ETagDBPtr->UpdateETag(ContactFilename, ETagServer, ETagServer);
1942 if ((iter->second == 4 && TypeIter->second == 1) ||
1943 (iter->second == 8 && TypeIter->second == 1)){
1945 AccountDir = StringAccountIter->second;
1946 ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir);
1948 ConnHandle.GetServerETagValueThread();
1949 ETagServer = ConnHandle.ETagValueResult();
1950 ETagDBPtr->UpdateETag(ContactFilename, ETagServer, ETagServer);
1960 if (TasksFoundProc == FALSE){
1962 TasksActive = FALSE;
1963 ProcessTasksData = FALSE;
1967 wxCommandEvent eventp(ACTMGR_STARTTIMER);
1968 wxPostEvent(this, eventp);
1970 //AnimationTimer.StartAnimation();
1971 //ActListProcTimer.Start();
1975 wxCommandEvent event(ACTMGR_STARTPROCESSTIMER);
1976 wxPostEvent(this, event);
1978 //ActProcessTimer.Start();
1982 void frmActivityMgr::ProcessTasks()
1985 std::thread ProcessThread(&frmActivityMgr::ProcessTasksThread, this);
1986 ProcessThread.detach();
1990 void frmActivityMgr::SetupPointers(wxETagProcessTimer *ETagTmrPtrInc, void *frmMainPtrInc)
1993 ETagTmrPtr = ETagTmrPtrInc;
1995 frmMainPtr = frmMainPtrInc;
1999 void frmActivityMgr::ResumeProcessing(wxCommandEvent &event){
2001 QRNotif *qrn = (QRNotif *)event.GetClientData();
2003 int *QRes = qrn->QResponse;
2005 *qrn->PausePtr = FALSE;
2007 *QRes = event.GetInt();
2011 void frmActivityMgr::ToggleConnectionStatus( wxCommandEvent &event ){
2013 wxCommandEvent connevent(CONNSTAT_UPDATE);
2015 if (SleepMode == FALSE){
2017 connevent.SetInt(1);
2022 connevent.SetInt(0);
2027 wxPostEvent(GetParent(), connevent);
2031 void frmActivityMgr::WriteServerCertificate(wxString AccountName, SSLCertCollection SSLCertInc){
2033 wxString ServerCertFinal;
2035 // Get the Cert section of the certificate and write it to the file.
2037 ServerCertFinal = GetAccountDir(AccountName, TRUE);
2041 std::map<int, SSLCertData>::iterator SSLCDIter = SSLCertInc.SSLCollection.find(0);
2042 std::multimap<wxString,wxString>::iterator SSLDataIter = SSLCDIter->second.CertData.find(wxT("Cert"));
2044 CertFile.Open(ServerCertFinal, wxFile::write);
2046 CertFile.Write(SSLDataIter->second, wxConvUTF8);
2051 void frmActivityMgr::StartTimer(wxCommandEvent& event){
2053 ActListProcTimer.Start(1000, FALSE);
2057 void frmActivityMgr::StopTimer(wxCommandEvent& event){
2059 ActListProcTimer.Stop();
2063 void frmActivityMgr::StartProcessTimer(wxCommandEvent& event){
2065 ActProcessTimer.Start(1000, FALSE);
2069 void frmActivityMgr::StopProcessTimer(wxCommandEvent& event){
2071 ActProcessTimer.Stop();
2075 void frmActivityMgr::UpdateStatusLabel(wxCommandEvent& event){
2077 ActivityMgrLabelUpdate *actmgrudata = (ActivityMgrLabelUpdate*)event.GetClientData();
2079 if (actmgrudata != NULL){
2081 lstActivity->SetItem(actmgrudata->ItemIndex, 2, actmgrudata->ItemLabel);
2083 /*if (!actmgrudata->ItemDes.IsEmpty()){
2084 lstActivity->SetItem(actmgrudata->ItemIndex, 0, actmgrudata->ItemDes);