1 // timers.cpp - Timers subroutines.
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 "../actmgr/frmActivityMgr.h"
20 #include "../frmContact.h"
21 #include "../frmMain.h"
22 #include <wx/mstream.h>
25 #include <wx/filename.h>
26 #include <wx/tokenzr.h>
27 #include "../bitmaps.h"
29 #include "../common/preferences.h"
30 #include "../common/etag.h"
31 #include "../common/dirs.h"
33 void wxActTimer::Notify(){
35 frmMain *frmMainPtrProc = static_cast<frmMain*>(frmMainPtr);
37 wxCommandEvent shuffleevent(ACTMGR_SHUFFLE);
39 if (intActivityProgress == 0){
41 wxMemoryInputStream istream(misc_activity1_png, sizeof(misc_activity1_png));
42 wxImage misc_activity1_pngi(istream, wxBITMAP_TYPE_PNG);
43 wxBitmap activityiconbmp(misc_activity1_pngi, -1);
44 bmpActivity->SetBitmap(activityiconbmp);
46 intActivityProgress++;
48 } else if (intActivityProgress == 1){
50 wxMemoryInputStream istream(misc_activity2_png, sizeof(misc_activity2_png));
51 wxImage misc_activity2_pngi(istream, wxBITMAP_TYPE_PNG);
52 wxBitmap activityiconbmp(misc_activity2_pngi, -1);
53 bmpActivity->SetBitmap(activityiconbmp);
55 intActivityProgress++;
57 } else if (intActivityProgress == 2){
59 wxMemoryInputStream istream(misc_activity3_png, sizeof(misc_activity3_png));
60 wxImage misc_activity3_pngi(istream, wxBITMAP_TYPE_PNG);
61 wxBitmap activityiconbmp(misc_activity3_pngi, -1);
62 bmpActivity->SetBitmap(activityiconbmp);
64 intActivityProgress++;
66 } else if (intActivityProgress == 3){
68 wxMemoryInputStream istream(misc_activity4_png, sizeof(misc_activity4_png));
69 wxImage misc_activity4_pngi(istream, wxBITMAP_TYPE_PNG);
70 wxBitmap activityiconbmp(misc_activity4_pngi, -1);
71 bmpActivity->SetBitmap(activityiconbmp);
73 intActivityProgress++;
75 } else if (intActivityProgress == 4){
77 wxMemoryInputStream istream(misc_activity5_png, sizeof(misc_activity5_png));
78 wxImage misc_activity5_pngi(istream, wxBITMAP_TYPE_PNG);
79 wxBitmap activityiconbmp(misc_activity5_pngi, -1);
80 bmpActivity->SetBitmap(activityiconbmp);
82 intActivityProgress++;
84 } else if (intActivityProgress == 5){
86 wxMemoryInputStream istream(misc_activity6_png, sizeof(misc_activity6_png));
87 wxImage misc_activity6_pngi(istream, wxBITMAP_TYPE_PNG);
88 wxBitmap activityiconbmp(misc_activity6_pngi, -1);
89 bmpActivity->SetBitmap(activityiconbmp);
91 intActivityProgress++;
93 } else if (intActivityProgress == 6){
95 wxMemoryInputStream istream(misc_activity7_png, sizeof(misc_activity7_png));
96 wxImage misc_activity7_pngi(istream, wxBITMAP_TYPE_PNG);
97 wxBitmap activityiconbmp(misc_activity7_pngi, -1);
98 bmpActivity->SetBitmap(activityiconbmp);
100 intActivityProgress++;
102 } else if (intActivityProgress == 7){
104 wxMemoryInputStream istream(misc_activity8_png, sizeof(misc_activity8_png));
105 wxImage misc_activity8_pngi(istream, wxBITMAP_TYPE_PNG);
106 wxBitmap activityiconbmp(misc_activity8_pngi, -1);
107 bmpActivity->SetBitmap(activityiconbmp);
109 intActivityProgress++;
111 } else if (intActivityProgress == 8){
113 wxMemoryInputStream istream(misc_activity9_png, sizeof(misc_activity9_png));
114 wxImage misc_activity9_pngi(istream, wxBITMAP_TYPE_PNG);
115 wxBitmap activityiconbmp(misc_activity9_pngi, -1);
116 bmpActivity->SetBitmap(activityiconbmp);
118 intActivityProgress++;
120 } else if (intActivityProgress == 9){
122 wxMemoryInputStream istream(misc_activity10_png, sizeof(misc_activity10_png));
123 wxImage misc_activity10_pngi(istream, wxBITMAP_TYPE_PNG);
124 wxBitmap activityiconbmp(misc_activity10_pngi, -1);
125 bmpActivity->SetBitmap(activityiconbmp);
127 intActivityProgress++;
129 } else if (intActivityProgress == 10){
131 wxMemoryInputStream istream(misc_activity11_png, sizeof(misc_activity11_png));
132 wxImage misc_activity11_pngi(istream, wxBITMAP_TYPE_PNG);
133 wxBitmap activityiconbmp(misc_activity11_pngi, -1);
134 bmpActivity->SetBitmap(activityiconbmp);
136 intActivityProgress++;
138 } else if (intActivityProgress == 11){
140 wxMemoryInputStream istream(misc_activity12_png, sizeof(misc_activity12_png));
141 wxImage misc_activity12_pngi(istream, wxBITMAP_TYPE_PNG);
142 wxBitmap activityiconbmp(misc_activity12_pngi, -1);
143 bmpActivity->SetBitmap(activityiconbmp);
145 intActivityProgress = 0;
149 wxPostEvent(frmMainPtrProc, shuffleevent);
153 void wxActTimer::SetBitmap(wxStaticBitmap *bitmap)
156 bmpActivity = bitmap;
160 void wxActTimer::SetSleepBitmap(wxBitmap *SleepBitmap)
163 SleepBitmapPtr = SleepBitmap;
167 void wxActTimer::StopAnimation()
170 // Stop the icon animation.
172 frmMain *frmMainPtrProc = static_cast<frmMain*>(frmMainPtr);
174 wxCommandEvent actstop(ACTMGR_STOP);
175 wxPostEvent(frmMainPtrProc, actstop);
176 //frmMainPtrProc->ActivityIconStop();
179 bmpActivity->SetBitmap(*SleepBitmapPtr);
183 void wxActTimer::StartAnimation()
186 frmMain *frmMainPtrProc = static_cast<frmMain*>(frmMainPtr);
187 wxCommandEvent actstart(ACTMGR_START);
188 wxPostEvent(frmMainPtrProc, actstart);
189 //frmMainPtrProc->ActivityIconStart();
192 this->Start(50, FALSE);
196 void wxActTimer::ResetBitmap()
199 intActivityProgress = 0;
203 void wxActTimer::SetupPointer(void *frmMainPtrIn)
206 frmMainPtr = frmMainPtrIn;
210 void wxActProcessTimer::Notify()
213 // Pause the timer whilst processing to avoid problems.
219 frmActivityMgr *ActMgrPtrProc = static_cast<frmActivityMgr*>(ActMgrPtr);
220 ActMgrPtrProc->ProcessTasks();
224 void wxActProcessTimer::SetupPointers(void *ActMgr){
230 void wxActListProcTimer::Notify(){
232 // Setup Label and get task data (update SetupPointers subroutine).
236 for (std::map<int,int>::iterator iter = ActListPtr->begin();
237 iter != ActListPtr->end(); ++iter){
239 // Check for any queued tasks and start one.
246 // 5 = Failed (UI Updated).
247 // 6 = Stopped (UI Updated).
248 // 7 = (Reserved) (UI Updated).
249 // 8 = Completed. (UI Updated).
251 std::map<int,long>::iterator LongIter = ActListUIPtr->find(iter->first);
253 if (iter->second > 4){
259 std::map<int,wxString>::iterator DetailIter = ActListDetailPtr->find(iter->first);
261 wxCommandEvent uevent(ACTMGR_UPDATESTATUSLABEL);
262 ActivityMgrLabelUpdate *ueventdata = new ActivityMgrLabelUpdate;
263 uevent.SetClientData(ueventdata);
265 if (iter->second == 1){
267 ueventdata->ItemIndex = LongIter->second;
268 ueventdata->ItemLabel = _("Processing...");
269 //ueventdata->ItemDes = _("Adding Contact '") + DetailIter->second + _("'...");
271 wxPostEvent(static_cast<frmActivityMgr*>(ActMgrPtr), uevent);
273 /*lstActivityPtr->SetItem(LongIter->second, 2, _("Processing..."));
274 if (ActListDetailPtr->find(iter->first) != ActListDetailPtr->end()){
275 lblDetailsPtr->SetLabel(_("Adding Contact '") + DetailIter->second + _("'..."));
278 } else if (iter->second == 2){
280 ueventdata->ItemIndex = LongIter->second;
281 ueventdata->ItemLabel = _("Failed");
283 wxPostEvent(static_cast<frmActivityMgr*>(ActMgrPtr), uevent);
286 //lstActivityPtr->SetItem(LongIter->second, 2, _("Failed"));
288 } else if (iter->second == 3){
290 ueventdata->ItemIndex = LongIter->second;
291 ueventdata->ItemLabel = _("Stopped");
293 wxPostEvent(static_cast<frmActivityMgr*>(ActMgrPtr), uevent);
296 //lstActivityPtr->SetItem(LongIter->second, 2, _("Stopped"));
299 } else if (iter->second == 4){
301 ueventdata->ItemIndex = LongIter->second;
302 ueventdata->ItemLabel = _("Completed");
304 wxPostEvent(static_cast<frmActivityMgr*>(ActMgrPtr), uevent);
307 //lstActivityPtr->SetItem(LongIter->second, 2, _("Completed"));
312 // Insert a finish date.
317 ActListFinDTPtr->insert(std::make_pair(iter->first, adt));
319 // Delete the connection object.
321 std::map<int, CardDAV*>::iterator ConnObject = ActListConnPtr->find(iter->first);
322 delete ConnObject->second;
323 ConnObject->second = NULL;
327 if (ClearupProcessed == TRUE){
329 // Clear up processed items.
331 // Delete the processed items.
333 ClearupProcessed = FALSE;
337 if (*TasksActivePtr == FALSE){
339 ActTimerPtr->StopAnimation();
340 lblDetailsPtr->SetLabel(_("No activity."));
350 void wxActListProcTimer::SetupPointers(std::map<int,int> *ActList, std::map<int,long> *ActListUI,
351 std::map<int,wxString> *ActListDetail, bool *TasksActive,
352 wxListCtrl *lstActivity, wxStaticText *lblDetails, wxGauge *GauProgress,
353 void *ActMgr, wxActTimer *ActTimer, wxActProcessTimer *ActProcessTimer,
354 std::map<int,wxDateTime> *ActListFinDT, std::map<int, CardDAV*> *ActListConn){
356 ActListPtr = ActList;
357 ActListUIPtr = ActListUI;
358 ActListDetailPtr = ActListDetail;
359 TasksActivePtr = TasksActive;
360 lstActivityPtr = lstActivity;
361 lblDetailsPtr = lblDetails;
362 GauProgressPtr = GauProgress;
364 ActTimerPtr = ActTimer;
365 ActProcessTimerPtr = ActProcessTimer;
366 ActListFinDTPtr = ActListFinDT;
367 ActListConnPtr = ActListConn;
371 void wxActListProcTimer::EnableClearup(){
373 ClearupProcessed = TRUE;
377 void wxETagProcessTimer::Notify(){
379 // Check each ETagDB and see if writing to file is required.
384 std::map<wxString,ETagDB>::iterator ETagIter;
386 for (ETagIter = ETagDBList.begin();
387 ETagIter != ETagDBList.end(); ++ETagIter){
389 if (ETagIter->second.GetWriteStatus() == TRUE){
391 ETagIter->second.WriteETagDB();
400 void wxETagProcessTimer::ReloadAccounts(){
402 // Get the account preferences file and setup each database accordingly.
411 wxString PrefFilename = GetUserPrefDir();
413 XABPreferences PrefData(PrefFilename);
415 wxString AccountName;
417 wxString AccountAddress;
418 wxString AccountUsername;
419 wxString AccountPassword;
420 wxString AccountPrefix;
421 wxString AccountType;
423 // Look for the account and get the friendly name for the account.
425 for (int i = 0; i < PrefData.accounts.GetCount(); i++){
427 AccountDir = PrefData.accounts.GetAccountDirectory(i);
428 AccountType = PrefData.accounts.GetAccountType(i);
430 if (AccountDir.IsEmpty()){
434 if (AccountType == wxT("Local") || AccountType == wxT("local")){
439 AccountDir.Append(wxT(".carddav"));
442 AccountDB.SetupDB(AccountDir);
444 ETagDBList.insert(std::make_pair(AccountDir, AccountDB));
452 /*for (int i = 0; i < PrefData.accounts.GetCount(); i++){
454 AccountDir = PrefData.accounts.GetAccountDirectory(i);
457 AccountDir.Append(wxT(".carddav"));
459 //AccountPrefix = PrefData.accounts.GetAccountDirPrefix(i);
461 //ETagDB NewETagDB (AccountDir);
464 AccountDB.SetupDB(AccountDir);
466 //ETagDBList.insert(std::make_pair(AccountDir, Moo));
468 //std::pair<wxString,ETagDB> Moo2;
472 //ETagDBListv3.insert(std::make_pair(0,Meep));
474 //ETagDBListv2.insert(std::make_pair(0, Moo));
476 //ETagDBList.insert(Moo2);
478 ETagDBList.insert(std::make_pair(AccountDir, AccountDB));
480 //Moo55.insert(std::make_pair(wxT("Meep"), wxT("Meep")));
482 //ETagDBList[AccountDir] = new ETagDB (AccountDir);
486 //ETagDB Test (AccountDir);
488 //ETagDBList.insert(std::make_pair(AccountDir, Test));
495 ETagDB* wxETagProcessTimer::GetPointer(wxString AccountName){
497 ETagDB *ETagDBPtr = NULL;
499 std::map<wxString,ETagDB>::iterator ETagIter;
501 ETagIter = ETagDBList.find(AccountName);
503 if (ETagIter != ETagDBList.end()){
505 ETagDBPtr = &ETagIter->second;
513 void wxContactFileMonitorTimer::Notify(){
515 if (Filename.IsEmpty()){
521 wxFileName FileCheck(Filename);
522 wxDateTime CurrentDateTime;
524 CurrentDateTime = FileCheck.GetModificationTime();
526 if (FileDateTime != CurrentDateTime){
528 // The dates & times of the file are different.
529 // Send an event to notify the user of this change.
531 wxCommandEvent dateevent(wxEVT_COMMAND_BUTTON_CLICKED);
532 wxPostEvent(frmCEPtr, dateevent);
538 void wxContactFileMonitorTimer::SetFilename(wxString FilenameInc){
540 Filename = FilenameInc;
542 wxFileName FileCheck(Filename);
543 FileDateTime = FileCheck.GetModificationTime();
547 void wxContactFileMonitorTimer::SetupPointers(frmContactEditor *frmCEPtrInc){
549 frmCEPtr = frmCEPtrInc;
553 void wxContactFileMonitorTimer::UpdateTimestamp(){
555 wxFileName FileCheck(Filename);
556 FileDateTime = FileCheck.GetModificationTime();
560 void wxContactWindowMonitor::Notify(){
562 // Look through the list of windows and see if any have
563 // closed. IF they have closed then delete and free the
564 // memory (also delete from the map).
566 /*for(std::map<wxString, void*>::iterator iter = ContactWindowListPtr->begin();
567 iter != ContactWindowListPtr->end(); iter++){
569 frmContact *ContactPtr = (frmContact*)iter->second;
577 // Delete the data from the map.
583 void wxContactWindowMonitor::SetupPointers(std::map<wxString, void*> *ContactWindowListPtrInc){
585 ContactWindowListPtr = ContactWindowListPtrInc;
589 void wxAccountSyncTimer::Notify(){
591 frmActivityMgr *ActMgrPtrProc = static_cast<frmActivityMgr*>(frmActMgrPtr);
593 // Disable the timer. (Don't go updating unless needed).
597 if (ActMgrPtrProc->GetTaskStatus(intTaskID) < 2){
604 // Add task to the activity manager.
606 intTaskID = ActMgrPtrProc->AddTask(3, wxT(""), AccName,
607 wxT(""), wxT(""), wxT(""), wxT(""));
609 // Go to sleep and wait for the task to be completed.
611 // Enable the timer as we are now finished syncronising.
617 void wxAccountSyncTimer::SetupData(wxString AccNameInc,
618 wxString AccNameFullInc){
620 // Set the account name.
622 AccName = AccNameInc;
623 AccNameFull = AccNameFullInc;
627 void wxAccountSyncTimer::SetupPointers(void *frmMainPtrInc,
628 void *frmActMgrPtrInc, ETagDB *ETagDBPtrInc){
632 frmMainPtr = frmMainPtrInc;
633 frmActMgrPtr = frmActMgrPtrInc;
634 ETagDBPtr = ETagDBPtrInc;
638 void SleepFor(unsigned long longSleepNanoSecs){
641 ::Sleep((longSleepNanoSecs / 1000000));
649 n1.tv_nsec = longSleepNanoSecs;