3 #include "frmContact.h"
4 #include "search/XABSearchPanel.h"
5 #include "search/frmSearchAccounts.h"
6 #include "common/preferences.h"
7 #include "common/dirs.h"
8 #include "vcard/vcard.h"
11 #include <wx/fs_mem.h>
12 /*#include <boost/filesystem.hpp>
13 #include <boost/filesystem/fstream.hpp>
14 #include <boost/filesystem/path.hpp>*/
15 #include <wx/tokenzr.h>
18 DEFINE_EVENT_TYPE(SE_ADDSEARCHSETTING);
19 DEFINE_EVENT_TYPE(SE_REMOVESEARCHSETTING);
20 DEFINE_EVENT_TYPE(SE_RELOADACCOUNTS);
21 DEFINE_EVENT_TYPE(SE_ADDRESULT);
22 DEFINE_EVENT_TYPE(SE_SBUPDATE);
23 DEFINE_EVENT_TYPE(SE_SEARCHFINISHED);
24 DEFINE_EVENT_TYPE(SE_UPDATERESULT);
25 DEFINE_EVENT_TYPE(SE_DELETERESULT);
26 DEFINE_EVENT_TYPE(SE_OPENCONTACT);
27 DEFINE_EVENT_TYPE(SE_EDITCONTACT);
28 DEFINE_EVENT_TYPE(SE_REVEALCONTACT);
30 BEGIN_EVENT_TABLE(frmSearch, wxFrame)
31 EVT_COMMAND(wxID_ANY, SE_ADDSEARCHSETTING, frmSearch::AddSearchSetting)
32 EVT_COMMAND(wxID_ANY, SE_REMOVESEARCHSETTING, frmSearch::RemoveSearchSetting)
33 EVT_COMMAND(wxID_ANY, SE_RELOADACCOUNTS, frmSearch::ReloadAccountList)
34 EVT_COMMAND(wxID_ANY, SE_ADDRESULT, frmSearch::AddResult)
35 EVT_COMMAND(wxID_ANY, SE_SBUPDATE, frmSearch::SearchBarUpdate)
36 EVT_COMMAND(wxID_ANY, SE_SEARCHFINISHED, frmSearch::SearchFinished)
37 EVT_COMMAND(wxID_ANY, SE_UPDATERESULT, frmSearch::UpdateResult)
38 EVT_COMMAND(wxID_ANY, SE_DELETERESULT, frmSearch::DeleteResult)
39 EVT_COMMAND(wxID_ANY, SE_OPENCONTACT, frmSearch::OpenContact)
40 EVT_COMMAND(wxID_ANY, SE_EDITCONTACT, frmSearch::EditContact)
41 EVT_COMMAND(wxID_ANY, SE_REVEALCONTACT, frmSearch::RevealContact)
44 //namespace boostfs = boost::filesystem;
46 frmSearch::frmSearch( wxWindow* parent )
48 frmSearchADT( parent )
51 XABSearchPanel *InitPanel = new XABSearchPanel( tabSearch );
52 InitPanel->EnableButtons(TRUE, FALSE);
53 InitPanel->SetupPointers(this);
54 InitPanel->SetupInteger(ScrollGen);
55 szrSearch->Add(InitPanel, 1, wxEXPAND, 0);
56 szrSearch->Fit(tabSearch);
57 SearchFrames.insert(std::make_pair(ScrollGen, InitPanel));
60 // Get the list of accounts and mark them as true.
62 wxString preffilename = GetUserPrefDir();
64 XABPreferences preferences(preffilename);
68 wxString AccDirFullSfx;
70 for (int i = 0; i < preferences.accounts.GetCount(); i++){
71 AccDir = preferences.accounts.GetAccountDirectory(i);
72 AccDirFull = preferences.accounts.GetAccountDirectory(i);
74 AccDirFull.Append(wxT("."));
75 AccDirFullSfx.Append(preferences.accounts.GetAccountType(i));
76 AccDirFullSfx.LowerCase();
78 AccDirFull.Append(AccDirFullSfx);
79 SearchAccountsPaths.insert(std::make_pair(AccDir, AccDirFull));
80 SearchAccounts.insert(std::make_pair(AccDir, TRUE));
81 SearchAccountsNames.insert(std::make_pair(AccDir,
82 preferences.accounts.GetAccountName(i)));
84 AccDirFullSfx.clear();
92 item.SetText(_("Name"));
95 lstResults->InsertColumn(0, item);
98 item.SetText(_("Nickname"));
101 lstResults->InsertColumn(1, item);
104 item.SetText(_("Account"));
107 lstResults->InsertColumn(2, item);
111 void frmSearch::SelectAccounts( wxCommandEvent& event )
114 // Create the form and display as modal.
116 frmSearchAccounts *frameSAccount = new frmSearchAccounts ( this );
117 frameSAccount->LoadSearchAccounts(&SearchAccounts, &SearchAccountsNames);
118 frameSAccount->ShowModal();
119 delete frameSAccount;
120 frameSAccount = NULL;
124 void frmSearch::SearchContactsThread(){
126 // Go through each account and find contacts based on the
129 std::map<wxString,bool>::iterator SAiter;
130 std::map<wxString,wxString>::iterator SAPiter;
131 int intResultFound = 0;
133 for (std::map<wxString, wxString>::iterator SALiter = SearchAccountsNames.begin();
134 SALiter != SearchAccountsNames.end();
137 // Double check that we are searching in this account.
138 // If not, skip to the next one.
140 SAiter = SearchAccounts.find(SALiter->first);
141 SAPiter = SearchAccountsPaths.find(SAiter->first);
144 if (SAiter->second == FALSE){
146 // Not looking in this account. Go to next account.
152 wxCommandEvent sbupdate (SE_SBUPDATE);
154 wxString *SBData = new wxString;
155 *SBData = _("Searching ") + SALiter->second + _("...");
157 sbupdate.SetClientData(SBData);
158 wxPostEvent(this, sbupdate);
160 if (StopMode == FALSE){
162 wxCommandEvent sbstop (SE_SBUPDATE);
164 wxString *SBStopStr = new wxString;
165 *SBStopStr = _("Search stopped.");
167 sbstop.SetClientData(SBStopStr);
168 wxPostEvent(this, sbstop);
173 // Get the list of contact files and process each
176 wxString AccountDir = GetAccountDir(SAPiter->second, FALSE);
178 //boostfs::path vcarddir(AccountDir.c_str());
179 //boostfs::directory_iterator dir_end;
181 //boostfs::path vcardfilename;
182 wxString vcardfilenamewxs;
183 wxStringTokenizer vcardfileline;
186 wxString setname, setvalue;
187 long ContactIndex = 1;
188 long ContactSeekPoint = 0;
189 wxString vCardFilename;
190 wxString vCardFilenameFull;
192 //if (boostfs::exists(vcarddir)){
193 if (wxDirExists(AccountDir)){
195 wxDir vcardaccdir(AccountDir);
197 bool ProcFiles = vcardaccdir.GetFirst(&vCardFilename, wxEmptyString, wxDIR_FILES);
199 //for (boostfs::directory_iterator vcarddir_iter(vcarddir);
200 // vcarddir_iter != dir_end ; ++vcarddir_iter){
202 if (StopMode == FALSE){
204 wxCommandEvent sbstop(SE_SBUPDATE);
206 wxString *SBStopStr = new wxString;
207 *SBStopStr = _("Search stopped.");
209 sbstop.SetClientData(SBStopStr);
210 wxPostEvent(this, sbstop);
215 if (vCardFilename.Right(4) == wxT(".vcf") ||
216 vCardFilename.Right(4) == wxT(".VCF") ||
217 vCardFilename.Right(5) == wxT(".vcard") ||
218 vCardFilename.Right(5) == wxT(".VCARD")){
221 vCardFilenameFull.Append(AccountDir);
222 vCardFilenameFull.Append(vCardFilename);
225 Person.LoadFile(vCardFilenameFull);
227 /*if (boostfs::path(vcarddir_iter->path()).extension() == ".vcf" ||
228 boostfs::path(vcarddir_iter->path()).extension() == ".VCF" ||
229 boostfs::path(vcarddir_iter->path()).extension() == ".vcard" ||
230 boostfs::path(vcarddir_iter->path()).extension() == ".VCARD"){*/
232 vcardfilenamewxs = vCardFilenameFull;
235 std::fstream vcardfile;
237 vcardfilename = boostfs::path(vcarddir_iter->path()).filename();
238 vcardfilenamewxs.Append(AccountDir);
239 vcardfilenamewxs.Append(wxString::FromUTF8(vcardfilename.c_str()));
241 // Open the vCard file up and get the setting names and values from the
244 vcardfile.open(vcardfilenamewxs.mb_str(), std::ios::in);
246 while(getline(vcardfile, l)){
251 lwxs.Append(wxString::FromUTF8(l.c_str()));
252 vcardfileline.SetString(lwxs, wxT(":"));
253 setname = vcardfileline.GetNextToken();
254 setvalue = vcardfileline.GetString();
256 Person.Add(setname, setvalue, TRUE);
262 // Check if file has version 4.0, first name (FN)
263 // begin and end vCard portions.
265 // Don't search unless these conditions have been met.
267 if (Person.MeetBaseSpecification()){
269 // Go through each of the search settings and check
270 // if they match with contact details.
272 // If it matches then add to the search results.
278 ArrayvCardOutData ArrayData;
279 ArrayvCardOutData NicknameArrayData;
280 vCardName NameArray = Person.GetName();
281 wxString ContactFinalNickname;
282 NicknameArrayData = Person.GetByPartial(wxT("NICKNAME"));
284 if (NicknameArrayData.PropCount != 0){
285 ContactFinalNickname = NicknameArrayData.PropValues[0];
288 for (std::map<int, void*>::iterator siter = SearchFrames.begin();
289 siter != SearchFrames.end(); siter++){
291 // Get the settings from the form.
293 XABSearchPanel *XABSPPtr = static_cast<XABSearchPanel*>(siter->second);
295 // Get Selected Option and Setting.
297 SelOpt = XABSPPtr->GetSelectionOption();
301 StrOpt = XABSPPtr->GetStringSetting();
302 StrOptLen = StrOpt.Len();
304 if (SelOpt == 0 || SelOpt == 4 || SelOpt == 8){
306 // Matching string that beings with...
308 // Double check the std::map inserts for each section.
312 // Get the forename from the first N.
314 if (NameArray.Forename.Mid(0, StrOptLen) == StrOpt){
316 if (CheckDuplicate(vcardfilenamewxs,
318 &SearchResultAccount,
319 &SearchResultFilename) == TRUE){
325 ArrayData.PropData.Clear();
326 ArrayData.PropValues.Clear();
327 ArrayData.PropCount = 0;
332 SRNotif *sradd = new SRNotif;
333 sradd->ContactName = NameArray;
334 sradd->ContactNickname = ContactFinalNickname;
335 sradd->ContactAccount = SAPiter->second;
336 sradd->ContactAccountName = SALiter->second;
337 sradd->ContactFullFilename = vcardfilenamewxs;
338 sradd->SearchResultID = intResultFound;
340 SearchResultAccount.insert(std::make_pair(sradd->SearchResultID, sradd->ContactAccount));
341 SearchResultFilename.insert(std::make_pair(sradd->SearchResultID, sradd->ContactFullFilename));
345 wxCommandEvent sraddenv(SE_ADDRESULT);
346 sraddenv.SetClientData(sradd);
347 wxPostEvent(this, sraddenv);
351 } else if (SelOpt == 4){
353 if (NameArray.Surname.Mid(0, StrOptLen) == StrOpt){
355 if (CheckDuplicate(vcardfilenamewxs,
357 &SearchResultAccount,
358 &SearchResultFilename) == TRUE){
364 ArrayData.PropData.Clear();
365 ArrayData.PropValues.Clear();
366 ArrayData.PropCount = 0;
371 SRNotif *sradd = new SRNotif;
372 sradd->ContactName = NameArray;
373 sradd->ContactNickname = ContactFinalNickname;
374 sradd->ContactAccount = SAPiter->second;
375 sradd->ContactAccountName = SALiter->second;
376 sradd->ContactFullFilename = vcardfilenamewxs;
377 sradd->SearchResultID = intResultFound;
379 SearchResultAccount.insert(std::make_pair(sradd->SearchResultID, sradd->ContactAccount));
380 SearchResultFilename.insert(std::make_pair(sradd->SearchResultID, sradd->ContactFullFilename));
384 wxCommandEvent sraddenv(SE_ADDRESULT);
385 sraddenv.SetClientData(sradd);
386 wxPostEvent(this, sraddenv);
390 } else if (SelOpt == 8){
392 wxString NicknameData;
394 for (int i = 0; i < NicknameArrayData.PropCount; i++){
396 NicknameData = NicknameArrayData.PropValues[i];
398 if (NicknameData.Mid(0, StrOptLen) == StrOpt){
400 if (CheckDuplicate(vcardfilenamewxs,
402 &SearchResultAccount,
403 &SearchResultFilename) == TRUE){
409 ArrayData.PropData.Clear();
410 ArrayData.PropValues.Clear();
411 ArrayData.PropCount = 0;
416 SRNotif *sradd = new SRNotif;
417 sradd->ContactName = NameArray;
418 sradd->ContactNickname = ContactFinalNickname;
419 sradd->ContactAccount = SAPiter->second;
420 sradd->ContactAccountName = SALiter->second;
421 sradd->ContactFullFilename = vcardfilenamewxs;
422 sradd->SearchResultID = intResultFound;
424 SearchResultAccount.insert(std::make_pair(sradd->SearchResultID, sradd->ContactAccount));
425 SearchResultFilename.insert(std::make_pair(sradd->SearchResultID, sradd->ContactFullFilename));
429 wxCommandEvent sraddenv(SE_ADDRESULT);
430 sraddenv.SetClientData(sradd);
431 wxPostEvent(this, sraddenv);
441 } else if (SelOpt == 1 || SelOpt == 5 || SelOpt == 9){
443 // Matching string that ends with...
447 // Check the forename.
449 if (NameArray.Forename.Right(StrOptLen) == StrOpt){
451 if (CheckDuplicate(vcardfilenamewxs,
453 &SearchResultAccount,
454 &SearchResultFilename) == TRUE){
460 ArrayData.PropData.Clear();
461 ArrayData.PropValues.Clear();
462 ArrayData.PropCount = 0;
467 SRNotif *sradd = new SRNotif;
468 sradd->ContactName = NameArray;
469 sradd->ContactNickname = ContactFinalNickname;
470 sradd->ContactAccount = SAPiter->second;
471 sradd->ContactAccountName = SALiter->second;
472 sradd->ContactFullFilename = vcardfilenamewxs;
473 sradd->SearchResultID = intResultFound;
475 SearchResultAccount.insert(std::make_pair(sradd->SearchResultID, sradd->ContactAccount));
476 SearchResultFilename.insert(std::make_pair(sradd->SearchResultID, sradd->ContactFullFilename));
480 wxCommandEvent sraddenv(SE_ADDRESULT);
481 sraddenv.SetClientData(sradd);
482 wxPostEvent(this, sraddenv);
486 } else if (SelOpt == 5){
488 if (NameArray.Surname.Right(StrOptLen) == StrOpt){
490 if (CheckDuplicate(vcardfilenamewxs,
492 &SearchResultAccount,
493 &SearchResultFilename) == TRUE){
499 ArrayData.PropData.Clear();
500 ArrayData.PropValues.Clear();
501 ArrayData.PropCount = 0;
506 SRNotif *sradd = new SRNotif;
507 sradd->ContactName = NameArray;
508 sradd->ContactNickname = ContactFinalNickname;
509 sradd->ContactAccount = SAPiter->second;
510 sradd->ContactAccountName = SALiter->second;
511 sradd->ContactFullFilename = vcardfilenamewxs;
512 sradd->SearchResultID = intResultFound;
514 SearchResultAccount.insert(std::make_pair(sradd->SearchResultID, sradd->ContactAccount));
515 SearchResultFilename.insert(std::make_pair(sradd->SearchResultID, sradd->ContactFullFilename));
519 wxCommandEvent sraddenv(SE_ADDRESULT);
520 sraddenv.SetClientData(sradd);
521 wxPostEvent(this, sraddenv);
525 } else if (SelOpt == 9){
527 wxString NicknameData;
529 for (int i = 0; i < NicknameArrayData.PropCount; i++){
531 NicknameData = NicknameArrayData.PropValues[i];
534 if (NicknameData.Right(StrOptLen) == StrOpt){
536 if (CheckDuplicate(vcardfilenamewxs,
538 &SearchResultAccount,
539 &SearchResultFilename) == TRUE){
545 ArrayData.PropData.Clear();
546 ArrayData.PropValues.Clear();
547 ArrayData.PropCount = 0;
552 SRNotif *sradd = new SRNotif;
553 sradd->ContactName = NameArray;
554 sradd->ContactNickname = ContactFinalNickname;
555 sradd->ContactAccount = SAPiter->second;
556 sradd->ContactAccountName = SALiter->second;
557 sradd->ContactFullFilename = vcardfilenamewxs;
558 sradd->SearchResultID = intResultFound;
560 SearchResultAccount.insert(std::make_pair(sradd->SearchResultID, sradd->ContactAccount));
561 SearchResultFilename.insert(std::make_pair(sradd->SearchResultID, sradd->ContactFullFilename));
565 wxCommandEvent sraddenv(SE_ADDRESULT);
566 sraddenv.SetClientData(sradd);
567 wxPostEvent(this, sraddenv);
577 } else if (SelOpt == 2 || SelOpt == 6 || SelOpt == 10){
579 // Matching string that contains...
583 if (NameArray.Forename.Find(StrOpt) != wxNOT_FOUND){
585 if (CheckDuplicate(vcardfilenamewxs,
587 &SearchResultAccount,
588 &SearchResultFilename) == TRUE){
594 ArrayData.PropData.Clear();
595 ArrayData.PropValues.Clear();
596 ArrayData.PropCount = 0;
601 SRNotif *sradd = new SRNotif;
602 sradd->ContactName = NameArray;
603 sradd->ContactNickname = ContactFinalNickname;
604 sradd->ContactAccount = SAPiter->second;
605 sradd->ContactAccountName = SALiter->second;
606 sradd->ContactFullFilename = vcardfilenamewxs;
607 sradd->SearchResultID = intResultFound;
609 SearchResultAccount.insert(std::make_pair(sradd->SearchResultID, sradd->ContactAccount));
610 SearchResultFilename.insert(std::make_pair(sradd->SearchResultID, sradd->ContactFullFilename));
614 wxCommandEvent sraddenv(SE_ADDRESULT);
615 sraddenv.SetClientData(sradd);
616 wxPostEvent(this, sraddenv);
620 } else if (SelOpt == 6){
622 if (NameArray.Surname.Find(StrOpt) != wxNOT_FOUND){
624 if (CheckDuplicate(vcardfilenamewxs,
626 &SearchResultAccount,
627 &SearchResultFilename) == TRUE){
633 ArrayData.PropData.Clear();
634 ArrayData.PropValues.Clear();
635 ArrayData.PropCount = 0;
640 SRNotif *sradd = new SRNotif;
641 sradd->ContactName = NameArray;
642 sradd->ContactNickname = ContactFinalNickname;
643 sradd->ContactAccount = SAPiter->second;
644 sradd->ContactAccountName = SALiter->second;
645 sradd->ContactFullFilename = vcardfilenamewxs;
646 sradd->SearchResultID = intResultFound;
648 SearchResultAccount.insert(std::make_pair(sradd->SearchResultID, sradd->ContactAccount));
649 SearchResultFilename.insert(std::make_pair(sradd->SearchResultID, sradd->ContactFullFilename));
653 wxCommandEvent sraddenv(SE_ADDRESULT);
654 sraddenv.SetClientData(sradd);
655 wxPostEvent(this, sraddenv);
659 } else if (SelOpt == 10){
661 wxString NicknameData;
663 for (int i = 0; i < NicknameArrayData.PropCount; i++){
665 NicknameData = NicknameArrayData.PropValues[i];
668 if (NicknameData.Find(StrOpt) != wxNOT_FOUND){
670 if (CheckDuplicate(vcardfilenamewxs,
672 &SearchResultAccount,
673 &SearchResultFilename) == TRUE){
679 ArrayData.PropData.Clear();
680 ArrayData.PropValues.Clear();
681 ArrayData.PropCount = 0;
686 SRNotif *sradd = new SRNotif;
687 sradd->ContactName = NameArray;
688 sradd->ContactNickname = ContactFinalNickname;
689 sradd->ContactAccount = SAPiter->second;
690 sradd->ContactAccountName = SALiter->second;
691 sradd->ContactFullFilename = vcardfilenamewxs;
692 sradd->SearchResultID = intResultFound;
694 SearchResultAccount.insert(std::make_pair(sradd->SearchResultID, sradd->ContactAccount));
695 SearchResultFilename.insert(std::make_pair(sradd->SearchResultID, sradd->ContactFullFilename));
699 wxCommandEvent sraddenv(SE_ADDRESULT);
700 sraddenv.SetClientData(sradd);
701 wxPostEvent(this, sraddenv);
711 } else if (SelOpt == 3 || SelOpt == 7 || SelOpt == 11){
713 // Matching String that doesn't contain...
717 // Process the nickname data.
719 if (NameArray.Forename.Find(StrOpt) == wxNOT_FOUND){
721 if (CheckDuplicate(vcardfilenamewxs,
723 &SearchResultAccount,
724 &SearchResultFilename) == TRUE){
730 ArrayData.PropData.Clear();
731 ArrayData.PropValues.Clear();
732 ArrayData.PropCount = 0;
737 SRNotif *sradd = new SRNotif;
738 sradd->ContactName = NameArray;
739 sradd->ContactNickname = ContactFinalNickname;
740 sradd->ContactAccount = SAPiter->second;
741 sradd->ContactAccountName = SALiter->second;
742 sradd->ContactFullFilename = vcardfilenamewxs;
743 sradd->SearchResultID = intResultFound;
745 SearchResultAccount.insert(std::make_pair(sradd->SearchResultID, sradd->ContactAccount));
746 SearchResultFilename.insert(std::make_pair(sradd->SearchResultID, sradd->ContactFullFilename));
750 wxCommandEvent sraddenv(SE_ADDRESULT);
751 sraddenv.SetClientData(sradd);
752 wxPostEvent(this, sraddenv);
756 } else if (SelOpt == 7){
758 if (!NameArray.Surname.Find(StrOpt) == wxNOT_FOUND){
760 if (CheckDuplicate(vcardfilenamewxs,
762 &SearchResultAccount,
763 &SearchResultFilename) == TRUE){
769 ArrayData.PropData.Clear();
770 ArrayData.PropValues.Clear();
771 ArrayData.PropCount = 0;
776 SRNotif *sradd = new SRNotif;
777 sradd->ContactName = NameArray;
778 sradd->ContactNickname = ContactFinalNickname;
779 sradd->ContactAccount = SAPiter->second;
780 sradd->ContactAccountName = SALiter->second;
781 sradd->ContactFullFilename = vcardfilenamewxs;
782 sradd->SearchResultID = intResultFound;
784 SearchResultAccount.insert(std::make_pair(sradd->SearchResultID, sradd->ContactAccount));
785 SearchResultFilename.insert(std::make_pair(sradd->SearchResultID, sradd->ContactFullFilename));
789 wxCommandEvent sraddenv(SE_ADDRESULT);
790 sraddenv.SetClientData(sradd);
791 wxPostEvent(this, sraddenv);
795 } else if (SelOpt == 11){
797 wxString NicknameData;
799 for (int i = 0; i < NicknameArrayData.PropCount; i++){
801 NicknameData = NicknameArrayData.PropValues[i];
804 if (NicknameData.Find(StrOpt) == wxNOT_FOUND){
806 if (CheckDuplicate(vcardfilenamewxs,
808 &SearchResultAccount,
809 &SearchResultFilename) == TRUE){
815 ArrayData.PropData.Clear();
816 ArrayData.PropValues.Clear();
817 ArrayData.PropCount = 0;
822 SRNotif *sradd = new SRNotif;
823 sradd->ContactName = NameArray;
824 sradd->ContactNickname = ContactFinalNickname;
825 sradd->ContactAccount = SAPiter->second;
826 sradd->ContactAccountName = SALiter->second;
827 sradd->ContactFullFilename = vcardfilenamewxs;
828 sradd->SearchResultID = intResultFound;
830 SearchResultAccount.insert(std::make_pair(sradd->SearchResultID, sradd->ContactAccount));
831 SearchResultFilename.insert(std::make_pair(sradd->SearchResultID, sradd->ContactFullFilename));
835 wxCommandEvent sraddenv(SE_ADDRESULT);
836 sraddenv.SetClientData(sradd);
837 wxPostEvent(this, sraddenv);
851 chkOpt = XABSPPtr->GetCheckboxSetting();
855 // Search should check if it has a photo or not.
857 ArrayData = Person.GetByPartial(wxT("PHOTO"));
859 if ((ArrayData.PropCount >= 1 &&
861 (ArrayData.PropCount == 0 &&
864 if (CheckDuplicate(vcardfilenamewxs,
866 &SearchResultAccount,
867 &SearchResultFilename) == TRUE){
873 ArrayData.PropData.Clear();
874 ArrayData.PropValues.Clear();
875 ArrayData.PropCount = 0;
880 SRNotif *sradd = new SRNotif;
882 sradd->ContactName = NameArray;
883 sradd->ContactNickname = ContactFinalNickname;
884 sradd->ContactAccount = SAPiter->second;
885 sradd->ContactAccountName = SALiter->second;
886 sradd->ContactFullFilename = vcardfilenamewxs;
887 sradd->SearchResultID = intResultFound;
889 SearchResultAccount.insert(std::make_pair(sradd->SearchResultID, sradd->ContactAccount));
890 SearchResultFilename.insert(std::make_pair(sradd->SearchResultID, sradd->ContactFullFilename));
894 wxCommandEvent sraddenv(SE_ADDRESULT);
895 sraddenv.SetClientData(sradd);
896 wxPostEvent(this, sraddenv);
900 } else if (SelOpt == 13){
902 // Search should check if it has a logo or not.
904 ArrayData = Person.GetByPartial(wxT("LOGO"));
906 if ((ArrayData.PropCount >= 1 &&
908 (ArrayData.PropCount == 0 &&
911 if (CheckDuplicate(vcardfilenamewxs,
913 &SearchResultAccount,
914 &SearchResultFilename) == TRUE){
920 ArrayData.PropData.Clear();
921 ArrayData.PropValues.Clear();
922 ArrayData.PropCount = 0;
927 SRNotif *sradd = new SRNotif;
929 sradd->ContactName = NameArray;
930 sradd->ContactNickname = ContactFinalNickname;
931 sradd->ContactAccount = SAPiter->second;
932 sradd->ContactAccountName = SALiter->second;
933 sradd->ContactFullFilename = vcardfilenamewxs;
934 sradd->SearchResultID = intResultFound;
936 SearchResultAccount.insert(std::make_pair(sradd->SearchResultID, sradd->ContactAccount));
937 SearchResultFilename.insert(std::make_pair(sradd->SearchResultID, sradd->ContactFullFilename));
941 wxCommandEvent sraddenv(SE_ADDRESULT);
942 sraddenv.SetClientData(sradd);
943 wxPostEvent(this, sraddenv);
947 } else if (SelOpt == 14){
949 // Search should check if it has sound or not.
951 ArrayData = Person.GetByPartial(wxT("SOUND"));
953 if ((ArrayData.PropCount >= 1 &&
955 (ArrayData.PropCount == 0 &&
958 if (CheckDuplicate(vcardfilenamewxs,
960 &SearchResultAccount,
961 &SearchResultFilename) == TRUE){
967 ArrayData.PropData.Clear();
968 ArrayData.PropValues.Clear();
969 ArrayData.PropCount = 0;
974 SRNotif *sradd = new SRNotif;
976 sradd->ContactName = NameArray;
977 sradd->ContactNickname = ContactFinalNickname;
978 sradd->ContactAccount = SAPiter->second;
979 sradd->ContactAccountName = SALiter->second;
980 sradd->ContactFullFilename = vcardfilenamewxs;
981 sradd->SearchResultID = intResultFound;
983 SearchResultAccount.insert(std::make_pair(sradd->SearchResultID, sradd->ContactAccount));
984 SearchResultFilename.insert(std::make_pair(sradd->SearchResultID, sradd->ContactFullFilename));
988 wxCommandEvent sraddenv(SE_ADDRESULT);
989 sraddenv.SetClientData(sradd);
990 wxPostEvent(this, sraddenv);
1002 ArrayData.PropData.Clear();
1003 ArrayData.PropValues.Clear();
1004 ArrayData.PropCount = 0;
1014 vCardFilename.Clear();
1015 vCardFilenameFull.Clear();
1016 ProcFiles = vcardaccdir.GetNext(&vCardFilename);
1026 // Finished searching... clear up.
1028 wxCommandEvent sbfinstr (SE_SBUPDATE);
1030 wxString *SBFinish = new wxString;
1032 if (intResultFound == 0){
1034 *SBFinish = _("No contacts found.");
1036 } else if (intResultFound == 1){
1038 *SBFinish = _("1 contact found.");
1042 *SBFinish = wxString::Format(wxT("%i"), intResultFound) + _(" contacts found.");
1046 sbfinstr.SetClientData(SBFinish);
1047 wxPostEvent(this, sbfinstr);
1049 wxCommandEvent sbfinish (SE_SEARCHFINISHED);
1050 wxPostEvent(this, sbfinish);
1054 void frmSearch::SearchContacts( wxCommandEvent& event )
1057 // Change the button to stop.
1059 if (StopMode == FALSE){
1061 // Clear the list of search results.
1063 lstResults->DeleteAllItems();
1064 SearchResultAccount.clear();
1065 SearchResultFilename.clear();
1067 // Button clicked on as 'Search'.
1069 DisableAllSearchSettings(TRUE);
1071 btnSearch->SetLabel(_("Stop"));
1073 // Spawn a thread so that searching can proceed
1074 // without blocking the GUI (and allow the
1075 // search to stop when needed).
1077 std::thread SearchThread(&frmSearch::SearchContactsThread, this);
1078 SearchThread.detach();
1082 // Button clicked on as 'Stop'.
1085 btnSearch->SetLabel(_("Search"));
1086 DisableAllSearchSettings(FALSE);
1092 void frmSearch::ResetContacts( wxCommandEvent& event )
1095 // Clear all the search settings.
1097 for (std::map<int,void*>::iterator iter = SearchFrames.begin();
1098 iter != SearchFrames.end(); ++iter){
1100 XABSearchPanel *XABSPPtr;
1102 XABSPPtr = static_cast<XABSearchPanel*>(iter->second);
1103 szrSearch->Detach(XABSPPtr);
1105 // Remove the frame from the memory and the list.
1110 SearchFrames.erase(iter->first);
1114 // Clear the list of search results.
1116 lstResults->DeleteAllItems();
1118 // Clear the account settings.
1120 for (std::map<wxString, bool>::iterator iter = SearchAccounts.begin();
1121 iter != SearchAccounts.end(); iter++){
1123 iter->second = TRUE;
1127 // Add a search settings with the default things.
1131 XABSearchPanel *NewPanel = new XABSearchPanel( tabSearch );
1132 NewPanel->EnableButtons(TRUE, FALSE);
1133 NewPanel->SetupPointers(this);
1134 NewPanel->SetupInteger(ScrollGen);
1135 szrSearch->Add(NewPanel, 1, wxEXPAND, 0);
1136 szrSearch->Fit(tabSearch);
1137 SearchFrames.insert(std::make_pair(ScrollGen, NewPanel));
1142 void frmSearch::AddSearchSetting( wxCommandEvent& event )
1145 // Add a search setting frame to the list.
1147 XABSearchPanel *NewPanel = new XABSearchPanel( tabSearch );
1148 NewPanel->EnableButtons(TRUE, TRUE);
1149 NewPanel->SetupPointers(this);
1150 NewPanel->SetupInteger(ScrollGen);
1151 szrSearch->Add(NewPanel, 1, wxEXPAND|wxGROW, 5);
1152 //szrSearch->Fit(tabSearch);
1153 szrSearch->FitInside(tabSearch);
1154 szrSearch->Layout();
1155 szrSearch->RecalcSizes();
1156 tabSearch->Layout();
1157 SearchFrames.insert(std::make_pair(ScrollGen, NewPanel));
1160 // Check if number of search settings is 15 (or over).
1161 // If it is, disable the option of adding extra settings
1162 // for all frames until one is removed.
1164 XABSearchPanel *XABSPPtr;
1166 if (SearchFrames.size() >= 15){
1168 for (std::map<int,void*>::iterator iter = SearchFrames.begin();
1169 iter != SearchFrames.end(); ++iter){
1171 XABSPPtr = static_cast<XABSearchPanel*>(iter->second);
1173 XABSPPtr->EnableButtons(FALSE, TRUE);
1177 } else if (SearchFrames.size() >= 2){
1179 for (std::map<int,void*>::iterator iter = SearchFrames.begin();
1180 iter != SearchFrames.end(); ++iter){
1182 XABSPPtr = static_cast<XABSearchPanel*>(iter->second);
1184 XABSPPtr->EnableButtons(TRUE, TRUE);
1190 //tabSearch->SetScrollbar(wxVERTICAL, 32768, 25, 32768, false);
1191 tabSearch->Update();
1192 //tabSearch->ScrollToLine(tabSearch->GetLineCount());
1196 void frmSearch::RemoveSearchSetting( wxCommandEvent& event )
1199 // Get the integer from the event.
1201 std::map<int,void*>::iterator iter;
1202 iter = SearchFrames.find(event.GetInt());
1204 // Remove a search setting frame from the list.
1206 XABSearchPanel *XABSPPtr;
1207 XABSPPtr = static_cast<XABSearchPanel*>(iter->second);
1209 szrSearch->Detach(XABSPPtr);
1211 // Remove the frame from the memory and the list.
1213 SearchFrames.erase(event.GetInt());
1218 //szrSearch->Fit(tabSearch);
1220 if (SearchFrames.size() < 15 && SearchFrames.size() > 1){
1222 for (std::map<int,void*>::iterator iter = SearchFrames.begin();
1223 iter != SearchFrames.end(); ++iter){
1225 XABSPPtr = static_cast<XABSearchPanel*>(iter->second);
1227 XABSPPtr->EnableButtons(TRUE, TRUE);
1231 } else if (SearchFrames.size() == 1){
1233 for (std::map<int,void*>::iterator iter = SearchFrames.begin();
1234 iter != SearchFrames.end(); ++iter){
1236 XABSPPtr = static_cast<XABSearchPanel*>(iter->second);
1238 XABSPPtr->EnableButtons(TRUE, FALSE);
1244 szrSearch->FitInside(tabSearch);
1245 szrSearch->Layout();
1246 szrSearch->RecalcSizes();
1247 tabSearch->Layout();
1251 void frmSearch::ReloadAccountList( wxCommandEvent& event ){
1253 // Currently unimplemented.
1257 void frmSearch::AddResult( wxCommandEvent& event ){
1259 SRNotif *srnotif = (SRNotif*)event.GetClientData();
1261 // Process Data and add to the list of results.
1265 // Setup the contact name.
1267 wxString ContactNameFinal;
1269 if (!srnotif->ContactName.Title.IsEmpty()){
1271 ContactNameFinal.append(srnotif->ContactName.Title);
1272 ContactNameFinal.Trim();
1273 ContactNameFinal.append(wxT(" "));
1277 if (!srnotif->ContactName.Forename.IsEmpty()){
1279 ContactNameFinal.append(srnotif->ContactName.Forename);
1280 ContactNameFinal.Trim();
1281 ContactNameFinal.append(wxT(" "));
1285 if (!srnotif->ContactName.Surname.IsEmpty()){
1287 ContactNameFinal.append(srnotif->ContactName.Surname);
1288 ContactNameFinal.Trim();
1289 ContactNameFinal.append(wxT(" "));
1293 if (!srnotif->ContactName.Suffix.IsEmpty()){
1295 ContactNameFinal.append(srnotif->ContactName.Suffix);
1296 ContactNameFinal.Trim();
1301 item.SetText(ContactNameFinal);
1302 item.SetData(srnotif->SearchResultID);
1304 long ListCtrlIndex = lstResults->InsertItem(item);
1306 //SearchResultAccount.insert(std::make_pair(srnotif->SearchResultID, srnotif->ContactAccount));
1307 //SearchResultFilename.insert(std::make_pair(srnotif->SearchResultID, srnotif->ContactFullFilename));
1309 srnotif->ContactNickname.Trim();
1311 lstResults->SetItem(ListCtrlIndex, 1, srnotif->ContactNickname);
1312 lstResults->SetItem(ListCtrlIndex, 2, srnotif->ContactAccountName);
1319 void frmSearch::SearchBarUpdate( wxCommandEvent& event ){
1321 wxString *SBData = (wxString*)event.GetClientData();
1323 stbBottom->SetStatusText(*SBData, 0);
1330 void frmSearch::SearchFinished( wxCommandEvent& event ){
1333 btnSearch->SetLabel(_("Search"));
1334 DisableAllSearchSettings(FALSE);
1338 void frmSearch::DisableAllSearchSettings(bool Enable){
1340 for (std::map<int, void*>::iterator siter = SearchFrames.begin();
1341 siter != SearchFrames.end(); siter++){
1343 XABSearchPanel *XABSPPtr = static_cast<XABSearchPanel*>(siter->second);
1345 if (Enable == FALSE){
1347 wxCommandEvent enboxes(XABSP_ENABLECONTROLS);
1348 wxPostEvent(XABSPPtr, enboxes);
1350 } else if (Enable == TRUE){
1352 wxCommandEvent disboxes(XABSP_DISABLECONTROLS);
1353 wxPostEvent(XABSPPtr, disboxes);
1361 void frmSearch::OpenContact( wxCommandEvent& event ){
1363 // Check if a contact has been selected.
1365 long intSelected = -1;
1366 int intSelectedData = 0;
1367 long intContactSeekNum = -1;
1369 intSelected = lstResults->GetNextItem(intSelected,
1371 wxLIST_STATE_SELECTED);
1373 if (intSelected == -1){
1377 intContactSeekNum = lstResults->GetItemData(intSelected);
1379 if (SearchMode == TRUE){
1381 wxMessageBox(SearchResultFilename[intContactSeekNum]);
1385 Person.LoadFile(SearchResultFilename[intContactSeekNum]);
1387 wxMemoryInputStream istream(bigimgs_contactpersonicon48_png, sizeof(bigimgs_contactpersonicon48_png));
1388 wxImage bigimgs_contactpersonicon48i(istream, wxBITMAP_TYPE_PNG);
1389 wxBitmap contacticonbmp(bigimgs_contactpersonicon48i, -1);
1391 contacticon.CopyFromBitmap(contacticonbmp);
1393 frmContact *Contact = new frmContact( this );
1395 Contact->SetupPointers(&SearchModeMemoryFSPtr);
1396 Contact->SetupContactData(&Person);
1398 Contact->SetIcon(contacticon);
1399 Contact->Show(true);
1403 UCNotif *uc = new UCNotif;
1405 uc->ContactAccount = SearchResultAccount[intContactSeekNum];
1406 uc->ContactFilename = SearchResultFilename[intContactSeekNum];
1408 wxCommandEvent oc(CE_OPENCONTACT);
1409 oc.SetClientData(uc);
1410 wxPostEvent(this->GetParent(), oc);
1416 void frmSearch::EditContact( wxCommandEvent& event ){
1418 // Check if a contact has been selected.
1420 long intSelected = -1;
1421 int intSelectedData = 0;
1422 long intContactSeekNum = -1;
1424 intSelected = lstResults->GetNextItem(intSelected,
1426 wxLIST_STATE_SELECTED);
1428 if (intSelected == -1){
1432 intContactSeekNum = lstResults->GetItemData(intSelected);
1434 UCNotif *uc = new UCNotif;
1436 uc->ContactAccount = SearchResultAccount[intContactSeekNum];
1437 uc->ContactFilename = SearchResultFilename[intContactSeekNum];
1439 wxCommandEvent ec(CE_EDITCONTACT);
1440 ec.SetClientData(uc);
1442 wxPostEvent(this->GetParent(), ec);
1446 void frmSearch::RevealContact( wxCommandEvent& event ){
1448 // Check if a contact has been selected.
1450 long intSelected = -1;
1451 int intSelectedData = 0;
1452 long intContactSeekNum = -1;
1454 intSelected = lstResults->GetNextItem(intSelected,
1456 wxLIST_STATE_SELECTED);
1458 if (intSelected == -1){
1462 intContactSeekNum = lstResults->GetItemData(intSelected);
1464 UCNotif *uc = new UCNotif;
1466 uc->ContactAccount = SearchResultAccount[intContactSeekNum];
1467 uc->ContactFilename = SearchResultFilename[intContactSeekNum];
1469 wxCommandEvent rc(CE_REVEALCONTACT);
1470 rc.SetClientData(uc);
1472 wxPostEvent(this->GetParent(), rc);
1476 void frmSearch::CloseWindow( wxCloseEvent& event ){
1478 // Hide the window so users don't panic
1479 // whilst clearing up.
1485 for (std::map<int,void*>::iterator iter = SearchFrames.begin();
1486 iter != SearchFrames.end(); ++iter){
1488 XABSearchPanel *XABSPPtr;
1490 XABSPPtr = static_cast<XABSearchPanel*>(iter->second);
1491 szrSearch->Detach(XABSPPtr);
1493 // Remove the frame from the memory and the list.
1500 SearchFrames.clear();
1504 WindowData *WData = new WindowData;
1506 WData->DataType = 2;
1507 WData->WindowPointer = this;
1508 WData->WindowID = SearchUID;
1510 wxCommandEvent delevent(WINDOW_CLOSE);
1511 delevent.SetClientData(WData);
1512 wxPostEvent(GetParent(), delevent);
1514 wxCommandEvent rs(CE_REMOVESEARCH);
1515 wxPostEvent(this, rs);
1523 void frmSearch::CloseWindow( wxCommandEvent& event ){
1529 void frmSearch::UpdateResult( wxCommandEvent& event ){
1531 UCNotif *uc = (UCNotif*)event.GetClientData();
1533 long longSelected = -1;
1534 int intSelectedData = 0;
1538 longSelected = lstResults->GetNextItem(longSelected,
1540 wxLIST_STATE_DONTCARE);
1542 if (longSelected == -1){
1548 // Get the filename/ID information.
1550 intSelectedData = lstResults->GetItemData(longSelected);
1552 if (uc->ContactFilename == SearchResultFilename[intSelectedData]){
1554 // Process the contact name
1556 wxString ContactNameFinal;
1558 if (!uc->ContactNameArray.Title.IsEmpty()){
1560 ContactNameFinal.append(uc->ContactNameArray.Title);
1561 ContactNameFinal.Trim();
1562 ContactNameFinal.append(wxT(" "));
1566 if (!uc->ContactNameArray.Forename.IsEmpty()){
1568 ContactNameFinal.append(uc->ContactNameArray.Forename);
1569 ContactNameFinal.Trim();
1570 ContactNameFinal.append(wxT(" "));
1574 if (!uc->ContactNameArray.Surname.IsEmpty()){
1576 ContactNameFinal.append(uc->ContactNameArray.Surname);
1577 ContactNameFinal.Trim();
1578 ContactNameFinal.append(wxT(" "));
1582 if (!uc->ContactNameArray.Suffix.IsEmpty()){
1584 ContactNameFinal.append(uc->ContactNameArray.Suffix);
1585 ContactNameFinal.Trim();
1589 lstResults->SetItem(longSelected, 0, ContactNameFinal);
1590 lstResults->SetItem(longSelected, 1, uc->ContactNickname);
1601 bool frmSearch::CheckDuplicate(wxString Filename,
1603 std::map<long,wxString> *SRAcc,
1604 std::map<long,wxString> *SRFN){
1606 std::map<long,wxString>::iterator fniter;
1608 // Check comparison code.
1610 for (std::map<long,wxString>::iterator aciter = SRAcc->begin();
1611 aciter != SRAcc->end(); aciter++){
1613 fniter = SRFN->find(aciter->first);
1615 if (Filename == fniter->second &&
1616 Account == aciter->second){
1628 void frmSearch::DeleteResult(wxCommandEvent &event){
1630 UCNotif *uc = (UCNotif*)event.GetClientData();
1632 long longSelected = -1;
1633 int intSelectedData = 0;
1637 longSelected = lstResults->GetNextItem(longSelected,
1639 wxLIST_STATE_DONTCARE);
1641 if (longSelected == -1){
1647 // Get the filename/ID information.
1649 intSelectedData = lstResults->GetItemData(longSelected);
1651 if (uc->ContactFilename == SearchResultFilename[intSelectedData]){
1653 // Delete the result from the search list and
1654 // update the total search results.
1656 // Remove DeleteResultEvent and find out where the uc
1657 // data is still being used as it crashes on delete.
1659 lstResults->DeleteItem(longSelected);
1661 // Update the number of search results.
1663 wxCommandEvent sbu(SE_SBUPDATE);
1664 wxString *SBUpdate = new wxString;
1666 // Get the number of results.
1668 int intResultFound = lstResults->GetItemCount();
1670 // Prepare the status bar message.
1672 if (intResultFound == 0){
1674 *SBUpdate = _("No contacts found.");
1676 } else if (intResultFound == 1){
1678 *SBUpdate = _("1 contact found.");
1682 *SBUpdate = wxString::Format(wxT("%i"), intResultFound) + _(" contacts found.");
1686 sbu.SetClientData(SBUpdate);
1687 wxPostEvent(this, sbu);
1700 void frmSearch::SetUID(int UID){
1706 void frmSearch::SetSearchMode(bool SearchModeIn){
1708 SearchMode = SearchModeIn;
1710 if (SearchMode == TRUE){
1712 mnuContactEdit->Enable(FALSE);
1713 mnuContactReveal->Enable(FALSE);
1715 wxFileSystem::AddHandler(new wxMemoryFSHandler);
1718 wxMemoryInputStream ciptostream(icons_cipto_png, sizeof(icons_cipto_png));
1719 ciicon_png.LoadFile(ciptostream, wxBITMAP_TYPE_PNG);
1720 wxMemoryFSHandler::AddFile(wxT("cipto.png"), ciicon_png, wxBITMAP_TYPE_PNG);
1722 wxMemoryInputStream cilogstream(icons_cilog_png, sizeof(icons_cilog_png));
1723 ciicon_png.LoadFile(cilogstream, wxBITMAP_TYPE_PNG);
1724 wxMemoryFSHandler::AddFile(wxT("cilog.png"), ciicon_png, wxBITMAP_TYPE_PNG);
1726 wxMemoryInputStream cisndstream(icons_cisnd_png, sizeof(icons_cisnd_png));
1727 ciicon_png.LoadFile(cisndstream, wxBITMAP_TYPE_PNG);
1728 wxMemoryFSHandler::AddFile(wxT("cisnd.png"), ciicon_png, wxBITMAP_TYPE_PNG);
1730 wxMemoryInputStream cikeystream(icons_cikey_png, sizeof(icons_cikey_png));
1731 ciicon_png.LoadFile(cikeystream, wxBITMAP_TYPE_PNG);
1732 wxMemoryFSHandler::AddFile(wxT("cikey.png"), ciicon_png, wxBITMAP_TYPE_PNG);
1734 wxMemoryInputStream civenstream(icons_civen_png, sizeof(icons_civen_png));
1735 ciicon_png.LoadFile(civenstream, wxBITMAP_TYPE_PNG);
1736 wxMemoryFSHandler::AddFile(wxT("civen.png"), ciicon_png, wxBITMAP_TYPE_PNG);
1738 wxMemoryInputStream ciextstream(icons_ciext_png, sizeof(icons_ciext_png));
1739 ciicon_png.LoadFile(ciextstream, wxBITMAP_TYPE_PNG);
1740 wxMemoryFSHandler::AddFile(wxT("ciext.png"), ciicon_png, wxBITMAP_TYPE_PNG);
1744 mnuContactEdit->Enable(TRUE);
1745 mnuContactReveal->Enable(TRUE);
1751 void frmSearch::ShowContactMenu( wxMouseEvent& event ){
1753 ContactMenu->SetupPointers(this, lstResults);
1755 PopupMenu(ContactMenu->MenuPointer(), wxDefaultPosition);