1 #include "frmActivityMgr.h"
2 #include <wx/mstream.h>
5 #include <wx/tokenzr.h>
13 #include "common/preferences.h"
14 #include "frmConflictResolution.h"
15 #include "frmInvalidSSLCertificate.h"
17 #include "common/events.h"
18 #include "common/filename.h"
19 #include "common/dirs.h"
20 #include "vcard/vcard34conv.h"
21 #include "vcard/vcard.h"
24 #ifndef FRMACTIVITYMGR_H
25 #define FRMACTIVITYMGR_H
27 DEFINE_EVENT_TYPE(ACTMGR_RESUMEPROC);
28 DEFINE_EVENT_TYPE(ACTMGR_TOGGLECONN);
29 DEFINE_EVENT_TYPE(ACTMGR_STARTTIMER);
30 DEFINE_EVENT_TYPE(ACTMGR_STOPTIMER);
31 DEFINE_EVENT_TYPE(ACTMGR_STARTPROCESSTIMER);
32 DEFINE_EVENT_TYPE(ACTMGR_STOPPROCESSTIMER);
34 BEGIN_EVENT_TABLE(frmActivityMgr, wxWindow)
35 EVT_COMMAND(wxID_ANY, ACTMGR_RESUMEPROC, frmActivityMgr::ResumeProcessing)
36 EVT_COMMAND(wxID_ANY, ACTMGR_TOGGLECONN, frmActivityMgr::ToggleConnectionStatus)
37 EVT_COMMAND(wxID_ANY, ACTMGR_STARTTIMER, frmActivityMgr::StartTimer)
38 EVT_COMMAND(wxID_ANY, ACTMGR_STOPTIMER, frmActivityMgr::StopTimer)
39 EVT_COMMAND(wxID_ANY, ACTMGR_STARTPROCESSTIMER, frmActivityMgr::StartProcessTimer)
40 EVT_COMMAND(wxID_ANY, ACTMGR_STOPPROCESSTIMER, frmActivityMgr::StopProcessTimer)
43 frmActivityMgr::frmActivityMgr( wxWindow* parent )
45 frmActivityMgrADT( parent )
48 frmMain *frmMainPtrGet = static_cast<frmMain*>(frmMainPtr);
50 wxMemoryInputStream istream(icons_activitywindow_png, sizeof(icons_activitywindow_png));
51 wxImage icons_activitywindow_pngi(istream, wxBITMAP_TYPE_PNG);
52 wxBitmap activityiconbmp(icons_activitywindow_pngi, -1);
54 activityicon.CopyFromBitmap(activityiconbmp);
55 this->SetIcon(activityicon);
57 wxMemoryInputStream istream2(misc_activitysleep_png, sizeof(misc_activitysleep_png));
58 wxImage misc_activitysleep_pngi(istream2, wxBITMAP_TYPE_PNG);
59 wxBitmap sleepiconbmp(misc_activitysleep_pngi, -1);
60 SleepBitmap = sleepiconbmp;
61 bmpActivity->SetBitmap(SleepBitmap);
62 ActProcessTimer.SetupPointers(this);
63 lblDetails->SetLabel(_("No activity."));
65 ActListProcTimer.SetupPointers(&ActivityList, &ActivityListIndex, &ActivityListTaskDetail,
66 &TasksActive, lstActivity, lblDetails, GauProgress, this, &AnimationTimer,
67 &ActProcessTimer, &ActivityListFinDate);
69 AnimationTimer.SetBitmap(bmpActivity);
70 AnimationTimer.SetSleepBitmap(&SleepBitmap);
71 AnimationTimer.SetupPointer(this->GetParent());
73 wxListItem ColumnData;
75 ColumnData.SetText(_("Activity"));
76 ColumnData.SetWidth(175);
77 lstActivity->InsertColumn(0, ColumnData);
79 wxListItem ColumnData2;
81 ColumnData2.SetText(_("Account"));
82 ColumnData2.SetWidth(100);
83 lstActivity->InsertColumn(1, ColumnData2);
85 wxListItem ColumnData3;
87 ColumnData3.SetText(_("Status"));
88 ColumnData3.SetWidth(100);
89 lstActivity->InsertColumn(2, ColumnData3);
91 //AnimationTimer.StartAnimation();
93 // Create recovery database if it doesn't exist.
95 wxString RecoveryFilename = GetRecoveryDB();
99 if (wxFile::Exists(RecoveryFilename) == FALSE){
101 // Create the recovery database.
103 RecoveryDB.Open(RecoveryFilename.c_str(), wxFile::write);
105 RecoveryDB.Write(wxT("BEGIN:XAB-RECOVERYDB\r\n"), wxConvUTF8);
106 RecoveryDB.Write(wxT("VERSION:1.0\r\n"), wxConvUTF8);
107 RecoveryDB.Write(wxT("COMMENT:Please do not alter or delete this file. DATA LOSS IS POSSIBLE!\r\n"), wxConvUTF8);
108 RecoveryDB.Write(wxT("END:XAB-RECOVERYDB\r\n"), wxConvUTF8);
115 #if wxABI_VERSION < 20900
116 RecoveryDBF.Open(RecoveryFilename.c_str(), wxT("r"));
118 RecoveryDBF.Open(RecoveryFilename, wxT("r"));
121 // Load the recovery database for tasks not done.
123 if (RecoveryDBF.IsOpened() == TRUE){
125 wxString wxSRecoveryDB;
126 wxString RecoveryLine;
128 // Check if we are using wxWidgets version 2.8 or less and
129 // execute the required command accordingly.
131 RecoveryDBF.ReadAll(&wxSRecoveryDB, wxConvAuto());
135 std::map<int, wxString> RecoveryFileLines;
136 std::map<int, wxString>::iterator striter;
138 wxStringTokenizer wSTRecoveryDBLines(wxSRecoveryDB, wxT("\r\n"));
140 int RecoveryLineSeek = 0;
142 while (wSTRecoveryDBLines.HasMoreTokens() == TRUE){
144 RecoveryLine = wSTRecoveryDBLines.GetNextToken();
145 RecoveryFileLines.insert(std::make_pair(RecoveryLineSeek, RecoveryLine));
154 //TestTimer.Start(50, FALSE);
157 int frmActivityMgr::AddTask(int TaskType, wxString TaskDetail, wxString TaskAccount,
158 wxString TaskURL, wxString TaskFilename, wxString TaskFullFilename,
167 coldata.SetId(ActivityTaskID);
168 coldata.SetData(ActivityTaskID);
170 AnimationTimer.StartAnimation();
172 // Get the preferences file.
174 wxString PrefFilename = GetUserPrefDir();
176 XABPreferences PrefData(PrefFilename);
178 wxString AccountName;
180 wxString AccountAddress;
182 wxString AccountUsername;
183 wxString AccountPassword;
184 bool AccountSSL = FALSE;
185 wxString AccountPrefix;
187 // Look for the account and get the friendly name for the account.
189 for (int i = 0; i < PrefData.accounts.GetCount(); i++){
191 AccountDir = PrefData.accounts.GetAccountDirectory(i);
194 AccountDir.Append(wxT(".carddav"));
196 if (AccountDir == TaskAccount){
198 AccountName = PrefData.accounts.GetAccountName(i);
199 AccountAddress = PrefData.accounts.GetAccountAddress(i);
200 AccountPort = PrefData.accounts.GetAccountPort(i);
201 AccountUsername = PrefData.accounts.GetAccountUsername(i);
202 AccountPassword = PrefData.accounts.GetAccountPassword(i);
203 AccountPrefix = PrefData.accounts.GetAccountDirPrefix(i);
204 AccountSSL = PrefData.accounts.GetAccountSSL(i);
207 AccountAddress.Trim();
208 //AccountPort.Trim();
209 AccountUsername.Trim();
210 AccountPassword.Trim();
211 AccountPrefix.Trim();
218 CardDAVConn.SetupConnection(AccountAddress, AccountPort, AccountUsername, AccountPassword, AccountSSL, AccountPrefix, AccountDir);
219 CardDAVConn.SetupVariables(&ActivityList, ActivityTaskID);
220 CardDAVConn.SetupResultBools(&BlankBool, &BlankBool);
223 // 0 - Add a contact.
224 // 1 - Update a contact.
225 // 2 - Delete a contact.
226 // 3 - Account syncronisation.
230 coldata.SetText(_("Adding Contact '") + TaskDetail + _("'"));
231 itemindex = lstActivity->InsertItem(coldata);
233 lstActivity->SetItem(itemindex, 1, AccountName);
234 lstActivity->SetItem(itemindex, 2, _("Queued"));
236 CardDAVConn.SetUploadMode(TRUE);
237 CardDAVConn.SetupData(wxT("PUT"), TaskURL, TaskData);
239 // Setup all of the task details.
241 ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir);
243 ActivityListType.insert(std::make_pair(ActivityTaskID, 0));
244 ActivityListData.insert(std::make_pair(ActivityTaskID, TaskData));
245 ActivityListConn.insert(std::make_pair(ActivityTaskID, CardDAVConn));
246 ActivityListIndex.insert(std::make_pair(ActivityTaskID, itemindex));
247 ActivityListTaskDetail.insert(std::make_pair(ActivityTaskID, TaskDetail));
248 ActivityListAccount.insert(std::make_pair(ActivityTaskID, TaskAccount));
249 ActivityListFilename.insert(std::make_pair(ActivityTaskID, TaskFilename));
250 ActivityListFullFilename.insert(std::make_pair(ActivityTaskID, TaskFullFilename));
252 ActivityListETag.insert(std::make_pair(ActivityTaskID, ETagDBPtr->GetETag(TaskFilename)));
253 ActivityListETagOriginal.insert(std::make_pair(ActivityTaskID, ETagDBPtr->GetETagOriginal(TaskFilename)));
254 ActivityList.insert(std::make_pair(ActivityTaskID, 0));
256 } else if (TaskType == 1){
258 coldata.SetText(_("Updating Contact '") + TaskDetail + _("'"));
259 itemindex = lstActivity->InsertItem(coldata);
261 lstActivity->SetItem(itemindex, 1, AccountName);
262 lstActivity->SetItem(itemindex, 2, _("Queued"));
264 CardDAVConn.SetUploadMode(TRUE);
265 CardDAVConn.SetupData(wxT("PUT"), TaskURL, TaskData);
266 CardDAVConn.SetEditMode(TRUE);
268 ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir);
270 ActivityListType.insert(std::make_pair(ActivityTaskID, 1));
271 ActivityListData.insert(std::make_pair(ActivityTaskID, TaskData));
272 ActivityListConn.insert(std::make_pair(ActivityTaskID, CardDAVConn));
273 ActivityListIndex.insert(std::make_pair(ActivityTaskID, itemindex));
274 ActivityListTaskDetail.insert(std::make_pair(ActivityTaskID, TaskDetail));
275 ActivityListAccount.insert(std::make_pair(ActivityTaskID, TaskAccount));
276 ActivityListFilename.insert(std::make_pair(ActivityTaskID, TaskFilename));
277 ActivityListFullFilename.insert(std::make_pair(ActivityTaskID, TaskFullFilename));
279 ActivityListETag.insert(std::make_pair(ActivityTaskID, ETagDBPtr->GetETag(TaskFilename)));
280 ActivityListETagOriginal.insert(std::make_pair(ActivityTaskID, ETagDBPtr->GetETagOriginal(TaskFilename)));
281 ActivityList.insert(std::make_pair(ActivityTaskID, 0));
283 } else if (TaskType == 2){
285 coldata.SetText(_("Deleting Contact '") + TaskDetail + _("'"));
286 itemindex = lstActivity->InsertItem(coldata);
288 lstActivity->SetItem(itemindex, 1, AccountName);
289 lstActivity->SetItem(itemindex, 2, _("Queued"));
291 // TODO: Pass the ETagDB for the account to the connection.
293 ActivityList.insert(std::make_pair(ActivityTaskID, 0));
294 ActivityListType.insert(std::make_pair(ActivityTaskID, 2));
295 ActivityListData.insert(std::make_pair(ActivityTaskID, TaskData));
296 ActivityListAccount.insert(std::make_pair(ActivityTaskID, TaskAccount));
297 ActivityListConn.insert(std::make_pair(ActivityTaskID, CardDAVConn));
298 ActivityListFilename.insert(std::make_pair(ActivityTaskID, TaskFilename));
299 ActivityListIndex.insert(std::make_pair(ActivityTaskID, itemindex));
301 } else if (TaskType == 3){
303 coldata.SetText(_("Syncronising All Contacts"));
304 itemindex = lstActivity->InsertItem(coldata);
306 lstActivity->SetItem(itemindex, 1, AccountName);
307 lstActivity->SetItem(itemindex, 2, _("Queued"));
309 ActivityList.insert(std::make_pair(ActivityTaskID, 0));
310 ActivityListType.insert(std::make_pair(ActivityTaskID, 3));
311 ActivityListData.insert(std::make_pair(ActivityTaskID, TaskData));
312 ActivityListConn.insert(std::make_pair(ActivityTaskID, CardDAVConn));
313 ActivityListTaskDetail.insert(std::make_pair(ActivityTaskID, AccountPrefix));
314 ActivityListAccount.insert(std::make_pair(ActivityTaskID, TaskAccount));
315 ActivityListIndex.insert(std::make_pair(ActivityTaskID, itemindex));
319 ProcessTasksData = TRUE;
321 if (!ActProcessTimer.IsRunning()) {
323 wxCommandEvent event(ACTMGR_STARTTIMER);
324 wxPostEvent(this, event);
326 wxCommandEvent eventp(ACTMGR_STARTPROCESSTIMER);
327 wxPostEvent(this, eventp);
329 //ActProcessTimer.Start(1000, FALSE);
330 //ActListProcTimer.Start(1000, FALSE);
334 // Update the recovery database.
336 return ActivityTaskID;
340 void frmActivityMgr::RemoveTask(){
342 // Remove task from the recovery database.
346 void frmActivityMgr::StopTask( wxCommandEvent& event ){
348 // Check if activity has been completed already before stopping.
350 long longSelected = -1;
351 int intSelectedData = 0;
353 longSelected = lstActivity->GetNextItem(longSelected,
355 wxLIST_STATE_SELECTED);
357 intSelectedData = lstActivity->GetItemData(longSelected);
359 if (longSelected == -1){
363 std::map<int,CardDAV>::iterator CDAVter;
365 CDAVter = ActivityListConn.find(intSelectedData);
367 CDAVter->second.Abort();
369 lstActivity->SetItem(longSelected, 2, _("Stopped"));
373 void frmActivityMgr::StopAllTasks( wxCommandEvent& event ){
375 // Check if activity has been completed already before stopping.
377 // TODO: Look through for '1' and stop the running task(s).
379 long longSelected = -1;
380 int intSelectedData = 0;
382 longSelected = lstActivity->GetNextItem(longSelected,
384 wxLIST_STATE_SELECTED);
386 intSelectedData = lstActivity->GetItemData(longSelected);
388 if (longSelected == -1){
392 std::map<int,CardDAV>::iterator CDAVter;
394 CDAVter = ActivityListConn.find(intSelectedData);
396 CDAVter->second.Abort();
398 lstActivity->SetItem(longSelected, 2, _("Stopped"));
399 AnimationTimer.StopAnimation();
400 bmpActivity->SetBitmap(SleepBitmap);
401 lblDetails->SetLabel(_("No activity."));
405 void frmActivityMgr::RetryTask( wxCommandEvent& event ){
407 // Check if activity has been completed already before retrying.
409 long longSelected = -1;
410 int intSelectedData = 0;
412 longSelected = lstActivity->GetNextItem(longSelected,
414 wxLIST_STATE_SELECTED);
416 intSelectedData = lstActivity->GetItemData(longSelected);
418 if (longSelected == -1){
422 std::map<int,CardDAV>::iterator CDAVter;
424 CDAVter = ActivityListConn.find(intSelectedData);
428 //CDAVter->second.Abort();
430 std::map<int,int>::iterator Iter;
431 Iter = ActivityList.find(intSelectedData);
435 AnimationTimer.StartAnimation();
437 if (!ActProcessTimer.IsRunning()) {
439 ActProcessTimer.Start(150, FALSE);
440 ActListProcTimer.Start(150, FALSE);
444 //lstActivity->SetItem(longSelected, 2, _("Processing..."));
448 void frmActivityMgr::OpenWindow()
453 void frmActivityMgr::CloseWindow( wxCommandEvent& event )
459 void frmActivityMgr::ProcessTasksThread()
462 if (ProcessTasksData == FALSE){
468 std::map<int,int>::iterator TypeIter;
469 std::map<int,wxString>::iterator StringIter;
470 std::map<int,wxString>::iterator StringDetailIter;
471 std::map<int,wxString>::iterator StringAccountIter;
472 std::map<int,wxString>::iterator StringFilenameIter;
473 std::map<int,wxString>::iterator StringFullFilenameIter;
474 std::map<int,wxString>::iterator StringTaskDetailIter;
475 std::map<int,wxString>::iterator StringETagIter;
476 std::map<int,wxString>::iterator StringETagOrigIter;
477 std::map<int,CardDAV>::iterator CardDAVIter;
478 std::map<int,long>::iterator LongIter;
479 bool TasksFoundProc = FALSE;
482 for (std::map<int,int>::iterator iter = ActivityList.begin();
483 iter != ActivityList.end(); ++iter){
485 // Check for any queued tasks and start one.
487 if (iter->second > 4){
491 CardDAVIter = ActivityListConn.find(iter->first);
492 TypeIter = ActivityListType.find(iter->first);
493 StringETagIter = ActivityListETag.find(iter->first);
494 StringETagOrigIter = ActivityListETagOriginal.find(iter->first);
495 StringAccountIter = ActivityListAccount.find(iter->first);
496 StringFilenameIter = ActivityListFilename.find(iter->first);
497 StringFullFilenameIter = ActivityListFullFilename.find(iter->first);
504 // 5 = Failed (UI Updated).
505 // 6 = Stopped (UI Updated).
506 // 7 = (Reserved) (UI Updated).
507 // 8 = Completed. (UI Updated).
509 if (iter->second == 0){
511 //CardDAVIter->second.
513 // Wait for process to finish.
516 TasksFoundProc = TRUE;
518 wxString ETagOriginal;
521 wxString ContactFilename;
522 wxString FullFilename;
527 if (TypeIter->second == 1){
528 CardDAVIter->second.GetServerETagValueThread();
529 ETagServer = CardDAVIter->second.ETagValueResult();
532 // Compare the ETags and work out if a conflict has occured.
534 if (TypeIter->second == 1){
536 ETag = StringETagIter->second;
537 ETagOriginal = StringETagOrigIter->second;
538 AccountDir = StringAccountIter->second;
539 ContactFilename = StringFilenameIter->second;
540 FullFilename = StringFullFilenameIter->second;
542 ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir);
544 if (ETag == ETagOriginal){
546 // Compare the ETag with the Server ETag.
548 if (ETagOriginal != ETagServer){
550 // Server ETag is different from original ETag.
551 // This is a conflict which the user will now
558 frmMain *frmMainPtrGet = static_cast<frmMain*>(frmMainPtr);
560 vCard34Conv vCard34Obj;
562 wxString ServerContactData;
564 vCard ConvertedV4Data;
566 // Load the client data from the filename given.
568 CardDAVIter->second.GetServerContactData();
569 ServerContactData = CardDAVIter->second.GetPageData();
571 // Process v3 version into v4 version.
573 vCard34Obj.ConvertToV4(&ServerContactData, &ConvertedV4Data);
575 vCardConflictObj vCardProcData;
577 vCardProcData.vCardLocalData = &ClientData;
578 vCardProcData.vCardServerData = &ConvertedV4Data;
579 ClientData.LoadFile(FullFilename);
581 //ContactConflictEvent event(ContactConflictCmdEnv);
582 //event.SetData(ContactFilename, Moo1, Moo2);
584 //wxPostEvent(frmMainPtrGet, event);
586 // Setup Conflict Resolution Dialog.
588 // Fetch Data from Server and convert.
590 bool *PauseMode = new bool;
595 qrn.QResponse = &ConflictResult;
596 qrn.PausePtr = PauseMode;
598 vCardProcData.QRNotifData = &qrn;
600 wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED);
601 event.SetClientData(&vCardProcData);
602 wxPostEvent(frmMainPtrGet, event);
607 n1.tv_nsec = 250000000L;*/
609 while (*PauseMode == TRUE){
610 //nanosleep(&n1, &n2);
617 //intResult = frmMainPtrGet->ShowConflictDialog(&Moo1, &Moo2);
619 if (ConflictResult == 0){
626 } else if (ConflictResult == 1){
628 // Decided to use client version.
630 CardDAVIter->second.ProcessData();
634 } else if (ConflictResult == 2){
636 // Decided to use server version.
638 // Download server version.
640 ConvertedV4Data.WriteFile(FullFilename);
649 // Update the data to the server.
651 CardDAVIter->second.ProcessData();
657 if (ETagOriginal != ETagServer){
659 // Server ETag is different from original ETag.
660 // This is a conflict which the user will now
667 frmMain *frmMainPtrGet = (frmMain *)frmMainPtr;
669 //ContactConflictEvent event(ContactConflictCmdEnv);
670 //event.SetData(ContactFilename, Moo1, Moo2);
672 vCard34Conv vCard34Obj;
674 wxString ServerContactData;
676 vCard ConvertedV4Data;
678 // Load the client data from the filename given.
680 CardDAVIter->second.GetServerContactData();
681 ServerContactData = CardDAVIter->second.GetPageData();
682 ClientData.LoadFile(FullFilename);
684 // Process v3 version into v4 version.
686 vCard34Obj.ConvertToV4(&ServerContactData, &ConvertedV4Data);
688 vCardConflictObj vCardProcData;
690 vCardProcData.vCardLocalData = &ClientData;
691 vCardProcData.vCardServerData = &ConvertedV4Data;
693 bool *PauseMode = new bool;
698 qrn.QResponse = &ConflictResult;
699 qrn.PausePtr = PauseMode;
701 vCardProcData.QRNotifData = &qrn;
703 wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED);
704 event.SetClientData(&vCardProcData);
705 wxPostEvent(frmMainPtrGet, event);
710 n1.tv_nsec = 250000000L;*/
712 while (*PauseMode == TRUE){
713 //nanosleep(&n1, &n2);
720 //intResult = frmMainPtrGet->ShowConflictDialog(&Moo1, &Moo2);
722 if (ConflictResult == 0){
729 } else if (ConflictResult == 1){
731 // Decided to use client version.
733 CardDAVIter->second.ProcessData();
734 //ETagServer = CardDAVIter->second.GetServerETagValueThread();
735 //ETagDBPtr->UpdateETag(ContactFilename, ETagServer, ETagServer);
739 } else if (ConflictResult == 2){
741 // Decided to use server version.
743 // Write server version to file.
745 ConvertedV4Data.WriteFile(FullFilename);
753 // Update the data to the server.
755 CardDAVIter->second.ProcessData();
761 // Update the ETag DB.
763 CardDAVIter->second.GetServerETagValueThread();
764 ETagServer = CardDAVIter->second.ETagValueResult();
765 ETagDBPtr->UpdateETag(ContactFilename, ETagServer, ETagServer);
769 } else if (TypeIter->second == 2) {
771 // Delete the contact from the server and update the ETag DB.
773 AccountDir = StringAccountIter->second;
774 ContactFilename = StringFilenameIter->second;
776 ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir);
778 CardDAVIter->second.SetUploadMode(FALSE);
779 CardDAVIter->second.SetupData(wxT("DELETE"), ContactFilename, wxT(""));
780 //CardDAVIter->second.SetServerFilename();
781 CardDAVIter->second.ProcessData();
782 ETagDBPtr->RemoveETag(ContactFilename);
786 } else if (TypeIter->second == 3) {
788 frmMain *frmMainPtrGet = static_cast<frmMain*>(frmMainPtr);
790 wxString AccountNameFriendly;
791 wxString PrefFilename = GetUserPrefDir();
793 XABPreferences PrefData(PrefFilename);
796 for (int i = 0; i < PrefData.accounts.GetCount(); i++){
798 wxString AccountDirCheck = PrefData.accounts.GetAccountDirectory(i);
800 AccountDirCheck.Trim();
801 AccountDirCheck.Append(wxT(".carddav"));
803 if (AccountDirCheck == StringAccountIter->second){
805 AccountNameFriendly = PrefData.accounts.GetAccountName(i);
812 bool KeepUpdating = TRUE;
814 while (KeepUpdating == TRUE){
816 StringTaskDetailIter = ActivityListTaskDetail.find(iter->first);
818 AccountDir = StringAccountIter->second;
820 ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir);
822 wxArrayString vCardAdd;
823 wxArrayString vCardDelete;
824 wxArrayString vCardList;
825 wxArrayString vCardUpdateLocal;
826 wxArrayString vCardUpdateRemote;
827 wxArrayString vCardUpdateLog;
828 std::map<wxString,wxString> vCardETag;
829 ContactListData ServerContactList;
831 std::map<wxString,vCardDownloadDataFileClass> vCardDownloadData;
832 //wxArrayString vCardDownload;
833 //std::map<wxString,wxString> vCardDownloadData;
835 // Get the list of vCard files locally.
837 wxString AccountDirFinal;
838 wxString AccountSyncTokenFilename;
839 wxString SyncTokenLoad;
841 #if defined(__HAIKU__)
843 //preffilename = wxT("noo");
845 #elif defined(__WIN32__)
847 AccountDirFinal = GetAccountDir(AccountDir, FALSE);
848 AccountSyncTokenFilename = AccountDirFinal;
849 AccountSyncTokenFilename.Append(wxT("synctoken"));
853 AccountDirFinal = GetAccountDir(AccountDir, FALSE);
854 AccountSyncTokenFilename = AccountDirFinal;
855 AccountSyncTokenFilename.Append(wxT("synctoken"));
859 // Suppress Error Messages.
861 wxLogNull PleaseDoNotDisturb;
864 SyncLoad.Open(AccountSyncTokenFilename, wxT("r"));
866 if (SyncLoad.IsOpened()){
868 SyncLoad.ReadAll(&SyncTokenLoad, wxMBConvUTF8());
873 // Get a list of vCard files from the server.
875 // Get the list of vCard files from the ETagDB.
877 std::map<wxString,ETagData> ETagDBData = ETagDBPtr->GetETagData();
879 CardDAV CardDAVInstance = CardDAVIter->second;
881 bool ExitLoop = FALSE;
883 std::map<wxString,FileSyncData> *SCListData = NULL;
885 while (ExitLoop == FALSE){
887 //ServerContactList = CardDAVInstance.GetContactList(SyncTokenLoad.ToUTF8());
888 ServerContactList = CardDAVIter->second.GetContactList(SyncTokenLoad.ToUTF8());
890 // Create a pointer for the std::map<wxString,FileSyncData>.
892 SCListData = &ServerContactList.ListData;
894 // Check if any errors have occured whilst getting the data.
896 int ErrorCode = CardDAVIter->second.GetResultCode();
900 if (ErrorCode == 60 || ErrorCode == 51){
902 // Invalid SSL certificate so bring up a dialog to the user
903 // explaining what has happened and the options available.
905 // Stop all the timers.
907 frmMainPtrGet->PauseAllTimers();
909 // Setup the data to be sent in the wxPostEvent command.
911 SSLInvalidCertNotifObj SSLICNProcData;
913 bool *PauseMode = new bool;
918 qrn.QResponse = &SSLResult;
919 qrn.PausePtr = PauseMode;
921 SSLICNProcData.CertCollection = CardDAVIter->second.GetCertificateData();
922 SSLICNProcData.QRNotifData = &qrn;
923 SSLICNProcData.AccountName = AccountNameFriendly;
925 wxCommandEvent event(INVALIDSSLCERT);
926 event.SetClientData(&SSLICNProcData);
927 wxPostEvent(frmMainPtrGet, event);
931 // Fall asleep until we get an response.
934 n1.tv_nsec = 250000000L;*/
936 while (*PauseMode == TRUE){
937 //nanosleep(&n1, &n2);
941 // Process the response from the user.
945 // Accept the certificate. Write the certificate into the account
946 // directory (as server.crt) - will overwrite old certificate.
948 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, CardDAVIter->second.GetCertificateData());
949 WriteServerCertificate(AccountDir, CardDAVIter->second.GetCertificateData());
951 } else if (SSLResult == 2){
953 // Reject the certificate, abort the task and mark as failed.
955 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, CardDAVIter->second.GetCertificateData());
961 // Resume all the timers.
963 frmMainPtrGet->ResumeAllTimers();
980 if (iter->second == 2 || iter->second == 3 || iter->second == 4){
984 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, CardDAVIter->second.GetCertificateData());
986 // Look in directory and see which vCards to add and delete
989 // vCard exists but not in ETagDB - Add (and upload).
990 // vCard missing but in ETagDB - Delete (from server).
992 // Start by looking for vCards that are not in the ETagDB.
994 wxDir AccDir(AccountDirFinal);
995 wxString AccDirFilename;
997 bool ContinueProcess = AccDir.GetFirst(&AccDirFilename, wxEmptyString, wxDIR_DEFAULT);
999 // Process the server data.
1001 if (SCListData != NULL){
1003 for (std::map<wxString, FileSyncData>::iterator fsiter = SCListData->begin();
1004 fsiter != SCListData->end(); fsiter++){
1006 // Check the mode of the file before adding.
1008 // Get the HTTP status of the file from the list.
1010 FileSyncData fsd = fsiter->second;
1012 if (fsd.DataFlag == 1){
1014 // Added or modified contact.
1016 //vCardAdd.Add(fsiter->first, 1);
1018 vCardDownloadDataFileClass vCardNewData;
1019 vCardNewData.DataType = 0;
1020 vCardDownloadData.insert(std::make_pair(fsiter->first, vCardNewData));
1022 //} else if (fsd.DataFlag == 1){
1024 // Contact has been modified on the server.
1026 // vCardUpdateLocal.Add(fsiter->first, 1);
1029 else if (fsd.DataFlag == 2){
1031 // Contact has been deleted.
1033 vCardDelete.Add(fsiter->first, 1);
1041 // Look for vCards that are missing but in the ETagDB.
1043 for (std::map<wxString,ETagData>::iterator etagiter = ETagDBData.begin();
1044 etagiter != ETagDBData.end(); etagiter++){
1046 // Check if the vCard exists.
1048 if (!wxFileExists(AccountDirFinal + etagiter->first)){
1050 // vCard doesn't exist so mark for deleting.
1052 vCardDelete.Add(etagiter->first, 1);
1058 // Compare Server with the ETag DB. Work out which
1059 // needs to updated remotely and which needs to be
1062 for (std::map<wxString,FileSyncData>::iterator srviter = SCListData->begin();
1063 srviter != SCListData->end(); srviter++){
1065 if (ETagDBData.find(srviter->first) == ETagDBData.end()){
1069 std::map<wxString,ETagData>::iterator lociter = ETagDBData.find(srviter->first);
1071 ETagData etd = lociter->second;
1072 FileSyncData fsd = srviter->second;
1074 wxString ETagSrv = fsd.ETagData;
1076 // Compare local ETag with original local ETag.
1077 // If different, update to server is required.
1079 if (etd.ETagValue != etd.ETagOrigValue){
1081 // Check if local original ETag is different from server ETag.
1082 // If it is then throw up a conflict resolution dialog.
1084 if (etd.ETagOrigValue != ETagSrv){
1086 vCard34Conv vCard34Obj;
1088 wxString ServerContactData;
1089 wxString FullFilename;
1091 vCard ConvertedV4Data;
1093 // Conflict. Bring up conflict resolution dialog.
1095 // Get the server contact data for comparison.
1097 CardDAVIter->second.SetServerFilename(srviter->first);
1098 CardDAVIter->second.GetServerContactData();
1099 ServerContactData = CardDAVIter->second.GetPageData();
1101 FullFilename = CreateFilenamePath(AccountDirFinal, srviter->first);
1103 // Convert it to v4.
1105 vCard34Obj.ConvertToV4(&ServerContactData, &ConvertedV4Data);
1107 vCardConflictObj vCardProcData;
1109 vCardProcData.vCardLocalData = &ClientData;
1110 vCardProcData.vCardServerData = &ConvertedV4Data;
1112 // Load the client data from the filename given.
1114 ClientData.LoadFile(FullFilename);
1118 bool *PauseMode = new bool;
1121 frmMain *frmMainPtrGet = static_cast<frmMain*>(frmMainPtr);
1124 qrn.QResponse = &ConflictResult;
1125 qrn.PausePtr = PauseMode;
1127 vCardProcData.QRNotifData = &qrn;
1129 wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED);
1130 event.SetClientData(&vCardProcData);
1131 wxPostEvent(frmMainPtrGet, event);
1136 n1.tv_nsec = 250000000L;*/
1138 while (*PauseMode == TRUE){
1139 //nanosleep(&n1, &n2);
1140 SleepFor(250000000);
1146 // If replacing local version, store copy for now.
1147 // Otherwise upload to server.
1149 if (ConflictResult == 0){
1155 } else if (ConflictResult == 1){
1157 // Decided to use client version.
1159 vCardUpdateLocal.Remove(srviter->first);
1160 vCardUpdateRemote.Add(srviter->first, 1);
1162 } else if (ConflictResult == 2){
1164 // Decided to use server version.
1165 // Store the converted downloaded copy for
1166 // processing later.
1168 //vCardUpdateLocal.Add(srviter->first, 1);
1170 vCardDownloadDataFileClass vCardNewData;
1171 vCardNewData.DataType = 1;
1172 vCardNewData.FileData = ConvertedV4Data.WriteString();
1174 ConvertedV4Data.WriteFile(FullFilename);
1176 vCardDownloadData.insert(std::make_pair(srviter->first, vCardNewData));
1184 // Send vCard to the server.
1186 vCardUpdateRemote.Add(srviter->first, 1);
1192 // Check if local ETag is different from server ETag.
1193 // If different, obtain the vCard from the server.
1195 if (etd.ETagOrigValue != ETagSrv){
1197 vCardUpdateLocal.Add(srviter->first, 1);
1205 // Process the vCards that need to be downloaded and added/overwritten.
1207 wxString vCardFilenameFinal;
1208 wxString vCardOutputData;
1209 wxString vCardInputData;
1210 wxString ETagFileData;
1212 bool vCardProcessError;
1214 for (std::map<wxString,vCardDownloadDataFileClass>::iterator additer = vCardDownloadData.begin();
1215 additer != vCardDownloadData.end(); additer++){
1217 vCardFilenameFinal.Clear();
1218 vCardInputData.Clear();
1219 vCardOutputData.Clear();
1220 ETagFileData.Clear();
1222 vCardFilenameFinal = CreateFilenamePath(AccountDirFinal, additer->first);
1224 ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir);
1226 if (additer->second.DataType == 0){
1228 vCard ConvertedV4Data;
1230 // Grab the file from the server and write the contact out.
1232 vCard34Conv vCard34Obj;
1234 CardDAVIter->second.SetServerFilename(additer->first);
1235 CardDAVIter->second.GetServerContactData();
1236 vCardInputData = CardDAVIter->second.GetPageData();
1238 vCard34Obj.ConvertToV4(&vCardInputData, &ConvertedV4Data);
1240 ConvertedV4Data.WriteFile(vCardFilenameFinal);
1242 // Update the ETagDB.
1244 //vCardFile.Open(vCardFilenameFinal, wxT("w"));
1246 //if (vCardFile.IsOpened()){
1248 // vCardFile.Write(vCardOutputData, wxConvAuto());
1249 // vCardFile.Close();
1253 // Get the server ETag.
1255 wxString ServerETag;
1256 CardDAVIter->second.GetServerETagValueThread();
1257 ServerETag = CardDAVIter->second.ETagValueResult();
1259 // Add to the ETag Database.
1261 ETagDBPtr->AddETag(additer->first, ServerETag, ServerETag);
1263 } else if (additer->second.DataType == 1){
1265 // Write out the contact to the account directory.
1267 vCardFilenameFinal = CreateFilenamePath(AccountDirFinal, additer->first);
1268 vCardOutputData = additer->second.FileData;
1270 vCardFile.Open(vCardFilenameFinal, wxT("w"));
1272 if (vCardFile.IsOpened()){
1274 vCardFile.Write(vCardOutputData, wxConvAuto());
1279 // Update the ETagDB.
1281 wxString ServerETag;
1282 CardDAVIter->second.GetServerETagValueThread();
1283 ServerETag = CardDAVIter->second.ETagValueResult();
1285 // Add to the ETag Database.
1287 ETagDBPtr->AddETag(additer->first, ServerETag, ServerETag);
1292 // Look for vCard files which aren't in the ETagDB.
1294 while(ContinueProcess){
1296 // Check and make sure that the filename ends in .vcf/.vcard
1297 // Skip any file that beings with a dot.
1299 if (AccDirFilename.Left(1) == wxT(".")){
1301 ContinueProcess = AccDir.GetNext(&AccDirFilename);
1306 if (AccDirFilename.Right(4) != wxT(".vcf") &&
1307 AccDirFilename.Right(6) != wxT(".vcard")){
1309 ContinueProcess = AccDir.GetNext(&AccDirFilename);
1314 // Look in the ETagDB for the file.
1316 bool ETagExists = ETagDBPtr->CheckETagExists(AccDirFilename);
1318 if (ETagExists == FALSE){
1320 // Add the vCard to the list to be added.
1322 vCardAdd.Add(AccDirFilename, 1);
1326 ContinueProcess = AccDir.GetNext(&AccDirFilename);
1330 // Process the vCards to add/update to the server.
1332 for (int vi = 0; vi < vCardAdd.GetCount(); vi++){
1334 ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir);
1335 ETag = ETagDBPtr->GetETag(vCardAdd[vi]);
1336 ETagOriginal = ETagDBPtr->GetETagOriginal(vCardAdd[vi]);
1337 ContactFilename = vCardAdd[vi];
1338 FullFilename = CreateFilenamePath(AccountDirFinal, vCardAdd[vi]);
1340 ContactFilename.Trim();
1342 if (ETag == ETagOriginal){
1344 // Compare the ETag with the Server ETag.
1346 if (ETagOriginal != ETagServer){
1348 // Server ETag is different from original ETag.
1349 // This is a conflict which the user will now
1356 frmMain *frmMainPtrGet = static_cast<frmMain*>(frmMainPtr);
1358 vCard34Conv vCard34Obj;
1360 wxString ServerContactData;
1362 vCard ConvertedV4Data;
1364 // Load the client data from the filename given.
1366 CardDAVIter->second.GetServerContactData();
1367 ServerContactData = CardDAVIter->second.GetPageData();
1369 // Process v3 version into v4 version.
1371 vCard34Obj.ConvertToV4(&ServerContactData, &ConvertedV4Data);
1373 vCardConflictObj vCardProcData;
1375 vCardProcData.vCardLocalData = &ClientData;
1376 vCardProcData.vCardServerData = &ConvertedV4Data;
1377 ClientData.LoadFile(FullFilename);
1379 //ContactConflictEvent event(ContactConflictCmdEnv);
1380 //event.SetData(ContactFilename, Moo1, Moo2);
1382 //wxPostEvent(frmMainPtrGet, event);
1384 // Setup Conflict Resolution Dialog.
1386 // Fetch Data from Server and convert.
1388 bool *PauseMode = new bool;
1393 qrn.QResponse = &ConflictResult;
1394 qrn.PausePtr = PauseMode;
1396 vCardProcData.QRNotifData = &qrn;
1398 wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED);
1399 event.SetClientData(&vCardProcData);
1400 wxPostEvent(frmMainPtrGet, event);
1405 n1.tv_nsec = 250000000L;*/
1407 while (*PauseMode == TRUE){
1408 //nanosleep(&n1, &n2);
1409 SleepFor(250000000);
1415 //intResult = frmMainPtrGet->ShowConflictDialog(&Moo1, &Moo2);
1417 if (ConflictResult == 0){
1424 } else if (ConflictResult == 1){
1426 // Decided to use client version.
1428 CardDAVIter->second.ProcessData();
1432 } else if (ConflictResult == 2){
1434 // Decided to use server version.
1436 // Download server version.
1438 ConvertedV4Data.WriteFile(CreateFilenamePath(AccountDirFinal, vCardAdd[vi]));
1446 // Setup the filename for the contact being added.
1448 wxString wxSFilename = CreateFilenamePath(AccountDirFinal, vCardAdd[vi]);
1449 wxString wxSCardData;
1453 // Load the data from the file.
1456 wxFCard.Open(wxSFilename, wxT("r"));
1458 if (wxFCard.IsOpened()){
1460 wxFCard.ReadAll(&wxSCardData, wxConvAuto());
1465 // Convert the data to v3.
1467 vCard34Conv vCard34Obj;
1469 vCard34Obj.ConvertToV3(wxSFilename, &TaskData);
1471 // Setup the URL address.
1473 //TaskURL = StringTaskDetailIter->second + wxT("/") + vCardAdd[vi];
1475 // Upload the data to the server.
1477 CardDAVIter->second.SetUploadMode(TRUE);
1478 CardDAVIter->second.SetupData(wxT("PUT"), vCardAdd[vi], TaskData);
1479 CardDAVIter->second.ProcessData();
1481 // Get the Server ETag and put it in the ETag database.
1483 CardDAVIter->second.SetServerFilename(vCardAdd[vi]);
1484 CardDAVIter->second.GetServerETagValueThread();
1485 ETagServer = CardDAVIter->second.ETagValueResult();
1487 ETagDBPtr->AddETag(vCardAdd[vi], ETagServer, ETagServer);
1493 if (ETagOriginal != ETagServer){
1495 // Server ETag is different from original ETag.
1496 // This is a conflict which the user will now
1503 frmMain *frmMainPtrGet = (frmMain *)frmMainPtr;
1505 //ContactConflictEvent event(ContactConflictCmdEnv);
1506 //event.SetData(ContactFilename, Moo1, Moo2);
1508 vCard34Conv vCard34Obj;
1510 wxString ServerContactData;
1512 vCard ConvertedV4Data;
1514 // Load the client data from the filename given.
1516 CardDAVIter->second.GetServerContactData();
1517 ServerContactData = CardDAVIter->second.GetPageData();
1518 ClientData.LoadFile(FullFilename);
1520 // Process v3 version into v4 version.
1522 vCard34Obj.ConvertToV4(&ServerContactData, &ConvertedV4Data);
1524 vCardConflictObj vCardProcData;
1526 vCardProcData.vCardLocalData = &ClientData;
1527 vCardProcData.vCardServerData = &ConvertedV4Data;
1529 bool *PauseMode = new bool;
1534 qrn.QResponse = &ConflictResult;
1535 qrn.PausePtr = PauseMode;
1537 vCardProcData.QRNotifData = &qrn;
1539 wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED);
1540 event.SetClientData(&vCardProcData);
1541 wxPostEvent(frmMainPtrGet, event);
1546 n1.tv_nsec = 250000000L;*/
1548 while (*PauseMode == TRUE){
1549 //nanosleep(&n1, &n2);
1550 SleepFor(250000000);
1556 //intResult = frmMainPtrGet->ShowConflictDialog(&Moo1, &Moo2);
1558 if (ConflictResult == 0){
1565 } else if (ConflictResult == 1){
1567 // Decided to use client version.
1569 CardDAVIter->second.ProcessData();
1570 //ETagServer = CardDAVIter->second.GetServerETagValueThread();
1571 //ETagDBPtr->UpdateETag(ContactFilename, ETagServer, ETagServer);
1575 } else if (ConflictResult == 2){
1577 // Decided to use server version.
1579 // Write server version to file.
1581 ConvertedV4Data.WriteFile(CreateFilenamePath(AccountDirFinal, vCardAdd[vi]));
1589 // Setup the filename for the contact being added.
1591 wxString wxSFilename = CreateFilenamePath(AccountDirFinal, vCardAdd[vi]);
1592 wxString wxSCardData;
1596 // Load the data from the file.
1599 wxFCard.Open(wxSFilename, wxT("r"));
1601 if (wxFCard.IsOpened()){
1603 wxFCard.ReadAll(&wxSCardData, wxConvAuto());
1608 // Convert the data to v3.
1610 vCard34Conv vCard34Obj;
1612 vCard34Obj.ConvertToV3(wxSFilename, &TaskData);
1614 // Setup the URL address.
1616 //TaskURL = StringTaskDetailIter->second + wxT("/") + vCardAdd[vi];
1618 // Upload the data to the server.
1620 CardDAVIter->second.SetUploadMode(TRUE);
1621 CardDAVIter->second.SetupData(wxT("PUT"), vCardAdd[vi], TaskData);
1622 CardDAVIter->second.ProcessData();
1624 // Get the Server ETag and put it in the ETag database.
1626 CardDAVIter->second.SetServerFilename(vCardAdd[vi]);
1627 CardDAVIter->second.GetServerETagValueThread();
1628 ETagServer = CardDAVIter->second.ETagValueResult();
1631 ETagDBPtr->AddETag(vCardAdd[vi], ETagServer, ETagServer);
1639 // Process the vCards to delete locally.
1641 for (int vi = 0; vi < vCardDelete.GetCount(); vi++){
1643 if (!wxRemoveFile(CreateFilenamePath(AccountDirFinal, vCardDelete[vi]))){
1647 ETagDBPtr->RemoveETag(vCardDelete[vi]);
1651 frmMain *frmMainPtrGet = static_cast<frmMain*>(frmMainPtr);
1655 // Process the vCards to delete from the server.
1657 std::map<wxString,wxString> *ETagFilenameMap = ETagDBPtr->GetFilenamePointer();
1660 for (std::map<wxString,wxString>::iterator deliter = ETagFilenameMap->begin();
1661 deliter != ETagFilenameMap->end(); deliter++){
1663 // Look through the ETagDB and find contacts which are marked as DELETED.
1665 if (deliter->second == wxT("DELETED")){
1667 CardDAVIter->second.SetUploadMode(FALSE);
1668 CardDAVIter->second.SetupData(wxT("DELETE"), deliter->first, wxT(""));
1669 CardDAVIter->second.ProcessData();
1671 // Delete the ETag as the file has now been deleted.
1673 ETagDBPtr->RemoveETag(deliter->first);
1679 // Write out the update server sync token.
1681 wxString ServerSyncToken = ServerContactList.SyncToken;
1683 ServerSyncToken.Trim();
1685 if (!ServerSyncToken.IsEmpty()){
1688 SyncWrite.Open(AccountSyncTokenFilename, wxT("w"));
1690 if (SyncWrite.IsOpened()){
1692 SyncWrite.Write(ServerSyncToken, wxConvAuto());
1699 // Check for another sync token. If there is another
1700 // sync token then repeat this. If token matches then stop processing.
1702 if (SyncTokenLoad == ServerSyncToken){
1704 KeepUpdating = FALSE;
1710 // Mark as completed.
1717 // Update the data to the server.
1719 CardDAVIter->second.ProcessData();
1726 n1.tv_nsec = 250000000L;*/
1728 while (iter->second == 1){
1730 SleepFor(250000000);
1731 //nanosleep(&n1, &n2);
1735 if ((iter->second == 4 && TypeIter->second == 0) ||
1736 (iter->second == 8 && TypeIter->second == 0)){
1738 AccountDir = StringAccountIter->second;
1739 ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir);
1741 CardDAVIter->second.GetServerETagValueThread();
1742 ETagServer = CardDAVIter->second.ETagValueResult();
1743 ETagDBPtr->UpdateETag(ContactFilename, ETagServer, ETagServer);
1747 if ((iter->second == 4 && TypeIter->second == 1) ||
1748 (iter->second == 8 && TypeIter->second == 1)){
1750 AccountDir = StringAccountIter->second;
1751 ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir);
1753 CardDAVIter->second.GetServerETagValueThread();
1754 ETagServer = CardDAVIter->second.ETagValueResult();
1755 ETagDBPtr->UpdateETag(ContactFilename, ETagServer, ETagServer);
1765 if (TasksFoundProc == FALSE){
1767 TasksActive = FALSE;
1768 ProcessTasksData = FALSE;
1772 wxCommandEvent eventp(ACTMGR_STARTTIMER);
1773 wxPostEvent(this, eventp);
1775 //AnimationTimer.StartAnimation();
1776 //ActListProcTimer.Start();
1780 wxCommandEvent event(ACTMGR_STARTPROCESSTIMER);
1781 wxPostEvent(this, event);
1783 //ActProcessTimer.Start();
1787 void frmActivityMgr::ProcessTasks()
1790 std::thread ProcessThread(&frmActivityMgr::ProcessTasksThread, this);
1791 ProcessThread.detach();
1795 void frmActivityMgr::SetupPointers(wxETagProcessTimer *ETagTmrPtrInc, void *frmMainPtrInc)
1798 ETagTmrPtr = ETagTmrPtrInc;
1800 frmMainPtr = frmMainPtrInc;
1804 void frmActivityMgr::ResumeProcessing(wxCommandEvent &event){
1806 QRNotif *qrn = (QRNotif *)event.GetClientData();
1808 int *QRes = qrn->QResponse;
1810 *qrn->PausePtr = FALSE;
1812 *QRes = event.GetInt();
1816 int frmActivityMgr::GetTaskStatus(int intTaskID){
1820 if (ActivityList.find(intTaskID) == ActivityList.end()){
1826 std::map<int,int>::iterator taskiter = ActivityList.find(intTaskID);
1827 intResult = taskiter->second;
1833 void frmActivityMgr::ToggleConnectionStatus( wxCommandEvent &event ){
1835 wxCommandEvent connevent(CONNSTAT_UPDATE);
1837 if (SleepMode == FALSE){
1839 connevent.SetInt(1);
1844 connevent.SetInt(0);
1849 wxPostEvent(GetParent(), connevent);
1853 void frmActivityMgr::WriteServerCertificate(wxString AccountName, SSLCertCollection SSLCertInc){
1855 wxString ServerCertFinal;
1857 // Get the Cert section of the certificate and write it to the file.
1859 ServerCertFinal = GetAccountDir(AccountName, TRUE);
1863 std::map<int, SSLCertData>::iterator SSLCDIter = SSLCertInc.SSLCollection.find(0);
1864 std::multimap<wxString,wxString>::iterator SSLDataIter = SSLCDIter->second.CertData.find(wxT("Cert"));
1866 CertFile.Open(ServerCertFinal, wxFile::write);
1868 CertFile.Write(SSLDataIter->second, wxConvUTF8);
1873 void frmActivityMgr::StartTimer(wxCommandEvent& event){
1875 ActListProcTimer.Start(1000, FALSE);
1879 void frmActivityMgr::StopTimer(wxCommandEvent& event){
1881 ActListProcTimer.Stop();
1885 void frmActivityMgr::StartProcessTimer(wxCommandEvent& event){
1887 ActProcessTimer.Start(1000, FALSE);
1891 void frmActivityMgr::StopProcessTimer(wxCommandEvent& event){
1893 ActProcessTimer.Stop();