1 // frmActivityMgr.cpp - Activity Manager form.
3 // (c) 2012-2015 Xestia Software Development.
5 // This file is part of Xestia Address Book.
7 // Xestia Address Book is free software: you can redistribute it and/or modify
8 // it under the terms of the GNU General Public License as published by the
9 // Free Software Foundation, version 3 of the license.
11 // Xestia Address Book is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 // GNU General Public License for more details.
16 // You should have received a copy of the GNU General Public License along
17 // with Xestia Address Book. If not, see <http://www.gnu.org/licenses/>
19 #include "frmActivityMgr.h"
20 #include <wx/mstream.h>
23 #include <wx/tokenzr.h>
25 #include <wx/filefn.h>
28 #include <curl/curl.h>
30 #include "../bitmaps.h"
32 #include "../common/preferences.h"
33 #include "../frmConflictResolution.h"
34 #include "../frmInvalidSSLCertificate.h"
35 #include "../frmMain.h"
36 #include "../common/events.h"
37 #include "../common/filename.h"
38 #include "../vcard/vcard34conv.h"
39 #include "../vcard/vcard.h"
41 DEFINE_EVENT_TYPE(ACTMGR_RESUMEPROC);
42 DEFINE_EVENT_TYPE(ACTMGR_TOGGLECONN);
43 DEFINE_EVENT_TYPE(ACTMGR_STARTTIMER);
44 DEFINE_EVENT_TYPE(ACTMGR_STOPTIMER);
45 DEFINE_EVENT_TYPE(ACTMGR_STARTPROCESSTIMER);
46 DEFINE_EVENT_TYPE(ACTMGR_STOPPROCESSTIMER);
47 DEFINE_EVENT_TYPE(ACTMGR_UPDATESTATUSLABEL);
49 BEGIN_EVENT_TABLE(frmActivityMgr, wxWindow)
50 EVT_COMMAND(wxID_ANY, ACTMGR_RESUMEPROC, frmActivityMgr::ResumeProcessing)
51 EVT_COMMAND(wxID_ANY, ACTMGR_TOGGLECONN, frmActivityMgr::ToggleConnectionStatus)
52 EVT_COMMAND(wxID_ANY, ACTMGR_STARTTIMER, frmActivityMgr::StartTimer)
53 EVT_COMMAND(wxID_ANY, ACTMGR_STOPTIMER, frmActivityMgr::StopTimer)
54 EVT_COMMAND(wxID_ANY, ACTMGR_STARTPROCESSTIMER, frmActivityMgr::StartProcessTimer)
55 EVT_COMMAND(wxID_ANY, ACTMGR_STOPPROCESSTIMER, frmActivityMgr::StopProcessTimer)
56 EVT_COMMAND(wxID_ANY, ACTMGR_UPDATESTATUSLABEL, frmActivityMgr::UpdateStatusLabel)
59 frmActivityMgr::frmActivityMgr( wxWindow* parent )
61 frmActivityMgrADT( parent )
64 wxMemoryInputStream istream(icons_activitywindow_png, sizeof(icons_activitywindow_png));
65 wxImage icons_activitywindow_pngi(istream, wxBITMAP_TYPE_PNG);
66 wxBitmap activityiconbmp(icons_activitywindow_pngi, -1);
68 activityicon.CopyFromBitmap(activityiconbmp);
69 this->SetIcon(activityicon);
71 wxMemoryInputStream istream2(misc_activitysleep_png, sizeof(misc_activitysleep_png));
72 wxImage misc_activitysleep_pngi(istream2, wxBITMAP_TYPE_PNG);
73 wxBitmap sleepiconbmp(misc_activitysleep_pngi, -1);
74 SleepBitmap = sleepiconbmp;
75 bmpActivity->SetBitmap(SleepBitmap);
76 ActProcessTimer.SetupPointers(this);
77 lblDetails->SetLabel(_("No activity."));
79 ActListProcTimer.SetupPointers(&ActivityList, &ActivityListIndex, &ActivityListTaskDetail,
80 &TasksActive, lstActivity, lblDetails, GauProgress, this, &AnimationTimer,
81 &ActProcessTimer, &ActivityListFinDate, &ActivityListConn);
83 AnimationTimer.SetBitmap(bmpActivity);
84 AnimationTimer.SetSleepBitmap(&SleepBitmap);
85 AnimationTimer.SetupPointer(this->GetParent());
87 wxListItem ColumnData;
89 ColumnData.SetText(_("Activity"));
90 ColumnData.SetWidth(175);
91 lstActivity->InsertColumn(0, ColumnData);
93 wxListItem ColumnData2;
95 ColumnData2.SetText(_("Account"));
96 ColumnData2.SetWidth(100);
97 lstActivity->InsertColumn(1, ColumnData2);
99 wxListItem ColumnData3;
100 ColumnData3.SetId(2);
101 ColumnData3.SetText(_("Status"));
102 ColumnData3.SetWidth(100);
103 lstActivity->InsertColumn(2, ColumnData3);
105 //AnimationTimer.StartAnimation();
107 // Create recovery database if it doesn't exist.
109 wxString RecoveryFilename = GetRecoveryDB();
113 if (wxFile::Exists(RecoveryFilename) == FALSE){
115 // Create the recovery database.
117 RecoveryDB.Open(RecoveryFilename.c_str(), wxFile::write);
119 RecoveryDB.Write(wxT("BEGIN:XAB-RECOVERYDB\r\n"), wxConvUTF8);
120 RecoveryDB.Write(wxT("VERSION:1.0\r\n"), wxConvUTF8);
121 RecoveryDB.Write(wxT("COMMENT:Please do not alter or delete this file. DATA LOSS IS POSSIBLE!\r\n"), wxConvUTF8);
122 RecoveryDB.Write(wxT("END:XAB-RECOVERYDB\r\n"), wxConvUTF8);
129 #if wxABI_VERSION < 20900
130 RecoveryDBF.Open(RecoveryFilename.c_str(), wxT("r"));
132 RecoveryDBF.Open(RecoveryFilename, wxT("r"));
135 // Load the recovery database for tasks not done.
137 if (RecoveryDBF.IsOpened() == TRUE){
139 wxString wxSRecoveryDB;
140 wxString RecoveryLine;
142 // Check if we are using wxWidgets version 2.8 or less and
143 // execute the required command accordingly.
145 RecoveryDBF.ReadAll(&wxSRecoveryDB, wxConvAuto());
149 std::map<int, wxString> RecoveryFileLines;
150 std::map<int, wxString>::iterator striter;
152 wxStringTokenizer wSTRecoveryDBLines(wxSRecoveryDB, wxT("\r\n"));
154 int RecoveryLineSeek = 0;
156 while (wSTRecoveryDBLines.HasMoreTokens() == TRUE){
158 RecoveryLine = wSTRecoveryDBLines.GetNextToken();
159 RecoveryFileLines.insert(std::make_pair(RecoveryLineSeek, RecoveryLine));
168 //TestTimer.Start(50, FALSE);
171 void frmActivityMgr::OpenWindow()
176 void frmActivityMgr::CloseWindow( wxCommandEvent& event )
182 void frmActivityMgr::CloseWindow( wxCloseEvent& event )
188 void frmActivityMgr::ProcessTasksThread()
191 if (ProcessTasksData == FALSE){
197 std::map<int,int>::iterator TypeIter;
198 std::map<int,wxString>::iterator StringIter;
199 std::map<int,wxString>::iterator StringDataIter;
200 std::map<int,wxString>::iterator StringURLIter;
201 std::map<int,wxString>::iterator StringDetailIter;
202 std::map<int,wxString>::iterator StringAccountIter;
203 std::map<int,wxString>::iterator StringFilenameIter;
204 std::map<int,wxString>::iterator StringFullFilenameIter;
205 std::map<int,wxString>::iterator StringTaskDetailIter;
206 std::map<int,wxString>::iterator StringETagIter;
207 std::map<int,wxString>::iterator StringETagOrigIter;
208 std::map<int,CardDAV*>::iterator CardDAVIter;
209 std::map<int,ActivityMgrAccountSettings>::iterator AccountSettingsIter;
210 std::map<int,long>::iterator LongIter;
211 bool TasksFoundProc = FALSE;
214 for (std::map<int,int>::iterator iter = ActivityList.begin();
215 iter != ActivityList.end(); ++iter){
217 // Check for any queued tasks and start one.
219 if (iter->second > 4){
223 CardDAVIter = ActivityListConn.find(iter->first);
224 TypeIter = ActivityListType.find(iter->first);
225 StringETagIter = ActivityListETag.find(iter->first);
226 StringETagOrigIter = ActivityListETagOriginal.find(iter->first);
227 StringAccountIter = ActivityListAccount.find(iter->first);
228 StringFilenameIter = ActivityListFilename.find(iter->first);
229 StringFullFilenameIter = ActivityListFullFilename.find(iter->first);
230 AccountSettingsIter = ActivityListAccSettings.find(iter->first);
232 // Setup the CardDAV object.
236 ConnHandle.SetupConnection(AccountSettingsIter->second.Address,
237 AccountSettingsIter->second.Port,
238 AccountSettingsIter->second.Username,
239 AccountSettingsIter->second.Password,
240 AccountSettingsIter->second.SSL,
241 AccountSettingsIter->second.Prefix,
242 AccountSettingsIter->second.Dir);
243 ConnHandle.SetupVariables(&ActivityList, iter->first);
244 ConnHandle.SetupResultBools(&BlankBool, &BlankBool);
251 // 5 = Failed (UI Updated).
252 // 6 = Stopped (UI Updated).
253 // 7 = (Reserved) (UI Updated).
254 // 8 = Completed. (UI Updated).
256 frmMain *frmMainPtrGet = static_cast<frmMain*>(frmMainPtr);
257 XABPreferences PrefData(GetUserPrefDir());
259 if (iter->second == 0){
261 //CardDAVIter->second.
263 // Wait for process to finish.
266 TasksFoundProc = TRUE;
268 wxString ETagOriginal;
271 wxString ContactFilename;
272 wxString FullFilename;
274 bool EditMode = FALSE;
278 // Compare the ETags and work out if a conflict has occured.
280 if (TypeIter->second == 0){
284 StringDataIter = ActivityListData.find(iter->first);
285 StringURLIter = ActivityListURL.find(iter->first);
287 AccountDir = StringAccountIter->second;
288 ContactFilename = StringFilenameIter->second;
289 wxString AccountNameFriendly;
293 for (int i = 0; i < PrefData.accounts.GetCount(); i++){
295 wxString AccountDirCheck = PrefData.accounts.GetAccountDirectory(i);
297 AccountDirCheck.Trim();
298 AccountDirCheck.Append(wxT(".carddav"));
300 if (AccountDirCheck == StringAccountIter->second){
302 AccountNameFriendly = PrefData.accounts.GetAccountName(i);
309 ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir);
311 ETag = StringETagIter->second;
312 ETagOriginal = StringETagOrigIter->second;
313 AccountDir = StringAccountIter->second;
314 ContactFilename = StringFilenameIter->second;
315 FullFilename = StringFullFilenameIter->second;
316 EditMode = ActivityListEditMode.find(iter->first)->second;
318 bool KeepUpdating = TRUE;
320 while(KeepUpdating == TRUE){
322 bool ExitLoop = FALSE;
324 while (ExitLoop == FALSE){
326 // Verify that we have a trusted SSL connection first.
328 int ErrorCode = ConnHandle.SSLVerifyTest();
330 if (ErrorCode != CURLE_OK){
332 if (ErrorCode == CURLE_SSL_CACERT ||
333 ErrorCode == CURLE_PEER_FAILED_VERIFICATION ||
334 ErrorCode == CURLE_SSL_CONNECT_ERROR){
336 // Invalid SSL certificate so bring up a dialog to the user
337 // explaining what has happened and the options available.
339 // Stop all the timers.
341 frmMainPtrGet->PauseAllTimers();
345 #if defined(__APPLE__)
347 // Bring up the trust panel and display the SSL certificate dialog.
349 SSLResult = DisplayTrustPanel(ConnHandle.GetTrustObject(), AccountNameFriendly);
351 // Update the SSL account with the trust object.
353 if (SSLResult != NSOKButton){
355 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetTrustObject());
361 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetTrustObject());
366 #elif defined(__WIN32__)
368 BOOL ModifiedCertificateData;
369 CRYPTUI_VIEWCERTIFICATE_STRUCTW CertificateData = BuildCertificateData(&ConnHandle, (HWND)frmMainPtrGet->GetHandle());
371 if (!CryptUIDlgViewCertificate(&CertificateData, &ModifiedCertificateData)){
372 wxMessageBox(_("An error occured while trying to open the certificate dialog."), _("Error opening Certificate Information dialog"));
375 if (ModifiedCertificateData == FALSE){
377 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetCertificateContextPointer());
383 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateContextPointer());
389 // Setup the data to be sent in the wxPostEvent command.
391 SSLInvalidCertNotifObj SSLICNProcData;
393 SSLCertCollection certcol = ConnHandle.GetSSLVerifyResults();
395 bool *PauseMode = new bool;
399 qrn.QResponse = &SSLResult;
400 qrn.PausePtr = PauseMode;
402 SSLICNProcData.CertCollection = certcol;
403 SSLICNProcData.QRNotifData = &qrn;
404 SSLICNProcData.AccountName = AccountNameFriendly;
406 wxCommandEvent event(INVALIDSSLCERT);
407 event.SetClientData(&SSLICNProcData);
408 wxPostEvent(frmMainPtrGet, event);
412 // Fall asleep until we get an response.
415 n1.tv_nsec = 250000000L;*/
417 while (*PauseMode == TRUE){
418 //nanosleep(&n1, &n2);
422 // Process the response from the user.
426 // Accept the certificate. Write the certificate into the account
427 // directory (as server.crt) - will overwrite old certificate.
429 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateData());
430 WriteServerCertificate(AccountDir, ConnHandle.GetCertificateData());
432 } else if (SSLResult == 2){
434 // Reject the certificate, abort the task and mark as failed.
436 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetCertificateData());
444 // Resume all the timers.
446 frmMainPtrGet->ResumeAllTimers();
464 if (iter->second == 2 || iter->second == 3 || iter->second == 4){
468 #if defined(__APPLE__)
470 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetTrustObject());
472 #elif defined(__WIN32__)
474 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateContextPointer());
478 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateData());
482 ConnHandle.SetUploadMode(TRUE);
483 ConnHandle.SetupData(wxT("PUT"), StringURLIter->second, StringDataIter->second);
484 ConnHandle.SetEditMode(EditMode);
485 ConnHandle.ProcessData();
487 int ErrorCode = ConnHandle.GetResultCode();
489 if (ErrorCode != CURLE_OK){
496 // Add contact to the ETag DB.
498 ConnHandle.GetServerETagValueThread();
499 ETagServer = ConnHandle.ETagValueResult();
500 ETagDBPtr->AddETag(ContactFilename, ETagServer, ETagServer);
507 } else if (TypeIter->second == 1){
511 StringDataIter = ActivityListData.find(iter->first);
512 StringURLIter = ActivityListURL.find(iter->first);
514 AccountDir = StringAccountIter->second;
515 ContactFilename = StringFilenameIter->second;
516 wxString AccountNameFriendly;
520 for (int i = 0; i < PrefData.accounts.GetCount(); i++){
522 wxString AccountDirCheck = PrefData.accounts.GetAccountDirectory(i);
524 AccountDirCheck.Trim();
525 AccountDirCheck.Append(wxT(".carddav"));
527 if (AccountDirCheck == StringAccountIter->second){
529 AccountNameFriendly = PrefData.accounts.GetAccountName(i);
536 ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir);
538 ETag = StringETagIter->second;
539 ETagOriginal = StringETagOrigIter->second;
540 AccountDir = StringAccountIter->second;
541 ContactFilename = StringFilenameIter->second;
542 FullFilename = StringFullFilenameIter->second;
543 EditMode = ActivityListEditMode.find(iter->first)->second;
545 bool KeepUpdating = TRUE;
547 while(KeepUpdating == TRUE){
549 bool ExitLoop = FALSE;
551 while (ExitLoop == FALSE){
553 int ErrorCode = ConnHandle.SSLVerifyTest();
555 if (ErrorCode != CURLE_OK){
557 if (ErrorCode == CURLE_SSL_CACERT ||
558 ErrorCode == CURLE_PEER_FAILED_VERIFICATION ||
559 ErrorCode == CURLE_SSL_CONNECT_ERROR){
561 // Invalid SSL certificate so bring up a dialog to the user
562 // explaining what has happened and the options available.
564 // Stop all the timers.
566 frmMainPtrGet->PauseAllTimers();
570 #if defined(__APPLE__)
572 // Bring up the trust panel and display the SSL certificate dialog.
574 SSLResult = DisplayTrustPanel(ConnHandle.GetTrustObject(), AccountNameFriendly);
576 // Update the SSL account with the trust object.
578 if (SSLResult != NSOKButton){
580 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetTrustObject());
586 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetTrustObject());
590 #elif defined(__WIN32__)
592 BOOL ModifiedCertificateData;
593 CRYPTUI_VIEWCERTIFICATE_STRUCTW CertificateData = BuildCertificateData(&ConnHandle, (HWND)frmMainPtrGet->GetHandle());
595 if (!CryptUIDlgViewCertificate(&CertificateData, &ModifiedCertificateData)){
596 wxMessageBox(_("An error occured while trying to open the certificate dialog."), _("Error opening Certificate Information dialog"));
599 if (ModifiedCertificateData == FALSE){
601 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetCertificateContextPointer());
607 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateContextPointer());
613 // Setup the data to be sent in the wxPostEvent command.
615 SSLInvalidCertNotifObj SSLICNProcData;
617 SSLCertCollection certcol = ConnHandle.GetSSLVerifyResults();
619 bool *PauseMode = new bool;
623 qrn.QResponse = &SSLResult;
624 qrn.PausePtr = PauseMode;
626 SSLICNProcData.CertCollection = certcol;
627 SSLICNProcData.QRNotifData = &qrn;
628 SSLICNProcData.AccountName = AccountNameFriendly;
630 wxCommandEvent event(INVALIDSSLCERT);
631 event.SetClientData(&SSLICNProcData);
632 wxPostEvent(frmMainPtrGet, event);
634 while (*PauseMode == TRUE){
635 //nanosleep(&n1, &n2);
639 // Process the response from the user.
643 // Accept the certificate. Write the certificate into the account
644 // directory (as server.crt) - will overwrite old certificate.
646 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetSSLVerifyResults());
647 WriteServerCertificate(AccountDir, ConnHandle.GetSSLVerifyResults());
649 } else if (SSLResult == 2){
651 // Reject the certificate, abort the task and mark as failed.
653 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetSSLVerifyResults());
661 // Resume all the timers.
663 frmMainPtrGet->ResumeAllTimers();
681 if (iter->second == 2 || iter->second == 3 || iter->second == 4){
685 #if defined(__APPLE__)
687 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetTrustObject());
689 #elif defined(__WIN32__)
691 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateContextPointer());
695 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetSSLVerifyResults());
699 ConnHandle.SetUploadMode(TRUE);
700 ConnHandle.SetupData(wxT("PUT"), StringURLIter->second, StringDataIter->second);
701 ConnHandle.SetEditMode(EditMode);
702 ConnHandle.GetServerETagValueThread();
703 ETagServer = ConnHandle.ETagValueResult();
705 int ErrorCode = ConnHandle.GetResultCode();
707 if (ErrorCode != CURLE_OK){
712 // Compare the ETag with the Server ETag.
714 if (ETagOriginal != ETagServer){
716 // Server ETag is different from original ETag.
717 // This is a conflict which the user will now
723 frmMain *frmMainPtrGet = static_cast<frmMain*>(frmMainPtr);
725 vCard34Conv vCard34Obj;
727 wxString ServerContactData;
729 vCard ConvertedV4Data;
731 // Load the client data from the filename given.
733 ConnHandle.GetServerContactData();
734 ServerContactData = ConnHandle.GetPageData();
736 // Process v3 version into v4 version.
738 vCard34Obj.ConvertToV4(&ServerContactData, &ConvertedV4Data);
740 vCardConflictObj vCardProcData;
742 vCardProcData.vCardLocalData = &ClientData;
743 vCardProcData.vCardServerData = &ConvertedV4Data;
744 ClientData.LoadFile(FullFilename);
746 //ContactConflictEvent event(ContactConflictCmdEnv);
747 //event.SetData(ContactFilename, Moo1, Moo2);
749 //wxPostEvent(frmMainPtrGet, event);
751 // Setup Conflict Resolution Dialog.
753 // Fetch Data from Server and convert.
755 bool *PauseMode = new bool;
760 qrn.QResponse = &ConflictResult;
761 qrn.PausePtr = PauseMode;
763 vCardProcData.QRNotifData = &qrn;
765 wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED);
766 event.SetClientData(&vCardProcData);
767 wxPostEvent(frmMainPtrGet, event);
769 while (*PauseMode == TRUE){
770 //nanosleep(&n1, &n2);
777 //intResult = frmMainPtrGet->ShowConflictDialog(&Moo1, &Moo2);
779 if (ConflictResult == 0){
786 } else if (ConflictResult == 1){
788 // Decided to use client version.
790 ConnHandle.ProcessData();
792 } else if (ConflictResult == 2){
794 // Decided to use server version.
796 // Download server version.
798 ConvertedV4Data.WriteFile(FullFilename);
804 // Update the data to the server.
806 ConnHandle.ProcessData();
810 // Update the ETag DB.
812 ConnHandle.GetServerETagValueThread();
813 ETagServer = ConnHandle.ETagValueResult();
814 ETagDBPtr->UpdateETag(ContactFilename, ETagServer, ETagServer);
821 } else if (TypeIter->second == 2) {
823 // Delete the contact from the server and update the ETag DB.
825 AccountDir = StringAccountIter->second;
826 ContactFilename = StringFilenameIter->second;
827 wxString AccountNameFriendly;
831 for (int i = 0; i < PrefData.accounts.GetCount(); i++){
833 wxString AccountDirCheck = PrefData.accounts.GetAccountDirectory(i);
835 AccountDirCheck.Trim();
836 AccountDirCheck.Append(wxT(".carddav"));
838 if (AccountDirCheck == StringAccountIter->second){
840 AccountNameFriendly = PrefData.accounts.GetAccountName(i);
847 ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir);
849 bool KeepUpdating = TRUE;
851 while(KeepUpdating == TRUE){
853 bool ExitLoop = FALSE;
855 while (ExitLoop == FALSE){
857 int ErrorCode = ConnHandle.SSLVerifyTest();
859 if (ErrorCode != CURLE_OK){
861 if (ErrorCode == CURLE_SSL_CACERT ||
862 ErrorCode == CURLE_PEER_FAILED_VERIFICATION ||
863 ErrorCode == CURLE_SSL_CONNECT_ERROR){
865 // Invalid SSL certificate so bring up a dialog to the user
866 // explaining what has happened and the options available.
868 // Stop all the timers.
870 frmMainPtrGet->PauseAllTimers();
874 #if defined(__APPLE__)
876 // Bring up the trust panel and display the SSL certificate dialog.
878 SSLResult = DisplayTrustPanel(ConnHandle.GetTrustObject(), AccountNameFriendly);
880 // Update the SSL account with the trust object.
882 if (SSLResult != NSOKButton){
884 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetTrustObject());
890 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetTrustObject());
894 #elif defined(__WIN32__)
896 BOOL ModifiedCertificateData;
897 CRYPTUI_VIEWCERTIFICATE_STRUCTW CertificateData = BuildCertificateData(&ConnHandle, (HWND)frmMainPtrGet->GetHandle());
899 if (!CryptUIDlgViewCertificate(&CertificateData, &ModifiedCertificateData)){
900 wxMessageBox(_("An error occured while trying to open the certificate dialog."), _("Error opening Certificate Information dialog"));
903 if (ModifiedCertificateData == FALSE){
905 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetCertificateContextPointer());
911 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateContextPointer());
917 // Setup the data to be sent in the wxPostEvent command.
919 SSLInvalidCertNotifObj SSLICNProcData;
921 SSLCertCollection certcol = ConnHandle.GetSSLVerifyResults();
923 bool *PauseMode = new bool;
927 qrn.QResponse = &SSLResult;
928 qrn.PausePtr = PauseMode;
930 SSLICNProcData.CertCollection = certcol;
931 SSLICNProcData.QRNotifData = &qrn;
932 SSLICNProcData.AccountName = AccountNameFriendly;
934 wxCommandEvent event(INVALIDSSLCERT);
935 event.SetClientData(&SSLICNProcData);
936 wxPostEvent(frmMainPtrGet, event);
940 // Fall asleep until we get an response.
943 n1.tv_nsec = 250000000L;*/
945 while (*PauseMode == TRUE){
946 //nanosleep(&n1, &n2);
950 // Process the response from the user.
954 // Accept the certificate. Write the certificate into the account
955 // directory (as server.crt) - will overwrite old certificate.
957 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetSSLVerifyResults());
958 WriteServerCertificate(AccountDir, ConnHandle.GetSSLVerifyResults());
960 } else if (SSLResult == 2){
962 // Reject the certificate, abort the task and mark as failed.
964 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetSSLVerifyResults());
972 // Resume all the timers.
974 frmMainPtrGet->ResumeAllTimers();
992 if (iter->second == 2 || iter->second == 3 || iter->second == 4){
996 #if defined(__APPLE__)
998 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetTrustObject());
1000 #elif defined(__WIN32__)
1002 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateContextPointer());
1006 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetSSLVerifyResults());
1010 ConnHandle.SetUploadMode(FALSE);
1011 ConnHandle.SetupData(wxT("DELETE"), ContactFilename, wxT(""));
1012 ConnHandle.ProcessData();
1014 SSLCertCollection certcol = ConnHandle.GetCertificateData();
1016 // Check if any errors have occured whilst getting the data.
1018 int ErrorCode = ConnHandle.GetResultCode();
1020 if (ErrorCode != CURLE_OK){
1025 ETagDBPtr->RemoveETag(ContactFilename);
1028 CardDAVIter->second = NULL;
1033 } else if (TypeIter->second == 3) {
1035 wxString AccountNameFriendly;
1039 for (int i = 0; i < PrefData.accounts.GetCount(); i++){
1041 wxString AccountDirCheck = PrefData.accounts.GetAccountDirectory(i);
1043 AccountDirCheck.Trim();
1044 AccountDirCheck.Append(wxT(".carddav"));
1046 if (AccountDirCheck == StringAccountIter->second){
1048 AccountNameFriendly = PrefData.accounts.GetAccountName(i);
1055 bool KeepUpdating = TRUE;
1057 while (KeepUpdating == TRUE){
1059 StringTaskDetailIter = ActivityListTaskDetail.find(iter->first);
1061 AccountDir = StringAccountIter->second;
1063 ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir);
1065 wxArrayString vCardAdd;
1066 wxArrayString vCardDelete;
1067 wxArrayString vCardList;
1068 wxArrayString vCardUpdateLocal;
1069 wxArrayString vCardUpdateRemote;
1070 wxArrayString vCardUpdateLog;
1071 std::map<wxString,wxString> vCardETag;
1072 ContactListData ServerContactList;
1074 std::map<wxString,vCardDownloadDataFileClass> vCardDownloadData;
1075 //wxArrayString vCardDownload;
1076 //std::map<wxString,wxString> vCardDownloadData;
1078 // Get the list of vCard files locally.
1080 wxString AccountDirFinal;
1081 wxString AccountSyncTokenFilename;
1082 wxString SyncTokenLoad;
1084 #if defined(__HAIKU__)
1086 //preffilename = wxT("noo");
1088 #elif defined(__WIN32__)
1090 AccountDirFinal = GetAccountDir(AccountDir, FALSE);
1091 AccountSyncTokenFilename = AccountDirFinal;
1092 AccountSyncTokenFilename.Append(wxT("synctoken"));
1096 AccountDirFinal = GetAccountDir(AccountDir, FALSE);
1097 AccountSyncTokenFilename = AccountDirFinal;
1098 AccountSyncTokenFilename.Append(wxT("synctoken"));
1102 // Suppress Error Messages.
1104 wxLogNull PleaseDoNotDisturb;
1107 SyncLoad.Open(AccountSyncTokenFilename, wxT("r"));
1109 if (SyncLoad.IsOpened()){
1111 SyncLoad.ReadAll(&SyncTokenLoad, wxMBConvUTF8());
1116 // Get a list of vCard files from the server.
1118 // Get the list of vCard files from the ETagDB.
1120 std::map<wxString,ETagData> ETagDBData = ETagDBPtr->GetETagData();
1122 bool ExitLoop = FALSE;
1124 std::map<wxString,FileSyncData> *SCListData = NULL;
1126 while (ExitLoop == FALSE){
1128 // Check if any errors have occured whilst getting the data.
1130 int ErrorCode = ConnHandle.SSLVerifyTest();
1132 if (ErrorCode != CURLE_OK){
1134 if (ErrorCode == CURLE_SSL_CACERT ||
1135 ErrorCode == CURLE_PEER_FAILED_VERIFICATION ||
1136 ErrorCode == CURLE_SSL_CONNECT_ERROR){
1138 // Invalid SSL certificate so bring up a dialog to the user
1139 // explaining what has happened and the options available.
1141 // Stop all the timers.
1143 frmMainPtrGet->PauseAllTimers();
1147 #if defined(__APPLE__)
1149 // Bring up the trust panel and display the SSL certificate dialog.
1151 SSLResult = DisplayTrustPanel(ConnHandle.GetTrustObject(), AccountNameFriendly);
1153 // Update the SSL account with the trust object.
1155 if (SSLResult != NSOKButton){
1157 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetTrustObject());
1163 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetTrustObject());
1167 #elif defined(__WIN32__)
1169 BOOL ModifiedCertificateData;
1170 CRYPTUI_VIEWCERTIFICATE_STRUCTW CertificateData = BuildCertificateData(&ConnHandle, (HWND)frmMainPtrGet->GetHandle());
1172 if (!CryptUIDlgViewCertificate(&CertificateData, &ModifiedCertificateData)){
1173 wxMessageBox(_("An error occured while trying to open the certificate dialog."), _("Error opening Certificate Information dialog"));
1176 if (ModifiedCertificateData == FALSE){
1178 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetCertificateContextPointer());
1184 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateContextPointer());
1189 // Setup the data to be sent in the wxPostEvent command.
1191 SSLInvalidCertNotifObj SSLICNProcData;
1193 SSLCertCollection certcol = ConnHandle.GetSSLVerifyResults();
1195 bool *PauseMode = new bool;
1199 qrn.QResponse = &SSLResult;
1200 qrn.PausePtr = PauseMode;
1202 SSLICNProcData.CertCollection = certcol;
1203 SSLICNProcData.QRNotifData = &qrn;
1204 SSLICNProcData.AccountName = AccountNameFriendly;
1206 wxCommandEvent event(INVALIDSSLCERT);
1207 event.SetClientData(&SSLICNProcData);
1208 wxPostEvent(frmMainPtrGet, event);
1212 // Fall asleep until we get an response.
1215 n1.tv_nsec = 250000000L;*/
1217 while (*PauseMode == TRUE){
1218 //nanosleep(&n1, &n2);
1219 SleepFor(250000000);
1222 // Process the response from the user.
1224 if (SSLResult == 1){
1226 // Accept the certificate. Write the certificate into the account
1227 // directory (as server.crt) - will overwrite old certificate.
1229 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetSSLVerifyResults());
1230 WriteServerCertificate(AccountDir, ConnHandle.GetSSLVerifyResults());
1232 } else if (SSLResult == 2){
1234 // Reject the certificate, abort the task and mark as failed.
1236 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetSSLVerifyResults());
1244 // Resume all the timers.
1246 frmMainPtrGet->ResumeAllTimers();
1264 if (iter->second == 2 || iter->second == 3 || iter->second == 4){
1268 #if defined(__APPLE__)
1270 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetTrustObject());
1272 #elif defined(__WIN32__)
1274 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateContextPointer());
1278 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetSSLVerifyResults());
1282 // Look in directory and see which vCards to add and delete
1285 // vCard exists but not in ETagDB - Add (and upload).
1286 // vCard missing but in ETagDB - Delete (from server).
1288 // Start by looking for vCards that are not in the ETagDB.
1290 wxDir AccDir(AccountDirFinal);
1291 wxString AccDirFilename;
1293 bool ContinueProcess = AccDir.GetFirst(&AccDirFilename, wxEmptyString, wxDIR_DEFAULT);
1295 ServerContactList = ConnHandle.GetContactList(SyncTokenLoad.ToUTF8());
1297 int ErrorCode = ConnHandle.GetResultCode();
1299 if (ErrorCode != CURLE_OK){
1306 SSLCertCollection certcol = ConnHandle.GetCertificateData();
1308 // Create a pointer for the std::map<wxString,FileSyncData>.
1310 SCListData = &ServerContactList.ListData;
1312 // Process the server data.
1314 if (SCListData != NULL){
1316 for (std::map<wxString, FileSyncData>::iterator fsiter = SCListData->begin();
1317 fsiter != SCListData->end(); fsiter++){
1319 // Check the mode of the file before adding.
1321 // Get the HTTP status of the file from the list.
1323 FileSyncData fsd = fsiter->second;
1325 if (fsd.DataFlag == 1){
1327 // Added or modified contact.
1329 //vCardAdd.Add(fsiter->first, 1);
1331 vCardDownloadDataFileClass vCardNewData;
1332 vCardNewData.DataType = 0;
1333 vCardDownloadData.insert(std::make_pair(fsiter->first, vCardNewData));
1335 //} else if (fsd.DataFlag == 1){
1337 // Contact has been modified on the server.
1339 // vCardUpdateLocal.Add(fsiter->first, 1);
1342 else if (fsd.DataFlag == 2){
1344 // Contact has been deleted.
1346 vCardDelete.Add(fsiter->first, 1);
1354 // Look for vCards that are missing but in the ETagDB.
1356 for (std::map<wxString,ETagData>::iterator etagiter = ETagDBData.begin();
1357 etagiter != ETagDBData.end(); etagiter++){
1359 // Check if the vCard exists.
1361 if (!wxFileExists(AccountDirFinal + etagiter->first)){
1363 // vCard doesn't exist so mark for deleting.
1365 vCardDelete.Add(etagiter->first, 1);
1371 // Compare Server with the ETag DB. Work out which
1372 // needs to updated remotely and which needs to be
1375 for (std::map<wxString,FileSyncData>::iterator srviter = SCListData->begin();
1376 srviter != SCListData->end(); srviter++){
1378 if (ETagDBData.find(srviter->first) == ETagDBData.end()){
1382 std::map<wxString,ETagData>::iterator lociter = ETagDBData.find(srviter->first);
1384 ETagData etd = lociter->second;
1385 FileSyncData fsd = srviter->second;
1387 wxString ETagSrv = fsd.ETagData;
1389 // Check if the local ETag value has 'DELETED' set and skip
1390 // checking this file if it does.
1392 if (etd.ETagValue == "DELETED"){
1398 // Compare local ETag with original local ETag.
1399 // If different, update to server is required.
1401 if (etd.ETagValue != etd.ETagOrigValue){
1403 // Check if local original ETag is different from server ETag.
1404 // If it is then throw up a conflict resolution dialog.
1406 if (etd.ETagOrigValue != ETagSrv){
1408 vCard34Conv vCard34Obj;
1410 wxString ServerContactData;
1411 wxString FullFilename;
1413 vCard ConvertedV4Data;
1415 // Conflict. Bring up conflict resolution dialog.
1417 // Get the server contact data for comparison.
1419 ConnHandle.SetServerFilename(srviter->first);
1420 ConnHandle.GetServerContactData();
1421 ServerContactData = ConnHandle.GetPageData();
1423 FullFilename = CreateFilenamePath(AccountDirFinal, srviter->first);
1425 // Convert it to v4.
1427 vCard34Obj.ConvertToV4(&ServerContactData, &ConvertedV4Data);
1429 vCardConflictObj vCardProcData;
1431 vCardProcData.vCardLocalData = &ClientData;
1432 vCardProcData.vCardServerData = &ConvertedV4Data;
1434 // Load the client data from the filename given.
1436 ClientData.LoadFile(FullFilename);
1440 bool *PauseMode = new bool;
1443 frmMain *frmMainPtrGet = static_cast<frmMain*>(frmMainPtr);
1446 qrn.QResponse = &ConflictResult;
1447 qrn.PausePtr = PauseMode;
1449 vCardProcData.QRNotifData = &qrn;
1451 wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED);
1452 event.SetClientData(&vCardProcData);
1453 wxPostEvent(frmMainPtrGet, event);
1458 n1.tv_nsec = 250000000L;*/
1460 while (*PauseMode == TRUE){
1461 //nanosleep(&n1, &n2);
1462 SleepFor(250000000);
1468 // If replacing local version, store copy for now.
1469 // Otherwise upload to server.
1471 if (ConflictResult == 0){
1477 } else if (ConflictResult == 1){
1479 // Decided to use client version.
1481 vCardUpdateLocal.Remove(srviter->first);
1482 vCardUpdateRemote.Add(srviter->first, 1);
1484 } else if (ConflictResult == 2){
1486 // Decided to use server version.
1487 // Store the converted downloaded copy for
1488 // processing later.
1490 //vCardUpdateLocal.Add(srviter->first, 1);
1492 vCardDownloadDataFileClass vCardNewData;
1493 vCardNewData.DataType = 1;
1494 vCardNewData.FileData = ConvertedV4Data.WriteString();
1496 ConvertedV4Data.WriteFile(FullFilename);
1498 vCardDownloadData.insert(std::make_pair(srviter->first, vCardNewData));
1506 // Send vCard to the server.
1508 vCardUpdateRemote.Add(srviter->first, 1);
1514 // Check if local ETag is different from server ETag.
1515 // If different, obtain the vCard from the server.
1517 if (etd.ETagOrigValue != ETagSrv){
1519 vCardUpdateLocal.Add(srviter->first, 1);
1527 // Process the vCards that need to be downloaded and added/overwritten.
1529 wxString vCardFilenameFinal;
1530 wxString vCardOutputData;
1531 wxString vCardInputData;
1532 wxString ETagFileData;
1535 for (std::map<wxString,vCardDownloadDataFileClass>::iterator additer = vCardDownloadData.begin();
1536 additer != vCardDownloadData.end(); additer++){
1538 vCardFilenameFinal.Clear();
1539 vCardInputData.Clear();
1540 vCardOutputData.Clear();
1541 ETagFileData.Clear();
1543 vCardFilenameFinal = CreateFilenamePath(AccountDirFinal, additer->first);
1545 ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir);
1547 if (additer->second.DataType == 0){
1549 vCard ConvertedV4Data;
1551 // Grab the file from the server and write the contact out.
1553 vCard34Conv vCard34Obj;
1555 ConnHandle.SetServerFilename(additer->first);
1556 ConnHandle.GetServerContactData();
1557 vCardInputData = ConnHandle.GetPageData();
1559 vCard34Obj.ConvertToV4(&vCardInputData, &ConvertedV4Data);
1561 ConvertedV4Data.WriteFile(vCardFilenameFinal);
1563 // Update the ETagDB.
1565 //vCardFile.Open(vCardFilenameFinal, wxT("w"));
1567 //if (vCardFile.IsOpened()){
1569 // vCardFile.Write(vCardOutputData, wxConvAuto());
1570 // vCardFile.Close();
1574 // Get the server ETag.
1576 wxString ServerETag;
1577 ConnHandle.GetServerETagValueThread();
1578 ServerETag = ConnHandle.ETagValueResult();
1580 // Add to the ETag Database.
1582 ETagDBPtr->AddETag(additer->first, ServerETag, ServerETag);
1584 } else if (additer->second.DataType == 1){
1586 // Write out the contact to the account directory.
1588 vCardFilenameFinal = CreateFilenamePath(AccountDirFinal, additer->first);
1589 vCardOutputData = additer->second.FileData;
1591 vCardFile.Open(vCardFilenameFinal, wxT("w"));
1593 if (vCardFile.IsOpened()){
1595 vCardFile.Write(vCardOutputData, wxConvAuto());
1600 // Update the ETagDB.
1602 wxString ServerETag;
1603 ConnHandle.GetServerETagValueThread();
1604 ServerETag = ConnHandle.ETagValueResult();
1606 // Add to the ETag Database.
1608 ETagDBPtr->AddETag(additer->first, ServerETag, ServerETag);
1613 // Look for vCard files which aren't in the ETagDB.
1615 while(ContinueProcess){
1617 // Check and make sure that the filename ends in .vcf/.vcard
1618 // Skip any file that beings with a dot.
1620 if (AccDirFilename.Left(1) == wxT(".")){
1622 ContinueProcess = AccDir.GetNext(&AccDirFilename);
1627 if (AccDirFilename.Right(4) != wxT(".vcf") &&
1628 AccDirFilename.Right(6) != wxT(".vcard")){
1630 ContinueProcess = AccDir.GetNext(&AccDirFilename);
1635 // Look in the ETagDB for the file.
1637 bool ETagExists = ETagDBPtr->CheckETagExists(AccDirFilename);
1639 if (ETagExists == FALSE){
1641 // Add the vCard to the list to be added.
1643 vCardAdd.Add(AccDirFilename, 1);
1647 ContinueProcess = AccDir.GetNext(&AccDirFilename);
1651 // Process the vCards to add/update to the server.
1653 for (int vi = 0; vi < vCardAdd.GetCount(); vi++){
1655 ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir);
1656 ETag = ETagDBPtr->GetETag(vCardAdd[vi]);
1657 ETagOriginal = ETagDBPtr->GetETagOriginal(vCardAdd[vi]);
1659 ContactFilename = vCardAdd[vi];
1660 FullFilename = CreateFilenamePath(AccountDirFinal, vCardAdd[vi]);
1662 ContactFilename.Trim();
1664 if (ETag == ETagOriginal && ETagDBPtr->ETagExists(vCardAdd[vi])){
1666 // Compare the ETag with the Server ETag.
1668 ConnHandle.SetServerFilename(vCardAdd[vi]);
1669 ConnHandle.GetServerETagValueThread();
1670 ETagServer = ConnHandle.ETagValueResult();
1672 if (ETagOriginal != ETagServer){
1674 // Server ETag is different from original ETag.
1675 // This is a conflict which the user will now
1678 frmMain *frmMainPtrGet = static_cast<frmMain*>(frmMainPtr);
1680 vCard34Conv vCard34Obj;
1682 wxString ServerContactData;
1684 vCard ConvertedV4Data;
1686 // Load the client data from the filename given.
1688 ConnHandle.GetServerContactData();
1689 ServerContactData = ConnHandle.GetPageData();
1691 // Process v3 version into v4 version.
1693 vCard34Obj.ConvertToV4(&ServerContactData, &ConvertedV4Data);
1695 vCardConflictObj vCardProcData;
1697 vCardProcData.vCardLocalData = &ClientData;
1698 vCardProcData.vCardServerData = &ConvertedV4Data;
1699 ClientData.LoadFile(FullFilename);
1701 //ContactConflictEvent event(ContactConflictCmdEnv);
1702 //event.SetData(ContactFilename, Moo1, Moo2);
1704 //wxPostEvent(frmMainPtrGet, event);
1706 // Setup Conflict Resolution Dialog.
1708 // Fetch Data from Server and convert.
1710 bool *PauseMode = new bool;
1715 qrn.QResponse = &ConflictResult;
1716 qrn.PausePtr = PauseMode;
1718 vCardProcData.QRNotifData = &qrn;
1720 wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED);
1721 event.SetClientData(&vCardProcData);
1722 wxPostEvent(frmMainPtrGet, event);
1727 n1.tv_nsec = 250000000L;*/
1729 while (*PauseMode == TRUE){
1730 //nanosleep(&n1, &n2);
1731 SleepFor(250000000);
1737 //intResult = frmMainPtrGet->ShowConflictDialog(&Moo1, &Moo2);
1739 if (ConflictResult == 0){
1746 } else if (ConflictResult == 1){
1748 // Decided to use client version.
1750 ConnHandle.ProcessData();
1754 } else if (ConflictResult == 2){
1756 // Decided to use server version.
1758 // Download server version.
1760 ConvertedV4Data.WriteFile(CreateFilenamePath(AccountDirFinal, vCardAdd[vi]));
1768 // Setup the filename for the contact being added.
1770 wxString wxSFilename = CreateFilenamePath(AccountDirFinal, vCardAdd[vi]);
1771 wxString wxSCardData;
1775 // Load the data from the file.
1778 wxFCard.Open(wxSFilename, wxT("r"));
1780 if (wxFCard.IsOpened()){
1782 wxFCard.ReadAll(&wxSCardData, wxConvAuto());
1787 // Convert the data to v3.
1789 vCard34Conv vCard34Obj;
1791 vCard34Obj.ConvertToV3(wxSFilename, &TaskData);
1793 // Setup the URL address.
1795 //TaskURL = StringTaskDetailIter->second + wxT("/") + vCardAdd[vi];
1797 // Upload the data to the server.
1799 ConnHandle.SetUploadMode(TRUE);
1800 ConnHandle.SetupData(wxT("PUT"), vCardAdd[vi], TaskData);
1801 ConnHandle.ProcessData();
1803 // Get the Server ETag and put it in the ETag database.
1805 ConnHandle.SetServerFilename(vCardAdd[vi]);
1806 ConnHandle.GetServerETagValueThread();
1807 ETagServer = ConnHandle.ETagValueResult();
1809 ETagDBPtr->AddETag(vCardAdd[vi], ETagServer, ETagServer);
1815 if (ETagOriginal != ETagServer){
1817 // Server ETag is different from original ETag.
1818 // This is a conflict which the user will now
1821 frmMain *frmMainPtrGet = (frmMain *)frmMainPtr;
1823 //ContactConflictEvent event(ContactConflictCmdEnv);
1824 //event.SetData(ContactFilename, Moo1, Moo2);
1826 vCard34Conv vCard34Obj;
1828 wxString ServerContactData;
1830 vCard ConvertedV4Data;
1832 // Load the client data from the filename given.
1834 ConnHandle.GetServerContactData();
1835 ServerContactData = ConnHandle.GetPageData();
1836 ClientData.LoadFile(FullFilename);
1838 // Process v3 version into v4 version.
1840 vCard34Obj.ConvertToV4(&ServerContactData, &ConvertedV4Data);
1842 vCardConflictObj vCardProcData;
1844 vCardProcData.vCardLocalData = &ClientData;
1845 vCardProcData.vCardServerData = &ConvertedV4Data;
1847 bool *PauseMode = new bool;
1852 qrn.QResponse = &ConflictResult;
1853 qrn.PausePtr = PauseMode;
1855 vCardProcData.QRNotifData = &qrn;
1857 wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED);
1858 event.SetClientData(&vCardProcData);
1859 wxPostEvent(frmMainPtrGet, event);
1864 n1.tv_nsec = 250000000L;*/
1866 while (*PauseMode == TRUE){
1867 //nanosleep(&n1, &n2);
1868 SleepFor(250000000);
1874 //intResult = frmMainPtrGet->ShowConflictDialog(&Moo1, &Moo2);
1876 if (ConflictResult == 0){
1883 } else if (ConflictResult == 1){
1885 // Decided to use client version.
1887 ConnHandle.ProcessData();
1888 //ETagServer = CardDAVIter->second.GetServerETagValueThread();
1889 //ETagDBPtr->UpdateETag(ContactFilename, ETagServer, ETagServer);
1893 } else if (ConflictResult == 2){
1895 // Decided to use server version.
1897 // Write server version to file.
1899 ConvertedV4Data.WriteFile(CreateFilenamePath(AccountDirFinal, vCardAdd[vi]));
1907 // Setup the filename for the contact being added.
1909 wxString wxSFilename = CreateFilenamePath(AccountDirFinal, vCardAdd[vi]);
1910 wxString wxSCardData;
1914 // Load the data from the file.
1917 wxFCard.Open(wxSFilename, wxT("r"));
1919 if (wxFCard.IsOpened()){
1921 wxFCard.ReadAll(&wxSCardData, wxConvAuto());
1926 // Convert the data to v3.
1928 vCard34Conv vCard34Obj;
1930 vCard34Obj.ConvertToV3(wxSFilename, &TaskData);
1932 // Setup the URL address.
1934 //TaskURL = StringTaskDetailIter->second + wxT("/") + vCardAdd[vi];
1936 // Upload the data to the server.
1938 ConnHandle.SetUploadMode(TRUE);
1939 ConnHandle.SetupData(wxT("PUT"), vCardAdd[vi], TaskData);
1940 ConnHandle.ProcessData();
1942 // Get the Server ETag and put it in the ETag database.
1944 ConnHandle.SetServerFilename(vCardAdd[vi]);
1945 ConnHandle.GetServerETagValueThread();
1946 ETagServer = ConnHandle.ETagValueResult();
1949 ETagDBPtr->AddETag(vCardAdd[vi], ETagServer, ETagServer);
1957 // Process the vCards to delete locally.
1959 for (int vi = 0; vi < vCardDelete.GetCount(); vi++){
1961 if (!wxRemoveFile(CreateFilenamePath(AccountDirFinal, vCardDelete[vi]))){
1965 ETagDBPtr->RemoveETag(vCardDelete[vi]);
1971 // Process the vCards to delete from the server.
1973 std::map<wxString,wxString> *ETagFilenameMap = ETagDBPtr->GetFilenamePointer();
1974 std::list<wxString> DeleteList;
1976 for (std::map<wxString,wxString>::iterator deliter = ETagFilenameMap->begin();
1977 deliter != ETagFilenameMap->end(); deliter++){
1979 // Look through the ETagDB and find contacts which are marked as DELETED.
1981 if (deliter->second == wxT("DELETED")){
1983 ConnHandle.SetUploadMode(FALSE);
1984 ConnHandle.SetupData(wxT("DELETE"), deliter->first, wxT(""));
1985 ConnHandle.ProcessDataThread();
1987 // Delete the ETag as the file has now been deleted.
1989 DeleteList.push_back(deliter->first);
1995 for (std::list<wxString>::iterator removeetagiter = DeleteList.begin();
1996 removeetagiter != DeleteList.end(); removeetagiter++){
1998 ETagDBPtr->RemoveETag(*removeetagiter);
2002 // Write out the update server sync token.
2004 wxString ServerSyncToken = ServerContactList.SyncToken;
2006 ServerSyncToken.Trim();
2008 if (!ServerSyncToken.IsEmpty()){
2011 SyncWrite.Open(AccountSyncTokenFilename, wxT("w"));
2013 if (SyncWrite.IsOpened()){
2015 SyncWrite.Write(ServerSyncToken, wxConvAuto());
2022 // Check for another sync token. If there is another
2023 // sync token then repeat this. If token matches then stop processing.
2025 if (SyncTokenLoad == ServerSyncToken){
2027 KeepUpdating = FALSE;
2033 // Mark as completed.
2035 wxString AccountNameFinal;
2036 AccountNameFinal = PrefData.accounts.GetAccountDirectory(AccountID);
2037 AccountNameFinal.Append(wxT(".carddav"));
2039 wxCommandEvent reloadevent(RELOADCONTACTLIST);
2040 reloadevent.SetString(AccountNameFinal);
2041 wxPostEvent(this->GetParent(), reloadevent);
2048 // Update the data to the server.
2050 ConnHandle.ProcessData();
2059 n1.tv_nsec = 250000000L;*/
2061 while (iter->second == 1){
2063 SleepFor(250000000);
2064 //nanosleep(&n1, &n2);
2068 if ((iter->second == 4 && TypeIter->second == 0) ||
2069 (iter->second == 8 && TypeIter->second == 0)){
2071 AccountDir = StringAccountIter->second;
2072 ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir);
2074 ConnHandle.GetServerETagValueThread();
2075 ETagServer = ConnHandle.ETagValueResult();
2076 ETagDBPtr->UpdateETag(ContactFilename, ETagServer, ETagServer);
2080 if ((iter->second == 4 && TypeIter->second == 1) ||
2081 (iter->second == 8 && TypeIter->second == 1)){
2083 AccountDir = StringAccountIter->second;
2084 ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir);
2086 ConnHandle.GetServerETagValueThread();
2087 ETagServer = ConnHandle.ETagValueResult();
2088 ETagDBPtr->UpdateETag(ContactFilename, ETagServer, ETagServer);
2098 if (TasksFoundProc == FALSE){
2100 TasksActive = FALSE;
2101 ProcessTasksData = FALSE;
2105 wxCommandEvent eventp(ACTMGR_STARTTIMER);
2106 wxPostEvent(this, eventp);
2108 //AnimationTimer.StartAnimation();
2109 //ActListProcTimer.Start();
2113 wxCommandEvent event(ACTMGR_STARTPROCESSTIMER);
2114 wxPostEvent(this, event);
2116 //ActProcessTimer.Start();
2120 void frmActivityMgr::ProcessTasks()
2123 std::thread ProcessThread(&frmActivityMgr::ProcessTasksThread, this);
2124 ProcessThread.detach();
2128 void frmActivityMgr::SetupPointers(wxETagProcessTimer *ETagTmrPtrInc, void *frmMainPtrInc)
2131 ETagTmrPtr = ETagTmrPtrInc;
2133 frmMainPtr = frmMainPtrInc;
2137 void frmActivityMgr::ResumeProcessing(wxCommandEvent &event){
2139 QRNotif *qrn = (QRNotif *)event.GetClientData();
2141 int *QRes = qrn->QResponse;
2143 *qrn->PausePtr = FALSE;
2145 *QRes = event.GetInt();
2149 void frmActivityMgr::ToggleConnectionStatus( wxCommandEvent &event ){
2151 wxCommandEvent connevent(CONNSTAT_UPDATE);
2153 if (SleepMode == FALSE){
2155 connevent.SetInt(1);
2160 connevent.SetInt(0);
2165 wxPostEvent(GetParent(), connevent);
2169 void frmActivityMgr::WriteServerCertificate(wxString AccountName, SSLCertCollection SSLCertInc){
2171 wxString ServerCertFinal;
2173 // Get the Cert section of the certificate and write it to the file.
2175 ServerCertFinal = GetAccountDir(AccountName, TRUE);
2179 std::map<int, SSLCertData>::iterator SSLCDIter = SSLCertInc.SSLCollection.find(0);
2180 std::multimap<wxString,wxString>::iterator SSLDataIter = SSLCDIter->second.CertData.find(wxT("Cert"));
2182 CertFile.Open(ServerCertFinal, wxFile::write);
2184 CertFile.Write(SSLDataIter->second, wxConvUTF8);
2189 void frmActivityMgr::StartTimer(wxCommandEvent& event){
2191 ActListProcTimer.Start(1000, FALSE);
2195 void frmActivityMgr::StopTimer(wxCommandEvent& event){
2197 ActListProcTimer.Stop();
2201 void frmActivityMgr::StartProcessTimer(wxCommandEvent& event){
2203 ActProcessTimer.Start(1000, FALSE);
2207 void frmActivityMgr::StopProcessTimer(wxCommandEvent& event){
2209 ActProcessTimer.Stop();
2213 void frmActivityMgr::UpdateStatusLabel(wxCommandEvent& event){
2215 ActivityMgrLabelUpdate *actmgrudata = (ActivityMgrLabelUpdate*)event.GetClientData();
2217 if (actmgrudata != NULL){
2219 lstActivity->SetItem(actmgrudata->ItemIndex, 2, actmgrudata->ItemLabel);
2221 /*if (!actmgrudata->ItemDes.IsEmpty()){
2222 lstActivity->SetItem(actmgrudata->ItemIndex, 0, actmgrudata->ItemDes);