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;
222 for (std::map<int,int>::iterator iter = ActivityList.begin();
223 iter != ActivityList.end(); ++iter){
225 // Check for any queued tasks and start one.
227 if (iter->second > 4){
231 wxCommandEvent StartAnimationEvent(ACTMGR_STARTANIMATIONTIMER);
233 wxPostEvent(this, StartAnimationEvent);
235 // Start the animation timer if it hasn't started.
237 CardDAVIter = ActivityListConn.find(iter->first);
238 TypeIter = ActivityListType.find(iter->first);
239 StringETagIter = ActivityListETag.find(iter->first);
240 StringETagOrigIter = ActivityListETagOriginal.find(iter->first);
241 StringAccountIter = ActivityListAccount.find(iter->first);
242 StringFilenameIter = ActivityListFilename.find(iter->first);
243 StringFullFilenameIter = ActivityListFullFilename.find(iter->first);
244 AccountSettingsIter = ActivityListAccSettings.find(iter->first);
246 // Setup the CardDAV object.
250 ConnHandle.SetupConnection(AccountSettingsIter->second.Address,
251 AccountSettingsIter->second.Port,
252 AccountSettingsIter->second.Username,
253 AccountSettingsIter->second.Password,
254 AccountSettingsIter->second.SSL,
255 AccountSettingsIter->second.Prefix,
256 AccountSettingsIter->second.Dir);
257 ConnHandle.SetupVariables(&ActivityList, iter->first);
258 ConnHandle.SetupResultBools(&BlankBool, &BlankBool);
265 // 5 = Failed (UI Updated).
266 // 6 = Stopped (UI Updated).
267 // 7 = (Reserved) (UI Updated).
268 // 8 = Completed. (UI Updated).
270 frmMain *frmMainPtrGet = static_cast<frmMain*>(frmMainPtr);
271 XABPreferences PrefData(GetUserPrefDir());
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);
1226 // Fall asleep until we get an response.
1229 n1.tv_nsec = 250000000L;*/
1231 while (*PauseMode == TRUE){
1232 //nanosleep(&n1, &n2);
1233 SleepFor(250000000);
1236 // Process the response from the user.
1238 if (SSLResult == 1){
1240 // Accept the certificate. Write the certificate into the account
1241 // directory (as server.crt) - will overwrite old certificate.
1243 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetSSLVerifyResults());
1244 WriteServerCertificate(AccountDir, ConnHandle.GetSSLVerifyResults());
1246 } else if (SSLResult == 2){
1248 // Reject the certificate, abort the task and mark as failed.
1250 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetSSLVerifyResults());
1258 // Resume all the timers.
1260 frmMainPtrGet->ResumeAllTimers();
1278 if (iter->second == 2 || iter->second == 3 || iter->second == 4){
1282 #if defined(__APPLE__)
1284 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetTrustObject());
1286 #elif defined(__WIN32__)
1288 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateContextPointer());
1292 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetSSLVerifyResults());
1296 // Look in directory and see which vCards to add and delete
1299 // vCard exists but not in ETagDB - Add (and upload).
1300 // vCard missing but in ETagDB - Delete (from server).
1302 // Start by looking for vCards that are not in the ETagDB.
1304 wxDir AccDir(AccountDirFinal);
1305 wxString AccDirFilename;
1307 bool ContinueProcess = AccDir.GetFirst(&AccDirFilename, wxEmptyString, wxDIR_DEFAULT);
1309 ServerContactList = ConnHandle.GetContactList(SyncTokenLoad.ToUTF8());
1311 int ErrorCode = ConnHandle.GetResultCode();
1313 if (ErrorCode != CURLE_OK){
1320 SSLCertCollection certcol = ConnHandle.GetCertificateData();
1322 // Create a pointer for the std::map<wxString,FileSyncData>.
1324 SCListData = &ServerContactList.ListData;
1326 // Process the server data.
1328 if (SCListData != NULL){
1330 for (std::map<wxString, FileSyncData>::iterator fsiter = SCListData->begin();
1331 fsiter != SCListData->end(); fsiter++){
1333 // Check the mode of the file before adding.
1335 // Get the HTTP status of the file from the list.
1337 FileSyncData fsd = fsiter->second;
1339 if (fsd.DataFlag == 1){
1341 // Added or modified contact.
1343 //vCardAdd.Add(fsiter->first, 1);
1345 vCardDownloadDataFileClass vCardNewData;
1346 vCardNewData.DataType = 0;
1347 vCardDownloadData.insert(std::make_pair(fsiter->first, vCardNewData));
1349 //} else if (fsd.DataFlag == 1){
1351 // Contact has been modified on the server.
1353 // vCardUpdateLocal.Add(fsiter->first, 1);
1356 else if (fsd.DataFlag == 2){
1358 // Contact has been deleted.
1360 vCardDelete.Add(fsiter->first, 1);
1368 // Look for vCards that are missing but in the ETagDB.
1370 for (std::map<wxString,ETagData>::iterator etagiter = ETagDBData.begin();
1371 etagiter != ETagDBData.end(); etagiter++){
1373 // Check if the vCard exists.
1375 if (!wxFileExists(AccountDirFinal + etagiter->first)){
1377 // vCard doesn't exist so mark for deleting.
1379 vCardDelete.Add(etagiter->first, 1);
1385 // Compare Server with the ETag DB. Work out which
1386 // needs to updated remotely and which needs to be
1389 for (std::map<wxString,FileSyncData>::iterator srviter = SCListData->begin();
1390 srviter != SCListData->end(); srviter++){
1392 if (ETagDBData.find(srviter->first) == ETagDBData.end()){
1396 std::map<wxString,ETagData>::iterator lociter = ETagDBData.find(srviter->first);
1398 ETagData etd = lociter->second;
1399 FileSyncData fsd = srviter->second;
1401 wxString ETagSrv = fsd.ETagData;
1403 // Check if the local ETag value has 'DELETED' set and skip
1404 // checking this file if it does.
1406 if (etd.ETagValue == "DELETED"){
1412 // Compare local ETag with original local ETag.
1413 // If different, update to server is required.
1415 if (etd.ETagValue != etd.ETagOrigValue){
1417 // Check if local original ETag is different from server ETag.
1418 // If it is then throw up a conflict resolution dialog.
1420 if (etd.ETagOrigValue != ETagSrv){
1422 vCard34Conv vCard34Obj;
1424 wxString ServerContactData;
1425 wxString FullFilename;
1427 vCard ConvertedV4Data;
1429 // Conflict. Bring up conflict resolution dialog.
1431 // Get the server contact data for comparison.
1433 ConnHandle.SetServerFilename(srviter->first);
1434 ConnHandle.GetServerContactData();
1435 ServerContactData = ConnHandle.GetPageData();
1437 FullFilename = CreateFilenamePath(AccountDirFinal, srviter->first);
1439 // Convert it to v4.
1441 vCard34Obj.ConvertToV4(&ServerContactData, &ConvertedV4Data);
1443 vCardConflictObj vCardProcData;
1445 vCardProcData.vCardLocalData = &ClientData;
1446 vCardProcData.vCardServerData = &ConvertedV4Data;
1448 // Load the client data from the filename given.
1450 ClientData.LoadFile(FullFilename);
1454 bool *PauseMode = new bool;
1457 frmMain *frmMainPtrGet = static_cast<frmMain*>(frmMainPtr);
1460 qrn.QResponse = &ConflictResult;
1461 qrn.PausePtr = PauseMode;
1463 vCardProcData.QRNotifData = &qrn;
1465 wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED);
1466 event.SetClientData(&vCardProcData);
1467 wxPostEvent(frmMainPtrGet, event);
1472 n1.tv_nsec = 250000000L;*/
1474 while (*PauseMode == TRUE){
1475 //nanosleep(&n1, &n2);
1476 SleepFor(250000000);
1482 // If replacing local version, store copy for now.
1483 // Otherwise upload to server.
1485 if (ConflictResult == 0){
1491 } else if (ConflictResult == 1){
1493 // Decided to use client version.
1495 vCardUpdateLocal.Remove(srviter->first);
1496 vCardUpdateRemote.Add(srviter->first, 1);
1498 } else if (ConflictResult == 2){
1500 // Decided to use server version.
1501 // Store the converted downloaded copy for
1502 // processing later.
1504 //vCardUpdateLocal.Add(srviter->first, 1);
1506 vCardDownloadDataFileClass vCardNewData;
1507 vCardNewData.DataType = 1;
1508 vCardNewData.FileData = ConvertedV4Data.WriteString();
1510 ConvertedV4Data.WriteFile(FullFilename);
1512 vCardDownloadData.insert(std::make_pair(srviter->first, vCardNewData));
1520 // Send vCard to the server.
1522 vCardUpdateRemote.Add(srviter->first, 1);
1528 // Check if local ETag is different from server ETag.
1529 // If different, obtain the vCard from the server.
1531 if (etd.ETagOrigValue != ETagSrv){
1533 vCardUpdateLocal.Add(srviter->first, 1);
1541 // Process the vCards that need to be downloaded and added/overwritten.
1543 wxString vCardFilenameFinal;
1544 wxString vCardOutputData;
1545 wxString vCardInputData;
1546 wxString ETagFileData;
1549 for (std::map<wxString,vCardDownloadDataFileClass>::iterator additer = vCardDownloadData.begin();
1550 additer != vCardDownloadData.end(); additer++){
1552 vCardFilenameFinal.Clear();
1553 vCardInputData.Clear();
1554 vCardOutputData.Clear();
1555 ETagFileData.Clear();
1557 vCardFilenameFinal = CreateFilenamePath(AccountDirFinal, additer->first);
1559 ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir);
1561 if (additer->second.DataType == 0){
1563 vCard ConvertedV4Data;
1565 // Grab the file from the server and write the contact out.
1567 vCard34Conv vCard34Obj;
1569 ConnHandle.SetServerFilename(additer->first);
1570 ConnHandle.GetServerContactData();
1571 vCardInputData = ConnHandle.GetPageData();
1573 vCard34Obj.ConvertToV4(&vCardInputData, &ConvertedV4Data);
1575 ConvertedV4Data.WriteFile(vCardFilenameFinal);
1577 // Update the ETagDB.
1579 //vCardFile.Open(vCardFilenameFinal, wxT("w"));
1581 //if (vCardFile.IsOpened()){
1583 // vCardFile.Write(vCardOutputData, wxConvAuto());
1584 // vCardFile.Close();
1588 // Get the server ETag.
1590 wxString ServerETag;
1591 ConnHandle.GetServerETagValueThread();
1592 ServerETag = ConnHandle.ETagValueResult();
1594 // Add to the ETag Database.
1596 ETagDBPtr->AddETag(additer->first, ServerETag, ServerETag);
1598 } else if (additer->second.DataType == 1){
1600 // Write out the contact to the account directory.
1602 vCardFilenameFinal = CreateFilenamePath(AccountDirFinal, additer->first);
1603 vCardOutputData = additer->second.FileData;
1605 vCardFile.Open(vCardFilenameFinal, wxT("w"));
1607 if (vCardFile.IsOpened()){
1609 vCardFile.Write(vCardOutputData, wxConvAuto());
1614 // Update the ETagDB.
1616 wxString ServerETag;
1617 ConnHandle.GetServerETagValueThread();
1618 ServerETag = ConnHandle.ETagValueResult();
1620 // Add to the ETag Database.
1622 ETagDBPtr->AddETag(additer->first, ServerETag, ServerETag);
1627 // Look for vCard files which aren't in the ETagDB.
1629 while(ContinueProcess){
1631 // Check and make sure that the filename ends in .vcf/.vcard
1632 // Skip any file that beings with a dot.
1634 if (AccDirFilename.Left(1) == wxT(".")){
1636 ContinueProcess = AccDir.GetNext(&AccDirFilename);
1641 if (AccDirFilename.Right(4) != wxT(".vcf") &&
1642 AccDirFilename.Right(6) != wxT(".vcard")){
1644 ContinueProcess = AccDir.GetNext(&AccDirFilename);
1649 // Look in the ETagDB for the file.
1651 bool ETagExists = ETagDBPtr->CheckETagExists(AccDirFilename);
1653 if (ETagExists == FALSE){
1655 // Add the vCard to the list to be added.
1657 vCardAdd.Add(AccDirFilename, 1);
1661 ContinueProcess = AccDir.GetNext(&AccDirFilename);
1665 // Process the vCards to add/update to the server.
1667 for (int vi = 0; vi < vCardAdd.GetCount(); vi++){
1669 ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir);
1670 ETag = ETagDBPtr->GetETag(vCardAdd[vi]);
1671 ETagOriginal = ETagDBPtr->GetETagOriginal(vCardAdd[vi]);
1673 ContactFilename = vCardAdd[vi];
1674 FullFilename = CreateFilenamePath(AccountDirFinal, vCardAdd[vi]);
1676 ContactFilename.Trim();
1678 if (ETag == ETagOriginal && ETagDBPtr->ETagExists(vCardAdd[vi])){
1680 // Compare the ETag with the Server ETag.
1682 ConnHandle.SetServerFilename(vCardAdd[vi]);
1683 ConnHandle.GetServerETagValueThread();
1684 ETagServer = ConnHandle.ETagValueResult();
1686 if (ETagOriginal != ETagServer){
1688 // Server ETag is different from original ETag.
1689 // This is a conflict which the user will now
1692 frmMain *frmMainPtrGet = static_cast<frmMain*>(frmMainPtr);
1694 vCard34Conv vCard34Obj;
1696 wxString ServerContactData;
1698 vCard ConvertedV4Data;
1700 // Load the client data from the filename given.
1702 ConnHandle.GetServerContactData();
1703 ServerContactData = ConnHandle.GetPageData();
1705 // Process v3 version into v4 version.
1707 vCard34Obj.ConvertToV4(&ServerContactData, &ConvertedV4Data);
1709 vCardConflictObj vCardProcData;
1711 vCardProcData.vCardLocalData = &ClientData;
1712 vCardProcData.vCardServerData = &ConvertedV4Data;
1713 ClientData.LoadFile(FullFilename);
1715 //ContactConflictEvent event(ContactConflictCmdEnv);
1716 //event.SetData(ContactFilename, Moo1, Moo2);
1718 //wxPostEvent(frmMainPtrGet, event);
1720 // Setup Conflict Resolution Dialog.
1722 // Fetch Data from Server and convert.
1724 bool *PauseMode = new bool;
1729 qrn.QResponse = &ConflictResult;
1730 qrn.PausePtr = PauseMode;
1732 vCardProcData.QRNotifData = &qrn;
1734 wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED);
1735 event.SetClientData(&vCardProcData);
1736 wxPostEvent(frmMainPtrGet, event);
1741 n1.tv_nsec = 250000000L;*/
1743 while (*PauseMode == TRUE){
1744 //nanosleep(&n1, &n2);
1745 SleepFor(250000000);
1751 //intResult = frmMainPtrGet->ShowConflictDialog(&Moo1, &Moo2);
1753 if (ConflictResult == 0){
1760 } else if (ConflictResult == 1){
1762 // Decided to use client version.
1764 ConnHandle.ProcessData();
1768 } else if (ConflictResult == 2){
1770 // Decided to use server version.
1772 // Download server version.
1774 ConvertedV4Data.WriteFile(CreateFilenamePath(AccountDirFinal, vCardAdd[vi]));
1782 // Setup the filename for the contact being added.
1784 wxString wxSFilename = CreateFilenamePath(AccountDirFinal, vCardAdd[vi]);
1785 wxString wxSCardData;
1789 // Load the data from the file.
1792 wxFCard.Open(wxSFilename, wxT("r"));
1794 if (wxFCard.IsOpened()){
1796 wxFCard.ReadAll(&wxSCardData, wxConvAuto());
1801 // Convert the data to v3.
1803 vCard34Conv vCard34Obj;
1805 vCard34Obj.ConvertToV3(wxSFilename, &TaskData);
1807 // Setup the URL address.
1809 //TaskURL = StringTaskDetailIter->second + wxT("/") + vCardAdd[vi];
1811 // Upload the data to the server.
1813 ConnHandle.SetUploadMode(TRUE);
1814 ConnHandle.SetupData(wxT("PUT"), vCardAdd[vi], TaskData);
1815 ConnHandle.ProcessData();
1817 // Get the Server ETag and put it in the ETag database.
1819 ConnHandle.SetServerFilename(vCardAdd[vi]);
1820 ConnHandle.GetServerETagValueThread();
1821 ETagServer = ConnHandle.ETagValueResult();
1823 ETagDBPtr->AddETag(vCardAdd[vi], ETagServer, ETagServer);
1829 if (ETagOriginal != ETagServer){
1831 // Server ETag is different from original ETag.
1832 // This is a conflict which the user will now
1835 frmMain *frmMainPtrGet = (frmMain *)frmMainPtr;
1837 //ContactConflictEvent event(ContactConflictCmdEnv);
1838 //event.SetData(ContactFilename, Moo1, Moo2);
1840 vCard34Conv vCard34Obj;
1842 wxString ServerContactData;
1844 vCard ConvertedV4Data;
1846 // Load the client data from the filename given.
1848 ConnHandle.GetServerContactData();
1849 ServerContactData = ConnHandle.GetPageData();
1850 ClientData.LoadFile(FullFilename);
1852 // Process v3 version into v4 version.
1854 vCard34Obj.ConvertToV4(&ServerContactData, &ConvertedV4Data);
1856 vCardConflictObj vCardProcData;
1858 vCardProcData.vCardLocalData = &ClientData;
1859 vCardProcData.vCardServerData = &ConvertedV4Data;
1861 bool *PauseMode = new bool;
1866 qrn.QResponse = &ConflictResult;
1867 qrn.PausePtr = PauseMode;
1869 vCardProcData.QRNotifData = &qrn;
1871 wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED);
1872 event.SetClientData(&vCardProcData);
1873 wxPostEvent(frmMainPtrGet, event);
1878 n1.tv_nsec = 250000000L;*/
1880 while (*PauseMode == TRUE){
1881 //nanosleep(&n1, &n2);
1882 SleepFor(250000000);
1888 //intResult = frmMainPtrGet->ShowConflictDialog(&Moo1, &Moo2);
1890 if (ConflictResult == 0){
1897 } else if (ConflictResult == 1){
1899 // Decided to use client version.
1901 ConnHandle.ProcessData();
1902 //ETagServer = CardDAVIter->second.GetServerETagValueThread();
1903 //ETagDBPtr->UpdateETag(ContactFilename, ETagServer, ETagServer);
1907 } else if (ConflictResult == 2){
1909 // Decided to use server version.
1911 // Write server version to file.
1913 ConvertedV4Data.WriteFile(CreateFilenamePath(AccountDirFinal, vCardAdd[vi]));
1921 // Setup the filename for the contact being added.
1923 wxString wxSFilename = CreateFilenamePath(AccountDirFinal, vCardAdd[vi]);
1924 wxString wxSCardData;
1928 // Load the data from the file.
1931 wxFCard.Open(wxSFilename, wxT("r"));
1933 if (wxFCard.IsOpened()){
1935 wxFCard.ReadAll(&wxSCardData, wxConvAuto());
1940 // Convert the data to v3.
1942 vCard34Conv vCard34Obj;
1944 vCard34Obj.ConvertToV3(wxSFilename, &TaskData);
1946 // Setup the URL address.
1948 //TaskURL = StringTaskDetailIter->second + wxT("/") + vCardAdd[vi];
1950 // Upload the data to the server.
1952 ConnHandle.SetUploadMode(TRUE);
1953 ConnHandle.SetupData(wxT("PUT"), vCardAdd[vi], TaskData);
1954 ConnHandle.ProcessData();
1956 // Get the Server ETag and put it in the ETag database.
1958 ConnHandle.SetServerFilename(vCardAdd[vi]);
1959 ConnHandle.GetServerETagValueThread();
1960 ETagServer = ConnHandle.ETagValueResult();
1963 ETagDBPtr->AddETag(vCardAdd[vi], ETagServer, ETagServer);
1971 // Process the vCards to delete locally.
1973 for (int vi = 0; vi < vCardDelete.GetCount(); vi++){
1975 if (!wxRemoveFile(CreateFilenamePath(AccountDirFinal, vCardDelete[vi]))){
1979 ETagDBPtr->RemoveETag(vCardDelete[vi]);
1985 // Process the vCards to delete from the server.
1987 std::map<wxString,wxString> *ETagFilenameMap = ETagDBPtr->GetFilenamePointer();
1988 std::list<wxString> DeleteList;
1990 for (std::map<wxString,wxString>::iterator deliter = ETagFilenameMap->begin();
1991 deliter != ETagFilenameMap->end(); deliter++){
1993 // Look through the ETagDB and find contacts which are marked as DELETED.
1995 if (deliter->second == wxT("DELETED")){
1997 ConnHandle.SetUploadMode(FALSE);
1998 ConnHandle.SetupData(wxT("DELETE"), deliter->first, wxT(""));
1999 ConnHandle.ProcessDataThread();
2001 // Delete the ETag as the file has now been deleted.
2003 DeleteList.push_back(deliter->first);
2009 for (std::list<wxString>::iterator removeetagiter = DeleteList.begin();
2010 removeetagiter != DeleteList.end(); removeetagiter++){
2012 ETagDBPtr->RemoveETag(*removeetagiter);
2016 // Write out the update server sync token.
2018 wxString ServerSyncToken = ServerContactList.SyncToken;
2020 ServerSyncToken.Trim();
2022 if (!ServerSyncToken.IsEmpty()){
2025 SyncWrite.Open(AccountSyncTokenFilename, wxT("w"));
2027 if (SyncWrite.IsOpened()){
2029 SyncWrite.Write(ServerSyncToken, wxConvAuto());
2036 // Check for another sync token. If there is another
2037 // sync token then repeat this. If token matches then stop processing.
2039 if (SyncTokenLoad == ServerSyncToken){
2041 KeepUpdating = FALSE;
2047 // Mark as completed.
2049 wxString AccountNameFinal;
2050 AccountNameFinal = PrefData.accounts.GetAccountDirectory(AccountID);
2051 AccountNameFinal.Append(wxT(".carddav"));
2053 wxCommandEvent reloadevent(RELOADCONTACTLIST);
2054 reloadevent.SetString(AccountNameFinal);
2055 wxPostEvent(this->GetParent(), reloadevent);
2062 // Update the data to the server.
2064 ConnHandle.ProcessData();
2073 n1.tv_nsec = 250000000L;*/
2075 while (iter->second == 1){
2077 SleepFor(250000000);
2078 //nanosleep(&n1, &n2);
2082 if ((iter->second == 4 && TypeIter->second == 0) ||
2083 (iter->second == 8 && TypeIter->second == 0)){
2085 AccountDir = StringAccountIter->second;
2086 ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir);
2088 ConnHandle.GetServerETagValueThread();
2089 ETagServer = ConnHandle.ETagValueResult();
2090 ETagDBPtr->UpdateETag(ContactFilename, ETagServer, ETagServer);
2094 if ((iter->second == 4 && TypeIter->second == 1) ||
2095 (iter->second == 8 && TypeIter->second == 1)){
2097 AccountDir = StringAccountIter->second;
2098 ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir);
2100 ConnHandle.GetServerETagValueThread();
2101 ETagServer = ConnHandle.ETagValueResult();
2102 ETagDBPtr->UpdateETag(ContactFilename, ETagServer, ETagServer);
2112 if (TasksFoundProc == FALSE){
2114 TasksActive = FALSE;
2115 ProcessTasksData = FALSE;
2119 wxCommandEvent eventp(ACTMGR_STARTTIMER);
2120 wxPostEvent(this, eventp);
2122 //AnimationTimer.StartAnimation();
2123 //ActListProcTimer.Start();
2127 wxCommandEvent event(ACTMGR_STARTPROCESSTIMER);
2128 wxPostEvent(this, event);
2130 //ActProcessTimer.Start();
2134 void frmActivityMgr::ProcessTasks()
2137 std::thread ProcessThread(&frmActivityMgr::ProcessTasksThread, this);
2138 ProcessThread.detach();
2142 void frmActivityMgr::SetupPointers(wxETagProcessTimer *ETagTmrPtrInc, void *frmMainPtrInc)
2145 ETagTmrPtr = ETagTmrPtrInc;
2147 frmMainPtr = frmMainPtrInc;
2151 void frmActivityMgr::ResumeProcessing(wxCommandEvent &event){
2153 QRNotif *qrn = (QRNotif *)event.GetClientData();
2155 int *QRes = qrn->QResponse;
2157 *qrn->PausePtr = FALSE;
2159 *QRes = event.GetInt();
2163 void frmActivityMgr::ToggleConnectionStatus( wxCommandEvent &event ){
2165 wxCommandEvent connevent(CONNSTAT_UPDATE);
2167 if (ApplicationSleepMode == FALSE){
2169 connevent.SetInt(1);
2170 ApplicationSleepMode = TRUE;
2171 mnuSleepMode->Check(true);
2175 connevent.SetInt(0);
2176 ApplicationSleepMode = FALSE;
2177 mnuSleepMode->Check(false);
2179 wxCommandEvent event(ACTMGR_STARTTIMER);
2180 wxPostEvent(this, event);
2182 wxCommandEvent eventp(ACTMGR_STARTPROCESSTIMER);
2183 wxPostEvent(this, eventp);
2187 wxPostEvent(GetParent(), connevent);
2191 void frmActivityMgr::SleepMode( wxCommandEvent &event ){
2193 wxCommandEvent connevent(ACTMGR_TOGGLECONN);
2195 wxPostEvent(this, connevent);
2199 void frmActivityMgr::WriteServerCertificate(wxString AccountName, SSLCertCollection SSLCertInc){
2201 wxString ServerCertFinal;
2203 // Get the Cert section of the certificate and write it to the file.
2205 ServerCertFinal = GetAccountDir(AccountName, TRUE);
2209 std::map<int, SSLCertData>::iterator SSLCDIter = SSLCertInc.SSLCollection.find(0);
2210 std::multimap<wxString,wxString>::iterator SSLDataIter = SSLCDIter->second.CertData.find(wxT("Cert"));
2212 CertFile.Open(ServerCertFinal, wxFile::write);
2214 CertFile.Write(SSLDataIter->second, wxConvUTF8);
2219 void frmActivityMgr::StartTimer(wxCommandEvent& event){
2221 ActListProcTimer.Start(1000, FALSE);
2225 void frmActivityMgr::StopTimer(wxCommandEvent& event){
2227 ActListProcTimer.Stop();
2231 void frmActivityMgr::StartProcessTimer(wxCommandEvent& event){
2233 ActProcessTimer.Start(1000, FALSE);
2237 void frmActivityMgr::StopProcessTimer(wxCommandEvent& event){
2239 ActProcessTimer.Stop();
2243 void frmActivityMgr::StartAnimationTimer(wxCommandEvent& event){
2245 AnimationTimer.StartAnimation();
2249 void frmActivityMgr::UpdateStatusLabel(wxCommandEvent& event){
2251 ActivityMgrLabelUpdate *actmgrudata = (ActivityMgrLabelUpdate*)event.GetClientData();
2253 if (actmgrudata != NULL){
2255 lstActivity->SetItem(actmgrudata->ItemIndex, 2, actmgrudata->ItemLabel);
2257 /*if (!actmgrudata->ItemDes.IsEmpty()){
2258 lstActivity->SetItem(actmgrudata->ItemIndex, 0, actmgrudata->ItemDes);