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 #ifndef FRMACTIVITYMGR_H
42 #define FRMACTIVITYMGR_H
44 DEFINE_EVENT_TYPE(ACTMGR_RESUMEPROC);
45 DEFINE_EVENT_TYPE(ACTMGR_TOGGLECONN);
46 DEFINE_EVENT_TYPE(ACTMGR_STARTTIMER);
47 DEFINE_EVENT_TYPE(ACTMGR_STOPTIMER);
48 DEFINE_EVENT_TYPE(ACTMGR_STARTPROCESSTIMER);
49 DEFINE_EVENT_TYPE(ACTMGR_STOPPROCESSTIMER);
50 DEFINE_EVENT_TYPE(ACTMGR_UPDATESTATUSLABEL);
52 BEGIN_EVENT_TABLE(frmActivityMgr, wxWindow)
53 EVT_COMMAND(wxID_ANY, ACTMGR_RESUMEPROC, frmActivityMgr::ResumeProcessing)
54 EVT_COMMAND(wxID_ANY, ACTMGR_TOGGLECONN, frmActivityMgr::ToggleConnectionStatus)
55 EVT_COMMAND(wxID_ANY, ACTMGR_STARTTIMER, frmActivityMgr::StartTimer)
56 EVT_COMMAND(wxID_ANY, ACTMGR_STOPTIMER, frmActivityMgr::StopTimer)
57 EVT_COMMAND(wxID_ANY, ACTMGR_STARTPROCESSTIMER, frmActivityMgr::StartProcessTimer)
58 EVT_COMMAND(wxID_ANY, ACTMGR_STOPPROCESSTIMER, frmActivityMgr::StopProcessTimer)
59 EVT_COMMAND(wxID_ANY, ACTMGR_UPDATESTATUSLABEL, frmActivityMgr::UpdateStatusLabel)
62 frmActivityMgr::frmActivityMgr( wxWindow* parent )
64 frmActivityMgrADT( parent )
67 wxMemoryInputStream istream(icons_activitywindow_png, sizeof(icons_activitywindow_png));
68 wxImage icons_activitywindow_pngi(istream, wxBITMAP_TYPE_PNG);
69 wxBitmap activityiconbmp(icons_activitywindow_pngi, -1);
71 activityicon.CopyFromBitmap(activityiconbmp);
72 this->SetIcon(activityicon);
74 wxMemoryInputStream istream2(misc_activitysleep_png, sizeof(misc_activitysleep_png));
75 wxImage misc_activitysleep_pngi(istream2, wxBITMAP_TYPE_PNG);
76 wxBitmap sleepiconbmp(misc_activitysleep_pngi, -1);
77 SleepBitmap = sleepiconbmp;
78 bmpActivity->SetBitmap(SleepBitmap);
79 ActProcessTimer.SetupPointers(this);
80 lblDetails->SetLabel(_("No activity."));
82 ActListProcTimer.SetupPointers(&ActivityList, &ActivityListIndex, &ActivityListTaskDetail,
83 &TasksActive, lstActivity, lblDetails, GauProgress, this, &AnimationTimer,
84 &ActProcessTimer, &ActivityListFinDate, &ActivityListConn);
86 AnimationTimer.SetBitmap(bmpActivity);
87 AnimationTimer.SetSleepBitmap(&SleepBitmap);
88 AnimationTimer.SetupPointer(this->GetParent());
90 wxListItem ColumnData;
92 ColumnData.SetText(_("Activity"));
93 ColumnData.SetWidth(175);
94 lstActivity->InsertColumn(0, ColumnData);
96 wxListItem ColumnData2;
98 ColumnData2.SetText(_("Account"));
99 ColumnData2.SetWidth(100);
100 lstActivity->InsertColumn(1, ColumnData2);
102 wxListItem ColumnData3;
103 ColumnData3.SetId(2);
104 ColumnData3.SetText(_("Status"));
105 ColumnData3.SetWidth(100);
106 lstActivity->InsertColumn(2, ColumnData3);
108 //AnimationTimer.StartAnimation();
110 // Create recovery database if it doesn't exist.
112 wxString RecoveryFilename = GetRecoveryDB();
116 if (wxFile::Exists(RecoveryFilename) == FALSE){
118 // Create the recovery database.
120 RecoveryDB.Open(RecoveryFilename.c_str(), wxFile::write);
122 RecoveryDB.Write(wxT("BEGIN:XAB-RECOVERYDB\r\n"), wxConvUTF8);
123 RecoveryDB.Write(wxT("VERSION:1.0\r\n"), wxConvUTF8);
124 RecoveryDB.Write(wxT("COMMENT:Please do not alter or delete this file. DATA LOSS IS POSSIBLE!\r\n"), wxConvUTF8);
125 RecoveryDB.Write(wxT("END:XAB-RECOVERYDB\r\n"), wxConvUTF8);
132 #if wxABI_VERSION < 20900
133 RecoveryDBF.Open(RecoveryFilename.c_str(), wxT("r"));
135 RecoveryDBF.Open(RecoveryFilename, wxT("r"));
138 // Load the recovery database for tasks not done.
140 if (RecoveryDBF.IsOpened() == TRUE){
142 wxString wxSRecoveryDB;
143 wxString RecoveryLine;
145 // Check if we are using wxWidgets version 2.8 or less and
146 // execute the required command accordingly.
148 RecoveryDBF.ReadAll(&wxSRecoveryDB, wxConvAuto());
152 std::map<int, wxString> RecoveryFileLines;
153 std::map<int, wxString>::iterator striter;
155 wxStringTokenizer wSTRecoveryDBLines(wxSRecoveryDB, wxT("\r\n"));
157 int RecoveryLineSeek = 0;
159 while (wSTRecoveryDBLines.HasMoreTokens() == TRUE){
161 RecoveryLine = wSTRecoveryDBLines.GetNextToken();
162 RecoveryFileLines.insert(std::make_pair(RecoveryLineSeek, RecoveryLine));
171 //TestTimer.Start(50, FALSE);
174 void frmActivityMgr::OpenWindow()
179 void frmActivityMgr::CloseWindow( wxCommandEvent& event )
185 void frmActivityMgr::CloseWindow( wxCloseEvent& event )
191 void frmActivityMgr::ProcessTasksThread()
194 if (ProcessTasksData == FALSE){
200 std::map<int,int>::iterator TypeIter;
201 std::map<int,wxString>::iterator StringIter;
202 std::map<int,wxString>::iterator StringDataIter;
203 std::map<int,wxString>::iterator StringURLIter;
204 std::map<int,wxString>::iterator StringDetailIter;
205 std::map<int,wxString>::iterator StringAccountIter;
206 std::map<int,wxString>::iterator StringFilenameIter;
207 std::map<int,wxString>::iterator StringFullFilenameIter;
208 std::map<int,wxString>::iterator StringTaskDetailIter;
209 std::map<int,wxString>::iterator StringETagIter;
210 std::map<int,wxString>::iterator StringETagOrigIter;
211 std::map<int,CardDAV*>::iterator CardDAVIter;
212 std::map<int,ActivityMgrAccountSettings>::iterator AccountSettingsIter;
213 std::map<int,long>::iterator LongIter;
214 bool TasksFoundProc = FALSE;
217 for (std::map<int,int>::iterator iter = ActivityList.begin();
218 iter != ActivityList.end(); ++iter){
220 // Check for any queued tasks and start one.
222 if (iter->second > 4){
226 CardDAVIter = ActivityListConn.find(iter->first);
227 TypeIter = ActivityListType.find(iter->first);
228 StringETagIter = ActivityListETag.find(iter->first);
229 StringETagOrigIter = ActivityListETagOriginal.find(iter->first);
230 StringAccountIter = ActivityListAccount.find(iter->first);
231 StringFilenameIter = ActivityListFilename.find(iter->first);
232 StringFullFilenameIter = ActivityListFullFilename.find(iter->first);
233 AccountSettingsIter = ActivityListAccSettings.find(iter->first);
235 // Setup the CardDAV object.
239 ConnHandle.SetupConnection(AccountSettingsIter->second.Address,
240 AccountSettingsIter->second.Port,
241 AccountSettingsIter->second.Username,
242 AccountSettingsIter->second.Password,
243 AccountSettingsIter->second.SSL,
244 AccountSettingsIter->second.Prefix,
245 AccountSettingsIter->second.Dir);
246 ConnHandle.SetupVariables(&ActivityList, iter->first);
247 ConnHandle.SetupResultBools(&BlankBool, &BlankBool);
254 // 5 = Failed (UI Updated).
255 // 6 = Stopped (UI Updated).
256 // 7 = (Reserved) (UI Updated).
257 // 8 = Completed. (UI Updated).
259 frmMain *frmMainPtrGet = static_cast<frmMain*>(frmMainPtr);
260 XABPreferences PrefData(GetUserPrefDir());
262 if (iter->second == 0){
264 //CardDAVIter->second.
266 // Wait for process to finish.
269 TasksFoundProc = TRUE;
271 wxString ETagOriginal;
274 wxString ContactFilename;
275 wxString FullFilename;
277 bool EditMode = FALSE;
281 // Compare the ETags and work out if a conflict has occured.
283 if (TypeIter->second == 0){
287 StringDataIter = ActivityListData.find(iter->first);
288 StringURLIter = ActivityListURL.find(iter->first);
290 AccountDir = StringAccountIter->second;
291 ContactFilename = StringFilenameIter->second;
292 wxString AccountNameFriendly;
296 for (int i = 0; i < PrefData.accounts.GetCount(); i++){
298 wxString AccountDirCheck = PrefData.accounts.GetAccountDirectory(i);
300 AccountDirCheck.Trim();
301 AccountDirCheck.Append(wxT(".carddav"));
303 if (AccountDirCheck == StringAccountIter->second){
305 AccountNameFriendly = PrefData.accounts.GetAccountName(i);
312 ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir);
314 ETag = StringETagIter->second;
315 ETagOriginal = StringETagOrigIter->second;
316 AccountDir = StringAccountIter->second;
317 ContactFilename = StringFilenameIter->second;
318 FullFilename = StringFullFilenameIter->second;
319 EditMode = ActivityListEditMode.find(iter->first)->second;
321 bool KeepUpdating = TRUE;
323 while(KeepUpdating == TRUE){
325 bool ExitLoop = FALSE;
327 while (ExitLoop == FALSE){
329 ConnHandle.SetUploadMode(TRUE);
330 ConnHandle.SetupData(wxT("PUT"), StringURLIter->second, StringDataIter->second);
331 ConnHandle.SetEditMode(EditMode);
332 ConnHandle.ProcessData();
334 int ErrorCode = ConnHandle.GetResultCode();
338 if (ErrorCode == 60 || ErrorCode == 51){
340 // Invalid SSL certificate so bring up a dialog to the user
341 // explaining what has happened and the options available.
343 // Stop all the timers.
345 frmMainPtrGet->PauseAllTimers();
349 #if defined(__APPLE__)
351 // Bring up the trust panel and display the SSL certificate dialog.
353 SSLResult = DisplayTrustPanel(ConnHandle.GetTrustObject(), AccountNameFriendly);
355 // Update the SSL account with the trust object.
357 if (SSLResult != NSOKButton){
359 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetTrustObject());
365 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetTrustObject());
370 // Setup the data to be sent in the wxPostEvent command.
372 SSLInvalidCertNotifObj SSLICNProcData;
374 bool *PauseMode = new bool;
378 qrn.QResponse = &SSLResult;
379 qrn.PausePtr = PauseMode;
381 SSLICNProcData.CertCollection = certcol;
382 SSLICNProcData.QRNotifData = &qrn;
383 SSLICNProcData.AccountName = AccountNameFriendly;
385 wxCommandEvent event(INVALIDSSLCERT);
386 event.SetClientData(&SSLICNProcData);
387 wxPostEvent(frmMainPtrGet, event);
391 // Fall asleep until we get an response.
394 n1.tv_nsec = 250000000L;*/
396 while (*PauseMode == TRUE){
397 //nanosleep(&n1, &n2);
401 // Process the response from the user.
405 // Accept the certificate. Write the certificate into the account
406 // directory (as server.crt) - will overwrite old certificate.
408 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateData());
409 WriteServerCertificate(AccountDir, ConnHandle.GetCertificateData());
411 } else if (SSLResult == 2){
413 // Reject the certificate, abort the task and mark as failed.
415 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetCertificateData());
423 // Resume all the timers.
425 frmMainPtrGet->ResumeAllTimers();
443 if (iter->second == 2 || iter->second == 3 || iter->second == 4){
447 #if defined(__APPLE__)
449 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetTrustObject());
453 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateData());
457 // Add contact to the ETag DB.
459 ConnHandle.GetServerETagValueThread();
460 ETagServer = ConnHandle.ETagValueResult();
461 ETagDBPtr->AddETag(ContactFilename, ETagServer, ETagServer);
464 CardDAVIter->second = NULL;
469 } else if (TypeIter->second == 1){
473 StringDataIter = ActivityListData.find(iter->first);
474 StringURLIter = ActivityListURL.find(iter->first);
476 AccountDir = StringAccountIter->second;
477 ContactFilename = StringFilenameIter->second;
478 wxString AccountNameFriendly;
482 for (int i = 0; i < PrefData.accounts.GetCount(); i++){
484 wxString AccountDirCheck = PrefData.accounts.GetAccountDirectory(i);
486 AccountDirCheck.Trim();
487 AccountDirCheck.Append(wxT(".carddav"));
489 if (AccountDirCheck == StringAccountIter->second){
491 AccountNameFriendly = PrefData.accounts.GetAccountName(i);
498 ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir);
500 ETag = StringETagIter->second;
501 ETagOriginal = StringETagOrigIter->second;
502 AccountDir = StringAccountIter->second;
503 ContactFilename = StringFilenameIter->second;
504 FullFilename = StringFullFilenameIter->second;
505 EditMode = ActivityListEditMode.find(iter->first)->second;
507 bool KeepUpdating = TRUE;
509 while(KeepUpdating == TRUE){
511 bool ExitLoop = FALSE;
513 while (ExitLoop == FALSE){
515 ConnHandle.SetUploadMode(TRUE);
516 ConnHandle.SetupData(wxT("PUT"), StringURLIter->second, StringDataIter->second);
517 ConnHandle.SetEditMode(EditMode);
518 ConnHandle.GetServerETagValueThread();
519 ETagServer = ConnHandle.ETagValueResult();
521 int ErrorCode = ConnHandle.GetResultCode();
525 if (ErrorCode == 60 || ErrorCode == 51){
527 // Invalid SSL certificate so bring up a dialog to the user
528 // explaining what has happened and the options available.
530 // Stop all the timers.
532 frmMainPtrGet->PauseAllTimers();
536 #if defined(__APPLE__)
538 // Bring up the trust panel and display the SSL certificate dialog.
540 SSLResult = DisplayTrustPanel(ConnHandle.GetTrustObject(), AccountNameFriendly);
542 // Update the SSL account with the trust object.
544 if (SSLResult != NSOKButton){
546 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetTrustObject());
552 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetTrustObject());
557 // Setup the data to be sent in the wxPostEvent command.
559 SSLInvalidCertNotifObj SSLICNProcData;
561 bool *PauseMode = new bool;
565 qrn.QResponse = &SSLResult;
566 qrn.PausePtr = PauseMode;
568 SSLICNProcData.CertCollection = certcol;
569 SSLICNProcData.QRNotifData = &qrn;
570 SSLICNProcData.AccountName = AccountNameFriendly;
572 wxCommandEvent event(INVALIDSSLCERT);
573 event.SetClientData(&SSLICNProcData);
574 wxPostEvent(frmMainPtrGet, event);
576 while (*PauseMode == TRUE){
577 //nanosleep(&n1, &n2);
581 // Process the response from the user.
585 // Accept the certificate. Write the certificate into the account
586 // directory (as server.crt) - will overwrite old certificate.
588 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateData());
589 WriteServerCertificate(AccountDir, ConnHandle.GetCertificateData());
591 } else if (SSLResult == 2){
593 // Reject the certificate, abort the task and mark as failed.
595 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetCertificateData());
603 // Resume all the timers.
605 frmMainPtrGet->ResumeAllTimers();
623 if (iter->second == 2 || iter->second == 3 || iter->second == 4){
627 #if defined(__APPLE__)
629 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetTrustObject());
633 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateData());
637 // Compare the ETag with the Server ETag.
639 if (ETagOriginal != ETagServer){
641 // Server ETag is different from original ETag.
642 // This is a conflict which the user will now
648 frmMain *frmMainPtrGet = static_cast<frmMain*>(frmMainPtr);
650 vCard34Conv vCard34Obj;
652 wxString ServerContactData;
654 vCard ConvertedV4Data;
656 // Load the client data from the filename given.
658 ConnHandle.GetServerContactData();
659 ServerContactData = ConnHandle.GetPageData();
661 // Process v3 version into v4 version.
663 vCard34Obj.ConvertToV4(&ServerContactData, &ConvertedV4Data);
665 vCardConflictObj vCardProcData;
667 vCardProcData.vCardLocalData = &ClientData;
668 vCardProcData.vCardServerData = &ConvertedV4Data;
669 ClientData.LoadFile(FullFilename);
671 //ContactConflictEvent event(ContactConflictCmdEnv);
672 //event.SetData(ContactFilename, Moo1, Moo2);
674 //wxPostEvent(frmMainPtrGet, event);
676 // Setup Conflict Resolution Dialog.
678 // Fetch Data from Server and convert.
680 bool *PauseMode = new bool;
685 qrn.QResponse = &ConflictResult;
686 qrn.PausePtr = PauseMode;
688 vCardProcData.QRNotifData = &qrn;
690 wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED);
691 event.SetClientData(&vCardProcData);
692 wxPostEvent(frmMainPtrGet, event);
694 while (*PauseMode == TRUE){
695 //nanosleep(&n1, &n2);
702 //intResult = frmMainPtrGet->ShowConflictDialog(&Moo1, &Moo2);
704 if (ConflictResult == 0){
711 } else if (ConflictResult == 1){
713 // Decided to use client version.
715 ConnHandle.ProcessData();
717 } else if (ConflictResult == 2){
719 // Decided to use server version.
721 // Download server version.
723 ConvertedV4Data.WriteFile(FullFilename);
729 // Update the data to the server.
731 ConnHandle.ProcessData();
735 // Update the ETag DB.
737 ConnHandle.GetServerETagValueThread();
738 ETagServer = ConnHandle.ETagValueResult();
739 ETagDBPtr->UpdateETag(ContactFilename, ETagServer, ETagServer);
746 } else if (TypeIter->second == 2) {
748 // Delete the contact from the server and update the ETag DB.
750 AccountDir = StringAccountIter->second;
751 ContactFilename = StringFilenameIter->second;
752 wxString AccountNameFriendly;
756 for (int i = 0; i < PrefData.accounts.GetCount(); i++){
758 wxString AccountDirCheck = PrefData.accounts.GetAccountDirectory(i);
760 AccountDirCheck.Trim();
761 AccountDirCheck.Append(wxT(".carddav"));
763 if (AccountDirCheck == StringAccountIter->second){
765 AccountNameFriendly = PrefData.accounts.GetAccountName(i);
772 ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir);
774 bool KeepUpdating = TRUE;
776 while(KeepUpdating == TRUE){
778 bool ExitLoop = FALSE;
780 while (ExitLoop == FALSE){
782 ConnHandle.SetUploadMode(FALSE);
783 ConnHandle.SetupData(wxT("DELETE"), ContactFilename, wxT(""));
784 ConnHandle.ProcessData();
785 SSLCertCollection certcol = ConnHandle.GetCertificateData();
787 // Check if any errors have occured whilst getting the data.
789 int ErrorCode = ConnHandle.GetResultCode();
793 if (ErrorCode == 60 || ErrorCode == 51){
795 // Invalid SSL certificate so bring up a dialog to the user
796 // explaining what has happened and the options available.
798 // Stop all the timers.
800 frmMainPtrGet->PauseAllTimers();
804 #if defined(__APPLE__)
806 // Bring up the trust panel and display the SSL certificate dialog.
808 SSLResult = DisplayTrustPanel(ConnHandle.GetTrustObject(), AccountNameFriendly);
810 // Update the SSL account with the trust object.
812 if (SSLResult != NSOKButton){
814 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetTrustObject());
820 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetTrustObject());
825 // Setup the data to be sent in the wxPostEvent command.
827 SSLInvalidCertNotifObj SSLICNProcData;
829 bool *PauseMode = new bool;
833 qrn.QResponse = &SSLResult;
834 qrn.PausePtr = PauseMode;
836 SSLICNProcData.CertCollection = certcol;
837 SSLICNProcData.QRNotifData = &qrn;
838 SSLICNProcData.AccountName = AccountNameFriendly;
840 wxCommandEvent event(INVALIDSSLCERT);
841 event.SetClientData(&SSLICNProcData);
842 wxPostEvent(frmMainPtrGet, event);
846 // Fall asleep until we get an response.
849 n1.tv_nsec = 250000000L;*/
851 while (*PauseMode == TRUE){
852 //nanosleep(&n1, &n2);
856 // Process the response from the user.
860 // Accept the certificate. Write the certificate into the account
861 // directory (as server.crt) - will overwrite old certificate.
863 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateData());
864 WriteServerCertificate(AccountDir, ConnHandle.GetCertificateData());
866 } else if (SSLResult == 2){
868 // Reject the certificate, abort the task and mark as failed.
870 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetCertificateData());
878 // Resume all the timers.
880 frmMainPtrGet->ResumeAllTimers();
898 if (iter->second == 2 || iter->second == 3 || iter->second == 4){
902 #if defined(__APPLE__)
904 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetTrustObject());
908 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateData());
913 ETagDBPtr->RemoveETag(ContactFilename);
916 CardDAVIter->second = NULL;
921 } else if (TypeIter->second == 3) {
923 wxString AccountNameFriendly;
927 for (int i = 0; i < PrefData.accounts.GetCount(); i++){
929 wxString AccountDirCheck = PrefData.accounts.GetAccountDirectory(i);
931 AccountDirCheck.Trim();
932 AccountDirCheck.Append(wxT(".carddav"));
934 if (AccountDirCheck == StringAccountIter->second){
936 AccountNameFriendly = PrefData.accounts.GetAccountName(i);
943 bool KeepUpdating = TRUE;
945 while (KeepUpdating == TRUE){
947 StringTaskDetailIter = ActivityListTaskDetail.find(iter->first);
949 AccountDir = StringAccountIter->second;
951 ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir);
953 wxArrayString vCardAdd;
954 wxArrayString vCardDelete;
955 wxArrayString vCardList;
956 wxArrayString vCardUpdateLocal;
957 wxArrayString vCardUpdateRemote;
958 wxArrayString vCardUpdateLog;
959 std::map<wxString,wxString> vCardETag;
960 ContactListData ServerContactList;
962 std::map<wxString,vCardDownloadDataFileClass> vCardDownloadData;
963 //wxArrayString vCardDownload;
964 //std::map<wxString,wxString> vCardDownloadData;
966 // Get the list of vCard files locally.
968 wxString AccountDirFinal;
969 wxString AccountSyncTokenFilename;
970 wxString SyncTokenLoad;
972 #if defined(__HAIKU__)
974 //preffilename = wxT("noo");
976 #elif defined(__WIN32__)
978 AccountDirFinal = GetAccountDir(AccountDir, FALSE);
979 AccountSyncTokenFilename = AccountDirFinal;
980 AccountSyncTokenFilename.Append(wxT("synctoken"));
984 AccountDirFinal = GetAccountDir(AccountDir, FALSE);
985 AccountSyncTokenFilename = AccountDirFinal;
986 AccountSyncTokenFilename.Append(wxT("synctoken"));
990 // Suppress Error Messages.
992 wxLogNull PleaseDoNotDisturb;
995 SyncLoad.Open(AccountSyncTokenFilename, wxT("r"));
997 if (SyncLoad.IsOpened()){
999 SyncLoad.ReadAll(&SyncTokenLoad, wxMBConvUTF8());
1004 // Get a list of vCard files from the server.
1006 // Get the list of vCard files from the ETagDB.
1008 std::map<wxString,ETagData> ETagDBData = ETagDBPtr->GetETagData();
1010 bool ExitLoop = FALSE;
1012 std::map<wxString,FileSyncData> *SCListData = NULL;
1014 while (ExitLoop == FALSE){
1016 ServerContactList = ConnHandle.GetContactList(SyncTokenLoad.ToUTF8());
1017 SSLCertCollection certcol = ConnHandle.GetCertificateData();
1019 // Create a pointer for the std::map<wxString,FileSyncData>.
1021 SCListData = &ServerContactList.ListData;
1023 // Check if any errors have occured whilst getting the data.
1025 int ErrorCode = ConnHandle.GetResultCode();
1027 if (ErrorCode != 0){
1029 if (ErrorCode == 60 || ErrorCode == 51){
1031 // Invalid SSL certificate so bring up a dialog to the user
1032 // explaining what has happened and the options available.
1034 // Stop all the timers.
1036 frmMainPtrGet->PauseAllTimers();
1040 #if defined(__APPLE__)
1042 // Bring up the trust panel and display the SSL certificate dialog.
1044 SSLResult = DisplayTrustPanel(ConnHandle.GetTrustObject(), AccountNameFriendly);
1046 // Update the SSL account with the trust object.
1048 if (SSLResult != NSOKButton){
1050 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetTrustObject());
1056 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetTrustObject());
1061 // Setup the data to be sent in the wxPostEvent command.
1063 SSLInvalidCertNotifObj SSLICNProcData;
1065 bool *PauseMode = new bool;
1069 qrn.QResponse = &SSLResult;
1070 qrn.PausePtr = PauseMode;
1072 SSLICNProcData.CertCollection = certcol;
1073 SSLICNProcData.QRNotifData = &qrn;
1074 SSLICNProcData.AccountName = AccountNameFriendly;
1076 wxCommandEvent event(INVALIDSSLCERT);
1077 event.SetClientData(&SSLICNProcData);
1078 wxPostEvent(frmMainPtrGet, event);
1082 // Fall asleep until we get an response.
1085 n1.tv_nsec = 250000000L;*/
1087 while (*PauseMode == TRUE){
1088 //nanosleep(&n1, &n2);
1089 SleepFor(250000000);
1092 // Process the response from the user.
1094 if (SSLResult == 1){
1096 // Accept the certificate. Write the certificate into the account
1097 // directory (as server.crt) - will overwrite old certificate.
1099 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateData());
1100 WriteServerCertificate(AccountDir, ConnHandle.GetCertificateData());
1102 } else if (SSLResult == 2){
1104 // Reject the certificate, abort the task and mark as failed.
1106 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetCertificateData());
1114 // Resume all the timers.
1116 frmMainPtrGet->ResumeAllTimers();
1134 if (iter->second == 2 || iter->second == 3 || iter->second == 4){
1138 #if defined(__APPLE__)
1140 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetTrustObject());
1144 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateData());
1148 // Look in directory and see which vCards to add and delete
1151 // vCard exists but not in ETagDB - Add (and upload).
1152 // vCard missing but in ETagDB - Delete (from server).
1154 // Start by looking for vCards that are not in the ETagDB.
1156 wxDir AccDir(AccountDirFinal);
1157 wxString AccDirFilename;
1159 bool ContinueProcess = AccDir.GetFirst(&AccDirFilename, wxEmptyString, wxDIR_DEFAULT);
1161 // Process the server data.
1163 if (SCListData != NULL){
1165 for (std::map<wxString, FileSyncData>::iterator fsiter = SCListData->begin();
1166 fsiter != SCListData->end(); fsiter++){
1168 // Check the mode of the file before adding.
1170 // Get the HTTP status of the file from the list.
1172 FileSyncData fsd = fsiter->second;
1174 if (fsd.DataFlag == 1){
1176 // Added or modified contact.
1178 //vCardAdd.Add(fsiter->first, 1);
1180 vCardDownloadDataFileClass vCardNewData;
1181 vCardNewData.DataType = 0;
1182 vCardDownloadData.insert(std::make_pair(fsiter->first, vCardNewData));
1184 //} else if (fsd.DataFlag == 1){
1186 // Contact has been modified on the server.
1188 // vCardUpdateLocal.Add(fsiter->first, 1);
1191 else if (fsd.DataFlag == 2){
1193 // Contact has been deleted.
1195 vCardDelete.Add(fsiter->first, 1);
1203 // Look for vCards that are missing but in the ETagDB.
1205 for (std::map<wxString,ETagData>::iterator etagiter = ETagDBData.begin();
1206 etagiter != ETagDBData.end(); etagiter++){
1208 // Check if the vCard exists.
1210 if (!wxFileExists(AccountDirFinal + etagiter->first)){
1212 // vCard doesn't exist so mark for deleting.
1214 vCardDelete.Add(etagiter->first, 1);
1220 // Compare Server with the ETag DB. Work out which
1221 // needs to updated remotely and which needs to be
1224 for (std::map<wxString,FileSyncData>::iterator srviter = SCListData->begin();
1225 srviter != SCListData->end(); srviter++){
1227 if (ETagDBData.find(srviter->first) == ETagDBData.end()){
1231 std::map<wxString,ETagData>::iterator lociter = ETagDBData.find(srviter->first);
1233 ETagData etd = lociter->second;
1234 FileSyncData fsd = srviter->second;
1236 wxString ETagSrv = fsd.ETagData;
1238 // Check if the local ETag value has 'DELETED' set and skip
1239 // checking this file if it does.
1241 if (etd.ETagValue == "DELETED"){
1247 // Compare local ETag with original local ETag.
1248 // If different, update to server is required.
1250 if (etd.ETagValue != etd.ETagOrigValue){
1252 // Check if local original ETag is different from server ETag.
1253 // If it is then throw up a conflict resolution dialog.
1255 if (etd.ETagOrigValue != ETagSrv){
1257 vCard34Conv vCard34Obj;
1259 wxString ServerContactData;
1260 wxString FullFilename;
1262 vCard ConvertedV4Data;
1264 // Conflict. Bring up conflict resolution dialog.
1266 // Get the server contact data for comparison.
1268 ConnHandle.SetServerFilename(srviter->first);
1269 ConnHandle.GetServerContactData();
1270 ServerContactData = ConnHandle.GetPageData();
1272 FullFilename = CreateFilenamePath(AccountDirFinal, srviter->first);
1274 // Convert it to v4.
1276 vCard34Obj.ConvertToV4(&ServerContactData, &ConvertedV4Data);
1278 vCardConflictObj vCardProcData;
1280 vCardProcData.vCardLocalData = &ClientData;
1281 vCardProcData.vCardServerData = &ConvertedV4Data;
1283 // Load the client data from the filename given.
1285 ClientData.LoadFile(FullFilename);
1289 bool *PauseMode = new bool;
1292 frmMain *frmMainPtrGet = static_cast<frmMain*>(frmMainPtr);
1295 qrn.QResponse = &ConflictResult;
1296 qrn.PausePtr = PauseMode;
1298 vCardProcData.QRNotifData = &qrn;
1300 wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED);
1301 event.SetClientData(&vCardProcData);
1302 wxPostEvent(frmMainPtrGet, event);
1307 n1.tv_nsec = 250000000L;*/
1309 while (*PauseMode == TRUE){
1310 //nanosleep(&n1, &n2);
1311 SleepFor(250000000);
1317 // If replacing local version, store copy for now.
1318 // Otherwise upload to server.
1320 if (ConflictResult == 0){
1326 } else if (ConflictResult == 1){
1328 // Decided to use client version.
1330 vCardUpdateLocal.Remove(srviter->first);
1331 vCardUpdateRemote.Add(srviter->first, 1);
1333 } else if (ConflictResult == 2){
1335 // Decided to use server version.
1336 // Store the converted downloaded copy for
1337 // processing later.
1339 //vCardUpdateLocal.Add(srviter->first, 1);
1341 vCardDownloadDataFileClass vCardNewData;
1342 vCardNewData.DataType = 1;
1343 vCardNewData.FileData = ConvertedV4Data.WriteString();
1345 ConvertedV4Data.WriteFile(FullFilename);
1347 vCardDownloadData.insert(std::make_pair(srviter->first, vCardNewData));
1355 // Send vCard to the server.
1357 vCardUpdateRemote.Add(srviter->first, 1);
1363 // Check if local ETag is different from server ETag.
1364 // If different, obtain the vCard from the server.
1366 if (etd.ETagOrigValue != ETagSrv){
1368 vCardUpdateLocal.Add(srviter->first, 1);
1376 // Process the vCards that need to be downloaded and added/overwritten.
1378 wxString vCardFilenameFinal;
1379 wxString vCardOutputData;
1380 wxString vCardInputData;
1381 wxString ETagFileData;
1384 for (std::map<wxString,vCardDownloadDataFileClass>::iterator additer = vCardDownloadData.begin();
1385 additer != vCardDownloadData.end(); additer++){
1387 vCardFilenameFinal.Clear();
1388 vCardInputData.Clear();
1389 vCardOutputData.Clear();
1390 ETagFileData.Clear();
1392 vCardFilenameFinal = CreateFilenamePath(AccountDirFinal, additer->first);
1394 ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir);
1396 if (additer->second.DataType == 0){
1398 vCard ConvertedV4Data;
1400 // Grab the file from the server and write the contact out.
1402 vCard34Conv vCard34Obj;
1404 ConnHandle.SetServerFilename(additer->first);
1405 ConnHandle.GetServerContactData();
1406 vCardInputData = ConnHandle.GetPageData();
1408 vCard34Obj.ConvertToV4(&vCardInputData, &ConvertedV4Data);
1410 ConvertedV4Data.WriteFile(vCardFilenameFinal);
1412 // Update the ETagDB.
1414 //vCardFile.Open(vCardFilenameFinal, wxT("w"));
1416 //if (vCardFile.IsOpened()){
1418 // vCardFile.Write(vCardOutputData, wxConvAuto());
1419 // vCardFile.Close();
1423 // Get the server ETag.
1425 wxString ServerETag;
1426 ConnHandle.GetServerETagValueThread();
1427 ServerETag = ConnHandle.ETagValueResult();
1429 // Add to the ETag Database.
1431 ETagDBPtr->AddETag(additer->first, ServerETag, ServerETag);
1433 } else if (additer->second.DataType == 1){
1435 // Write out the contact to the account directory.
1437 vCardFilenameFinal = CreateFilenamePath(AccountDirFinal, additer->first);
1438 vCardOutputData = additer->second.FileData;
1440 vCardFile.Open(vCardFilenameFinal, wxT("w"));
1442 if (vCardFile.IsOpened()){
1444 vCardFile.Write(vCardOutputData, wxConvAuto());
1449 // Update the ETagDB.
1451 wxString ServerETag;
1452 ConnHandle.GetServerETagValueThread();
1453 ServerETag = ConnHandle.ETagValueResult();
1455 // Add to the ETag Database.
1457 ETagDBPtr->AddETag(additer->first, ServerETag, ServerETag);
1462 // Look for vCard files which aren't in the ETagDB.
1464 while(ContinueProcess){
1466 // Check and make sure that the filename ends in .vcf/.vcard
1467 // Skip any file that beings with a dot.
1469 if (AccDirFilename.Left(1) == wxT(".")){
1471 ContinueProcess = AccDir.GetNext(&AccDirFilename);
1476 if (AccDirFilename.Right(4) != wxT(".vcf") &&
1477 AccDirFilename.Right(6) != wxT(".vcard")){
1479 ContinueProcess = AccDir.GetNext(&AccDirFilename);
1484 // Look in the ETagDB for the file.
1486 bool ETagExists = ETagDBPtr->CheckETagExists(AccDirFilename);
1488 if (ETagExists == FALSE){
1490 // Add the vCard to the list to be added.
1492 vCardAdd.Add(AccDirFilename, 1);
1496 ContinueProcess = AccDir.GetNext(&AccDirFilename);
1500 // Process the vCards to add/update to the server.
1502 for (int vi = 0; vi < vCardAdd.GetCount(); vi++){
1504 ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir);
1505 ETag = ETagDBPtr->GetETag(vCardAdd[vi]);
1506 ETagOriginal = ETagDBPtr->GetETagOriginal(vCardAdd[vi]);
1508 ContactFilename = vCardAdd[vi];
1509 FullFilename = CreateFilenamePath(AccountDirFinal, vCardAdd[vi]);
1511 ContactFilename.Trim();
1513 if (ETag == ETagOriginal && ETagDBPtr->ETagExists(vCardAdd[vi])){
1515 // Compare the ETag with the Server ETag.
1517 ConnHandle.SetServerFilename(vCardAdd[vi]);
1518 ConnHandle.GetServerETagValueThread();
1519 ETagServer = ConnHandle.ETagValueResult();
1521 if (ETagOriginal != ETagServer){
1523 // Server ETag is different from original ETag.
1524 // This is a conflict which the user will now
1527 frmMain *frmMainPtrGet = static_cast<frmMain*>(frmMainPtr);
1529 vCard34Conv vCard34Obj;
1531 wxString ServerContactData;
1533 vCard ConvertedV4Data;
1535 // Load the client data from the filename given.
1537 ConnHandle.GetServerContactData();
1538 ServerContactData = ConnHandle.GetPageData();
1540 // Process v3 version into v4 version.
1542 vCard34Obj.ConvertToV4(&ServerContactData, &ConvertedV4Data);
1544 vCardConflictObj vCardProcData;
1546 vCardProcData.vCardLocalData = &ClientData;
1547 vCardProcData.vCardServerData = &ConvertedV4Data;
1548 ClientData.LoadFile(FullFilename);
1550 //ContactConflictEvent event(ContactConflictCmdEnv);
1551 //event.SetData(ContactFilename, Moo1, Moo2);
1553 //wxPostEvent(frmMainPtrGet, event);
1555 // Setup Conflict Resolution Dialog.
1557 // Fetch Data from Server and convert.
1559 bool *PauseMode = new bool;
1564 qrn.QResponse = &ConflictResult;
1565 qrn.PausePtr = PauseMode;
1567 vCardProcData.QRNotifData = &qrn;
1569 wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED);
1570 event.SetClientData(&vCardProcData);
1571 wxPostEvent(frmMainPtrGet, event);
1576 n1.tv_nsec = 250000000L;*/
1578 while (*PauseMode == TRUE){
1579 //nanosleep(&n1, &n2);
1580 SleepFor(250000000);
1586 //intResult = frmMainPtrGet->ShowConflictDialog(&Moo1, &Moo2);
1588 if (ConflictResult == 0){
1595 } else if (ConflictResult == 1){
1597 // Decided to use client version.
1599 ConnHandle.ProcessData();
1603 } else if (ConflictResult == 2){
1605 // Decided to use server version.
1607 // Download server version.
1609 ConvertedV4Data.WriteFile(CreateFilenamePath(AccountDirFinal, vCardAdd[vi]));
1617 // Setup the filename for the contact being added.
1619 wxString wxSFilename = CreateFilenamePath(AccountDirFinal, vCardAdd[vi]);
1620 wxString wxSCardData;
1624 // Load the data from the file.
1627 wxFCard.Open(wxSFilename, wxT("r"));
1629 if (wxFCard.IsOpened()){
1631 wxFCard.ReadAll(&wxSCardData, wxConvAuto());
1636 // Convert the data to v3.
1638 vCard34Conv vCard34Obj;
1640 vCard34Obj.ConvertToV3(wxSFilename, &TaskData);
1642 // Setup the URL address.
1644 //TaskURL = StringTaskDetailIter->second + wxT("/") + vCardAdd[vi];
1646 // Upload the data to the server.
1648 ConnHandle.SetUploadMode(TRUE);
1649 ConnHandle.SetupData(wxT("PUT"), vCardAdd[vi], TaskData);
1650 ConnHandle.ProcessData();
1652 // Get the Server ETag and put it in the ETag database.
1654 ConnHandle.SetServerFilename(vCardAdd[vi]);
1655 ConnHandle.GetServerETagValueThread();
1656 ETagServer = ConnHandle.ETagValueResult();
1658 ETagDBPtr->AddETag(vCardAdd[vi], ETagServer, ETagServer);
1664 if (ETagOriginal != ETagServer){
1666 // Server ETag is different from original ETag.
1667 // This is a conflict which the user will now
1670 frmMain *frmMainPtrGet = (frmMain *)frmMainPtr;
1672 //ContactConflictEvent event(ContactConflictCmdEnv);
1673 //event.SetData(ContactFilename, Moo1, Moo2);
1675 vCard34Conv vCard34Obj;
1677 wxString ServerContactData;
1679 vCard ConvertedV4Data;
1681 // Load the client data from the filename given.
1683 ConnHandle.GetServerContactData();
1684 ServerContactData = ConnHandle.GetPageData();
1685 ClientData.LoadFile(FullFilename);
1687 // Process v3 version into v4 version.
1689 vCard34Obj.ConvertToV4(&ServerContactData, &ConvertedV4Data);
1691 vCardConflictObj vCardProcData;
1693 vCardProcData.vCardLocalData = &ClientData;
1694 vCardProcData.vCardServerData = &ConvertedV4Data;
1696 bool *PauseMode = new bool;
1701 qrn.QResponse = &ConflictResult;
1702 qrn.PausePtr = PauseMode;
1704 vCardProcData.QRNotifData = &qrn;
1706 wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED);
1707 event.SetClientData(&vCardProcData);
1708 wxPostEvent(frmMainPtrGet, event);
1713 n1.tv_nsec = 250000000L;*/
1715 while (*PauseMode == TRUE){
1716 //nanosleep(&n1, &n2);
1717 SleepFor(250000000);
1723 //intResult = frmMainPtrGet->ShowConflictDialog(&Moo1, &Moo2);
1725 if (ConflictResult == 0){
1732 } else if (ConflictResult == 1){
1734 // Decided to use client version.
1736 ConnHandle.ProcessData();
1737 //ETagServer = CardDAVIter->second.GetServerETagValueThread();
1738 //ETagDBPtr->UpdateETag(ContactFilename, ETagServer, ETagServer);
1742 } else if (ConflictResult == 2){
1744 // Decided to use server version.
1746 // Write server version to file.
1748 ConvertedV4Data.WriteFile(CreateFilenamePath(AccountDirFinal, vCardAdd[vi]));
1756 // Setup the filename for the contact being added.
1758 wxString wxSFilename = CreateFilenamePath(AccountDirFinal, vCardAdd[vi]);
1759 wxString wxSCardData;
1763 // Load the data from the file.
1766 wxFCard.Open(wxSFilename, wxT("r"));
1768 if (wxFCard.IsOpened()){
1770 wxFCard.ReadAll(&wxSCardData, wxConvAuto());
1775 // Convert the data to v3.
1777 vCard34Conv vCard34Obj;
1779 vCard34Obj.ConvertToV3(wxSFilename, &TaskData);
1781 // Setup the URL address.
1783 //TaskURL = StringTaskDetailIter->second + wxT("/") + vCardAdd[vi];
1785 // Upload the data to the server.
1787 ConnHandle.SetUploadMode(TRUE);
1788 ConnHandle.SetupData(wxT("PUT"), vCardAdd[vi], TaskData);
1789 ConnHandle.ProcessData();
1791 // Get the Server ETag and put it in the ETag database.
1793 ConnHandle.SetServerFilename(vCardAdd[vi]);
1794 ConnHandle.GetServerETagValueThread();
1795 ETagServer = ConnHandle.ETagValueResult();
1798 ETagDBPtr->AddETag(vCardAdd[vi], ETagServer, ETagServer);
1806 // Process the vCards to delete locally.
1808 for (int vi = 0; vi < vCardDelete.GetCount(); vi++){
1810 if (!wxRemoveFile(CreateFilenamePath(AccountDirFinal, vCardDelete[vi]))){
1814 ETagDBPtr->RemoveETag(vCardDelete[vi]);
1820 // Process the vCards to delete from the server.
1822 std::map<wxString,wxString> *ETagFilenameMap = ETagDBPtr->GetFilenamePointer();
1823 std::list<wxString> DeleteList;
1825 for (std::map<wxString,wxString>::iterator deliter = ETagFilenameMap->begin();
1826 deliter != ETagFilenameMap->end(); deliter++){
1828 // Look through the ETagDB and find contacts which are marked as DELETED.
1830 if (deliter->second == wxT("DELETED")){
1832 ConnHandle.SetUploadMode(FALSE);
1833 ConnHandle.SetupData(wxT("DELETE"), deliter->first, wxT(""));
1834 ConnHandle.ProcessDataThread();
1836 // Delete the ETag as the file has now been deleted.
1838 DeleteList.push_back(deliter->first);
1844 for (std::list<wxString>::iterator removeetagiter = DeleteList.begin();
1845 removeetagiter != DeleteList.end(); removeetagiter++){
1847 ETagDBPtr->RemoveETag(*removeetagiter);
1851 // Write out the update server sync token.
1853 wxString ServerSyncToken = ServerContactList.SyncToken;
1855 ServerSyncToken.Trim();
1857 if (!ServerSyncToken.IsEmpty()){
1860 SyncWrite.Open(AccountSyncTokenFilename, wxT("w"));
1862 if (SyncWrite.IsOpened()){
1864 SyncWrite.Write(ServerSyncToken, wxConvAuto());
1871 // Check for another sync token. If there is another
1872 // sync token then repeat this. If token matches then stop processing.
1874 if (SyncTokenLoad == ServerSyncToken){
1876 KeepUpdating = FALSE;
1882 // Mark as completed.
1884 wxString AccountNameFinal;
1885 AccountNameFinal = PrefData.accounts.GetAccountDirectory(AccountID);
1886 AccountNameFinal.Append(wxT(".carddav"));
1888 wxCommandEvent reloadevent(RELOADCONTACTLIST);
1889 reloadevent.SetString(AccountNameFinal);
1890 wxPostEvent(this->GetParent(), reloadevent);
1897 // Update the data to the server.
1899 ConnHandle.ProcessData();
1908 n1.tv_nsec = 250000000L;*/
1910 while (iter->second == 1){
1912 SleepFor(250000000);
1913 //nanosleep(&n1, &n2);
1917 if ((iter->second == 4 && TypeIter->second == 0) ||
1918 (iter->second == 8 && TypeIter->second == 0)){
1920 AccountDir = StringAccountIter->second;
1921 ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir);
1923 ConnHandle.GetServerETagValueThread();
1924 ETagServer = ConnHandle.ETagValueResult();
1925 ETagDBPtr->UpdateETag(ContactFilename, ETagServer, ETagServer);
1929 if ((iter->second == 4 && TypeIter->second == 1) ||
1930 (iter->second == 8 && TypeIter->second == 1)){
1932 AccountDir = StringAccountIter->second;
1933 ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir);
1935 ConnHandle.GetServerETagValueThread();
1936 ETagServer = ConnHandle.ETagValueResult();
1937 ETagDBPtr->UpdateETag(ContactFilename, ETagServer, ETagServer);
1947 if (TasksFoundProc == FALSE){
1949 TasksActive = FALSE;
1950 ProcessTasksData = FALSE;
1954 wxCommandEvent eventp(ACTMGR_STARTTIMER);
1955 wxPostEvent(this, eventp);
1957 //AnimationTimer.StartAnimation();
1958 //ActListProcTimer.Start();
1962 wxCommandEvent event(ACTMGR_STARTPROCESSTIMER);
1963 wxPostEvent(this, event);
1965 //ActProcessTimer.Start();
1969 void frmActivityMgr::ProcessTasks()
1972 std::thread ProcessThread(&frmActivityMgr::ProcessTasksThread, this);
1973 ProcessThread.detach();
1977 void frmActivityMgr::SetupPointers(wxETagProcessTimer *ETagTmrPtrInc, void *frmMainPtrInc)
1980 ETagTmrPtr = ETagTmrPtrInc;
1982 frmMainPtr = frmMainPtrInc;
1986 void frmActivityMgr::ResumeProcessing(wxCommandEvent &event){
1988 QRNotif *qrn = (QRNotif *)event.GetClientData();
1990 int *QRes = qrn->QResponse;
1992 *qrn->PausePtr = FALSE;
1994 *QRes = event.GetInt();
1998 void frmActivityMgr::ToggleConnectionStatus( wxCommandEvent &event ){
2000 wxCommandEvent connevent(CONNSTAT_UPDATE);
2002 if (SleepMode == FALSE){
2004 connevent.SetInt(1);
2009 connevent.SetInt(0);
2014 wxPostEvent(GetParent(), connevent);
2018 void frmActivityMgr::WriteServerCertificate(wxString AccountName, SSLCertCollection SSLCertInc){
2020 wxString ServerCertFinal;
2022 // Get the Cert section of the certificate and write it to the file.
2024 ServerCertFinal = GetAccountDir(AccountName, TRUE);
2028 std::map<int, SSLCertData>::iterator SSLCDIter = SSLCertInc.SSLCollection.find(0);
2029 std::multimap<wxString,wxString>::iterator SSLDataIter = SSLCDIter->second.CertData.find(wxT("Cert"));
2031 CertFile.Open(ServerCertFinal, wxFile::write);
2033 CertFile.Write(SSLDataIter->second, wxConvUTF8);
2038 void frmActivityMgr::StartTimer(wxCommandEvent& event){
2040 ActListProcTimer.Start(1000, FALSE);
2044 void frmActivityMgr::StopTimer(wxCommandEvent& event){
2046 ActListProcTimer.Stop();
2050 void frmActivityMgr::StartProcessTimer(wxCommandEvent& event){
2052 ActProcessTimer.Start(1000, FALSE);
2056 void frmActivityMgr::StopProcessTimer(wxCommandEvent& event){
2058 ActProcessTimer.Stop();
2062 void frmActivityMgr::UpdateStatusLabel(wxCommandEvent& event){
2064 ActivityMgrLabelUpdate *actmgrudata = (ActivityMgrLabelUpdate*)event.GetClientData();
2066 if (actmgrudata != NULL){
2068 lstActivity->SetItem(actmgrudata->ItemIndex, 2, actmgrudata->ItemLabel);
2070 /*if (!actmgrudata->ItemDes.IsEmpty()){
2071 lstActivity->SetItem(actmgrudata->ItemIndex, 0, actmgrudata->ItemDes);