1 // frmActivityMgr.cpp - Activity Manager form.
3 // (c) 2012-2015 Xestia Software Development.
5 // This file is part of Xestia Address Book.
7 // Xestia Address Book is free software: you can redistribute it and/or modify
8 // it under the terms of the GNU General Public License as published by the
9 // Free Software Foundation, version 3 of the license.
11 // Xestia Address Book is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 // GNU General Public License for more details.
16 // You should have received a copy of the GNU General Public License along
17 // with Xestia Address Book. If not, see <http://www.gnu.org/licenses/>
19 #include "frmActivityMgr.h"
20 #include <wx/mstream.h>
23 #include <wx/tokenzr.h>
25 #include <wx/filefn.h>
28 #include <curl/curl.h>
30 #include "../bitmaps.h"
32 #include "../common/preferences.h"
33 #include "../frmConflictResolution.h"
34 #include "../frmInvalidSSLCertificate.h"
35 #include "../frmMain.h"
36 #include "../common/events.h"
37 #include "../common/filename.h"
38 #include "../vcard/vcard34conv.h"
39 #include "../vcard/vcard.h"
41 DEFINE_EVENT_TYPE(ACTMGR_RESUMEPROC);
42 DEFINE_EVENT_TYPE(ACTMGR_TOGGLECONN);
43 DEFINE_EVENT_TYPE(ACTMGR_STARTTIMER);
44 DEFINE_EVENT_TYPE(ACTMGR_STOPTIMER);
45 DEFINE_EVENT_TYPE(ACTMGR_STARTPROCESSTIMER);
46 DEFINE_EVENT_TYPE(ACTMGR_STOPPROCESSTIMER);
47 DEFINE_EVENT_TYPE(ACTMGR_UPDATESTATUSLABEL);
48 DEFINE_EVENT_TYPE(ACTMGR_STARTANIMATIONTIMER);
50 BEGIN_EVENT_TABLE(frmActivityMgr, wxWindow)
51 EVT_COMMAND(wxID_ANY, ACTMGR_RESUMEPROC, frmActivityMgr::ResumeProcessing)
52 EVT_COMMAND(wxID_ANY, ACTMGR_TOGGLECONN, frmActivityMgr::ToggleConnectionStatus)
53 EVT_COMMAND(wxID_ANY, ACTMGR_STARTTIMER, frmActivityMgr::StartTimer)
54 EVT_COMMAND(wxID_ANY, ACTMGR_STOPTIMER, frmActivityMgr::StopTimer)
55 EVT_COMMAND(wxID_ANY, ACTMGR_STARTPROCESSTIMER, frmActivityMgr::StartProcessTimer)
56 EVT_COMMAND(wxID_ANY, ACTMGR_STOPPROCESSTIMER, frmActivityMgr::StopProcessTimer)
57 EVT_COMMAND(wxID_ANY, ACTMGR_UPDATESTATUSLABEL, frmActivityMgr::UpdateStatusLabel)
58 EVT_COMMAND(wxID_ANY, ACTMGR_STARTANIMATIONTIMER, frmActivityMgr::StartAnimationTimer)
61 frmActivityMgr::frmActivityMgr( wxWindow* parent )
63 frmActivityMgrADT( parent )
66 wxMemoryInputStream istream(icons_activitywindow_png, sizeof(icons_activitywindow_png));
67 wxImage icons_activitywindow_pngi(istream, wxBITMAP_TYPE_PNG);
68 wxBitmap activityiconbmp(icons_activitywindow_pngi, -1);
70 activityicon.CopyFromBitmap(activityiconbmp);
71 this->SetIcon(activityicon);
73 wxMemoryInputStream istream2(misc_activitysleep_png, sizeof(misc_activitysleep_png));
74 wxImage misc_activitysleep_pngi(istream2, wxBITMAP_TYPE_PNG);
75 wxBitmap sleepiconbmp(misc_activitysleep_pngi, -1);
76 SleepBitmap = sleepiconbmp;
77 bmpActivity->SetBitmap(SleepBitmap);
78 ActProcessTimer.SetupPointers(this);
79 lblDetails->SetLabel(_("No activity."));
81 ActListProcTimer.SetupPointers(&ActivityList, &ActivityListIndex, &ActivityListTaskDetail,
82 &TasksActive, lstActivity, lblDetails, GauProgress, this, &AnimationTimer,
83 &ActProcessTimer, &ActivityListFinDate, &ActivityListConn);
85 AnimationTimer.SetBitmap(bmpActivity);
86 AnimationTimer.SetSleepBitmap(&SleepBitmap);
87 AnimationTimer.SetupPointer(this->GetParent());
89 wxListItem ColumnData;
91 ColumnData.SetText(_("Activity"));
92 ColumnData.SetWidth(175);
93 lstActivity->InsertColumn(0, ColumnData);
95 wxListItem ColumnData2;
97 ColumnData2.SetText(_("Account"));
98 ColumnData2.SetWidth(100);
99 lstActivity->InsertColumn(1, ColumnData2);
101 wxListItem ColumnData3;
102 ColumnData3.SetId(2);
103 ColumnData3.SetText(_("Status"));
104 ColumnData3.SetWidth(100);
105 lstActivity->InsertColumn(2, ColumnData3);
107 //AnimationTimer.StartAnimation();
109 // Create recovery database if it doesn't exist.
111 wxString RecoveryFilename = GetRecoveryDB();
115 if (wxFile::Exists(RecoveryFilename) == FALSE){
117 // Create the recovery database.
119 RecoveryDB.Open(RecoveryFilename.c_str(), wxFile::write);
121 RecoveryDB.Write(wxT("BEGIN:XAB-RECOVERYDB\r\n"), wxConvUTF8);
122 RecoveryDB.Write(wxT("VERSION:1.0\r\n"), wxConvUTF8);
123 RecoveryDB.Write(wxT("COMMENT:Please do not alter or delete this file. DATA LOSS IS POSSIBLE!\r\n"), wxConvUTF8);
124 RecoveryDB.Write(wxT("END:XAB-RECOVERYDB\r\n"), wxConvUTF8);
131 #if wxABI_VERSION < 20900
132 RecoveryDBF.Open(RecoveryFilename.c_str(), wxT("r"));
134 RecoveryDBF.Open(RecoveryFilename, wxT("r"));
137 // Load the recovery database for tasks not done.
139 if (RecoveryDBF.IsOpened() == TRUE){
141 wxString wxSRecoveryDB;
142 wxString RecoveryLine;
144 // Check if we are using wxWidgets version 2.8 or less and
145 // execute the required command accordingly.
147 RecoveryDBF.ReadAll(&wxSRecoveryDB, wxConvAuto());
151 std::map<int, wxString> RecoveryFileLines;
152 std::map<int, wxString>::iterator striter;
154 wxStringTokenizer wSTRecoveryDBLines(wxSRecoveryDB, wxT("\r\n"));
156 int RecoveryLineSeek = 0;
158 while (wSTRecoveryDBLines.HasMoreTokens() == TRUE){
160 RecoveryLine = wSTRecoveryDBLines.GetNextToken();
161 RecoveryFileLines.insert(std::make_pair(RecoveryLineSeek, RecoveryLine));
170 //TestTimer.Start(50, FALSE);
173 void frmActivityMgr::OpenWindow()
178 void frmActivityMgr::CloseWindow( wxCommandEvent& event )
184 void frmActivityMgr::CloseWindow( wxCloseEvent& event )
190 void frmActivityMgr::ProcessTasksThread()
193 if (ProcessTasksData == FALSE){
199 if (ApplicationSleepMode == TRUE){
205 std::map<int,int>::iterator TypeIter;
206 std::map<int,wxString>::iterator StringIter;
207 std::map<int,wxString>::iterator StringDataIter;
208 std::map<int,wxString>::iterator StringURLIter;
209 std::map<int,wxString>::iterator StringDetailIter;
210 std::map<int,wxString>::iterator StringAccountIter;
211 std::map<int,wxString>::iterator StringFilenameIter;
212 std::map<int,wxString>::iterator StringFullFilenameIter;
213 std::map<int,wxString>::iterator StringTaskDetailIter;
214 std::map<int,wxString>::iterator StringETagIter;
215 std::map<int,wxString>::iterator StringETagOrigIter;
216 std::map<int,CardDAV*>::iterator CardDAVIter;
217 std::map<int,ActivityMgrAccountSettings>::iterator AccountSettingsIter;
218 std::map<int,long>::iterator LongIter;
219 bool TasksFoundProc = FALSE;
221 XABPreferences PrefData(GetUserPrefDir());
223 for (std::map<int,int>::iterator iter = ActivityList.begin();
224 iter != ActivityList.end(); ++iter){
226 // Check for any queued tasks and start one.
228 if (iter->second > 4){
232 wxCommandEvent StartAnimationEvent(ACTMGR_STARTANIMATIONTIMER);
234 wxPostEvent(this, StartAnimationEvent);
236 // Start the animation timer if it hasn't started.
238 CardDAVIter = ActivityListConn.find(iter->first);
239 TypeIter = ActivityListType.find(iter->first);
240 StringETagIter = ActivityListETag.find(iter->first);
241 StringETagOrigIter = ActivityListETagOriginal.find(iter->first);
242 StringAccountIter = ActivityListAccount.find(iter->first);
243 StringFilenameIter = ActivityListFilename.find(iter->first);
244 StringFullFilenameIter = ActivityListFullFilename.find(iter->first);
245 AccountSettingsIter = ActivityListAccSettings.find(iter->first);
247 // Setup the CardDAV object.
251 ConnHandle.SetupConnection(AccountSettingsIter->second.Address,
252 AccountSettingsIter->second.Port,
253 AccountSettingsIter->second.Username,
254 AccountSettingsIter->second.Password,
255 AccountSettingsIter->second.SSL,
256 AccountSettingsIter->second.Prefix,
257 AccountSettingsIter->second.Dir);
258 ConnHandle.SetupVariables(&ActivityList, iter->first);
259 ConnHandle.SetupResultBools(&BlankBool, &BlankBool);
266 // 5 = Failed (UI Updated).
267 // 6 = Stopped (UI Updated).
268 // 7 = (Reserved) (UI Updated).
269 // 8 = Completed. (UI Updated).
271 frmMain *frmMainPtrGet = static_cast<frmMain*>(frmMainPtr);
273 if (iter->second == 0){
275 //CardDAVIter->second.
277 // Wait for process to finish.
280 TasksFoundProc = TRUE;
282 wxString ETagOriginal;
285 wxString ContactFilename;
286 wxString FullFilename;
288 bool EditMode = FALSE;
292 // Compare the ETags and work out if a conflict has occured.
294 if (TypeIter->second == 0){
298 StringDataIter = ActivityListData.find(iter->first);
299 StringURLIter = ActivityListURL.find(iter->first);
301 AccountDir = StringAccountIter->second;
302 ContactFilename = StringFilenameIter->second;
303 wxString AccountNameFriendly;
307 for (int i = 0; i < PrefData.accounts.GetCount(); i++){
309 wxString AccountDirCheck = PrefData.accounts.GetAccountDirectory(i);
311 AccountDirCheck.Trim();
312 AccountDirCheck.Append(wxT(".carddav"));
314 if (AccountDirCheck == StringAccountIter->second){
316 AccountNameFriendly = PrefData.accounts.GetAccountName(i);
323 ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir);
325 ETag = StringETagIter->second;
326 ETagOriginal = StringETagOrigIter->second;
327 AccountDir = StringAccountIter->second;
328 ContactFilename = StringFilenameIter->second;
329 FullFilename = StringFullFilenameIter->second;
330 EditMode = ActivityListEditMode.find(iter->first)->second;
332 bool KeepUpdating = TRUE;
334 while(KeepUpdating == TRUE){
336 bool ExitLoop = FALSE;
338 while (ExitLoop == FALSE){
340 // Verify that we have a trusted SSL connection first.
342 int ErrorCode = ConnHandle.SSLVerifyTest();
344 if (ErrorCode != CURLE_OK){
346 if (ErrorCode == CURLE_SSL_CACERT ||
347 ErrorCode == CURLE_PEER_FAILED_VERIFICATION ||
348 ErrorCode == CURLE_SSL_CONNECT_ERROR){
350 // Invalid SSL certificate so bring up a dialog to the user
351 // explaining what has happened and the options available.
353 // Stop all the timers.
355 frmMainPtrGet->PauseAllTimers();
359 #if defined(__APPLE__)
361 // Bring up the trust panel and display the SSL certificate dialog.
363 SSLResult = DisplayTrustPanel(ConnHandle.GetTrustObject(), AccountNameFriendly);
365 // Update the SSL account with the trust object.
367 if (SSLResult != NSOKButton){
369 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetTrustObject());
375 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetTrustObject());
380 #elif defined(__WIN32__)
382 BOOL ModifiedCertificateData;
383 CRYPTUI_VIEWCERTIFICATE_STRUCTW CertificateData = BuildCertificateData(&ConnHandle, (HWND)frmMainPtrGet->GetHandle());
385 if (!CryptUIDlgViewCertificate(&CertificateData, &ModifiedCertificateData)){
386 wxMessageBox(_("An error occured while trying to open the certificate dialog."), _("Error opening Certificate Information dialog"));
389 if (ModifiedCertificateData == FALSE){
391 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetCertificateContextPointer());
397 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateContextPointer());
403 // Setup the data to be sent in the wxPostEvent command.
405 SSLInvalidCertNotifObj SSLICNProcData;
407 SSLCertCollection certcol = ConnHandle.GetSSLVerifyResults();
409 bool *PauseMode = new bool;
413 qrn.QResponse = &SSLResult;
414 qrn.PausePtr = PauseMode;
416 SSLICNProcData.CertCollection = certcol;
417 SSLICNProcData.QRNotifData = &qrn;
418 SSLICNProcData.AccountName = AccountNameFriendly;
420 wxCommandEvent event(INVALIDSSLCERT);
421 event.SetClientData(&SSLICNProcData);
422 wxPostEvent(frmMainPtrGet, event);
426 // Fall asleep until we get an response.
429 n1.tv_nsec = 250000000L;*/
431 while (*PauseMode == TRUE){
432 //nanosleep(&n1, &n2);
436 // Process the response from the user.
440 // Accept the certificate. Write the certificate into the account
441 // directory (as server.crt) - will overwrite old certificate.
443 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateData());
444 WriteServerCertificate(AccountDir, ConnHandle.GetCertificateData());
446 } else if (SSLResult == 2){
448 // Reject the certificate, abort the task and mark as failed.
450 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetCertificateData());
458 // Resume all the timers.
460 frmMainPtrGet->ResumeAllTimers();
478 if (iter->second == 2 || iter->second == 3 || iter->second == 4){
482 #if defined(__APPLE__)
484 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetTrustObject());
486 #elif defined(__WIN32__)
488 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateContextPointer());
492 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateData());
496 ConnHandle.SetUploadMode(TRUE);
497 ConnHandle.SetupData(wxT("PUT"), StringURLIter->second, StringDataIter->second);
498 ConnHandle.SetEditMode(EditMode);
499 ConnHandle.ProcessData();
501 int ErrorCode = ConnHandle.GetResultCode();
503 if (ErrorCode != CURLE_OK){
510 // Add contact to the ETag DB.
512 ConnHandle.GetServerETagValueThread();
513 ETagServer = ConnHandle.ETagValueResult();
514 ETagDBPtr->AddETag(ContactFilename, ETagServer, ETagServer);
521 } else if (TypeIter->second == 1){
525 StringDataIter = ActivityListData.find(iter->first);
526 StringURLIter = ActivityListURL.find(iter->first);
528 AccountDir = StringAccountIter->second;
529 ContactFilename = StringFilenameIter->second;
530 wxString AccountNameFriendly;
534 for (int i = 0; i < PrefData.accounts.GetCount(); i++){
536 wxString AccountDirCheck = PrefData.accounts.GetAccountDirectory(i);
538 AccountDirCheck.Trim();
539 AccountDirCheck.Append(wxT(".carddav"));
541 if (AccountDirCheck == StringAccountIter->second){
543 AccountNameFriendly = PrefData.accounts.GetAccountName(i);
550 ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir);
552 ETag = StringETagIter->second;
553 ETagOriginal = StringETagOrigIter->second;
554 AccountDir = StringAccountIter->second;
555 ContactFilename = StringFilenameIter->second;
556 FullFilename = StringFullFilenameIter->second;
557 EditMode = ActivityListEditMode.find(iter->first)->second;
559 bool KeepUpdating = TRUE;
561 while(KeepUpdating == TRUE){
563 bool ExitLoop = FALSE;
565 while (ExitLoop == FALSE){
567 int ErrorCode = ConnHandle.SSLVerifyTest();
569 if (ErrorCode != CURLE_OK){
571 if (ErrorCode == CURLE_SSL_CACERT ||
572 ErrorCode == CURLE_PEER_FAILED_VERIFICATION ||
573 ErrorCode == CURLE_SSL_CONNECT_ERROR){
575 // Invalid SSL certificate so bring up a dialog to the user
576 // explaining what has happened and the options available.
578 // Stop all the timers.
580 frmMainPtrGet->PauseAllTimers();
584 #if defined(__APPLE__)
586 // Bring up the trust panel and display the SSL certificate dialog.
588 SSLResult = DisplayTrustPanel(ConnHandle.GetTrustObject(), AccountNameFriendly);
590 // Update the SSL account with the trust object.
592 if (SSLResult != NSOKButton){
594 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetTrustObject());
600 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetTrustObject());
604 #elif defined(__WIN32__)
606 BOOL ModifiedCertificateData;
607 CRYPTUI_VIEWCERTIFICATE_STRUCTW CertificateData = BuildCertificateData(&ConnHandle, (HWND)frmMainPtrGet->GetHandle());
609 if (!CryptUIDlgViewCertificate(&CertificateData, &ModifiedCertificateData)){
610 wxMessageBox(_("An error occured while trying to open the certificate dialog."), _("Error opening Certificate Information dialog"));
613 if (ModifiedCertificateData == FALSE){
615 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetCertificateContextPointer());
621 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateContextPointer());
627 // Setup the data to be sent in the wxPostEvent command.
629 SSLInvalidCertNotifObj SSLICNProcData;
631 SSLCertCollection certcol = ConnHandle.GetSSLVerifyResults();
633 bool *PauseMode = new bool;
637 qrn.QResponse = &SSLResult;
638 qrn.PausePtr = PauseMode;
640 SSLICNProcData.CertCollection = certcol;
641 SSLICNProcData.QRNotifData = &qrn;
642 SSLICNProcData.AccountName = AccountNameFriendly;
644 wxCommandEvent event(INVALIDSSLCERT);
645 event.SetClientData(&SSLICNProcData);
646 wxPostEvent(frmMainPtrGet, event);
648 while (*PauseMode == TRUE){
649 //nanosleep(&n1, &n2);
653 // Process the response from the user.
657 // Accept the certificate. Write the certificate into the account
658 // directory (as server.crt) - will overwrite old certificate.
660 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetSSLVerifyResults());
661 WriteServerCertificate(AccountDir, ConnHandle.GetSSLVerifyResults());
663 } else if (SSLResult == 2){
665 // Reject the certificate, abort the task and mark as failed.
667 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetSSLVerifyResults());
675 // Resume all the timers.
677 frmMainPtrGet->ResumeAllTimers();
695 if (iter->second == 2 || iter->second == 3 || iter->second == 4){
699 #if defined(__APPLE__)
701 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetTrustObject());
703 #elif defined(__WIN32__)
705 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateContextPointer());
709 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetSSLVerifyResults());
713 ConnHandle.SetUploadMode(TRUE);
714 ConnHandle.SetupData(wxT("PUT"), StringURLIter->second, StringDataIter->second);
715 ConnHandle.SetEditMode(EditMode);
716 ConnHandle.GetServerETagValueThread();
717 ETagServer = ConnHandle.ETagValueResult();
719 int ErrorCode = ConnHandle.GetResultCode();
721 if (ErrorCode != CURLE_OK){
726 // Compare the ETag with the Server ETag.
728 if (ETagOriginal != ETagServer){
730 // Server ETag is different from original ETag.
731 // This is a conflict which the user will now
737 frmMain *frmMainPtrGet = static_cast<frmMain*>(frmMainPtr);
739 vCard34Conv vCard34Obj;
741 wxString ServerContactData;
743 vCard ConvertedV4Data;
745 // Load the client data from the filename given.
747 ConnHandle.GetServerContactData();
748 ServerContactData = ConnHandle.GetPageData();
750 // Process v3 version into v4 version.
752 vCard34Obj.ConvertToV4(&ServerContactData, &ConvertedV4Data);
754 vCardConflictObj vCardProcData;
756 vCardProcData.vCardLocalData = &ClientData;
757 vCardProcData.vCardServerData = &ConvertedV4Data;
758 ClientData.LoadFile(FullFilename);
760 //ContactConflictEvent event(ContactConflictCmdEnv);
761 //event.SetData(ContactFilename, Moo1, Moo2);
763 //wxPostEvent(frmMainPtrGet, event);
765 // Setup Conflict Resolution Dialog.
767 // Fetch Data from Server and convert.
769 bool *PauseMode = new bool;
774 qrn.QResponse = &ConflictResult;
775 qrn.PausePtr = PauseMode;
777 vCardProcData.QRNotifData = &qrn;
779 wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED);
780 event.SetClientData(&vCardProcData);
781 wxPostEvent(frmMainPtrGet, event);
783 while (*PauseMode == TRUE){
784 //nanosleep(&n1, &n2);
791 //intResult = frmMainPtrGet->ShowConflictDialog(&Moo1, &Moo2);
793 if (ConflictResult == 0){
800 } else if (ConflictResult == 1){
802 // Decided to use client version.
804 ConnHandle.ProcessData();
806 } else if (ConflictResult == 2){
808 // Decided to use server version.
810 // Download server version.
812 ConvertedV4Data.WriteFile(FullFilename);
818 // Update the data to the server.
820 ConnHandle.ProcessData();
824 // Update the ETag DB.
826 ConnHandle.GetServerETagValueThread();
827 ETagServer = ConnHandle.ETagValueResult();
828 ETagDBPtr->UpdateETag(ContactFilename, ETagServer, ETagServer);
835 } else if (TypeIter->second == 2) {
837 // Delete the contact from the server and update the ETag DB.
839 AccountDir = StringAccountIter->second;
840 ContactFilename = StringFilenameIter->second;
841 wxString AccountNameFriendly;
845 for (int i = 0; i < PrefData.accounts.GetCount(); i++){
847 wxString AccountDirCheck = PrefData.accounts.GetAccountDirectory(i);
849 AccountDirCheck.Trim();
850 AccountDirCheck.Append(wxT(".carddav"));
852 if (AccountDirCheck == StringAccountIter->second){
854 AccountNameFriendly = PrefData.accounts.GetAccountName(i);
861 ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir);
863 bool KeepUpdating = TRUE;
865 while(KeepUpdating == TRUE){
867 bool ExitLoop = FALSE;
869 while (ExitLoop == FALSE){
871 int ErrorCode = ConnHandle.SSLVerifyTest();
873 if (ErrorCode != CURLE_OK){
875 if (ErrorCode == CURLE_SSL_CACERT ||
876 ErrorCode == CURLE_PEER_FAILED_VERIFICATION ||
877 ErrorCode == CURLE_SSL_CONNECT_ERROR){
879 // Invalid SSL certificate so bring up a dialog to the user
880 // explaining what has happened and the options available.
882 // Stop all the timers.
884 frmMainPtrGet->PauseAllTimers();
888 #if defined(__APPLE__)
890 // Bring up the trust panel and display the SSL certificate dialog.
892 SSLResult = DisplayTrustPanel(ConnHandle.GetTrustObject(), AccountNameFriendly);
894 // Update the SSL account with the trust object.
896 if (SSLResult != NSOKButton){
898 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetTrustObject());
904 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetTrustObject());
908 #elif defined(__WIN32__)
910 BOOL ModifiedCertificateData;
911 CRYPTUI_VIEWCERTIFICATE_STRUCTW CertificateData = BuildCertificateData(&ConnHandle, (HWND)frmMainPtrGet->GetHandle());
913 if (!CryptUIDlgViewCertificate(&CertificateData, &ModifiedCertificateData)){
914 wxMessageBox(_("An error occured while trying to open the certificate dialog."), _("Error opening Certificate Information dialog"));
917 if (ModifiedCertificateData == FALSE){
919 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetCertificateContextPointer());
925 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateContextPointer());
931 // Setup the data to be sent in the wxPostEvent command.
933 SSLInvalidCertNotifObj SSLICNProcData;
935 SSLCertCollection certcol = ConnHandle.GetSSLVerifyResults();
937 bool *PauseMode = new bool;
941 qrn.QResponse = &SSLResult;
942 qrn.PausePtr = PauseMode;
944 SSLICNProcData.CertCollection = certcol;
945 SSLICNProcData.QRNotifData = &qrn;
946 SSLICNProcData.AccountName = AccountNameFriendly;
948 wxCommandEvent event(INVALIDSSLCERT);
949 event.SetClientData(&SSLICNProcData);
950 wxPostEvent(frmMainPtrGet, event);
954 // Fall asleep until we get an response.
957 n1.tv_nsec = 250000000L;*/
959 while (*PauseMode == TRUE){
960 //nanosleep(&n1, &n2);
964 // Process the response from the user.
968 // Accept the certificate. Write the certificate into the account
969 // directory (as server.crt) - will overwrite old certificate.
971 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetSSLVerifyResults());
972 WriteServerCertificate(AccountDir, ConnHandle.GetSSLVerifyResults());
974 } else if (SSLResult == 2){
976 // Reject the certificate, abort the task and mark as failed.
978 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetSSLVerifyResults());
986 // Resume all the timers.
988 frmMainPtrGet->ResumeAllTimers();
1006 if (iter->second == 2 || iter->second == 3 || iter->second == 4){
1010 #if defined(__APPLE__)
1012 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetTrustObject());
1014 #elif defined(__WIN32__)
1016 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateContextPointer());
1020 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetSSLVerifyResults());
1024 ConnHandle.SetUploadMode(FALSE);
1025 ConnHandle.SetupData(wxT("DELETE"), ContactFilename, wxT(""));
1026 ConnHandle.ProcessData();
1028 SSLCertCollection certcol = ConnHandle.GetCertificateData();
1030 // Check if any errors have occured whilst getting the data.
1032 int ErrorCode = ConnHandle.GetResultCode();
1034 if (ErrorCode != CURLE_OK){
1039 ETagDBPtr->RemoveETag(ContactFilename);
1042 CardDAVIter->second = NULL;
1047 } else if (TypeIter->second == 3) {
1049 wxString AccountNameFriendly;
1053 for (int i = 0; i < PrefData.accounts.GetCount(); i++){
1055 wxString AccountDirCheck = PrefData.accounts.GetAccountDirectory(i);
1057 AccountDirCheck.Trim();
1058 AccountDirCheck.Append(wxT(".carddav"));
1060 if (AccountDirCheck == StringAccountIter->second){
1062 AccountNameFriendly = PrefData.accounts.GetAccountName(i);
1069 bool KeepUpdating = TRUE;
1071 while (KeepUpdating == TRUE){
1073 StringTaskDetailIter = ActivityListTaskDetail.find(iter->first);
1075 AccountDir = StringAccountIter->second;
1077 ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir);
1079 wxArrayString vCardAdd;
1080 wxArrayString vCardDelete;
1081 wxArrayString vCardList;
1082 wxArrayString vCardUpdateLocal;
1083 wxArrayString vCardUpdateRemote;
1084 wxArrayString vCardUpdateLog;
1085 std::map<wxString,wxString> vCardETag;
1086 ContactListData ServerContactList;
1088 std::map<wxString,vCardDownloadDataFileClass> vCardDownloadData;
1089 //wxArrayString vCardDownload;
1090 //std::map<wxString,wxString> vCardDownloadData;
1092 // Get the list of vCard files locally.
1094 wxString AccountDirFinal;
1095 wxString AccountSyncTokenFilename;
1096 wxString SyncTokenLoad;
1098 #if defined(__HAIKU__)
1100 //preffilename = wxT("noo");
1102 #elif defined(__WIN32__)
1104 AccountDirFinal = GetAccountDir(AccountDir, FALSE);
1105 AccountSyncTokenFilename = AccountDirFinal;
1106 AccountSyncTokenFilename.Append(wxT("synctoken"));
1110 AccountDirFinal = GetAccountDir(AccountDir, FALSE);
1111 AccountSyncTokenFilename = AccountDirFinal;
1112 AccountSyncTokenFilename.Append(wxT("synctoken"));
1116 // Suppress Error Messages.
1118 wxLogNull PleaseDoNotDisturb;
1121 SyncLoad.Open(AccountSyncTokenFilename, wxT("r"));
1123 if (SyncLoad.IsOpened()){
1125 SyncLoad.ReadAll(&SyncTokenLoad, wxMBConvUTF8());
1130 // Get a list of vCard files from the server.
1132 // Get the list of vCard files from the ETagDB.
1134 std::map<wxString,ETagData> ETagDBData = ETagDBPtr->GetETagData();
1136 bool ExitLoop = FALSE;
1138 std::map<wxString,FileSyncData> *SCListData = NULL;
1140 while (ExitLoop == FALSE){
1142 // Check if any errors have occured whilst getting the data.
1144 int ErrorCode = ConnHandle.SSLVerifyTest();
1146 if (ErrorCode != CURLE_OK){
1148 if (ErrorCode == CURLE_SSL_CACERT ||
1149 ErrorCode == CURLE_PEER_FAILED_VERIFICATION ||
1150 ErrorCode == CURLE_SSL_CONNECT_ERROR){
1152 // Invalid SSL certificate so bring up a dialog to the user
1153 // explaining what has happened and the options available.
1155 // Stop all the timers.
1157 frmMainPtrGet->PauseAllTimers();
1161 #if defined(__APPLE__)
1163 // Bring up the trust panel and display the SSL certificate dialog.
1165 SSLResult = DisplayTrustPanel(ConnHandle.GetTrustObject(), AccountNameFriendly);
1167 // Update the SSL account with the trust object.
1169 if (SSLResult != NSOKButton){
1171 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetTrustObject());
1177 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetTrustObject());
1181 #elif defined(__WIN32__)
1183 BOOL ModifiedCertificateData;
1184 CRYPTUI_VIEWCERTIFICATE_STRUCTW CertificateData = BuildCertificateData(&ConnHandle, (HWND)frmMainPtrGet->GetHandle());
1186 if (!CryptUIDlgViewCertificate(&CertificateData, &ModifiedCertificateData)){
1187 wxMessageBox(_("An error occured while trying to open the certificate dialog."), _("Error opening Certificate Information dialog"));
1190 if (ModifiedCertificateData == FALSE){
1192 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetCertificateContextPointer());
1198 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateContextPointer());
1203 // Setup the data to be sent in the wxPostEvent command.
1205 SSLInvalidCertNotifObj SSLICNProcData;
1207 SSLCertCollection certcol = ConnHandle.GetSSLVerifyResults();
1209 bool *PauseMode = new bool;
1213 qrn.QResponse = &SSLResult;
1214 qrn.PausePtr = PauseMode;
1216 SSLICNProcData.CertCollection = certcol;
1217 SSLICNProcData.QRNotifData = &qrn;
1218 SSLICNProcData.AccountName = AccountNameFriendly;
1220 wxCommandEvent event(INVALIDSSLCERT);
1221 event.SetClientData(&SSLICNProcData);
1222 wxPostEvent(frmMainPtrGet, event);
1224 while (*PauseMode == TRUE){
1225 //nanosleep(&n1, &n2);
1226 SleepFor(250000000);
1229 // Process the response from the user.
1231 if (SSLResult == 1){
1233 // Accept the certificate. Write the certificate into the account
1234 // directory (as server.crt) - will overwrite old certificate.
1236 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetSSLVerifyResults());
1237 WriteServerCertificate(AccountDir, ConnHandle.GetSSLVerifyResults());
1239 } else if (SSLResult == 2){
1241 // Reject the certificate, abort the task and mark as failed.
1243 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetSSLVerifyResults());
1251 // Resume all the timers.
1253 frmMainPtrGet->ResumeAllTimers();
1271 if (iter->second == 2 || iter->second == 3 || iter->second == 4){
1275 #if defined(__APPLE__)
1277 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetTrustObject());
1279 #elif defined(__WIN32__)
1281 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateContextPointer());
1285 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetSSLVerifyResults());
1289 // Look in directory and see which vCards to add and delete
1292 // vCard exists but not in ETagDB - Add (and upload).
1293 // vCard missing but in ETagDB - Delete (from server).
1295 // Start by looking for vCards that are not in the ETagDB.
1297 wxDir AccDir(AccountDirFinal);
1298 wxString AccDirFilename;
1300 bool ContinueProcess = AccDir.GetFirst(&AccDirFilename, wxEmptyString, wxDIR_DEFAULT);
1302 ServerContactList = ConnHandle.GetContactList(SyncTokenLoad.ToUTF8());
1304 int ErrorCode = ConnHandle.GetResultCode();
1306 if (ErrorCode != CURLE_OK){
1313 SSLCertCollection certcol = ConnHandle.GetCertificateData();
1315 // Create a pointer for the std::map<wxString,FileSyncData>.
1317 SCListData = &ServerContactList.ListData;
1319 // Process the server data.
1321 if (SCListData != NULL){
1323 for (std::map<wxString, FileSyncData>::iterator fsiter = SCListData->begin();
1324 fsiter != SCListData->end(); fsiter++){
1326 // Check the mode of the file before adding.
1328 // Get the HTTP status of the file from the list.
1330 FileSyncData fsd = fsiter->second;
1332 if (fsd.DataFlag == 1){
1334 // Added or modified contact.
1336 //vCardAdd.Add(fsiter->first, 1);
1338 vCardDownloadDataFileClass vCardNewData;
1339 vCardNewData.DataType = 0;
1340 vCardDownloadData.insert(std::make_pair(fsiter->first, vCardNewData));
1342 //} else if (fsd.DataFlag == 1){
1344 // Contact has been modified on the server.
1346 // vCardUpdateLocal.Add(fsiter->first, 1);
1349 else if (fsd.DataFlag == 2){
1351 // Contact has been deleted.
1353 vCardDelete.Add(fsiter->first, 1);
1361 // Look for vCards that are missing but in the ETagDB.
1363 for (std::map<wxString,ETagData>::iterator etagiter = ETagDBData.begin();
1364 etagiter != ETagDBData.end(); etagiter++){
1366 // Check if the vCard exists.
1368 if (!wxFileExists(AccountDirFinal + etagiter->first)){
1370 // vCard doesn't exist so mark for deleting.
1372 vCardDelete.Add(etagiter->first, 1);
1378 // Compare Server with the ETag DB. Work out which
1379 // needs to updated remotely and which needs to be
1382 for (std::map<wxString,FileSyncData>::iterator srviter = SCListData->begin();
1383 srviter != SCListData->end(); srviter++){
1385 if (ETagDBData.find(srviter->first) == ETagDBData.end()){
1389 std::map<wxString,ETagData>::iterator lociter = ETagDBData.find(srviter->first);
1391 ETagData etd = lociter->second;
1392 FileSyncData fsd = srviter->second;
1394 wxString ETagSrv = fsd.ETagData;
1396 // Check if the local ETag value has 'DELETED' set and skip
1397 // checking this file if it does.
1399 if (etd.ETagValue == "DELETED"){
1405 // Compare local ETag with original local ETag.
1406 // If different, update to server is required.
1408 if (etd.ETagValue != etd.ETagOrigValue){
1410 // Check if local original ETag is different from server ETag.
1411 // If it is then throw up a conflict resolution dialog.
1413 if (etd.ETagOrigValue != ETagSrv){
1415 vCard34Conv vCard34Obj;
1417 wxString ServerContactData;
1418 wxString FullFilename;
1420 vCard ConvertedV4Data;
1422 // Conflict. Bring up conflict resolution dialog.
1424 // Get the server contact data for comparison.
1426 ConnHandle.SetServerFilename(srviter->first);
1427 ConnHandle.GetServerContactData();
1428 ServerContactData = ConnHandle.GetPageData();
1430 FullFilename = CreateFilenamePath(AccountDirFinal, srviter->first);
1432 // Convert it to v4.
1434 vCard34Obj.ConvertToV4(&ServerContactData, &ConvertedV4Data);
1436 vCardConflictObj vCardProcData;
1438 vCardProcData.vCardLocalData = &ClientData;
1439 vCardProcData.vCardServerData = &ConvertedV4Data;
1441 // Load the client data from the filename given.
1443 ClientData.LoadFile(FullFilename);
1447 bool *PauseMode = new bool;
1450 frmMain *frmMainPtrGet = static_cast<frmMain*>(frmMainPtr);
1453 qrn.QResponse = &ConflictResult;
1454 qrn.PausePtr = PauseMode;
1456 vCardProcData.QRNotifData = &qrn;
1458 wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED);
1459 event.SetClientData(&vCardProcData);
1460 wxPostEvent(frmMainPtrGet, event);
1462 while (*PauseMode == TRUE){
1463 //nanosleep(&n1, &n2);
1464 SleepFor(250000000);
1470 // If replacing local version, store copy for now.
1471 // Otherwise upload to server.
1473 if (ConflictResult == 0){
1479 } else if (ConflictResult == 1){
1481 // Decided to use client version.
1483 vCardUpdateLocal.Remove(srviter->first);
1484 vCardUpdateRemote.Add(srviter->first, 1);
1486 } else if (ConflictResult == 2){
1488 // Decided to use server version.
1489 // Store the converted downloaded copy for
1490 // processing later.
1492 //vCardUpdateLocal.Add(srviter->first, 1);
1494 vCardDownloadDataFileClass vCardNewData;
1495 vCardNewData.DataType = 1;
1496 vCardNewData.FileData = ConvertedV4Data.WriteString();
1498 ConvertedV4Data.WriteFile(FullFilename);
1500 vCardDownloadData.insert(std::make_pair(srviter->first, vCardNewData));
1508 // Send vCard to the server.
1510 vCardUpdateRemote.Add(srviter->first, 1);
1516 // Check if local ETag is different from server ETag.
1517 // If different, obtain the vCard from the server.
1519 if (etd.ETagOrigValue != ETagSrv){
1521 vCardUpdateLocal.Add(srviter->first, 1);
1529 // Process the vCards that need to be downloaded and added/overwritten.
1531 wxString vCardFilenameFinal;
1532 wxString vCardOutputData;
1533 wxString vCardInputData;
1534 wxString ETagFileData;
1537 for (std::map<wxString,vCardDownloadDataFileClass>::iterator additer = vCardDownloadData.begin();
1538 additer != vCardDownloadData.end(); additer++){
1540 vCardFilenameFinal.Clear();
1541 vCardInputData.Clear();
1542 vCardOutputData.Clear();
1543 ETagFileData.Clear();
1545 vCardFilenameFinal = CreateFilenamePath(AccountDirFinal, additer->first);
1547 ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir);
1549 if (additer->second.DataType == 0){
1551 vCard ConvertedV4Data;
1553 // Grab the file from the server and write the contact out.
1555 vCard34Conv vCard34Obj;
1557 ConnHandle.SetServerFilename(additer->first);
1558 ConnHandle.GetServerContactData();
1559 vCardInputData = ConnHandle.GetPageData();
1561 vCard34Obj.ConvertToV4(&vCardInputData, &ConvertedV4Data);
1563 ConvertedV4Data.WriteFile(vCardFilenameFinal);
1565 // Update the ETagDB.
1567 //vCardFile.Open(vCardFilenameFinal, wxT("w"));
1569 //if (vCardFile.IsOpened()){
1571 // vCardFile.Write(vCardOutputData, wxConvAuto());
1572 // vCardFile.Close();
1576 // Get the server ETag.
1578 wxString ServerETag;
1579 ConnHandle.GetServerETagValueThread();
1580 ServerETag = ConnHandle.ETagValueResult();
1582 // Add to the ETag Database.
1584 ETagDBPtr->AddETag(additer->first, ServerETag, ServerETag);
1586 } else if (additer->second.DataType == 1){
1588 // Write out the contact to the account directory.
1590 vCardFilenameFinal = CreateFilenamePath(AccountDirFinal, additer->first);
1591 vCardOutputData = additer->second.FileData;
1593 vCardFile.Open(vCardFilenameFinal, wxT("w"));
1595 if (vCardFile.IsOpened()){
1597 vCardFile.Write(vCardOutputData, wxConvAuto());
1602 // Update the ETagDB.
1604 wxString ServerETag;
1605 ConnHandle.GetServerETagValueThread();
1606 ServerETag = ConnHandle.ETagValueResult();
1608 // Add to the ETag Database.
1610 ETagDBPtr->AddETag(additer->first, ServerETag, ServerETag);
1615 // Look for vCard files which aren't in the ETagDB.
1617 while(ContinueProcess){
1619 // Check and make sure that the filename ends in .vcf/.vcard
1620 // Skip any file that beings with a dot.
1622 if (AccDirFilename.Left(1) == wxT(".")){
1624 ContinueProcess = AccDir.GetNext(&AccDirFilename);
1629 if (AccDirFilename.Right(4) != wxT(".vcf") &&
1630 AccDirFilename.Right(6) != wxT(".vcard")){
1632 ContinueProcess = AccDir.GetNext(&AccDirFilename);
1637 // Look in the ETagDB for the file.
1639 bool ETagExists = ETagDBPtr->CheckETagExists(AccDirFilename);
1641 if (ETagExists == FALSE){
1643 // Add the vCard to the list to be added.
1645 vCardAdd.Add(AccDirFilename, 1);
1649 ContinueProcess = AccDir.GetNext(&AccDirFilename);
1653 // Process the vCards to add/update to the server.
1655 for (int vi = 0; vi < vCardAdd.GetCount(); vi++){
1657 ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir);
1658 ETag = ETagDBPtr->GetETag(vCardAdd[vi]);
1659 ETagOriginal = ETagDBPtr->GetETagOriginal(vCardAdd[vi]);
1661 ContactFilename = vCardAdd[vi];
1662 FullFilename = CreateFilenamePath(AccountDirFinal, vCardAdd[vi]);
1664 ContactFilename.Trim();
1666 if (ETag == ETagOriginal && ETagDBPtr->ETagExists(vCardAdd[vi])){
1668 // Compare the ETag with the Server ETag.
1670 ConnHandle.SetServerFilename(vCardAdd[vi]);
1671 ConnHandle.GetServerETagValueThread();
1672 ETagServer = ConnHandle.ETagValueResult();
1674 if (ETagOriginal != ETagServer){
1676 // Server ETag is different from original ETag.
1677 // This is a conflict which the user will now
1680 frmMain *frmMainPtrGet = static_cast<frmMain*>(frmMainPtr);
1682 vCard34Conv vCard34Obj;
1684 wxString ServerContactData;
1686 vCard ConvertedV4Data;
1688 // Load the client data from the filename given.
1690 ConnHandle.GetServerContactData();
1691 ServerContactData = ConnHandle.GetPageData();
1693 // Process v3 version into v4 version.
1695 vCard34Obj.ConvertToV4(&ServerContactData, &ConvertedV4Data);
1697 vCardConflictObj vCardProcData;
1699 vCardProcData.vCardLocalData = &ClientData;
1700 vCardProcData.vCardServerData = &ConvertedV4Data;
1701 ClientData.LoadFile(FullFilename);
1703 //ContactConflictEvent event(ContactConflictCmdEnv);
1704 //event.SetData(ContactFilename, Moo1, Moo2);
1706 //wxPostEvent(frmMainPtrGet, event);
1708 // Setup Conflict Resolution Dialog.
1710 // Fetch Data from Server and convert.
1712 bool *PauseMode = new bool;
1717 qrn.QResponse = &ConflictResult;
1718 qrn.PausePtr = PauseMode;
1720 vCardProcData.QRNotifData = &qrn;
1722 wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED);
1723 event.SetClientData(&vCardProcData);
1724 wxPostEvent(frmMainPtrGet, event);
1726 while (*PauseMode == TRUE){
1727 //nanosleep(&n1, &n2);
1728 SleepFor(250000000);
1734 //intResult = frmMainPtrGet->ShowConflictDialog(&Moo1, &Moo2);
1736 if (ConflictResult == 0){
1743 } else if (ConflictResult == 1){
1745 // Decided to use client version.
1747 ConnHandle.ProcessData();
1751 } else if (ConflictResult == 2){
1753 // Decided to use server version.
1755 // Download server version.
1757 ConvertedV4Data.WriteFile(CreateFilenamePath(AccountDirFinal, vCardAdd[vi]));
1765 // Setup the filename for the contact being added.
1767 wxString wxSFilename = CreateFilenamePath(AccountDirFinal, vCardAdd[vi]);
1768 wxString wxSCardData;
1772 // Load the data from the file.
1775 wxFCard.Open(wxSFilename, wxT("r"));
1777 if (wxFCard.IsOpened()){
1779 wxFCard.ReadAll(&wxSCardData, wxConvAuto());
1784 // Convert the data to v3.
1786 vCard34Conv vCard34Obj;
1788 vCard34Obj.ConvertToV3(wxSFilename, &TaskData);
1790 // Setup the URL address.
1792 //TaskURL = StringTaskDetailIter->second + wxT("/") + vCardAdd[vi];
1794 // Upload the data to the server.
1796 ConnHandle.SetUploadMode(TRUE);
1797 ConnHandle.SetupData(wxT("PUT"), vCardAdd[vi], TaskData);
1798 ConnHandle.ProcessData();
1800 // Get the Server ETag and put it in the ETag database.
1802 ConnHandle.SetServerFilename(vCardAdd[vi]);
1803 ConnHandle.GetServerETagValueThread();
1804 ETagServer = ConnHandle.ETagValueResult();
1806 ETagDBPtr->AddETag(vCardAdd[vi], ETagServer, ETagServer);
1812 if (ETagOriginal != ETagServer){
1814 // Server ETag is different from original ETag.
1815 // This is a conflict which the user will now
1818 frmMain *frmMainPtrGet = (frmMain *)frmMainPtr;
1820 //ContactConflictEvent event(ContactConflictCmdEnv);
1821 //event.SetData(ContactFilename, Moo1, Moo2);
1823 vCard34Conv vCard34Obj;
1825 wxString ServerContactData;
1827 vCard ConvertedV4Data;
1829 // Load the client data from the filename given.
1831 ConnHandle.GetServerContactData();
1832 ServerContactData = ConnHandle.GetPageData();
1833 ClientData.LoadFile(FullFilename);
1835 // Process v3 version into v4 version.
1837 vCard34Obj.ConvertToV4(&ServerContactData, &ConvertedV4Data);
1839 vCardConflictObj vCardProcData;
1841 vCardProcData.vCardLocalData = &ClientData;
1842 vCardProcData.vCardServerData = &ConvertedV4Data;
1844 bool *PauseMode = new bool;
1849 qrn.QResponse = &ConflictResult;
1850 qrn.PausePtr = PauseMode;
1852 vCardProcData.QRNotifData = &qrn;
1854 wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED);
1855 event.SetClientData(&vCardProcData);
1856 wxPostEvent(frmMainPtrGet, event);
1858 while (*PauseMode == TRUE){
1859 //nanosleep(&n1, &n2);
1860 SleepFor(250000000);
1866 //intResult = frmMainPtrGet->ShowConflictDialog(&Moo1, &Moo2);
1868 if (ConflictResult == 0){
1875 } else if (ConflictResult == 1){
1877 // Decided to use client version.
1879 ConnHandle.ProcessData();
1880 //ETagServer = CardDAVIter->second.GetServerETagValueThread();
1881 //ETagDBPtr->UpdateETag(ContactFilename, ETagServer, ETagServer);
1885 } else if (ConflictResult == 2){
1887 // Decided to use server version.
1889 // Write server version to file.
1891 ConvertedV4Data.WriteFile(CreateFilenamePath(AccountDirFinal, vCardAdd[vi]));
1899 // Setup the filename for the contact being added.
1901 wxString wxSFilename = CreateFilenamePath(AccountDirFinal, vCardAdd[vi]);
1902 wxString wxSCardData;
1906 // Load the data from the file.
1909 wxFCard.Open(wxSFilename, wxT("r"));
1911 if (wxFCard.IsOpened()){
1913 wxFCard.ReadAll(&wxSCardData, wxConvAuto());
1918 // Convert the data to v3.
1920 vCard34Conv vCard34Obj;
1922 vCard34Obj.ConvertToV3(wxSFilename, &TaskData);
1924 // Setup the URL address.
1926 //TaskURL = StringTaskDetailIter->second + wxT("/") + vCardAdd[vi];
1928 // Upload the data to the server.
1930 ConnHandle.SetUploadMode(TRUE);
1931 ConnHandle.SetupData(wxT("PUT"), vCardAdd[vi], TaskData);
1932 ConnHandle.ProcessData();
1934 // Get the Server ETag and put it in the ETag database.
1936 ConnHandle.SetServerFilename(vCardAdd[vi]);
1937 ConnHandle.GetServerETagValueThread();
1938 ETagServer = ConnHandle.ETagValueResult();
1941 ETagDBPtr->AddETag(vCardAdd[vi], ETagServer, ETagServer);
1949 // Process the vCards to delete locally.
1951 for (int vi = 0; vi < vCardDelete.GetCount(); vi++){
1953 if (!wxRemoveFile(CreateFilenamePath(AccountDirFinal, vCardDelete[vi]))){
1957 ETagDBPtr->RemoveETag(vCardDelete[vi]);
1963 // Process the vCards to delete from the server.
1965 std::map<wxString,wxString> *ETagFilenameMap = ETagDBPtr->GetFilenamePointer();
1966 std::list<wxString> DeleteList;
1968 for (std::map<wxString,wxString>::iterator deliter = ETagFilenameMap->begin();
1969 deliter != ETagFilenameMap->end(); deliter++){
1971 // Look through the ETagDB and find contacts which are marked as DELETED.
1973 if (deliter->second == wxT("DELETED")){
1975 ConnHandle.SetUploadMode(FALSE);
1976 ConnHandle.SetupData(wxT("DELETE"), deliter->first, wxT(""));
1977 ConnHandle.ProcessDataThread();
1979 // Delete the ETag as the file has now been deleted.
1981 DeleteList.push_back(deliter->first);
1987 for (std::list<wxString>::iterator removeetagiter = DeleteList.begin();
1988 removeetagiter != DeleteList.end(); removeetagiter++){
1990 ETagDBPtr->RemoveETag(*removeetagiter);
1994 // Write out the update server sync token.
1996 wxString ServerSyncToken = ServerContactList.SyncToken;
1998 ServerSyncToken.Trim();
2000 if (!ServerSyncToken.IsEmpty()){
2003 SyncWrite.Open(AccountSyncTokenFilename, wxT("w"));
2005 if (SyncWrite.IsOpened()){
2007 SyncWrite.Write(ServerSyncToken, wxConvAuto());
2014 // Check for another sync token. If there is another
2015 // sync token then repeat this. If token matches then stop processing.
2017 if (SyncTokenLoad == ServerSyncToken){
2019 KeepUpdating = FALSE;
2025 // Mark as completed.
2027 wxString AccountNameFinal;
2028 AccountNameFinal = PrefData.accounts.GetAccountDirectory(AccountID);
2029 AccountNameFinal.Append(wxT(".carddav"));
2031 wxCommandEvent reloadevent(RELOADCONTACTLIST);
2032 reloadevent.SetString(AccountNameFinal);
2033 wxPostEvent(this->GetParent(), reloadevent);
2040 // Update the data to the server.
2042 ConnHandle.ProcessData();
2051 n1.tv_nsec = 250000000L;*/
2053 while (iter->second == 1){
2055 SleepFor(250000000);
2056 //nanosleep(&n1, &n2);
2060 if ((iter->second == 4 && TypeIter->second == 0) ||
2061 (iter->second == 8 && TypeIter->second == 0)){
2063 AccountDir = StringAccountIter->second;
2064 ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir);
2066 ConnHandle.GetServerETagValueThread();
2067 ETagServer = ConnHandle.ETagValueResult();
2068 ETagDBPtr->UpdateETag(ContactFilename, ETagServer, ETagServer);
2072 if ((iter->second == 4 && TypeIter->second == 1) ||
2073 (iter->second == 8 && TypeIter->second == 1)){
2075 AccountDir = StringAccountIter->second;
2076 ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir);
2078 ConnHandle.GetServerETagValueThread();
2079 ETagServer = ConnHandle.ETagValueResult();
2080 ETagDBPtr->UpdateETag(ContactFilename, ETagServer, ETagServer);
2090 if (TasksFoundProc == FALSE){
2092 TasksActive = FALSE;
2093 ProcessTasksData = FALSE;
2097 wxCommandEvent eventp(ACTMGR_STARTTIMER);
2098 wxPostEvent(this, eventp);
2100 //AnimationTimer.StartAnimation();
2101 //ActListProcTimer.Start();
2105 wxCommandEvent event(ACTMGR_STARTPROCESSTIMER);
2106 wxPostEvent(this, event);
2108 //ActProcessTimer.Start();
2112 void frmActivityMgr::ProcessTasks()
2115 std::thread ProcessThread(&frmActivityMgr::ProcessTasksThread, this);
2116 ProcessThread.detach();
2120 void frmActivityMgr::SetupPointers(wxETagProcessTimer *ETagTmrPtrInc, void *frmMainPtrInc)
2123 ETagTmrPtr = ETagTmrPtrInc;
2125 frmMainPtr = frmMainPtrInc;
2129 void frmActivityMgr::ResumeProcessing(wxCommandEvent &event){
2131 QRNotif *qrn = (QRNotif *)event.GetClientData();
2133 int *QRes = qrn->QResponse;
2135 *qrn->PausePtr = FALSE;
2137 *QRes = event.GetInt();
2141 void frmActivityMgr::ToggleConnectionStatus( wxCommandEvent &event ){
2143 wxCommandEvent connevent(CONNSTAT_UPDATE);
2145 if (ApplicationSleepMode == FALSE){
2147 connevent.SetInt(1);
2148 ApplicationSleepMode = TRUE;
2149 mnuSleepMode->Check(true);
2153 connevent.SetInt(0);
2154 ApplicationSleepMode = FALSE;
2155 mnuSleepMode->Check(false);
2157 wxCommandEvent event(ACTMGR_STARTTIMER);
2158 wxPostEvent(this, event);
2160 wxCommandEvent eventp(ACTMGR_STARTPROCESSTIMER);
2161 wxPostEvent(this, eventp);
2165 wxPostEvent(GetParent(), connevent);
2169 void frmActivityMgr::SleepMode( wxCommandEvent &event ){
2171 wxCommandEvent connevent(ACTMGR_TOGGLECONN);
2173 wxPostEvent(this, connevent);
2177 void frmActivityMgr::WriteServerCertificate(wxString AccountName, SSLCertCollection SSLCertInc){
2179 wxString ServerCertFinal;
2181 // Get the Cert section of the certificate and write it to the file.
2183 ServerCertFinal = GetAccountDir(AccountName, TRUE);
2187 std::map<int, SSLCertData>::iterator SSLCDIter = SSLCertInc.SSLCollection.find(0);
2188 std::multimap<wxString,wxString>::iterator SSLDataIter = SSLCDIter->second.CertData.find(wxT("Cert"));
2190 CertFile.Open(ServerCertFinal, wxFile::write);
2192 CertFile.Write(SSLDataIter->second, wxConvUTF8);
2197 void frmActivityMgr::StartTimer(wxCommandEvent& event){
2199 ActListProcTimer.Start(1000, FALSE);
2203 void frmActivityMgr::StopTimer(wxCommandEvent& event){
2205 ActListProcTimer.Stop();
2209 void frmActivityMgr::StartProcessTimer(wxCommandEvent& event){
2211 ActProcessTimer.Start(1000, FALSE);
2215 void frmActivityMgr::StopProcessTimer(wxCommandEvent& event){
2217 ActProcessTimer.Stop();
2221 void frmActivityMgr::StartAnimationTimer(wxCommandEvent& event){
2223 AnimationTimer.StartAnimation();
2227 void frmActivityMgr::UpdateStatusLabel(wxCommandEvent& event){
2229 ActivityMgrLabelUpdate *actmgrudata = (ActivityMgrLabelUpdate*)event.GetClientData();
2231 if (actmgrudata != NULL){
2233 lstActivity->SetItem(actmgrudata->ItemIndex, 2, actmgrudata->ItemLabel);
2235 /*if (!actmgrudata->ItemDes.IsEmpty()){
2236 lstActivity->SetItem(actmgrudata->ItemIndex, 0, actmgrudata->ItemDes);