1 // frmContactEditor-Save.cpp - frmContactEditor save contact subroutines.
3 // (c) 2012-2016 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 "frmContactEditor.h"
21 #include "../version.h"
22 #include "../vcard/vcard.h"
23 #include "../vcard/vcard34conv.h"
24 #include "../common/textprocessing.h"
25 #include "../common/preferences.h"
26 #include "../common/uuid.h"
27 #include "../common/dirs.h"
29 void frmContactEditor::SaveContact( wxCommandEvent& event )
32 // Do not save if the account is an unsupported account.
34 if (boolUnsupportedAccount == true){
36 wxMessageBox(_("Cannot make changes to a contact from an unsupported account type."), _("Unsupported account"), wxICON_ERROR);
41 // Check if Display As combo box has a value in it.
42 // Do not go any further if there is no value.
44 wxString cmbDisplayAsValue = cmbDisplayAs->GetValue();
46 if (cmbDisplayAsValue.IsEmpty()){
48 wxMessageBox(_("Display As value cannot be left blank."), _("Display As value empty"), wxICON_ERROR);
53 // Save the updated contact data.
56 wxString FilenameFinal;
57 bool ReplaceContact = FALSE;
59 if (StartupEditMode == TRUE){
61 if (cmbType->GetCurrentSelection() == 1 ||
62 cmbType->GetCurrentSelection() == 3 ||
63 cmbType->GetCurrentSelection() == 4){
67 // Mark contact for replacing.
69 ReplaceContact = TRUE;
74 } else if (cmbType->GetCurrentSelection() == 2){
76 if (IsGroup == FALSE){
78 // Mark contact for replacing.
80 ReplaceContact = TRUE;
87 if (ReplaceContact == TRUE){
89 wxString wxDelSplitFilename;
90 wxString wxDelFinalFilename;
91 wxString wxSDelDataURL;
92 wxStringTokenizer wSTDelFilename(wxSContactFilename, wxT("/"));
94 while(wSTDelFilename.HasMoreTokens()){
96 wxDelSplitFilename = wSTDelFilename.GetNextToken();
100 wxSDelDataURL = wxDelSplitFilename;
102 // Delete the contact from the server as it will be useless in certain
103 // address book clients.
105 ActMgrPtr->AddTask(2, cmbDisplayAs->GetValue(), wxSContactAccount, wxSDelDataURL, wxDelSplitFilename, wxSContactFilename, wxT(""));
107 // Clear the filename so the trigger to recreate the UID is done.
109 wxSContactFilename.Clear();
116 if (wxSContactFilename.IsEmpty()){
118 // Generate a random UUID.
120 ContactEditorData.UIDToken = GenerateUUID();
121 ContactEditorData.UIDToken = ContactEditorData.UIDToken.MakeUpper();
123 // Setup the filename.
125 FilenameFinal = GetAccountDir(wxSContactAccount, FALSE);
127 #if defined(__HAIKU__)
129 #elif defined(__WIN32__)
131 FilenameFinal = GetAccountDir(wxSContactAccount, FALSE);
132 FilenameFinal.Append(ContactEditorData.UIDToken);
133 FilenameFinal.Append(wxT(".vcf"));
134 wxSContactFilename = FilenameFinal;
138 FilenameFinal = GetAccountDir(wxSContactAccount, FALSE);
139 FilenameFinal.Append(ContactEditorData.UIDToken);
140 FilenameFinal.Append(wxT(".vcf"));
141 wxSContactFilename = FilenameFinal;
147 if (ContactEditorData.UIDToken.IsEmpty()){
149 // UID Token is empty. (Shouldn't be).
150 // Generate a new UID Token.
152 ContactEditorData.UIDToken = GenerateUUID();
153 ContactEditorData.UIDToken = ContactEditorData.UIDToken.MakeUpper();
157 FilenameFinal = wxSContactFilename;
161 // Setup the data and write it into the account folder.
163 // Begin preperations to write the contact to a file.
166 std::map<int,int>::iterator intiter;
167 std::map<int,wxString>::iterator striter;
169 // Set some values for saving.
171 ContactEditorData.NameForename = txtForename->GetValue();
172 ContactEditorData.NameSurname = txtSurname->GetValue();
173 ContactEditorData.NameOtherNames = txtOtherNames->GetValue();
174 ContactEditorData.NameTitle = txtTitle->GetValue();
175 ContactEditorData.NameSuffix = txtSuffix->GetValue();
177 ContactEditorData.GenderDetails = txtGenderDescription->GetValue();
179 // Process Birthday: Get Day, Month & Year.
181 wxDateTime BirthdayDate;
182 wxDateTime::Month BirthdayMonth;
185 wxString DataBeforeT;
187 wxString FinalBirthdayString;
188 bool ProcessDataAfterT = FALSE;
190 BirthdayDate = dapBirthday->GetValue();
192 if (!txtBirthday->IsEmpty()){
194 // Birthday value is text so use this.
196 ContactEditorData.Birthday = txtBirthday->GetValue();
198 } else if (BirthdayDate.IsValid()){
200 BirthdayDay = BirthdayDate.GetDay();
201 BirthdayMonth = BirthdayDate.GetMonth();
202 BirthdayYear = BirthdayDate.GetYear();
204 // Look for T and replace data before this.
206 wxStringTokenizer wSTDate(ContactEditorData.Birthday, wxT("T"));
208 while (wSTDate.HasMoreTokens()){
210 if (ProcessDataAfterT == FALSE){
212 DataBeforeT = wSTDate.GetNextToken();
213 ProcessDataAfterT = TRUE;
217 DataAfterT = wSTDate.GetNextToken();
224 // If there is not T then replace altogether.
226 wxString FinalBirthdayDay;
227 wxString FinalBirthdayMonth;
228 wxString FinalBirthdayYear;
230 if (BirthdayDay < 10){
232 FinalBirthdayDay = wxT("0") + wxString::Format(wxT("%i"), BirthdayDay);
236 FinalBirthdayDay = wxString::Format(wxT("%i"), BirthdayDay);
240 if (((int)BirthdayMonth + 1) < 10){
242 FinalBirthdayMonth = wxT("0") + wxString::Format(wxT("%i"), ((int)BirthdayMonth + 1));
246 FinalBirthdayMonth = wxString::Format(wxT("%i"), ((int)BirthdayMonth + 1));
250 if (BirthdayYear == 0){
252 FinalBirthdayYear = wxT("--");
256 FinalBirthdayYear = wxString::Format(wxT("%i"), BirthdayYear);
260 if (!DataAfterT.IsEmpty()){
262 FinalBirthdayString = FinalBirthdayYear + FinalBirthdayMonth + FinalBirthdayDay + wxT("T") + DataAfterT;
266 FinalBirthdayString = FinalBirthdayYear + FinalBirthdayMonth + FinalBirthdayDay;
270 if(!FinalBirthdayString.IsEmpty()){
272 ContactEditorData.Birthday = FinalBirthdayString;
278 // Process Anniversary: Get Day, Month & Year.
280 wxDateTime AnniversaryDate;
281 wxDateTime::Month AnniversaryMonth;
286 wxString FinalAnniversaryString;
287 ProcessDataAfterT = FALSE;
289 AnniversaryDate = dapAnniversary->GetValue();
291 if (!txtAnniversary->IsEmpty()){
293 // Birthday value is text so use this.
295 ContactEditorData.Anniversary = txtAnniversary->GetValue();
297 } else if (AnniversaryDate.IsValid()){
299 AnniversaryDay = AnniversaryDate.GetDay();
300 AnniversaryMonth = AnniversaryDate.GetMonth();
301 AnniversaryYear = AnniversaryDate.GetYear();
303 // Look for T and replace data before this.
305 wxStringTokenizer wSTDate(ContactEditorData.Anniversary, wxT("T"));
307 while (wSTDate.HasMoreTokens()){
309 if (ProcessDataAfterT == FALSE){
311 DataBeforeT = wSTDate.GetNextToken();
312 ProcessDataAfterT = TRUE;
316 DataAfterT = wSTDate.GetNextToken();
323 // If there is not T then replace altogether.
325 wxString FinalAnniversaryDay;
326 wxString FinalAnniversaryMonth;
327 wxString FinalAnniversaryYear;
329 if (AnniversaryDay < 10){
331 FinalAnniversaryDay = wxT("0") + wxString::Format(wxT("%i"), AnniversaryDay);
335 FinalAnniversaryDay = wxString::Format(wxT("%i"), AnniversaryDay);
339 if (((int)AnniversaryMonth + 1) < 10){
341 FinalAnniversaryMonth = wxT("0") + wxString::Format(wxT("%i"), ((int)AnniversaryMonth + 1));
345 FinalAnniversaryMonth = wxString::Format(wxT("%i"), ((int)AnniversaryMonth + 1));
349 if (AnniversaryYear == 0){
351 FinalAnniversaryYear = wxT("--");
355 FinalAnniversaryYear = wxString::Format(wxT("%i"), AnniversaryYear);
359 if (!DataAfterT.IsEmpty()){
361 FinalAnniversaryString = FinalAnniversaryYear + FinalAnniversaryMonth + FinalAnniversaryDay + wxT("T") + DataAfterT;
365 FinalAnniversaryString = FinalAnniversaryYear + FinalAnniversaryMonth + FinalAnniversaryDay;
369 if(!FinalAnniversaryString.IsEmpty()){
371 ContactEditorData.Birthday = FinalAnniversaryString;
377 // Process full name.
379 if (ContactEditorData.FullNamesList.size() > 0){
381 ContactEditorData.FullNamesList[0] = cmbDisplayAs->GetValue();
385 ContactEditorData.FullNamesList.insert(std::make_pair(0, cmbDisplayAs->GetValue()));
386 ContactEditorData.FullNamesListAltID.insert(std::make_pair(0, wxT("")));
387 ContactEditorData.FullNamesListPID.insert(std::make_pair(0, wxT("")));
388 ContactEditorData.FullNamesListType.insert(std::make_pair(0, wxT("")));
389 ContactEditorData.FullNamesListLanguage.insert(std::make_pair(0, wxT("")));
390 ContactEditorData.FullNamesListPref.insert(std::make_pair(0, 0));
391 ContactEditorData.FullNamesListTokens.insert(std::make_pair(0, wxT("")));
395 /*ContactData.Add(wxT("BEGIN"), wxT("VCARD"), FALSE);
396 ContactData.Add(wxT("VERSION"), wxT("4.0"), FALSE);
398 // Setup the version string.
400 strValue.Append(wxT("-//Xestia//Address Book Version "));
401 strValue.Append(wxT(XSDAB_VERSION));
402 strValue.Append(wxT("//KW"));
404 ContactData.Add(wxT("PRODID"), strValue, FALSE);
406 // Process the REV property.
408 wxDateTime DateTimeSave;
409 DateTimeSave = DateTimeSave.SetToCurrent();
410 wxString DateTimeSaveValue;
412 DateTimeSaveValue += wxString::Format("%04i", DateTimeSave.GetYear());
413 DateTimeSaveValue += wxString::Format("%02i", (DateTimeSave.GetMonth() + 1));
414 DateTimeSaveValue += wxString::Format("%02i", DateTimeSave.GetDay());
415 DateTimeSaveValue += "T";
416 DateTimeSaveValue += wxString::Format("%02i", DateTimeSave.GetHour());
417 DateTimeSaveValue += wxString::Format("%02i", DateTimeSave.GetMinute());
418 DateTimeSaveValue += wxString::Format("%02i", DateTimeSave.GetSecond());
420 if (!ContactEditorData.RevisionTokens.IsEmpty()){
422 ContactData.AddRaw("REV;" + ContactEditorData.RevisionTokens, DateTimeSaveValue);
426 ContactData.AddRaw("REV", DateTimeSaveValue);
430 // Process the XML properties.
432 for (std::map<int,wxString>::iterator iter = ContactEditorData.XMLList.begin();
433 iter != ContactEditorData.XMLList.end(); ++iter){
435 wxString strOrigValue;
437 strOrigValue = ContactEditorData.XMLList.find(iter->first)->second;
439 ResetUnusedString(&strOrigValue);
441 ProcessSaveData(wxT("XML"), &strValue2, &boolValue2, &boolValue,
442 &iter, &strOrigValue, &ContactData,
443 wxT("ALTID"), &ContactEditorData.XMLListAltID );
445 ResetSaveProcessData();
449 // Process the CLIENTPIDMAP properties.
451 for (std::map<int,wxString>::iterator iter = ContactEditorData.ClientPIDList.begin();
452 iter != ContactEditorData.ClientPIDList.end(); ++iter){
454 wxString strOrigValue;
456 strOrigValue = ContactEditorData.ClientPIDList.find(iter->first)->second;
458 ResetUnusedString(&strOrigValue);
460 ProcessSaveData(wxT("CLIENTPIDMAP"), &strValue2, &boolValue2, &boolValue,
461 &iter, &strOrigValue, &ContactData,
462 wxT(""), &ContactEditorData.ClientPIDListTokens );
464 ResetSaveProcessData();
468 // Process the SOURCE properties.
470 for (std::map<int,wxString>::iterator iter = ContactEditorData.SourceList.begin();
471 iter != ContactEditorData.SourceList.end(); ++iter){
473 wxString strOrigValue;
475 strOrigValue = ContactEditorData.SourceList.find(iter->first)->second;
477 ResetUnusedString(&strOrigValue);
479 ProcessSaveData(wxT("SOURCE"), &strValue2, &boolValue2, &boolValue,
480 &iter, &strOrigValue, &ContactData,
481 wxT("ALTID"), &ContactEditorData.SourceListAltID,
482 wxT("PID"), &ContactEditorData.SourceListPID,
483 wxT("TYPE"), &ContactEditorData.SourceListType,
484 wxT("PREF"), &ContactEditorData.SourceListPref,
485 wxT("MEDIATYPE"), &ContactEditorData.SourceListMediatype,
486 wxT(""), &ContactEditorData.SourceListTokens );
488 ResetSaveProcessData();
496 // Setup the name field.
498 strValue = txtSurname->GetValue() + wxT(";") +
499 txtForename->GetValue() + wxT(";") +
500 txtOtherNames->GetValue() + wxT(";") +
501 txtTitle->GetValue() + wxT(";") +
502 txtSuffix->GetValue();
504 strValue2 = ContactData.Convert(cmbDisplayAs->GetValue(), FALSE);
507 if (ContactEditorData.NameTokens.IsEmpty()){
509 ContactData.Add(wxT("N;SORT-AS=\"") + strValue2 + wxT("\""), strValue, FALSE);
513 ContactData.Add(wxT("N;SORT-AS=\"") + strValue2 + wxT("\";") + ContactEditorData.NameTokens, strValue, FALSE);
517 if (cmbType->GetCurrentSelection() == 1){
519 ContactData.AddRaw(wxT("KIND"), wxT("individual"));
521 } else if (cmbType->GetCurrentSelection() == 2){
523 ContactData.AddRaw(wxT("KIND"), wxT("group"));
525 // Go through each of the members and write them out.
527 for (std::map<int, wxString>::iterator itemiter = ContactEditorData.GroupsList.begin();
528 itemiter != ContactEditorData.GroupsList.end(); ++itemiter){
530 ContactData.Add(wxT("MEMBER:urn:uuid"), itemiter->second, FALSE);
534 } else if (cmbType->GetCurrentSelection() == 3){
536 ContactData.AddRaw(wxT("KIND"), wxT("org"));
538 } else if (cmbType->GetCurrentSelection() == 4){
540 ContactData.AddRaw(wxT("KIND"), wxT("location"));
545 // Setup the nicknames (General, Home & Business).
558 if (cmbGender->GetCurrentSelection() != 0){
560 switch(cmbGender->GetCurrentSelection()){
591 if (!txtGenderDescription->IsEmpty()){
593 strValue2 = txtGenderDescription->GetValue();
597 if (!strValue.IsEmpty() || !strValue2.IsEmpty()){
599 EscapeString(&strValue2, FALSE);
601 if (!ContactEditorData.GenderTokens.IsEmpty()){
603 if (!strValue2.IsEmpty()){
605 ContactData.AddRaw(wxT("GENDER;") + ContactEditorData.GenderTokens, strValue + wxT(";") + strValue2);
609 ContactData.AddRaw(wxT("GENDER;") + ContactEditorData.GenderTokens, strValue);
615 if (!strValue2.IsEmpty()){
617 ContactData.AddRaw(wxT("GENDER"), strValue + wxT(";") + strValue2);
621 ContactData.AddRaw(wxT("GENDER"), strValue);
629 ResetSaveProcessData();
631 // Build the values for the BDAY property.
635 if (!ContactEditorData.BirthdayAltID.IsEmpty()){
638 DataValue = ContactEditorData.BirthdayAltID;
640 EscapeString(&DataValue, FALSE);
642 strValue3.Append("ALTID=");
643 strValue3.Append(DataValue);
651 if (!ContactEditorData.BirthdayCalScale.IsEmpty()){
654 DataValue = ContactEditorData.BirthdayCalScale;
656 EscapeString(&DataValue, FALSE);
658 if (boolValue2 == TRUE){
660 strValue3.Append(";");
664 strValue3.Append("CALSCALE=");
665 strValue3.Append(DataValue);
673 if (!ContactEditorData.BirthdayTokens.IsEmpty()){
676 DataValue = ContactEditorData.BirthdayTokens;
678 EscapeString(&DataValue, FALSE);
680 if (boolValue2 == TRUE){
682 strValue3.Append(";");
686 strValue3.Append(DataValue);
690 // Write the BDAY property.
692 if (!txtBirthday->IsEmpty()){
694 if (!txtBirthday->GetValue().IsEmpty()){
696 strValue = txtBirthday->GetValue();
698 if (!strValue3.IsEmpty()){
700 ContactData.AddRaw("BDAY;VALUE=text;" + strValue3, strValue);
704 ContactData.AddRaw("BDAY;VALUE=text", strValue);
714 // Get Day, Month & Year.
716 wxDateTime BirthdayDate;
717 wxDateTime::Month BirthdayMonth;
720 wxString DataBeforeT;
722 wxString FinalBirthdayString;
723 bool ProcessDataAfterT = FALSE;
725 BirthdayDate = dapBirthday->GetValue();
727 if (BirthdayDate.IsValid()){
729 BirthdayDay = BirthdayDate.GetDay();
730 BirthdayMonth = BirthdayDate.GetMonth();
731 BirthdayYear = BirthdayDate.GetYear();
733 // Look for T and replace data before this.
735 wxStringTokenizer wSTDate(ContactEditorData.Birthday, wxT("T"));
737 while (wSTDate.HasMoreTokens()){
739 if (ProcessDataAfterT == FALSE){
741 DataBeforeT = wSTDate.GetNextToken();
742 ProcessDataAfterT = TRUE;
746 DataAfterT = wSTDate.GetNextToken();
753 // If there is not T then replace altogether.
755 wxString FinalBirthdayDay;
756 wxString FinalBirthdayMonth;
757 wxString FinalBirthdayYear;
759 if (BirthdayDay < 10){
761 FinalBirthdayDay = wxT("0") + wxString::Format(wxT("%i"), BirthdayDay);
765 FinalBirthdayDay = wxString::Format(wxT("%i"), BirthdayDay);
769 if (((int)BirthdayMonth + 1) < 10){
771 FinalBirthdayMonth = wxT("0") + wxString::Format(wxT("%i"), ((int)BirthdayMonth + 1));
775 FinalBirthdayMonth = wxString::Format(wxT("%i"), ((int)BirthdayMonth + 1));
779 if (BirthdayYear == 0){
781 FinalBirthdayYear = wxT("--");
785 FinalBirthdayYear = wxString::Format(wxT("%i"), BirthdayYear);
789 if (!DataAfterT.IsEmpty()){
791 FinalBirthdayString = FinalBirthdayYear + FinalBirthdayMonth + FinalBirthdayDay + wxT("T") + DataAfterT;
795 FinalBirthdayString = FinalBirthdayYear + FinalBirthdayMonth + FinalBirthdayDay;
799 if (!FinalBirthdayString.IsEmpty() || !strValue3.IsEmpty()){
801 if (!strValue3.IsEmpty()){
803 EscapeString(&strValue2, FALSE);
804 EscapeString(&strValue, FALSE);
806 ContactData.AddRaw(wxT("BDAY;") + strValue3, FinalBirthdayString);
810 EscapeString(&strValue, FALSE);
812 ContactData.AddRaw(wxT("BDAY"), FinalBirthdayString);
822 ResetSaveProcessData();
824 // Build the values for the ANNIVERSARY property.
828 if (!ContactEditorData.AnniversaryAltID.IsEmpty()){
831 DataValue = ContactEditorData.AnniversaryAltID;
833 EscapeString(&DataValue, FALSE);
835 strValue3.Append("ALTID=");
836 strValue3.Append(DataValue);
844 if (!ContactEditorData.AnniversaryCalScale.IsEmpty()){
847 DataValue = ContactEditorData.AnniversaryCalScale;
849 EscapeString(&DataValue, FALSE);
851 if (boolValue2 == TRUE){
853 strValue3.Append(";");
857 strValue3.Append("CALSCALE=");
858 strValue3.Append(DataValue);
866 if (!ContactEditorData.AnniversaryTokens.IsEmpty()){
869 DataValue = ContactEditorData.AnniversaryTokens;
871 EscapeString(&DataValue, FALSE);
873 if (boolValue2 == TRUE){
875 strValue3.Append(";");
879 strValue3.Append(DataValue);
883 // Write the ANNIVERSARY property.
885 if (!txtAnniversary->IsEmpty()){
887 if (!txtAnniversary->GetValue().IsEmpty()){
889 strValue = txtAnniversary->GetValue();
891 if (!strValue3.IsEmpty()){
893 ContactData.AddRaw("ANNIVERSARY;VALUE=text;" + strValue3, strValue);
897 ContactData.AddRaw("ANNIVERSARY;VALUE=text", strValue);
905 // Look for T and replace data before this.
907 // Get Day, Month & Year.
909 wxDateTime AnniversaryDate;
910 wxDateTime::Month AnniversaryMonth;
913 wxString DataBeforeT;
915 wxString FinalAnniversaryString;
916 bool ProcessDataAfterT = FALSE;
918 AnniversaryDate = dapAnniversary->GetValue();
920 if (AnniversaryDate.IsValid()){
922 AnniversaryDay = AnniversaryDate.GetDay();
923 AnniversaryMonth = AnniversaryDate.GetMonth();
924 AnniversaryYear = AnniversaryDate.GetYear();
926 // Look for T and replace data before this.
928 wxStringTokenizer wSTDate(ContactEditorData.Anniversary, wxT("T"));
930 while (wSTDate.HasMoreTokens()){
932 if (ProcessDataAfterT == FALSE){
934 DataBeforeT = wSTDate.GetNextToken();
935 ProcessDataAfterT = TRUE;
939 DataAfterT = wSTDate.GetNextToken();
946 // If there is not T then replace altogether.
948 wxString FinalAnniversaryDay;
949 wxString FinalAnniversaryMonth;
950 wxString FinalAnniversaryYear;
952 if (AnniversaryDay < 10){
954 FinalAnniversaryDay = wxT("0") + wxString::Format(wxT("%i"), AnniversaryDay);
958 FinalAnniversaryDay = wxString::Format(wxT("%i"), AnniversaryDay);
962 if (((int)AnniversaryMonth + 1) < 10){
964 FinalAnniversaryMonth = wxT("0") + wxString::Format(wxT("%i"), ((int)AnniversaryMonth + 1));
968 FinalAnniversaryMonth = wxString::Format(wxT("%i"), ((int)AnniversaryMonth + 1));
972 if (AnniversaryYear == 0){
974 FinalAnniversaryYear = wxT("--");
978 FinalAnniversaryYear = wxString::Format(wxT("%i"), AnniversaryYear);
982 if (!DataAfterT.IsEmpty()){
984 FinalAnniversaryString = FinalAnniversaryYear + FinalAnniversaryMonth + FinalAnniversaryDay + wxT("T") + DataAfterT;
988 FinalAnniversaryString = FinalAnniversaryYear + FinalAnniversaryMonth + FinalAnniversaryDay;
992 if (!FinalAnniversaryString.IsEmpty() || !strValue3.IsEmpty()){
994 if (!strValue3.IsEmpty()){
996 EscapeString(&strValue2, FALSE);
997 EscapeString(&strValue, FALSE);
999 ContactData.AddRaw(wxT("ANNIVERSARY;") + strValue3, FinalAnniversaryString);
1003 EscapeString(&strValue, FALSE);
1005 ContactData.AddRaw(wxT("ANNIVERSARY"), FinalAnniversaryString);
1015 // Setup the addresses (General, Home, Business).
1017 ResetSaveProcessData();
1019 for (std::map<int,wxString>::iterator iter = ContactEditorData.GeneralAddressList.begin();
1020 iter != ContactEditorData.GeneralAddressList.end(); ++iter){
1022 int intSeekValue = iter->first;
1024 wxString strAddressString;
1025 wxString strAddressFinalValue;
1026 std::map<int, wxString>::iterator iterValue;
1028 strAddressString.Append(wxT(";;"));
1032 iterValue = ContactEditorData.GeneralAddressList.find(intSeekValue);
1033 strAddressFinalValue = iterValue->second;
1034 ProcessCaptureStrings(&strAddressFinalValue);
1035 strAddressString.Append(strAddressFinalValue + wxT(";"));
1036 strAddressFinalValue.Clear();
1040 iterValue = ContactEditorData.GeneralAddressListTown.find(intSeekValue);
1041 strAddressFinalValue = iterValue->second;
1042 ProcessCaptureStrings(&strAddressFinalValue);
1043 strAddressString.Append(strAddressFinalValue + wxT(";"));
1044 strAddressFinalValue.Clear();
1048 iterValue = ContactEditorData.GeneralAddressListCounty.find(intSeekValue);
1049 strAddressFinalValue = iterValue->second;
1050 ProcessCaptureStrings(&strAddressFinalValue);
1051 strAddressString.Append(strAddressFinalValue + wxT(";"));
1052 strAddressFinalValue.Clear();
1056 iterValue = ContactEditorData.GeneralAddressListPostCode.find(intSeekValue);
1057 strAddressFinalValue = iterValue->second;
1058 ProcessCaptureStrings(&strAddressFinalValue);
1059 strAddressString.Append(strAddressFinalValue + wxT(";"));
1060 strAddressFinalValue.Clear();
1064 iterValue = ContactEditorData.GeneralAddressListCountry.find(intSeekValue);
1065 strAddressFinalValue = iterValue->second;
1066 ProcessCaptureStrings(&strAddressFinalValue);
1067 strAddressString.Append(strAddressFinalValue);
1068 strAddressFinalValue.Clear();
1070 ProcessSaveData(wxT("ADR"), &strValue2, &boolValue2, &boolValue,
1071 &iter, &strAddressString, &ContactData,
1072 wxT("LABEL"), &ContactEditorData.GeneralAddressListLabel,
1073 wxT("LANGUAGE"), &ContactEditorData.GeneralAddressListLang,
1074 wxT("ALTID"), &ContactEditorData.GeneralAddressListAltID,
1075 wxT("PID"), &ContactEditorData.GeneralAddressListPID,
1076 wxT("GEO"), &ContactEditorData.GeneralAddressListGeo,
1077 wxT("TZ"), &ContactEditorData.GeneralAddressListTimezone,
1078 wxT("MEDIATYPE"), &ContactEditorData.GeneralAddressListMediatype,
1079 wxT("PREF"), &ContactEditorData.GeneralAddressListPref,
1080 wxT(""), &ContactEditorData.GeneralAddressListTokens );
1082 ResetSaveProcessData();
1086 ResetSaveProcessData();
1088 for (std::map<int,wxString>::iterator iter = ContactEditorData.HomeAddressList.begin();
1089 iter != ContactEditorData.HomeAddressList.end(); ++iter){
1091 int intSeekValue = iter->first;
1093 wxString strAddressString;
1094 wxString strAddressFinalValue;
1095 std::map<int, wxString>::iterator iterValue;
1097 strAddressString.Append(wxT(";;"));
1101 iterValue = ContactEditorData.HomeAddressList.find(intSeekValue);
1102 strAddressFinalValue = iterValue->second;
1103 ProcessCaptureStrings(&strAddressFinalValue);
1104 strAddressString.Append(strAddressFinalValue + wxT(";"));
1108 iterValue = ContactEditorData.HomeAddressListTown.find(intSeekValue);
1109 strAddressFinalValue = iterValue->second;
1110 ProcessCaptureStrings(&strAddressFinalValue);
1111 strAddressString.Append(strAddressFinalValue + wxT(";"));
1115 iterValue = ContactEditorData.HomeAddressListCounty.find(intSeekValue);
1116 strAddressFinalValue = iterValue->second;
1117 ProcessCaptureStrings(&strAddressFinalValue);
1118 strAddressString.Append(strAddressFinalValue + wxT(";"));
1122 iterValue = ContactEditorData.HomeAddressListPostCode.find(intSeekValue);
1123 strAddressFinalValue = iterValue->second;
1124 ProcessCaptureStrings(&strAddressFinalValue);
1125 strAddressString.Append(strAddressFinalValue + wxT(";"));
1129 iterValue = ContactEditorData.HomeAddressListCountry.find(intSeekValue);
1130 strAddressFinalValue = iterValue->second;
1131 ProcessCaptureStrings(&strAddressFinalValue);
1132 strAddressString.Append(strAddressFinalValue);
1134 ProcessSaveData(wxT("ADR;TYPE=home"), &strValue2, &boolValue2, &boolValue,
1135 &iter, &strAddressString, &ContactData,
1136 wxT("LABEL"), &ContactEditorData.HomeAddressListLabel,
1137 wxT("LANGUAGE"), &ContactEditorData.HomeAddressListLang,
1138 wxT("ALTID"), &ContactEditorData.HomeAddressListAltID,
1139 wxT("PID"), &ContactEditorData.HomeAddressListPID,
1140 wxT("GEO"), &ContactEditorData.HomeAddressListGeo,
1141 wxT("TZ"), &ContactEditorData.HomeAddressListTimezone,
1142 wxT("MEDIATYPE"), &ContactEditorData.HomeAddressListMediatype,
1143 wxT("PREF"), &ContactEditorData.HomeAddressListPref,
1144 wxT(""), &ContactEditorData.HomeAddressListTokens );
1146 ResetSaveProcessData();
1150 ResetSaveProcessData();
1152 for (std::map<int,wxString>::iterator iter = ContactEditorData.BusinessAddressList.begin();
1153 iter != ContactEditorData.BusinessAddressList.end(); ++iter){
1155 int intSeekValue = iter->first;
1157 wxString strAddressString;
1158 wxString strAddressFinalValue;
1159 std::map<int, wxString>::iterator iterValue;
1161 strAddressString.Append(wxT(";;"));
1165 iterValue = ContactEditorData.BusinessAddressList.find(intSeekValue);
1166 strAddressFinalValue = iterValue->second;
1167 ProcessCaptureStrings(&strAddressFinalValue);
1169 strAddressString.Append(strAddressFinalValue + wxT(";"));
1173 iterValue = ContactEditorData.BusinessAddressListTown.find(intSeekValue);
1174 strAddressFinalValue = iterValue->second;
1175 ProcessCaptureStrings(&strAddressFinalValue);
1177 strAddressString.Append(strAddressFinalValue + wxT(";"));
1181 iterValue = ContactEditorData.BusinessAddressListCounty.find(intSeekValue);
1182 strAddressFinalValue = iterValue->second;
1183 ProcessCaptureStrings(&strAddressFinalValue);
1185 strAddressString.Append(strAddressFinalValue + wxT(";"));
1189 iterValue = ContactEditorData.BusinessAddressListPostCode.find(intSeekValue);
1190 strAddressFinalValue = iterValue->second;
1191 ProcessCaptureStrings(&strAddressFinalValue);
1193 strAddressString.Append(strAddressFinalValue + wxT(";"));
1197 iterValue = ContactEditorData.BusinessAddressListCountry.find(intSeekValue);
1198 strAddressFinalValue = iterValue->second;
1199 ProcessCaptureStrings(&strAddressFinalValue);
1201 strAddressString.Append(strAddressFinalValue);
1203 ProcessSaveData(wxT("ADR;TYPE=work"), &strValue2, &boolValue2, &boolValue,
1204 &iter, &strAddressString, &ContactData,
1205 wxT("LABEL"), &ContactEditorData.BusinessAddressListLabel,
1206 wxT("LANGUAGE"), &ContactEditorData.BusinessAddressListLang,
1207 wxT("ALTID"), &ContactEditorData.BusinessAddressListAltID,
1208 wxT("PID"), &ContactEditorData.BusinessAddressListPID,
1209 wxT("GEO"), &ContactEditorData.BusinessAddressListGeo,
1210 wxT("TZ"), &ContactEditorData.BusinessAddressListTimezone,
1211 wxT("MEDIATYPE"), &ContactEditorData.BusinessAddressListMediatype,
1212 wxT("PREF"), &ContactEditorData.BusinessAddressListPref,
1213 wxT(""), &ContactEditorData.BusinessAddressListTokens );
1215 ResetSaveProcessData();
1219 // Sort out nicknames (if any).
1221 for (std::map<int,wxString>::iterator iter = ContactEditorData.GeneralNicknamesList.begin();
1222 iter != ContactEditorData.GeneralNicknamesList.end(); ++iter){
1224 intValue2 = iter->first;
1226 // Process Alternative ID.
1228 ProcessSaveData(wxT("NICKNAME"), &strValue2, &boolValue2, &boolValue,
1229 &iter, &ContactEditorData.GeneralNicknamesList, &ContactData,
1230 wxT("LANGUAGE"), &ContactEditorData.GeneralNicknamesListLanguage,
1231 wxT("ALTID"), &ContactEditorData.GeneralNicknamesListAltID,
1232 wxT("PID"), &ContactEditorData.GeneralNicknamesListPID,
1233 wxT("PREF"), &ContactEditorData.GeneralNicknamesListPref,
1234 wxT(""), &ContactEditorData.GeneralNicknamesListTokens );
1236 ResetSaveProcessData();
1240 ResetSaveProcessData();
1242 for (std::map<int,wxString>::iterator iter = ContactEditorData.HomeNicknamesList.begin();
1243 iter != ContactEditorData.HomeNicknamesList.end(); ++iter){
1245 ProcessSaveData(wxT("NICKNAME;TYPE=home"), &strValue2, &boolValue2, &boolValue,
1246 &iter, &ContactEditorData.HomeNicknamesList, &ContactData,
1247 wxT("LANGUAGE"), &ContactEditorData.HomeNicknamesListLanguage,
1248 wxT("ALTID"), &ContactEditorData.HomeNicknamesListAltID,
1249 wxT("PID"), &ContactEditorData.HomeNicknamesListPID,
1250 wxT("PREF"), &ContactEditorData.HomeNicknamesListPref,
1251 wxT(""), &ContactEditorData.HomeNicknamesListTokens );
1253 ResetSaveProcessData();
1257 ResetSaveProcessData();
1259 for (std::map<int,wxString>::iterator iter = ContactEditorData.BusinessNicknamesList.begin();
1260 iter != ContactEditorData.BusinessNicknamesList.end(); ++iter){
1262 ProcessSaveData(wxT("NICKNAME;TYPE=work"), &strValue2, &boolValue2, &boolValue,
1263 &iter, &ContactEditorData.BusinessNicknamesList, &ContactData,
1264 wxT("LANGUAGE"), &ContactEditorData.BusinessNicknamesListLanguage,
1265 wxT("ALTID"), &ContactEditorData.BusinessNicknamesListAltID,
1266 wxT("PID"), &ContactEditorData.BusinessNicknamesListPID,
1267 wxT("PREF"), &ContactEditorData.BusinessNicknamesListPref,
1268 wxT(""), &ContactEditorData.BusinessNicknamesListTokens );
1270 ResetSaveProcessData();
1274 ResetSaveProcessData();
1276 // Sort out email (general, home and business).
1278 for (std::map<int,wxString>::iterator iter = ContactEditorData.GeneralEmailList.begin();
1279 iter != ContactEditorData.GeneralEmailList.end(); ++iter){
1281 wxString strAddressFinalValue;
1282 std::map<int, wxString>::iterator iterValue;
1284 ProcessSaveData(wxT("EMAIL"), &strValue2, &boolValue2, &boolValue,
1285 &iter, &ContactEditorData.GeneralEmailList, &ContactData,
1286 wxT("ALTID"), &ContactEditorData.GeneralEmailListAltID,
1287 wxT("PID"), &ContactEditorData.GeneralEmailListPID,
1288 wxT("PREF"), &ContactEditorData.GeneralEmailListPref,
1289 wxT(""), &ContactEditorData.GeneralEmailListTokens );
1291 ResetSaveProcessData();
1295 ResetSaveProcessData();
1297 for (std::map<int,wxString>::iterator iter = ContactEditorData.HomeEmailList.begin();
1298 iter != ContactEditorData.HomeEmailList.end(); ++iter){
1300 ProcessSaveData(wxT("EMAIL;TYPE=home"), &strValue2, &boolValue2, &boolValue,
1301 &iter, &ContactEditorData.HomeEmailList, &ContactData,
1302 wxT("ALTID"), &ContactEditorData.HomeEmailListAltID,
1303 wxT("PID"), &ContactEditorData.HomeEmailListPID,
1304 wxT("PREF"), &ContactEditorData.HomeEmailListPref,
1305 wxT(""), &ContactEditorData.HomeEmailListTokens );
1307 ResetSaveProcessData();
1311 ResetSaveProcessData();
1313 for (std::map<int,wxString>::iterator iter = ContactEditorData.BusinessEmailList.begin();
1314 iter != ContactEditorData.BusinessEmailList.end(); ++iter){
1316 ProcessSaveData(wxT("EMAIL;TYPE=work"), &strValue2, &boolValue2, &boolValue,
1317 &iter, &ContactEditorData.BusinessEmailList, &ContactData,
1318 wxT("ALTID"), &ContactEditorData.BusinessEmailListAltID,
1319 wxT("PID"), &ContactEditorData.BusinessEmailListPID,
1320 wxT("PREF"), &ContactEditorData.BusinessEmailListPref,
1321 wxT(""), &ContactEditorData.BusinessEmailListTokens );
1323 ResetSaveProcessData();
1327 ResetSaveProcessData();
1329 for (std::map<int,wxString>::iterator iter = ContactEditorData.GeneralIMList.begin();
1330 iter != ContactEditorData.GeneralIMList.end(); ++iter){
1332 intValue2 = iter->first;
1334 wxString strIMFinalValue = iter->second;
1336 ProcessCaptureStrings(&strIMFinalValue);
1338 if (ContactEditorData.GeneralIMListTypeInfo.find(iter->first) !=
1339 ContactEditorData.GeneralIMListTypeInfo.end()){
1341 std::map<int,wxString>::iterator DataTypeIter = ContactEditorData.GeneralIMListTypeInfo.find(iter->first);
1343 strIMFinalValue.insert(0, ":");
1344 strIMFinalValue.insert(0, DataTypeIter->second);
1348 strIMFinalValue.insert(0, "none:");
1352 // Process Alternative ID.
1354 ProcessSaveData(wxT("IMPP"), &strValue2, &boolValue2, &boolValue,
1355 &iter, &strIMFinalValue, &ContactData,
1356 wxT("ALTID"), &ContactEditorData.GeneralIMListAltID,
1357 wxT("PID"), &ContactEditorData.GeneralIMListPID,
1358 wxT("MEDIATYPE"), &ContactEditorData.GeneralIMListMediatype,
1359 wxT("PREF"), &ContactEditorData.GeneralIMListPref,
1360 wxT(""), &ContactEditorData.GeneralIMListTokens );
1362 ResetSaveProcessData();
1366 ResetSaveProcessData();
1368 for (std::map<int,wxString>::iterator iter = ContactEditorData.HomeIMList.begin();
1369 iter != ContactEditorData.HomeIMList.end(); ++iter){
1371 wxString strIMFinalValue = iter->second;
1373 ProcessCaptureStrings(&strIMFinalValue);
1375 if (ContactEditorData.HomeIMListTypeInfo.find(iter->first) !=
1376 ContactEditorData.HomeIMListTypeInfo.end()){
1378 std::map<int,wxString>::iterator DataTypeIter = ContactEditorData.HomeIMListTypeInfo.find(iter->first);
1380 strIMFinalValue.insert(0, ":");
1381 strIMFinalValue.insert(0, DataTypeIter->second);
1385 strIMFinalValue.insert(0, "none:");
1389 ProcessSaveData(wxT("IMPP;TYPE=home"), &strValue2, &boolValue2, &boolValue,
1390 &iter, &ContactEditorData.HomeIMList, &ContactData,
1391 wxT("ALTID"), &ContactEditorData.HomeIMListAltID,
1392 wxT("PID"), &ContactEditorData.HomeIMListPID,
1393 wxT("MEDIATYPE"), &ContactEditorData.HomeIMListMediatype,
1394 wxT("PREF"), &ContactEditorData.HomeIMListPref,
1395 wxT(""), &ContactEditorData.HomeIMListTokens );
1397 ResetSaveProcessData();
1401 ResetSaveProcessData();
1403 for (std::map<int,wxString>::iterator iter = ContactEditorData.BusinessIMList.begin();
1404 iter != ContactEditorData.BusinessIMList.end(); ++iter){
1406 wxString strIMFinalValue = iter->second;
1408 ProcessCaptureStrings(&strIMFinalValue);
1410 if (ContactEditorData.BusinessIMListTypeInfo.find(iter->first) !=
1411 ContactEditorData.BusinessIMListTypeInfo.end()){
1413 std::map<int,wxString>::iterator DataTypeIter = ContactEditorData.BusinessIMListTypeInfo.find(iter->first);
1415 strIMFinalValue.insert(0, ":");
1416 strIMFinalValue.insert(0, DataTypeIter->second);
1420 strIMFinalValue.insert(0, "none:");
1424 ProcessSaveData(wxT("IMPP;TYPE=work"), &strValue2, &boolValue2, &boolValue,
1425 &iter, &ContactEditorData.BusinessIMList, &ContactData,
1426 wxT("ALTID"), &ContactEditorData.BusinessIMListAltID,
1427 wxT("PID"), &ContactEditorData.BusinessIMListPID,
1428 wxT("MEDIATYPE"), &ContactEditorData.BusinessIMListMediatype,
1429 wxT("PREF"), &ContactEditorData.BusinessIMListPref,
1430 wxT(""), &ContactEditorData.BusinessIMListTokens );
1432 ResetSaveProcessData();
1436 ResetSaveProcessData();
1438 for (std::map<int,wxString>::iterator iter = ContactEditorData.GeneralTelephoneList.begin();
1439 iter != ContactEditorData.GeneralTelephoneList.end(); ++iter){
1441 wxString strAddressFinalValue = iter->second;
1442 int DataID = iter->first;
1444 ProcessCaptureStrings(&strAddressFinalValue);
1446 if (MapDataExists(&DataID, &ContactEditorData.GeneralTelephoneListDataType)){
1448 std::map<int,wxString>::iterator DataTypeIter = ContactEditorData.GeneralTelephoneListDataType.find(iter->first);
1450 strAddressFinalValue.insert(0, ":");
1451 strAddressFinalValue.insert(0, DataTypeIter->second);
1455 strAddressFinalValue.insert(0, "tel:");
1459 wxString strAddressTypeInfo;
1461 if (MapDataExists(&DataID, &ContactEditorData.GeneralTelephoneListTypeInfo)){
1463 strAddressTypeInfo = ContactEditorData.GeneralTelephoneListTypeInfo.find(iter->first)->second;
1467 ProcessSaveData(wxT("TEL"), &strValue2, &boolValue2, &boolValue,
1468 &iter, &strAddressFinalValue, &ContactData,
1469 wxT("ALTID"), &ContactEditorData.GeneralTelephoneListAltID,
1470 wxT("PID"), &ContactEditorData.GeneralTelephoneListPID,
1471 wxT("TYPE"), &ContactEditorData.GeneralTelephoneListTypeInfo,
1472 wxT("PREF"), &ContactEditorData.GeneralTelephoneListPref,
1473 wxT(""), &ContactEditorData.GeneralTelephoneListTokens );
1475 ResetSaveProcessData();
1479 ResetSaveProcessData();
1481 for (std::map<int,wxString>::iterator iter = ContactEditorData.HomeTelephoneList.begin();
1482 iter != ContactEditorData.HomeTelephoneList.end(); ++iter){
1484 wxString strAddressFinalValue = iter->second;
1486 ProcessCaptureStrings(&strAddressFinalValue);
1488 if (ContactEditorData.HomeTelephoneListDataType.find(iter->first) !=
1489 ContactEditorData.HomeTelephoneListDataType.end()){
1491 std::map<int,wxString>::iterator DataTypeIter = ContactEditorData.HomeTelephoneListDataType.find(iter->first);
1493 strAddressFinalValue.insert(0, ":");
1494 strAddressFinalValue.insert(0, DataTypeIter->second);
1498 strAddressFinalValue.insert(0, "tel:");
1502 ProcessSaveData(wxT("TEL"), &strValue2, &boolValue2, &boolValue,
1503 &iter, &strAddressFinalValue, &ContactData,
1504 wxT("ALTID"), &ContactEditorData.HomeTelephoneListAltID,
1505 wxT("PID"), &ContactEditorData.HomeTelephoneListPID,
1506 wxT("TYPE"), &ContactEditorData.HomeTelephoneListTypeInfo,
1507 wxT("PREF"), &ContactEditorData.HomeTelephoneListPref,
1508 wxT(""), &ContactEditorData.HomeTelephoneListTokens );
1510 ResetSaveProcessData();
1514 ResetSaveProcessData();
1516 for (std::map<int,wxString>::iterator iter = ContactEditorData.BusinessTelephoneList.begin();
1517 iter != ContactEditorData.BusinessTelephoneList.end(); ++iter){
1519 wxString strAddressFinalValue = iter->second;
1521 ProcessCaptureStrings(&strAddressFinalValue);
1523 if (ContactEditorData.BusinessTelephoneListDataType.find(iter->first) !=
1524 ContactEditorData.BusinessTelephoneListDataType.end()){
1526 std::map<int,wxString>::iterator DataTypeIter = ContactEditorData.BusinessTelephoneListDataType.find(iter->first);
1528 strAddressFinalValue.insert(0, ":");
1529 strAddressFinalValue.insert(0, DataTypeIter->second);
1533 strAddressFinalValue.insert(0, "tel:");
1537 ProcessSaveData(wxT("TEL"), &strValue2, &boolValue2, &boolValue,
1538 &iter, &strAddressFinalValue, &ContactData,
1539 wxT("ALTID"), &ContactEditorData.BusinessTelephoneListAltID,
1540 wxT("PID"), &ContactEditorData.BusinessTelephoneListPID,
1541 wxT("TYPE"), &ContactEditorData.BusinessTelephoneListTypeInfo,
1542 wxT("PREF"), &ContactEditorData.BusinessTelephoneListPref,
1543 wxT(""), &ContactEditorData.BusinessTelephoneListTokens );
1545 ResetSaveProcessData();
1549 ResetSaveProcessData();
1551 for (std::map<int,wxString>::iterator iter = ContactEditorData.GeneralLanguageList.begin();
1552 iter != ContactEditorData.GeneralLanguageList.end(); ++iter){
1554 intValue2 = iter->first;
1556 ProcessSaveData(wxT("LANG"), &strValue2, &boolValue2, &boolValue,
1557 &iter, &ContactEditorData.GeneralLanguageList, &ContactData,
1558 wxT("ALTID"), &ContactEditorData.GeneralLanguageListAltID,
1559 wxT("PID"), &ContactEditorData.GeneralLanguageListPID,
1560 wxT("PREF"), &ContactEditorData.GeneralLanguageListPref,
1561 wxT(""), &ContactEditorData.GeneralLanguageListTokens );
1563 ResetSaveProcessData();
1567 ResetSaveProcessData();
1569 for (std::map<int,wxString>::iterator iter = ContactEditorData.HomeLanguageList.begin();
1570 iter != ContactEditorData.HomeLanguageList.end(); ++iter){
1572 ProcessSaveData(wxT("LANG;TYPE=home"), &strValue2, &boolValue2, &boolValue,
1573 &iter, &ContactEditorData.HomeLanguageList, &ContactData,
1574 wxT("ALTID"), &ContactEditorData.HomeLanguageListAltID,
1575 wxT("PID"), &ContactEditorData.HomeLanguageListPID,
1576 wxT("PREF"), &ContactEditorData.HomeLanguageListPref,
1577 wxT(""), &ContactEditorData.HomeLanguageListTokens );
1579 ResetSaveProcessData();
1583 ResetSaveProcessData();
1585 for (std::map<int,wxString>::iterator iter = ContactEditorData.BusinessLanguageList.begin();
1586 iter != ContactEditorData.BusinessLanguageList.end(); ++iter){
1588 ProcessSaveData(wxT("LANG;TYPE=work"), &strValue2, &boolValue2, &boolValue,
1589 &iter, &ContactEditorData.BusinessLanguageList, &ContactData,
1590 wxT("ALTID"), &ContactEditorData.BusinessLanguageListAltID,
1591 wxT("PID"), &ContactEditorData.BusinessLanguageListPID,
1592 wxT("PREF"), &ContactEditorData.BusinessLanguageListPref,
1593 wxT(""), &ContactEditorData.BusinessLanguageListTokens );
1595 ResetSaveProcessData();
1599 ResetSaveProcessData();
1601 for (std::map<int,wxString>::iterator iter = ContactEditorData.GeneralTZList.begin();
1602 iter != ContactEditorData.GeneralTZList.end(); ++iter){
1604 ProcessSaveData(wxT("TZ"), &strValue2, &boolValue2, &boolValue,
1605 &iter, &ContactEditorData.GeneralTZList, &ContactData,
1606 wxT("ALTID"), &ContactEditorData.GeneralTZListAltID,
1607 wxT("PID"), &ContactEditorData.GeneralTZListPID,
1608 wxT("MEDIATYPE"), &ContactEditorData.GeneralTZListMediatype,
1609 wxT("PREF"), &ContactEditorData.GeneralTZListPref,
1610 wxT(""), &ContactEditorData.GeneralTZListTokens );
1612 ResetSaveProcessData();
1616 ResetSaveProcessData();
1618 for (std::map<int,wxString>::iterator iter = ContactEditorData.HomeTZList.begin();
1619 iter != ContactEditorData.HomeTZList.end(); ++iter){
1621 ProcessSaveData(wxT("TZ;TYPE=home"), &strValue2, &boolValue2, &boolValue,
1622 &iter, &ContactEditorData.HomeTZList, &ContactData,
1623 wxT("ALTID"), &ContactEditorData.HomeTZListAltID,
1624 wxT("PID"), &ContactEditorData.HomeTZListPID,
1625 wxT("MEDIATYPE"), &ContactEditorData.HomeTZListMediatype,
1626 wxT("PREF"), &ContactEditorData.HomeTZListPref,
1627 wxT(""), &ContactEditorData.HomeTZListTokens );
1629 ResetSaveProcessData();
1633 ResetSaveProcessData();
1635 for (std::map<int,wxString>::iterator iter = ContactEditorData.BusinessTZList.begin();
1636 iter != ContactEditorData.BusinessTZList.end(); ++iter){
1638 ProcessSaveData(wxT("TZ;TYPE=work"), &strValue2, &boolValue2, &boolValue,
1639 &iter, &ContactEditorData.BusinessTZList, &ContactData,
1640 wxT("ALTID"), &ContactEditorData.BusinessTZListAltID,
1641 wxT("PID"), &ContactEditorData.BusinessTZListPID,
1642 wxT("MEDIATYPE"), &ContactEditorData.BusinessTZListMediatype,
1643 wxT("PREF"), &ContactEditorData.BusinessTZListPref,
1644 wxT(""), &ContactEditorData.BusinessTZListTokens );
1646 ResetSaveProcessData();
1650 ResetSaveProcessData();
1652 for (std::map<int,wxString>::iterator iter = ContactEditorData.GeneralGeographyList.begin();
1653 iter != ContactEditorData.GeneralGeographyList.end(); ++iter){
1655 wxString strGeoFinalValue = iter->second;
1657 ProcessCaptureStrings(&strGeoFinalValue);
1659 if (ContactEditorData.GeneralGeographyListDataType.find(iter->first) !=
1660 ContactEditorData.GeneralGeographyListDataType.end()){
1662 std::map<int,wxString>::iterator DataTypeIter = ContactEditorData.GeneralGeographyListDataType.find(iter->first);
1664 strGeoFinalValue.insert(0, ":");
1665 strGeoFinalValue.insert(0, DataTypeIter->second);
1669 strGeoFinalValue.insert(0, "geo:");
1673 ProcessSaveData(wxT("GEO"), &strValue2, &boolValue2, &boolValue,
1674 &iter, &strGeoFinalValue, &ContactData,
1675 wxT("ALTID"), &ContactEditorData.GeneralGeographyListAltID,
1676 wxT("PID"), &ContactEditorData.GeneralGeographyListPID,
1677 wxT("MEDIATYPE"), &ContactEditorData.GeneralGeographyListMediatype,
1678 wxT("PREF"), &ContactEditorData.GeneralGeographyListPref,
1679 wxT(""), &ContactEditorData.GeneralGeographyListTokens );
1681 ResetSaveProcessData();
1685 ResetSaveProcessData();
1687 for (std::map<int,wxString>::iterator iter = ContactEditorData.HomeGeographyList.begin();
1688 iter != ContactEditorData.HomeGeographyList.end(); ++iter){
1690 wxString strGeoFinalValue = iter->second;
1692 ProcessCaptureStrings(&strGeoFinalValue);
1694 if (ContactEditorData.HomeGeographyListDataType.find(iter->first) !=
1695 ContactEditorData.HomeGeographyListDataType.end()){
1697 std::map<int,wxString>::iterator DataTypeIter = ContactEditorData.HomeGeographyListDataType.find(iter->first);
1699 strGeoFinalValue.insert(0, ":");
1700 strGeoFinalValue.insert(0, DataTypeIter->second);
1704 strGeoFinalValue.insert(0, "geo:");
1708 ProcessSaveData(wxT("GEO;TYPE=home"), &strValue2, &boolValue2, &boolValue,
1709 &iter, &strGeoFinalValue, &ContactData,
1710 wxT("ALTID"), &ContactEditorData.HomeGeographyListAltID,
1711 wxT("PID"), &ContactEditorData.HomeGeographyListPID,
1712 wxT("MEDIATYPE"), &ContactEditorData.HomeGeographyListMediatype,
1713 wxT("PREF"), &ContactEditorData.HomeGeographyListPref,
1714 wxT(""), &ContactEditorData.HomeGeographyListTokens );
1716 ResetSaveProcessData();
1720 ResetSaveProcessData();
1722 for (std::map<int,wxString>::iterator iter = ContactEditorData.BusinessGeographyList.begin();
1723 iter != ContactEditorData.BusinessGeographyList.end(); ++iter){
1725 wxString strGeoFinalValue = iter->second;
1727 ProcessCaptureStrings(&strGeoFinalValue);
1729 if (ContactEditorData.BusinessGeographyListDataType.find(iter->first) !=
1730 ContactEditorData.BusinessGeographyListDataType.end()){
1732 std::map<int,wxString>::iterator DataTypeIter = ContactEditorData.BusinessGeographyListDataType.find(iter->first);
1734 strGeoFinalValue.insert(0, ":");
1735 strGeoFinalValue.insert(0, DataTypeIter->second);
1739 strGeoFinalValue.insert(0, "geo:");
1743 ProcessSaveData(wxT("GEO;TYPE=work"), &strValue2, &boolValue2, &boolValue,
1744 &iter, &strGeoFinalValue, &ContactData,
1745 wxT("ALTID"), &ContactEditorData.BusinessGeographyListAltID,
1746 wxT("PID"), &ContactEditorData.BusinessGeographyListPID,
1747 wxT("MEDIATYPE"), &ContactEditorData.BusinessGeographyListMediatype,
1748 wxT("PREF"), &ContactEditorData.BusinessGeographyListPref,
1749 wxT(""), &ContactEditorData.BusinessGeographyListTokens );
1751 ResetSaveProcessData();
1755 ResetSaveProcessData();
1757 for (std::map<int,wxString>::iterator iter = ContactEditorData.GeneralRelatedList.begin();
1758 iter != ContactEditorData.GeneralRelatedList.end(); ++iter){
1760 ProcessSaveData(wxT("RELATED"), &strValue2, &boolValue2, &boolValue,
1761 &iter, &ContactEditorData.GeneralRelatedList, &ContactData,
1762 wxT("ALTID"), &ContactEditorData.GeneralRelatedListAltID,
1763 wxT("PID"), &ContactEditorData.GeneralRelatedListPID,
1764 wxT("LANGUAGE"), &ContactEditorData.GeneralRelatedListLanguage,
1765 wxT("TYPE"), &ContactEditorData.GeneralRelatedListRelType,
1766 wxT("PREF"), &ContactEditorData.GeneralRelatedListPref,
1767 wxT(""), &ContactEditorData.GeneralRelatedListTokens );
1769 ResetSaveProcessData();
1773 ResetSaveProcessData();
1775 for (std::map<int,wxString>::iterator iter = ContactEditorData.GeneralWebsiteList.begin();
1776 iter != ContactEditorData.GeneralWebsiteList.end(); ++iter){
1778 ProcessSaveData(wxT("URL"), &strValue2, &boolValue2, &boolValue,
1779 &iter, &ContactEditorData.GeneralWebsiteList, &ContactData,
1780 wxT("ALTID"), &ContactEditorData.GeneralWebsiteListAltID,
1781 wxT("PID"), &ContactEditorData.GeneralWebsiteListPID,
1782 wxT("MEDIATYPE"), &ContactEditorData.GeneralWebsiteListMediatype,
1783 wxT("PREF"), &ContactEditorData.GeneralWebsiteListPref,
1784 wxT(""), &ContactEditorData.GeneralWebsiteListTokens );
1786 ResetSaveProcessData();
1790 ResetSaveProcessData();
1792 for (std::map<int,wxString>::iterator iter = ContactEditorData.HomeWebsiteList.begin();
1793 iter != ContactEditorData.HomeWebsiteList.end(); ++iter){
1795 ProcessSaveData(wxT("URL;TYPE=home"), &strValue2, &boolValue2, &boolValue,
1796 &iter, &ContactEditorData.HomeWebsiteList, &ContactData,
1797 wxT("ALTID"), &ContactEditorData.HomeWebsiteListAltID,
1798 wxT("PID"), &ContactEditorData.HomeWebsiteListPID,
1799 wxT("MEDIATYPE"), &ContactEditorData.HomeWebsiteListMediatype,
1800 wxT("PREF"), &ContactEditorData.HomeWebsiteListPref,
1801 wxT(""), &ContactEditorData.HomeWebsiteListTokens );
1803 ResetSaveProcessData();
1807 ResetSaveProcessData();
1809 for (std::map<int,wxString>::iterator iter = ContactEditorData.BusinessWebsiteList.begin();
1810 iter != ContactEditorData.BusinessWebsiteList.end(); ++iter){
1812 ProcessSaveData(wxT("URL;TYPE=work"), &strValue2, &boolValue2, &boolValue,
1813 &iter, &ContactEditorData.BusinessWebsiteList, &ContactData,
1814 wxT("ALTID"), &ContactEditorData.BusinessWebsiteListAltID,
1815 wxT("PID"), &ContactEditorData.BusinessWebsiteListPID,
1816 wxT("MEDIATYPE"), &ContactEditorData.BusinessWebsiteListMediatype,
1817 wxT("PREF"), &ContactEditorData.BusinessWebsiteListPref,
1818 wxT(""), &ContactEditorData.BusinessWebsiteListTokens );
1820 ResetSaveProcessData();
1824 ResetSaveProcessData();
1826 for (std::map<int,wxString>::iterator iter = ContactEditorData.GeneralTitleList.begin();
1827 iter != ContactEditorData.GeneralTitleList.end(); ++iter){
1829 ProcessSaveData(wxT("TITLE"), &strValue2, &boolValue2, &boolValue,
1830 &iter, &ContactEditorData.GeneralTitleList, &ContactData,
1831 wxT("ALTID"), &ContactEditorData.GeneralTitleListAltID,
1832 wxT("PID"), &ContactEditorData.GeneralTitleListPID,
1833 wxT("LANGUAGE"), &ContactEditorData.GeneralTitleListLanguage,
1834 wxT("PREF"), &ContactEditorData.GeneralTitleListPref,
1835 wxT(""), &ContactEditorData.GeneralTitleListTokens );
1837 ResetSaveProcessData();
1841 ResetSaveProcessData();
1843 for (std::map<int,wxString>::iterator iter = ContactEditorData.HomeTitleList.begin();
1844 iter != ContactEditorData.HomeTitleList.end(); ++iter){
1846 ProcessSaveData(wxT("TITLE;TYPE=home"), &strValue2, &boolValue2, &boolValue,
1847 &iter, &ContactEditorData.HomeTitleList, &ContactData,
1848 wxT("ALTID"), &ContactEditorData.HomeTitleListAltID,
1849 wxT("PID"), &ContactEditorData.HomeTitleListPID,
1850 wxT("LANGUAGE"), &ContactEditorData.HomeTitleListLanguage,
1851 wxT("PREF"), &ContactEditorData.HomeTitleListPref,
1852 wxT(""), &ContactEditorData.HomeTitleListTokens );
1854 ResetSaveProcessData();
1858 ResetSaveProcessData();
1860 for (std::map<int,wxString>::iterator iter = ContactEditorData.BusinessTitleList.begin();
1861 iter != ContactEditorData.BusinessTitleList.end(); ++iter){
1863 ProcessSaveData(wxT("TITLE;TYPE=work"), &strValue2, &boolValue2, &boolValue,
1864 &iter, &ContactEditorData.BusinessTitleList, &ContactData,
1865 wxT("ALTID"), &ContactEditorData.BusinessTitleListAltID,
1866 wxT("PID"), &ContactEditorData.BusinessTitleListPID,
1867 wxT("LANGUAGE"), &ContactEditorData.BusinessTitleListLanguage,
1868 wxT("PREF"), &ContactEditorData.BusinessTitleListPref,
1869 wxT(""), &ContactEditorData.BusinessTitleListTokens );
1871 ResetSaveProcessData();
1875 ResetSaveProcessData();
1877 for (std::map<int,wxString>::iterator iter = ContactEditorData.GeneralRoleList.begin();
1878 iter != ContactEditorData.GeneralRoleList.end(); ++iter){
1880 ProcessSaveData(wxT("ROLE"), &strValue2, &boolValue2, &boolValue,
1881 &iter, &ContactEditorData.GeneralRoleList, &ContactData,
1882 wxT("ALTID"), &ContactEditorData.GeneralRoleListAltID,
1883 wxT("PID"), &ContactEditorData.GeneralRoleListPID,
1884 wxT("LANGUAGE"), &ContactEditorData.GeneralRoleListLanguage,
1885 wxT("PREF"), &ContactEditorData.GeneralRoleListPref,
1886 wxT(""), &ContactEditorData.GeneralRoleListTokens );
1888 ResetSaveProcessData();
1892 ResetSaveProcessData();
1894 for (std::map<int,wxString>::iterator iter = ContactEditorData.HomeRoleList.begin();
1895 iter != ContactEditorData.HomeRoleList.end(); ++iter){
1897 ProcessSaveData(wxT("ROLE;TYPE=home"), &strValue2, &boolValue2, &boolValue,
1898 &iter, &ContactEditorData.HomeRoleList, &ContactData,
1899 wxT("ALTID"), &ContactEditorData.HomeRoleListAltID,
1900 wxT("PID"), &ContactEditorData.HomeRoleListPID,
1901 wxT("LANGUAGE"), &ContactEditorData.HomeRoleListLanguage,
1902 wxT("PREF"), &ContactEditorData.HomeRoleListPref,
1903 wxT(""), &ContactEditorData.HomeRoleListTokens );
1905 ResetSaveProcessData();
1909 ResetSaveProcessData();
1911 for (std::map<int,wxString>::iterator iter = ContactEditorData.BusinessRoleList.begin();
1912 iter != ContactEditorData.BusinessRoleList.end(); ++iter){
1914 ProcessSaveData(wxT("ROLE;TYPE=work"), &strValue2, &boolValue2, &boolValue,
1915 &iter, &ContactEditorData.BusinessRoleList, &ContactData,
1916 wxT("ALTID"), &ContactEditorData.BusinessRoleListAltID,
1917 wxT("PID"), &ContactEditorData.BusinessRoleListPID,
1918 wxT("LANGUAGE"), &ContactEditorData.BusinessRoleListLanguage,
1919 wxT("PREF"), &ContactEditorData.BusinessRoleListPref,
1920 wxT(""), &ContactEditorData.BusinessRoleListTokens );
1922 ResetSaveProcessData();
1926 ResetSaveProcessData();
1928 for (std::map<int,wxString>::iterator iter = ContactEditorData.GeneralOrganisationsList.begin();
1929 iter != ContactEditorData.GeneralOrganisationsList.end(); ++iter){
1931 ProcessSaveData(wxT("ORG"), &strValue2, &boolValue2, &boolValue,
1932 &iter, &ContactEditorData.GeneralOrganisationsList, &ContactData,
1933 wxT("ALTID"), &ContactEditorData.GeneralOrganisationsListAltID,
1934 wxT("PID"), &ContactEditorData.GeneralOrganisationsListPID,
1935 wxT("LANGUAGE"), &ContactEditorData.GeneralOrganisationsListLanguage,
1936 wxT("SORT-AS"), &ContactEditorData.GeneralOrganisationsListSortAs,
1937 wxT("PREF"), &ContactEditorData.GeneralOrganisationsListPref,
1938 wxT(""), &ContactEditorData.GeneralOrganisationsListTokens );
1940 ResetSaveProcessData();
1944 ResetSaveProcessData();
1946 for (std::map<int,wxString>::iterator iter = ContactEditorData.HomeOrganisationsList.begin();
1947 iter != ContactEditorData.HomeOrganisationsList.end(); ++iter){
1949 ProcessSaveData(wxT("ORG;TYPE=home"), &strValue2, &boolValue2, &boolValue,
1950 &iter, &ContactEditorData.HomeOrganisationsList, &ContactData,
1951 wxT("ALTID"), &ContactEditorData.HomeOrganisationsListAltID,
1952 wxT("PID"), &ContactEditorData.HomeOrganisationsListPID,
1953 wxT("LANGUAGE"), &ContactEditorData.HomeOrganisationsListLanguage,
1954 wxT("SORT-AS"), &ContactEditorData.HomeOrganisationsListSortAs,
1955 wxT("PREF"), &ContactEditorData.HomeOrganisationsListPref,
1956 wxT(""), &ContactEditorData.HomeOrganisationsListTokens );
1958 ResetSaveProcessData();
1962 ResetSaveProcessData();
1964 for (std::map<int,wxString>::iterator iter = ContactEditorData.BusinessOrganisationsList.begin();
1965 iter != ContactEditorData.BusinessOrganisationsList.end(); ++iter){
1967 ProcessSaveData(wxT("ORG;TYPE=work"), &strValue2, &boolValue2, &boolValue,
1968 &iter, &ContactEditorData.BusinessOrganisationsList, &ContactData,
1969 wxT("ALTID"), &ContactEditorData.BusinessOrganisationsListAltID,
1970 wxT("PID"), &ContactEditorData.BusinessOrganisationsListPID,
1971 wxT("LANGUAGE"), &ContactEditorData.BusinessOrganisationsListLanguage,
1972 wxT("SORT-AS"), &ContactEditorData.BusinessOrganisationsListSortAs,
1973 wxT("PREF"), &ContactEditorData.BusinessOrganisationsListPref,
1974 wxT(""), &ContactEditorData.BusinessOrganisationsListTokens );
1976 ResetSaveProcessData();
1980 ResetSaveProcessData();
1982 for (std::map<int,wxString>::iterator iter = ContactEditorData.GeneralNoteList.begin();
1983 iter != ContactEditorData.GeneralNoteList.end(); ++iter){
1985 ProcessSaveData(wxT("NOTE"), &strValue2, &boolValue2, &boolValue,
1986 &iter, &ContactEditorData.GeneralNoteList, &ContactData,
1987 wxT("ALTID"), &ContactEditorData.GeneralNoteListAltID,
1988 wxT("PID"), &ContactEditorData.GeneralNoteListPID,
1989 wxT("LANGUAGE"), &ContactEditorData.GeneralNoteListLanguage,
1990 wxT("PREF"), &ContactEditorData.GeneralNoteListPref,
1991 wxT(""), &ContactEditorData.GeneralNoteListTokens );
1993 ResetSaveProcessData();
1997 ResetSaveProcessData();
1999 for (std::map<int,wxString>::iterator iter = ContactEditorData.HomeNoteList.begin();
2000 iter != ContactEditorData.HomeNoteList.end(); ++iter){
2002 ProcessSaveData(wxT("NOTE;TYPE=home"), &strValue2, &boolValue2, &boolValue,
2003 &iter, &ContactEditorData.HomeNoteList, &ContactData,
2004 wxT("ALTID"), &ContactEditorData.HomeNoteListAltID,
2005 wxT("PID"), &ContactEditorData.HomeNoteListPID,
2006 wxT("LANGUAGE"), &ContactEditorData.HomeNoteListLanguage,
2007 wxT("PREF"), &ContactEditorData.HomeNoteListPref,
2008 wxT(""), &ContactEditorData.HomeNoteListTokens );
2010 ResetSaveProcessData();
2014 ResetSaveProcessData();
2016 for (std::map<int,wxString>::iterator iter = ContactEditorData.BusinessNoteList.begin();
2017 iter != ContactEditorData.BusinessNoteList.end(); ++iter){
2019 ProcessSaveData(wxT("NOTE;TYPE=work"), &strValue2, &boolValue2, &boolValue,
2020 &iter, &ContactEditorData.BusinessNoteList, &ContactData,
2021 wxT("ALTID"), &ContactEditorData.BusinessNoteListAltID,
2022 wxT("PID"), &ContactEditorData.BusinessNoteListPID,
2023 wxT("LANGUAGE"), &ContactEditorData.BusinessNoteListLanguage,
2024 wxT("PREF"), &ContactEditorData.BusinessNoteListPref,
2025 wxT(""), &ContactEditorData.BusinessNoteListTokens );
2027 ResetSaveProcessData();
2031 ResetSaveProcessData();
2033 for (std::map<int,wxString>::iterator iter = ContactEditorData.CategoriesList.begin();
2034 iter != ContactEditorData.CategoriesList.end(); ++iter){
2036 ProcessSaveData(wxT("CATEGORIES"), &strValue2, &boolValue2, &boolValue,
2037 &iter, &ContactEditorData.CategoriesList, &ContactData,
2038 wxT("ALTID"), &ContactEditorData.CategoriesListAltID,
2039 wxT("PID"), &ContactEditorData.CategoriesListPID,
2040 wxT("TYPE"), &ContactEditorData.CategoriesListType,
2041 wxT("PREF"), &ContactEditorData.CategoriesListPref,
2042 wxT(""), &ContactEditorData.CategoriesListTokens );
2044 ResetSaveProcessData();
2050 for (std::map<int, std::string>::iterator iter = ContactEditorData.PicturesList.begin();
2051 iter != ContactEditorData.PicturesList.end(); ++iter){
2053 int intValueIndex = iter->first;
2055 std::map<int, std::string>::iterator stdstriter;
2056 std::map<int, wxString>::iterator enciter;
2058 striter = ContactEditorData.PicturesListPictureType.find(intValueIndex);
2059 enciter = ContactEditorData.PicturesListPicEncType.find(intValueIndex);
2061 ProcessSaveData(wxT("PHOTO"), &strValue2, &boolValue2, &boolValue,
2062 &iter, &ContactEditorData.PicturesList, &striter,
2063 &enciter, &ContactData,
2064 wxT("ALTID"), &ContactEditorData.PicturesListAltID,
2065 wxT("PID"), &ContactEditorData.PicturesListPID,
2066 wxT("TYPE"), &ContactEditorData.PicturesListType,
2067 wxT("PREF"), &ContactEditorData.PicturesListPref,
2068 wxT(""), &ContactEditorData.PicturesListTokens);
2070 ResetSaveProcessData();
2074 ResetSaveProcessData();
2078 for (std::map<int, std::string>::iterator iter = ContactEditorData.LogosList.begin();
2079 iter != ContactEditorData.LogosList.end(); ++iter){
2081 int intValueIndex = iter->first;
2083 std::map<int, std::string>::iterator stdstriter;
2084 std::map<int, wxString>::iterator enciter;
2086 striter = ContactEditorData.LogosListPictureType.find(intValueIndex);
2087 enciter = ContactEditorData.LogosListPicEncType.find(intValueIndex);
2089 ProcessSaveData(wxT("LOGO"), &strValue2, &boolValue2, &boolValue,
2090 &iter, &ContactEditorData.LogosList, &striter,
2091 &enciter, &ContactData,
2092 wxT("ALTID"), &ContactEditorData.LogosListAltID,
2093 wxT("PID"), &ContactEditorData.LogosListPID,
2094 wxT("TYPE"), &ContactEditorData.LogosListType,
2095 wxT("PREF"), &ContactEditorData.LogosListPref,
2096 wxT(""), &ContactEditorData.LogosListTokens );
2098 ResetSaveProcessData();
2102 ResetSaveProcessData();
2106 for (std::map<int, std::string>::iterator iter = ContactEditorData.SoundsList.begin();
2107 iter != ContactEditorData.SoundsList.end(); ++iter){
2109 int intValueIndex = iter->first;
2111 std::map<int, std::string>::iterator stdstriter;
2112 std::map<int, wxString>::iterator enciter;
2114 striter = ContactEditorData.SoundsListAudioType.find(intValueIndex);
2115 enciter = ContactEditorData.SoundsListAudioEncType.find(intValueIndex);
2117 ProcessSaveData(wxT("SOUND"), &strValue2, &boolValue2, &boolValue,
2118 &iter, &ContactEditorData.SoundsList, &striter,
2119 &enciter, &ContactData,
2120 wxT("ALTID"), &ContactEditorData.SoundsListAltID,
2121 wxT("PID"), &ContactEditorData.SoundsListPID,
2122 wxT("TYPE"), &ContactEditorData.SoundsListType,
2123 wxT("PREF"), &ContactEditorData.SoundsListPref,
2124 wxT(""), &ContactEditorData.SoundsListTokens );
2126 ResetSaveProcessData();
2130 ResetSaveProcessData();
2132 for (std::map<int,wxString>::iterator iter = ContactEditorData.CalendarList.begin();
2133 iter != ContactEditorData.CalendarList.end(); ++iter){
2135 ProcessSaveData(wxT("CALURI"), &strValue2, &boolValue2, &boolValue,
2136 &iter, &ContactEditorData.CalendarList, &ContactData,
2137 wxT("ALTID"), &ContactEditorData.CalendarListAltID,
2138 wxT("PID"), &ContactEditorData.CalendarListPID,
2139 wxT("MEDIATYPE"), &ContactEditorData.CalendarListMediatype,
2140 wxT("TYPE"), &ContactEditorData.CalendarListType,
2141 wxT("PREF"), &ContactEditorData.CalendarListPref,
2142 wxT(""), &ContactEditorData.CalendarListTokens );
2144 ResetSaveProcessData();
2148 ResetSaveProcessData();
2150 for (std::map<int,wxString>::iterator iter = ContactEditorData.CalendarRequestList.begin();
2151 iter != ContactEditorData.CalendarRequestList.end(); ++iter){
2153 ProcessSaveData(wxT("CALADRURI"), &strValue2, &boolValue2, &boolValue,
2154 &iter, &ContactEditorData.CalendarRequestList, &ContactData,
2155 wxT("ALTID"), &ContactEditorData.CalendarRequestListAltID,
2156 wxT("PID"), &ContactEditorData.CalendarRequestListPID,
2157 wxT("MEDIATYPE"), &ContactEditorData.CalendarRequestListMediatype,
2158 wxT("TYPE"), &ContactEditorData.CalendarRequestListType,
2159 wxT("PREF"), &ContactEditorData.CalendarRequestListPref,
2160 wxT(""), &ContactEditorData.CalendarRequestListTokens );
2162 ResetSaveProcessData();
2166 ResetSaveProcessData();
2168 for (std::map<int,wxString>::iterator iter = ContactEditorData.FreeBusyList.begin();
2169 iter != ContactEditorData.FreeBusyList.end(); ++iter){
2171 ProcessSaveData(wxT("FBURL"), &strValue2, &boolValue2, &boolValue,
2172 &iter, &ContactEditorData.FreeBusyList, &ContactData,
2173 wxT("ALTID"), &ContactEditorData.FreeBusyListAltID,
2174 wxT("PID"), &ContactEditorData.FreeBusyListPID,
2175 wxT("MEDIATYPE"), &ContactEditorData.FreeBusyListMediatype,
2176 wxT("TYPE"), &ContactEditorData.FreeBusyListType,
2177 wxT("PREF"), &ContactEditorData.FreeBusyListPref,
2178 wxT(""), &ContactEditorData.FreeBusyListTokens );
2180 ResetSaveProcessData();
2184 for (std::map<int, wxString>::iterator iter = ContactEditorData.KeyList.begin();
2185 iter != ContactEditorData.KeyList.end(); ++iter){
2187 intValue2 = iter->first;
2189 // Get the key information.
2191 std::map<int, wxString>::iterator enciter;
2193 striter = ContactEditorData.KeyListDataType.find(intValue2);
2195 wxString strValueData;
2197 strValueData = iter->second;
2198 strValueData.insert(0, wxT("data:") + striter->second + wxT(";base64,"));
2200 ProcessSaveData(wxT("KEY"), &strValue2, &boolValue2, &boolValue,
2201 &iter, &strValueData, &ContactData,
2202 wxT("ALTID"), &ContactEditorData.KeyListAltID,
2203 wxT("PID"), &ContactEditorData.KeyListPID,
2204 wxT("TYPE"), &ContactEditorData.KeyListType,
2205 wxT("PREF"), &ContactEditorData.KeyListPref,
2206 wxT(""), &ContactEditorData.KeyListTokens );
2208 ResetSaveProcessData();
2212 // Vendor specific items.
2214 ResetSaveProcessData();
2216 for (std::map<int,wxString>::iterator iter = ContactEditorData.VendorList.begin();
2217 iter != ContactEditorData.VendorList.end(); ++iter){
2219 intValue2 = iter->first;
2221 // Get the IANA PEN number.
2223 striter = ContactEditorData.VendorListPEN.find(intValue2);
2225 if (striter->first == intValue2){
2227 strValue2 = striter->second;
2231 // Get the element name.
2233 striter = ContactEditorData.VendorListElement.find(intValue2);
2235 if (striter->first == intValue2){
2237 strValue3 = striter->second;
2243 striter = ContactEditorData.VendorList.find(intValue2);
2245 if (striter->first == intValue2){
2247 strValue = striter->second;
2251 // Add to the vCard.
2253 if (boolValue == TRUE){
2255 ContactData.AddRaw(wxT("VND-") + strValue2 + wxT("-") + strValue3, strValue);
2259 ContactData.Add(wxT("VND-") + strValue2 + wxT("-") + strValue3, strValue, FALSE);
2263 ResetSaveProcessData();
2267 ResetSaveProcessData();
2271 for (std::map<int,wxString>::iterator iter = ContactEditorData.XTokenList.begin();
2272 iter != ContactEditorData.XTokenList.end(); ++iter){
2274 intValue2 = iter->first;
2276 // Get the element name.
2278 striter = ContactEditorData.XTokenListTokens.find(intValue2);
2280 if (striter->first == intValue2){
2282 strValue2 = striter->second;
2288 striter = ContactEditorData.XTokenList.find(intValue2);
2290 if (striter->first == intValue2){
2292 strValue = striter->second;
2296 // Add to the vCard.
2298 if (boolValue == TRUE){
2300 ContactData.AddRaw(wxT("X-") + strValue2, strValue);
2304 ContactData.Add(wxT("X-") + strValue2, strValue, FALSE);
2308 ResetSaveProcessData();
2312 ResetSaveProcessData();
2314 if (ContactEditorData.FullNamesList.size() == 0){
2316 wxString FullName = cmbDisplayAs->GetValue();
2317 ContactEditorData.FullNamesList.insert(std::make_pair(0, FullName));
2318 ContactEditorData.FullNamesListAltID.insert(std::make_pair(0, wxT("")));
2319 ContactEditorData.FullNamesListPID.insert(std::make_pair(0, wxT("")));
2320 ContactEditorData.FullNamesListType.insert(std::make_pair(0, wxT("")));
2321 ContactEditorData.FullNamesListLanguage.insert(std::make_pair(0, wxT("")));
2322 ContactEditorData.FullNamesListPref.insert(std::make_pair(0, 0));
2323 ContactEditorData.FullNamesListTokens.insert(std::make_pair(0, wxT("")));
2328 for (std::map<int, wxString>::iterator iter = ContactEditorData.FullNamesList.begin();
2329 iter != ContactEditorData.FullNamesList.end(); ++iter){
2331 if (FNFirst == TRUE){
2333 iter->second = cmbDisplayAs->GetValue();
2338 std::map<int,wxString>::iterator mapS;
2340 mapS = ContactEditorData.FullNamesListTokens.find(iter->first);
2342 ProcessSaveData(wxT("FN"), &strValue2, &boolValue2, &boolValue,
2343 &iter, &ContactEditorData.FullNamesList, &ContactData,
2344 wxT("ALTID"), &ContactEditorData.FullNamesListAltID,
2345 wxT("PID"), &ContactEditorData.FullNamesListPID,
2346 wxT("TYPE"), &ContactEditorData.FullNamesListType,
2347 wxT("LANGUAGE"), &ContactEditorData.FullNamesListLanguage,
2348 wxT("PREF"), &ContactEditorData.FullNamesListPref,
2349 wxT(""), &ContactEditorData.FullNamesListTokens );
2353 ResetSaveProcessData();
2357 // Insert revision (REV) date.
2359 // Get today's date and time.
2361 wxDateTime DateTimeNow = wxDateTime::Now();
2365 // Set year, month and date.
2367 int intYear = DateTimeNow.GetYear();
2368 int intMonth = DateTimeNow.GetMonth();
2369 int intDay = DateTimeNow.GetDay();
2371 DateRev.Append(wxT("0") + wxString::Format(wxT("%i"), intYear));
2375 DateRev.Append(wxT("0") + wxString::Format(wxT("%i"), intMonth));
2379 DateRev.Append(wxString::Format(wxT("%i"), intMonth));
2385 DateRev.Append(wxT("0") + wxString::Format(wxT("%i"), intDay));
2389 DateRev.Append(wxString::Format(wxT("%i"), intDay));
2393 DateRev.Append(wxT("T"));
2395 // Set hour, minute and second.
2397 int intHour = DateTimeNow.GetHour();
2398 int intMinute = DateTimeNow.GetMinute();
2399 int intSecond = DateTimeNow.GetSecond();
2403 DateRev.Append(wxT("0") + wxString::Format(wxT("%i"), intHour));
2407 DateRev.Append(wxString::Format(wxT("%i"), intHour));
2411 if (intMinute < 10){
2413 DateRev.Append(wxT("0") + wxString::Format(wxT("%i"), intMinute));
2417 DateRev.Append(wxString::Format(wxT("%i"), intMinute));
2421 if (intSecond < 10){
2423 DateRev.Append(wxT("0") + wxString::Format(wxT("%i"), intSecond));
2427 DateRev.Append(wxString::Format(wxT("%i"), intSecond));
2431 DateRev.Append(wxT("Z"));
2433 ContactData.Add(wxT("UID"), ContactEditorData.UIDToken, FALSE);
2435 // End the vCard File.
2437 ContactData.Add(wxT("END"), wxT("VCARD"), FALSE);*/
2440 ContactEditorData.SaveFile(FilenameFinal);
2441 //ContactData.WriteFile(FilenameFinal);
2443 vCard34Conv ConvFileFun;
2447 ConvFileFun.ConvertToV3(FilenameFinal, &wxSData);
2449 wxString AccountDirPrefix;
2450 wxString AccountDir;
2453 #if defined(__HAIKU__)
2455 #elif defined(__APPLE__)
2457 PrefDir = GetUserPrefDir();
2459 wxStringTokenizer wSTFilename(wxSContactFilename, wxT("/"));
2461 #elif defined(__WIN32__)
2463 PrefDir = GetUserPrefDir();
2465 wxStringTokenizer wSTFilename(wxSContactFilename, wxT("\\"));
2469 PrefDir = GetUserPrefDir();
2471 wxStringTokenizer wSTFilename(wxSContactFilename, wxT("/"));
2475 XABPreferences PrefData(PrefDir);
2477 wxString AccountType;
2479 for (int i = 0; i < PrefData.accounts.GetCount(); i++){
2481 AccountDir = PrefData.accounts.GetAccountDirectory(i) + wxT(".carddav");
2483 if (AccountDir == wxSContactAccount){
2485 AccountDirPrefix = PrefData.accounts.GetAccountDirPrefix(i);
2486 AccountDirPrefix.Trim();
2487 AccountType = PrefData.accounts.GetAccountType(i);
2494 wxString wxSplitFilename;
2495 wxString wxSDataURL;
2497 while(wSTFilename.HasMoreTokens()){
2499 wxSplitFilename = wSTFilename.GetNextToken();
2503 wxSDataURL = wxSplitFilename;
2505 // Find out if the filename exists in the table.
2507 if (AccountType == wxT("CardDAV") || AccountType == wxT("carddav")){
2509 wxString ETagResult;
2510 wxString ETagOriginal;
2512 ETagDB *ETagDBPtr = NULL;
2514 ETagDBPtr = ETagTmrPtr->GetPointer(wxSContactAccount);
2516 wxString wxSETag = ETagDBPtr->GetETag(wxSplitFilename);
2517 wxString wxSETagOrig = ETagDBPtr->GetETagOriginal(wxSplitFilename);
2519 if (wxSETagOrig.IsEmpty()){
2521 // Generate the ETag.
2523 wxSETagOrig = wxString::Format(wxT("%X%X%X%X"), rand() % 1024, rand() % 1024, rand() % 1024, rand() % 1024);
2527 if (wxSETag.IsEmpty()){
2529 // Update empty ETag.
2531 wxSETag = wxSETagOrig;
2532 ETagDBPtr->UpdateETag(wxSplitFilename, wxSETag, wxSETagOrig);
2536 // Don't change original ETag.
2538 wxSETag = wxString::Format(wxT("%X%X%X%X"), rand() % 1024, rand() % 1024, rand() % 1024, rand() % 1024);
2539 ETagDBPtr->UpdateETag(wxSplitFilename, wxSETag);
2543 if (EditMode == FALSE){
2545 ActMgrPtr->AddTask(0, cmbDisplayAs->GetValue(), wxSContactAccount, wxSDataURL, wxSplitFilename, FilenameFinal, wxSData);
2547 FMTimer.SetFilename(FilenameFinal);
2548 FMTimer.UpdateTimestamp();
2549 FMTimer.Start(10000, FALSE);
2551 wxCommandEvent reloadevent(RELOADCONTACTLIST);
2552 reloadevent.SetString(wxSContactAccount);
2553 wxPostEvent(this->GetParent(), reloadevent);
2557 ActMgrPtr->AddTask(1, cmbDisplayAs->GetValue(), wxSContactAccount, wxSDataURL, wxSplitFilename, FilenameFinal, wxSData);
2558 FMTimer.UpdateTimestamp();
2559 FMTimer.Start(10000, FALSE);
2565 // Send a notification to update the main window
2566 // with the new details.
2571 // TODO: Workout nickname settings by priority and
2576 NameData.Forename = txtForename->GetValue();
2577 NameData.Surname = txtSurname->GetValue();
2578 NameData.OtherNames = txtOtherNames->GetValue();
2579 NameData.Title = txtTitle->GetValue();
2580 NameData.Suffix = txtSuffix->GetValue();
2582 ucd->ContactAccount = wxSContactAccount;
2583 ucd->ContactFilename = FilenameFinal;
2584 ucd->ContactName = cmbDisplayAs->GetValue();
2585 ucd->ContactNameArray = NameData;
2587 for (std::map<int,wxString>::iterator gniter = ContactEditorData.GeneralNicknamesList.begin();
2588 gniter != ContactEditorData.GeneralNicknamesList.end(); gniter++){
2590 ucd->ContactNickname = gniter->second;
2595 wxCommandEvent event2(CE_UPDATECONTACTLIST);
2596 event2.SetClientData(ucd);
2597 wxPostEvent(MainPtr, event2);
2601 void frmContactEditor::SaveCloseContact( wxCommandEvent& event )
2604 // Save the updated contact data and close the form.
2606 wxCommandEvent NullEvent;
2607 this->SaveContact(NullEvent);