1 // ContactDataObject.cpp - Client Data Object.
3 // (c) 2012-2015 Xestia Software Development.
5 // This file is part of Xestia Address Book.
7 // Xestia Address Book is free software: you can redistribute it and/or modify
8 // it under the terms of the GNU General Public License as published by the
9 // Free Software Foundation, version 3 of the license.
11 // Xestia Address Book is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 // GNU General Public License for more details.
16 // You should have received a copy of the GNU General Public License along
17 // with Xestia Address Book. If not, see <http://www.gnu.org/licenses/>
19 #include "ContactDataObject.h"
21 ContactLoadStatus ContactDataObject::LoadFile(wxString Filename){
23 if (!wxFileExists(Filename)){
25 return CONTACTLOAD_FILEMISSING;
31 if (!ContactFile.Open(Filename, wxFile::read, wxS_DEFAULT)){
33 return CONTACTLOAD_FILEERROR;
37 // Check that the vCard is a valid vCard 4.0 file.
39 vCard vCard4FormatCheck;
41 vCard4FormatCheck.LoadFile(Filename);
43 if (vCard4FormatCheck.Get("VERSION") != wxT("4.0")){
45 return CONTACTLOAD_FILEINVALIDFORMAT;
49 // Check that the vCard meets the base specification.
51 if (!vCard4FormatCheck.MeetBaseSpecification()){
53 return CONTACTLOAD_FILEBASESPECFAIL;
57 wxStringTokenizer wSTContactFileLines(vCard4FormatCheck.WriteString(), wxT("\r\n"));
59 std::map<int, wxString> ContactFileLines;
61 int ContactLineSeek = 0;
63 while (wSTContactFileLines.HasMoreTokens() == TRUE){
65 wxString ContactLine = wSTContactFileLines.GetNextToken();
66 ContactFileLines.insert(std::make_pair(ContactLineSeek, ContactLine));
71 wxString wxSPropertyNextLine;
73 bool ExtraLineSeek = TRUE;
74 bool QuoteMode = FALSE;
75 bool PropertyFind = TRUE;
76 bool KindProcessed = FALSE;
77 bool NameProcessed = FALSE;
78 bool GenderProcessed = FALSE;
79 bool BirthdayProcessed = FALSE;
80 bool AnniversaryProcessed = FALSE;
81 bool UIDProcessed = FALSE;
82 bool RevisionProcessed = FALSE;
83 int ContactLineLen = 0;
84 int QuoteBreakPoint = 0;
88 int NicknameCount = 0;
89 int TimeZoneCount = 0;
93 int TelephoneCount = 0;
94 int LanguageCount = 0;
95 int GeographicCount = 0;
100 int OrganisationCount = 0;
102 int CategoryCount = 0;
106 int CalendarCount = 0;
107 int CalendarAddressCount = 0;
108 int FreeBusyAddressCount = 0;
113 int ClientPIDCount = 0;
114 wxString ContactLine;
115 wxString PropertyLine;
116 wxString PropertySeg1;
117 wxString PropertySeg2;
118 wxString PropertyNextLine;
121 for (std::map<int,wxString>::iterator iter = ContactFileLines.begin();
122 iter != ContactFileLines.end(); ++iter){
124 ExtraLineSeek = TRUE;
130 PropertyLine.Clear();
131 PropertySeg1.Clear();
132 PropertySeg2.Clear();
135 ContactLine = iter->second;
137 while (ExtraLineSeek == TRUE){
139 // Check if there is extra data on the next line
140 // (indicated by space or tab at the start) and add data.
144 if (iter == ContactFileLines.end()){
151 PropertyNextLine = iter->second;
153 if (PropertyNextLine.Mid(0, 1) == wxT(" ") || PropertyNextLine.Mid(0, 1) == wxT("\t")){
155 PropertyNextLine.Remove(0, 1);
156 ContactLine.Append(PropertyNextLine);
161 ExtraLineSeek = FALSE;
167 ContactLineLen = ContactLine.Len();
169 // Make sure we are not in quotation mode.
170 // Make sure colon does not have \ or \\ before it.
172 for (int i = 0; i <= ContactLineLen; i++){
174 if ((ContactLine.Mid(i, 1) == wxT(";") || ContactLine.Mid(i, 1) == wxT(":")) && PropertyFind == TRUE){
176 PropertyFind = FALSE;
178 } else if (PropertyFind == TRUE){
180 Property.Append(ContactLine.Mid(i, 1));
184 if (ContactLine.Mid(i, 1) == wxT("\"")){
186 if (QuoteMode == TRUE){
198 if (ContactLine.Mid(i, 1) == wxT(":") && ContactLine.Mid((i - 1), 1) != wxT("\\") && QuoteMode == FALSE){
207 // Split that line at the point into two variables (ignore the colon).
209 PropertySeg1 = ContactLine.Mid(0, QuoteBreakPoint);
210 PropertySeg2 = ContactLine.Mid((QuoteBreakPoint + 1));
212 if (Property == wxT("KIND") && KindProcessed == FALSE){
214 ProcessKind(PropertySeg2);
216 } else if (Property == wxT("UID") && UIDProcessed == FALSE){
218 UIDToken = PropertySeg2;
221 } else if (Property == wxT("SOURCE")){
223 ProcessSource(PropertySeg1, PropertySeg2, &SourceCount);
226 } else if (Property == wxT("XML")){
228 ProcessXML(PropertySeg1, PropertySeg2, &XMLCount);
231 } else if (Property == wxT("REV") && RevisionProcessed == FALSE){
233 ProcessRevision(PropertySeg1, PropertySeg2);
234 RevisionProcessed = TRUE;
236 } else if (Property == wxT("MEMBER")){
238 ProcessMember(PropertySeg1, PropertySeg2, &GroupCount);
241 } else if (Property == wxT("FN")){
243 ProcessFN(PropertySeg1, PropertySeg2, &FNCount);
246 } else if (Property == wxT("N") && NameProcessed == FALSE){
248 ProcessN(PropertySeg1, PropertySeg2);
249 NameProcessed = TRUE;
251 } else if (Property == wxT("CLIENTPIDMAP")){
253 ProcessClientPIDMap(PropertySeg1, PropertySeg2, &ClientPIDCount);
256 } else if (Property == wxT("NICKNAME")){
258 ProcessNickname(PropertySeg1, PropertySeg2, &NicknameCount);
261 } else if (Property == wxT("GENDER") && GenderProcessed == FALSE){
263 ProcessGender(PropertySeg1, PropertySeg2);
264 GenderProcessed = TRUE;
266 } else if (Property == wxT("BDAY") && BirthdayProcessed == FALSE){
268 ProcessBirthday(PropertySeg1, PropertySeg2);
269 BirthdayProcessed = TRUE;
271 } else if (Property == wxT("ANNIVERSARY") && AnniversaryProcessed == FALSE){
273 ProcessAnniversary(PropertySeg1, PropertySeg2);
274 AnniversaryProcessed = TRUE;
276 } else if (Property == wxT("TZ")){
278 ProcessTimeZone(PropertySeg1, PropertySeg2, &TimeZoneCount);
281 } else if (Property == wxT("ADR")){
283 ProcessAddress(PropertySeg1, PropertySeg2, &AddressCount);
286 } else if (Property == wxT("EMAIL")){
288 ProcessEmail(PropertySeg1, PropertySeg2, &EmailCount);
291 } else if (Property == wxT("IMPP")){
293 ProcessIM(PropertySeg1, PropertySeg2, &IMCount);
296 } else if (Property == wxT("TEL")){
298 ProcessTelephone(PropertySeg1, PropertySeg2, &TelephoneCount);
301 } else if (Property == wxT("LANG")){
303 // See frmContactEditor-LoadLanguage.cpp
305 ProcessLanguage(PropertySeg1, PropertySeg2, &LanguageCount);
308 } else if (Property == wxT("GEO")){
310 // See frmContactEditor-LoadGeo.cpp
312 ProcessGeographic(PropertySeg1, PropertySeg2, &GeographicCount);
315 } else if (Property == wxT("RELATED")){
317 // See fromContactEditor-LoadRelated.cpp
319 ProcessRelated(PropertySeg1, PropertySeg2, &RelatedCount);
322 } else if (Property == wxT("URL")){
324 // See frmContactEditor-LoadURL.cpp
326 ProcessURL(PropertySeg1, PropertySeg2, &URLCount);
329 } else if (Property == wxT("TITLE")) {
331 // See frmContactEditor-LoadTitle.cpp
333 ProcessTitle(PropertySeg1, PropertySeg2, &TitleCount);
336 } else if (Property == wxT("ROLE")) {
338 // See frmContactEditor-LoadTitle.cpp
340 ProcessRole(PropertySeg1, PropertySeg2, &RoleCount);
343 } else if (Property == wxT("ORG")) {
345 // See frmContactEditor-LoadOrg.cpp
347 ProcessOrganisation(PropertySeg1, PropertySeg2, &OrganisationCount);
350 } else if (Property == wxT("NOTE")) {
352 // See frmContactEditor-LoadNote.cpp
354 ProcessNote(PropertySeg1, PropertySeg2, &NoteCount);
357 } else if (Property == wxT("CATEGORIES")) {
359 // See frmContactEditor-LoadCategory.cpp
361 ProcessCategory(PropertySeg1, PropertySeg2, &CategoryCount);
364 } else if (Property == wxT("PHOTO")) {
366 // See frmContactEditor-LoadPhoto.cpp
368 ProcessPhoto(PropertySeg1, PropertySeg2, &PhotoCount);
371 } else if (Property == wxT("LOGO")) {
373 // See frmContactEditor-LoadPhoto.cpp
375 ProcessLogo(PropertySeg1, PropertySeg2, &LogoCount);
378 } else if (Property == wxT("LOGO")) {
380 // See frmContactEditor-LoadPhoto.cpp
382 ProcessLogo(PropertySeg1, PropertySeg2, &LogoCount);
385 } else if (Property == wxT("SOUND")) {
387 // See frmContactEditor-LoadSound.cpp
389 ProcessSound(PropertySeg1, PropertySeg2, &SoundCount);
392 } else if (Property == wxT("CALURI")){
394 // See frmContactEditor-LoadCalendar.cpp
396 ProcessCalendarURI(PropertySeg1, PropertySeg2, &CalendarCount);
399 } else if (Property == wxT("CALADRURI")){
401 ProcessCalendarAddressURI(PropertySeg1, PropertySeg2, &CalendarAddressCount);
402 CalendarAddressCount++;
404 } else if (Property == wxT("FBURL")){
406 // See frmContactEditor-LoadCalendar.cpp
408 ProcessCalendarFreeBusy(PropertySeg1, PropertySeg2, &FreeBusyAddressCount);
409 FreeBusyAddressCount++;
411 } else if (Property == wxT("KEY")){
413 // See frmContactEditor-LoadKey.cpp
415 ProcessKey(PropertySeg1, PropertySeg2, &KeyCount);
418 } else if (Property.Mid(0, 3) == wxT("VND")){
420 ProcessVendor(PropertySeg1, PropertySeg2, &VendorCount);
423 } else if (Property.Mid(0, 2) == wxT("X-")){
425 XTokenList.insert(std::make_pair(XTokenCount, PropertySeg2));
426 XTokenListTokens.insert(std::make_pair(XTokenCount, PropertySeg1.Mid(2)));
433 return CONTACTLOAD_OK;
437 void ContactDataObject::ProcessKind(wxString KindType){
439 if (KindType == wxT("individual")){
441 ContactKind = CONTACTKIND_INDIVIDUAL;
443 } else if (KindType == wxT("group")){
445 ContactKind = CONTACTKIND_GROUP;
447 } else if (KindType == wxT("org")){
449 ContactKind = CONTACTKIND_ORGANISATION;
451 } else if (KindType == wxT("location")){
453 ContactKind = CONTACTKIND_LOCATION;
457 ContactKind = CONTACTKIND_NONE;
462 void ContactDataObject::ProcessRevision(wxString PropertySeg1, wxString PropertySeg2){
464 size_t intPropertyLen = PropertySeg1.Len();
465 std::map<int, int> SplitPoints;
466 std::map<int, int> SplitLength;
467 std::map<int, int>::iterator SLiter;
468 wxString PropertyData;
469 wxString PropertyName;
470 wxString PropertyValue;
471 wxString PropertyTokens;
472 bool FirstToken = TRUE;
473 int intSplitsFound = 0;
474 int intSplitSize = 0;
475 int intPrevValue = 5;
479 SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue);
483 for (std::map<int, int>::iterator intiter = SplitPoints.begin();
484 intiter != SplitPoints.end(); ++intiter){
486 SLiter = SplitLength.find(intiter->first);
488 PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second));
490 wxStringTokenizer PropertyElement (PropertyData, wxT("="));
491 PropertyName = PropertyElement.GetNextToken();
492 PropertyValue = PropertyElement.GetNextToken();
494 intPrevValue = intiter->second;
496 // Process properties.
498 size_t intPropertyValueLen = PropertyValue.Len();
500 if (PropertyValue.Mid((intPropertyValueLen - 1), 1) == wxT("\"")){
502 PropertyValue.Trim();
503 PropertyValue.RemoveLast();
507 if (PropertyValue.Mid(0, 1) == wxT("\"")){
509 PropertyValue.Remove(0, 1);
513 CaptureString(&PropertyValue, FALSE);
515 if (FirstToken == TRUE){
517 PropertyTokens.Append(PropertyName + wxT("=") + PropertyValue);
522 PropertyTokens.Append(wxT(";") + PropertyName + wxT("=") + PropertyValue);
528 CaptureString(&PropertySeg2, FALSE);
530 Revision = PropertySeg2;
532 if (!PropertyTokens.IsEmpty()){
534 RevisionTokens = PropertyTokens;
541 void ContactDataObject::ProcessSource(wxString PropertySeg1, wxString PropertySeg2, int *SourceCount){
543 size_t intPropertyLen = PropertySeg1.Len();
544 std::map<int, int> SplitPoints;
545 std::map<int, int> SplitLength;
546 std::map<int, int>::iterator SLiter;
547 wxString PropertyData;
548 wxString PropertyName;
549 wxString PropertyValue;
550 wxString PropertyTokens;
551 bool FirstToken = TRUE;
552 int intSplitsFound = 0;
553 int intSplitSize = 0;
554 int intPrevValue = 8;
558 SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue);
562 PropertyType PropType = PROPERTY_NONE;
564 // Look for type before continuing.
566 CheckType(&PropertySeg1, &SplitPoints, &SplitLength, &intPrevValue, &PropType);
570 for (std::map<int, int>::iterator intiter = SplitPoints.begin();
571 intiter != SplitPoints.end(); ++intiter){
573 SLiter = SplitLength.find(intiter->first);
575 PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second));
577 wxStringTokenizer PropertyElement (PropertyData, wxT("="));
578 PropertyName = PropertyElement.GetNextToken();
579 PropertyValue = PropertyElement.GetNextToken();
581 intPrevValue = intiter->second;
583 // Process properties.
585 size_t intPropertyValueLen = PropertyValue.Len();
587 if (PropertyValue.Mid((intPropertyValueLen - 1), 1) == wxT("\"")){
589 PropertyValue.Trim();
590 PropertyValue.RemoveLast();
594 if (PropertyValue.Mid(0, 1) == wxT("\"")){
596 PropertyValue.Remove(0, 1);
600 CaptureString(&PropertyValue, FALSE);
602 if (PropertyName == wxT("ALTID")){
604 SourceListAltID.erase(*SourceCount);
605 SourceListAltID.insert(std::make_pair(*SourceCount, PropertyValue));
607 } else if (PropertyName == wxT("PID")){
609 SourceListPID.erase(*SourceCount);
610 SourceListPID.insert(std::make_pair(*SourceCount, PropertyValue));
612 } else if (PropertyName == wxT("PREF")){
614 ProcessIntegerValue(this, &SourceListPref, &PropertyValue, SourceCount);
616 } else if (PropertyName == wxT("MEDIATYPE")){
618 SourceListMediatype.erase(*SourceCount);
619 SourceListMediatype.insert(std::make_pair(*SourceCount, PropertyValue));
623 // Something else we don't know about so append
624 // to the tokens variable.
626 if (!PropertyName.IsEmpty() && !PropertyValue.IsEmpty() && PropertyName != wxT("TYPE")){
628 if (FirstToken == TRUE){
630 PropertyTokens.Append(PropertyName + wxT("=") + PropertyValue);
635 PropertyTokens.Append(wxT(";") + PropertyName + wxT("=") + PropertyValue);
645 intPropertyLen = PropertySeg2.Len();
652 CaptureString(&PropertySeg2, FALSE);
654 // Add the data to the General/Home/Work address variables.
660 SourceListType.insert(std::make_pair(*SourceCount, "home"));
663 SourceListType.insert(std::make_pair(*SourceCount, "work"));
667 SourceList.insert(std::make_pair(*SourceCount, PropertySeg2));
669 if (!PropertyTokens.IsEmpty()){
671 SourceListTokens.insert(std::make_pair(*SourceCount, PropertyTokens));
677 void ContactDataObject::ProcessXML(wxString PropertySeg1, wxString PropertySeg2, int *XMLCount){
679 std::map<int, int> SplitPoints;
680 std::map<int, int> SplitLength;
682 int intPrevValue = 5;
686 SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue);
690 wxString PropertyName;
691 wxString PropertyValue;
692 wxString PropertyData;
693 wxString PropertyTokens;
694 std::map<int,int>::iterator SLiter;
695 bool FirstToken = TRUE;
697 for (std::map<int, int>::iterator intiter = SplitPoints.begin();
698 intiter != SplitPoints.end(); ++intiter){
700 SLiter = SplitLength.find(intiter->first);
702 PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second));
704 wxStringTokenizer PropertyElement (PropertyData, wxT("="));
705 PropertyName = PropertyElement.GetNextToken();
706 PropertyValue = PropertyElement.GetNextToken();
708 intPrevValue = intiter->second;
710 CaptureString(&PropertyValue, FALSE);
712 if (PropertyName == wxT("ALTID")){
714 XMLListAltID.erase(*XMLCount);
715 XMLListAltID.insert(std::make_pair(*XMLCount, PropertyValue));
721 XMLList.insert(std::make_pair(*XMLCount, PropertySeg2));
725 void ContactDataObject::ProcessMember(wxString PropertySeg1, wxString PropertySeg2, int *GroupCount){
727 std::map<int, int> SplitPoints;
728 std::map<int, int> SplitLength;
730 int intPrevValue = 8;
734 SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue);
738 wxString PropertyName;
739 wxString PropertyValue;
740 wxString PropertyData;
741 wxString PropertyTokens;
742 std::map<int,int>::iterator SLiter;
743 bool FirstToken = TRUE;
745 for (std::map<int, int>::iterator intiter = SplitPoints.begin();
746 intiter != SplitPoints.end(); ++intiter){
748 SLiter = SplitLength.find(intiter->first);
750 PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second));
752 wxStringTokenizer PropertyElement (PropertyData, wxT("="));
753 PropertyName = PropertyElement.GetNextToken();
754 PropertyValue = PropertyElement.GetNextToken();
756 intPrevValue = intiter->second;
758 CaptureString(&PropertyValue, FALSE);
760 if (PropertyName == wxT("ALTID")){
762 GroupsListAltID.erase(*GroupCount);
763 GroupsListAltID.insert(std::make_pair(*GroupCount, PropertyValue));
765 } else if (PropertyName == wxT("PID")){
767 GroupsListPID.erase(*GroupCount);
768 GroupsListPID.insert(std::make_pair(*GroupCount, PropertyValue));
770 } else if (PropertyName == wxT("PREF")){
772 ProcessIntegerValue(this, &GroupsListPref, &PropertyValue, GroupCount);
774 } else if (PropertyName == wxT("MEDIATYPE")){
776 GroupsListMediaType.erase(*GroupCount);
777 GroupsListMediaType.insert(std::make_pair(*GroupCount, PropertyValue));
779 } else if (!PropertyName.IsEmpty() && !PropertyValue.IsEmpty()){
781 if (FirstToken == TRUE){
783 PropertyTokens.Append(PropertyName + wxT("=") + PropertyValue);
788 PropertyTokens.Append(wxT(";") + PropertyName + wxT("=") + PropertyValue);
796 GroupsList.insert(std::make_pair(*GroupCount, PropertySeg2));
798 if (!PropertyTokens.IsEmpty()){
800 GroupsListTokens.insert(std::make_pair(*GroupCount, PropertyTokens));
807 void ContactDataObject::ProcessFN(wxString PropertySeg1, wxString PropertySeg2, int *FNCount){
809 std::map<int, int> SplitPoints;
810 std::map<int, int> SplitLength;
812 int intPrevValue = 4;
816 SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue);
820 wxString PropertyName;
821 wxString PropertyValue;
822 wxString PropertyData;
823 wxString PropertyTokens;
824 std::map<int,int>::iterator SLiter;
825 bool FirstToken = TRUE;
827 for (std::map<int, int>::iterator intiter = SplitPoints.begin();
828 intiter != SplitPoints.end(); ++intiter){
830 SLiter = SplitLength.find(intiter->first);
832 PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second));
834 wxStringTokenizer PropertyElement (PropertyData, wxT("="));
835 PropertyName = PropertyElement.GetNextToken();
836 PropertyValue = PropertyElement.GetNextToken();
838 intPrevValue = intiter->second;
840 CaptureString(&PropertyValue, FALSE);
842 if (PropertyName == wxT("TYPE")){
844 if (!PropertyValue.IsEmpty() || PropertyValue == wxT("home") ||
845 PropertyValue == wxT("work") ){
847 FullNamesListType.erase(*FNCount);
848 FullNamesListType.insert(std::make_pair(*FNCount, PropertyValue));
852 } else if (PropertyName == wxT("LANGUAGE")){
854 FullNamesListLanguage.erase(*FNCount);
855 FullNamesListLanguage.insert(std::make_pair(*FNCount, PropertyValue));
857 } else if (PropertyName == wxT("ALTID")){
859 FullNamesListAltID.erase(*FNCount);
860 FullNamesListAltID.insert(std::make_pair(*FNCount, PropertyValue));
862 } else if (PropertyName == wxT("PID")){
864 FullNamesListPID.erase(*FNCount);
865 FullNamesListPID.insert(std::make_pair(*FNCount, PropertyValue));
867 } else if (PropertyName == wxT("PREF")){
869 ProcessIntegerValue(this, &FullNamesListPref, &PropertyValue, FNCount);
871 } else if (!PropertyName.IsEmpty() && !PropertyValue.IsEmpty()){
873 if (FirstToken == TRUE){
875 PropertyTokens.Append(PropertyName + wxT("=") + PropertyValue);
880 PropertyTokens.Append(wxT(";") + PropertyName + wxT("=") + PropertyValue);
888 FullNamesList.insert(std::make_pair(*FNCount, PropertySeg2));
890 if (!PropertyTokens.IsEmpty()){
892 FullNamesListTokens.insert(std::make_pair(*FNCount, PropertyTokens));
898 void ContactDataObject::ProcessN(wxString PropertySeg1, wxString PropertySeg2){
900 std::map<int, int> SplitPoints;
901 std::map<int, int> SplitLength;
903 int intPrevValue = 3;
907 SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue);
911 wxString PropertyName;
912 wxString PropertyValue;
913 wxString PropertyData;
914 wxString PropertyTokens;
915 std::map<int,int>::iterator SLiter;
916 bool FirstToken = TRUE;
918 for (std::map<int, int>::iterator intiter = SplitPoints.begin();
919 intiter != SplitPoints.end(); ++intiter){
921 SLiter = SplitLength.find(intiter->first);
923 PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second));
925 wxStringTokenizer PropertyElement (PropertyData, wxT("="));
926 PropertyName = PropertyElement.GetNextToken();
927 PropertyValue = PropertyElement.GetNextToken();
929 intPrevValue = intiter->second;
931 CaptureString(&PropertyValue, FALSE);
933 if (PropertyName == wxT("ALTID")){
935 NameAltID = PropertyValue;
937 } else if (PropertyName == wxT("LANGUAGE")){
939 NameLanguage = PropertyValue;
941 } else if (PropertyName == wxT("SORT-AS")){
943 if (PropertyValue.Left(1) == wxT("\"") && PropertyValue.Right(1) == wxT("\"") &&
944 PropertyValue.Len() >= 3){
945 NameDisplayAs = PropertyValue.Mid(1, (PropertyValue.Len() - 2));
948 } else if (!PropertyName.IsEmpty() && !PropertyValue.IsEmpty()){
950 if (FirstToken == TRUE){
952 PropertyTokens.Append(PropertyName + wxT("=") + PropertyValue);
957 PropertyTokens.Append(wxT(";") + PropertyName + wxT("=") + PropertyValue);
965 // Split the name data.
967 int intSplitSeek = 0;
968 int intSplitsFound = 0;
969 int intSplitSize = 0;
970 int intPropertyLen = PropertySeg2.Len();
972 std::map<int,wxString> NameValues;
975 for (int i = 0; i <= intPropertyLen; i++){
977 if (PropertySeg2.Mid(i, 1) == wxT(";") && PropertySeg2.Mid((i - 1), 1) != wxT("\\")){
979 NameValues.insert(std::make_pair(++intSplitsFound, PropertySeg2.Mid(intSplitSeek, intSplitSize)));
984 if (intSplitsFound == 4){
986 NameValues.insert(std::make_pair(++intSplitsFound, PropertySeg2.Mid(intSplitSeek, wxString::npos)));
1000 // Split the data into several parts.
1002 for (std::map<int, wxString>::iterator iter = NameValues.begin();
1003 iter != NameValues.end(); ++iter){
1005 if (iter->first == 1){
1007 // Deal with family name.
1009 NameSurname = iter->second;
1011 } else if (iter->first == 2){
1013 // Deal with given names.
1015 NameForename = iter->second;
1017 } else if (iter->first == 3){
1019 // Deal with additional names.
1021 NameOtherNames = iter->second;
1023 } else if (iter->first == 4){
1025 // Deal with honorifix prefixes and suffixes.
1027 NameTitle = iter->second;
1031 if (iter == NameValues.end()){
1037 NameSuffix = iter->second;
1043 // Add the name token data.
1045 if (!PropertyTokens.IsEmpty()){
1047 NameTokens = PropertyTokens;
1053 void ContactDataObject::ProcessClientPIDMap(wxString PropertySeg1, wxString PropertySeg2, int *ClientPIDCount){
1055 size_t intPropertyLen = PropertySeg1.Len();
1056 std::map<int, int> SplitPoints;
1057 std::map<int, int> SplitLength;
1058 std::map<int, int>::iterator SLiter;
1059 wxString PropertyData;
1060 wxString PropertyName;
1061 wxString PropertyValue;
1062 wxString PropertyTokens;
1063 bool FirstToken = TRUE;
1064 int intSplitsFound = 0;
1065 int intSplitSize = 0;
1066 int intPrevValue = 14;
1070 SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue);
1074 for (std::map<int, int>::iterator intiter = SplitPoints.begin();
1075 intiter != SplitPoints.end(); ++intiter){
1077 SLiter = SplitLength.find(intiter->first);
1079 PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second));
1081 wxStringTokenizer PropertyElement (PropertyData, wxT("="));
1082 PropertyName = PropertyElement.GetNextToken();
1083 PropertyValue = PropertyElement.GetNextToken();
1085 intPrevValue = intiter->second;
1087 // Process properties.
1089 size_t intPropertyValueLen = PropertyValue.Len();
1091 if (PropertyValue.Mid((intPropertyValueLen - 1), 1) == wxT("\"")){
1093 PropertyValue.Trim();
1094 PropertyValue.RemoveLast();
1098 if (PropertyValue.Mid(0, 1) == wxT("\"")){
1100 PropertyValue.Remove(0, 1);
1104 CaptureString(&PropertyValue, FALSE);
1106 if (PropertyName.IsEmpty() || PropertyName.IsEmpty()){
1112 if (FirstToken == TRUE){
1114 PropertyTokens.Append(PropertyName + wxT("=") + PropertyValue);
1119 PropertyTokens.Append(wxT(";") + PropertyName + wxT("=") + PropertyValue);
1125 CaptureString(&PropertySeg2, FALSE);
1127 ClientPIDList.insert(std::make_pair(*ClientPIDCount, PropertySeg2));
1129 if (!PropertyTokens.IsEmpty()){
1131 ClientPIDListTokens.insert(std::make_pair(*ClientPIDCount, PropertyTokens));
1137 void ContactDataObject::ProcessNickname(wxString PropertySeg1, wxString PropertySeg2, int *NicknameCount){
1139 std::map<int, int> SplitPoints;
1140 std::map<int, int> SplitLength;
1142 int intPrevValue = 10;
1145 SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue);
1149 PropertyType PropType = PROPERTY_NONE;
1151 // Look for type before continuing.
1153 CheckType(&PropertySeg1, &SplitPoints, &SplitLength, &intPrevValue, &PropType);
1157 std::map<int, wxString> *NicknamesList = NULL;
1158 std::map<int, wxString> *NicknamesListType = NULL;
1159 std::map<int, wxString> *NicknamesListLanguage = NULL;
1160 std::map<int, wxString> *NicknamesListAltID = NULL;
1161 std::map<int, wxString> *NicknamesListPID = NULL;
1162 std::map<int, wxString> *NicknamesListTokens = NULL;
1163 std::map<int, int> *NicknamesListPref = NULL;
1167 NicknamesList = &GeneralNicknamesList;
1168 NicknamesListType = &GeneralNicknamesListType;
1169 NicknamesListLanguage = &GeneralNicknamesListLanguage;
1170 NicknamesListAltID = &GeneralNicknamesListAltID;
1171 NicknamesListPID = &GeneralNicknamesListPID;
1172 NicknamesListTokens = &GeneralNicknamesListTokens;
1173 NicknamesListPref = &GeneralNicknamesListPref;
1176 NicknamesList = &HomeNicknamesList;
1177 NicknamesListType = &HomeNicknamesListType;
1178 NicknamesListLanguage = &HomeNicknamesListLanguage;
1179 NicknamesListAltID = &HomeNicknamesListAltID;
1180 NicknamesListPID = &HomeNicknamesListPID;
1181 NicknamesListTokens = &HomeNicknamesListTokens;
1182 NicknamesListPref = &HomeNicknamesListPref;
1185 NicknamesList = &BusinessNicknamesList;
1186 NicknamesListType = &BusinessNicknamesListType;
1187 NicknamesListLanguage = &BusinessNicknamesListLanguage;
1188 NicknamesListAltID = &BusinessNicknamesListAltID;
1189 NicknamesListPID = &BusinessNicknamesListPID;
1190 NicknamesListTokens = &BusinessNicknamesListTokens;
1191 NicknamesListPref = &BusinessNicknamesListPref;
1195 std::map<int, int>::iterator SLiter;
1196 wxString PropertyData;
1197 wxString PropertyName;
1198 wxString PropertyValue;
1199 wxString PropertyTokens;
1200 bool FirstToken = TRUE;
1202 for (std::map<int, int>::iterator intiter = SplitPoints.begin();
1203 intiter != SplitPoints.end(); ++intiter){
1205 SLiter = SplitLength.find(intiter->first);
1207 PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second));
1209 wxStringTokenizer PropertyElement (PropertyData, wxT("="));
1210 PropertyName = PropertyElement.GetNextToken();
1211 PropertyValue = PropertyElement.GetNextToken();
1213 intPrevValue = intiter->second;
1215 CaptureString(&PropertyValue, FALSE);
1217 if (PropertyName == wxT("ALTID")){
1219 NicknamesListAltID->erase(*NicknameCount);
1220 NicknamesListAltID->insert(std::make_pair(*NicknameCount, PropertyValue));
1222 } else if (PropertyName == wxT("PID")){
1224 NicknamesListPID->erase(*NicknameCount);
1225 NicknamesListPID->insert(std::make_pair(*NicknameCount, PropertyValue));
1227 } else if (PropertyName == wxT("PREF")){
1229 ProcessIntegerValue(this, NicknamesListPref, &PropertyValue, NicknameCount);
1231 } else if (PropertyName == wxT("LANGUAGE")){
1233 NicknamesListLanguage->erase(*NicknameCount);
1234 NicknamesListLanguage->insert(std::make_pair(*NicknameCount, PropertyValue));
1238 // Something else we don't know about so append
1239 // to the tokens variable.
1241 if (!PropertyName.IsEmpty() && !PropertyValue.IsEmpty() && PropertyName != wxT("TYPE")){
1243 if (FirstToken == TRUE){
1245 PropertyTokens.Append(PropertyName + wxT("=") + PropertyValue);
1250 PropertyTokens.Append(wxT(";") + PropertyName + wxT("=") + PropertyValue);
1260 NicknamesList->insert(std::make_pair(*NicknameCount, PropertySeg2));
1262 // Add the name token data.
1264 if (!PropertyTokens.IsEmpty()){
1266 NicknamesListTokens->insert(std::make_pair(*NicknameCount, PropertyTokens));
1272 void ContactDataObject::ProcessGender(wxString PropertySeg1, wxString PropertySeg2){
1274 std::map<int, int> SplitPoints;
1275 std::map<int, int> SplitLength;
1276 std::map<int, int>::iterator SLiter;
1277 wxString PropertyData;
1278 wxString PropertyName;
1279 wxString PropertyValue;
1280 wxString PropertyTokens;
1281 bool FirstToken = TRUE;
1282 int intPrevValue = 8;
1284 SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue);
1288 for (std::map<int, int>::iterator intiter = SplitPoints.begin();
1289 intiter != SplitPoints.end(); ++intiter){
1291 SLiter = SplitLength.find(intiter->first);
1293 PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second));
1295 wxStringTokenizer PropertyElement (PropertyData, wxT("="));
1296 PropertyName = PropertyElement.GetNextToken();
1297 PropertyValue = PropertyElement.GetNextToken();
1299 intPrevValue = intiter->second;
1301 // Process properties.
1303 size_t intPropertyValueLen = PropertyValue.Len();
1305 if (PropertyValue.Mid((intPropertyValueLen - 1), 1) == wxT("\"")){
1307 PropertyValue.Trim();
1308 PropertyValue.RemoveLast();
1312 if (PropertyValue.Mid(0, 1) == wxT("\"")){
1314 PropertyValue.Remove(0, 1);
1318 if (!PropertyName.IsEmpty() && !PropertyValue.IsEmpty()){
1320 if (FirstToken == TRUE){
1322 PropertyTokens.Append(PropertyName + wxT("=") + PropertyValue);
1327 PropertyTokens.Append(wxT(";") + PropertyName + wxT("=") + PropertyValue);
1335 wxStringTokenizer GenderData (PropertySeg2, wxT(";"));
1337 wxString GenderComponent;
1339 if (GenderData.CountTokens() >= 2){
1341 Gender = GenderData.GetNextToken();
1342 GenderDetails = GenderData.GetString();
1344 CaptureString(&GenderDetails, FALSE);
1348 Gender = GenderData.GetNextToken();
1352 if (!PropertyTokens.IsEmpty()){
1354 GenderTokens = PropertyTokens;
1360 void ContactDataObject::ProcessBirthday(wxString PropertySeg1, wxString PropertySeg2){
1362 // Process date. Preserve the remainder in the string.
1364 std::map<int, int> SplitPoints;
1365 std::map<int, int> SplitLength;
1366 std::map<int, int>::iterator SLiter;
1367 wxString PropertyData;
1368 wxString PropertyName;
1369 wxString PropertyValue;
1370 wxString PropertyTokens;
1371 bool BirthdayText = FALSE;
1372 int intPrevValue = 6;
1374 SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue);
1378 // Look for type before continuing.
1380 for (std::map<int, int>::iterator intiter = SplitPoints.begin();
1381 intiter != SplitPoints.end(); ++intiter){
1383 SLiter = SplitLength.find(intiter->first);
1385 PropertyData = PropertySeg1.Mid(intPrevValue, SLiter->second);
1387 wxStringTokenizer PropertyElement (PropertyData, wxT("="));
1388 PropertyName = PropertyElement.GetNextToken();
1389 PropertyValue = PropertyElement.GetNextToken();
1391 intPrevValue = intiter->second;
1393 if (PropertyName == wxT("VALUE") && PropertyValue == wxT("text") && BirthdayText == FALSE){
1395 CaptureString(&PropertySeg2, FALSE);
1396 Birthday = PropertySeg2;
1397 BirthdayText = TRUE;
1403 // Setup blank lines for later on.
1406 bool FirstToken = TRUE;
1408 for (std::map<int, int>::iterator intiter = SplitPoints.begin();
1409 intiter != SplitPoints.end(); ++intiter){
1411 SLiter = SplitLength.find(intiter->first);
1413 PropertyData = PropertySeg1.Mid(intPrevValue, SLiter->second);
1415 wxStringTokenizer PropertyElement (PropertyData, wxT("="));
1416 PropertyName = PropertyElement.GetNextToken();
1417 PropertyValue = PropertyElement.GetNextToken();
1419 intPrevValue = intiter->second;
1421 // Process properties.
1423 CaptureString(&PropertyValue, FALSE);
1425 if (PropertyValue.Mid((PropertyValue.Len() - 1), 1) == wxT("\"")){
1427 PropertyValue.Trim();
1428 PropertyValue.RemoveLast();
1432 if (PropertyValue.Mid(0, 1) == wxT("\"")){
1434 PropertyValue.Remove(0, 1);
1438 if (PropertyName == wxT("ALTID")){
1440 BirthdayAltID = PropertyValue;
1442 } else if (PropertyName == wxT("CALSCALE")){
1444 BirthdayCalScale = PropertyValue;
1446 } else if (PropertyName != wxT("VALUE")) {
1448 // Something else we don't know about so append
1449 // to the tokens variable.
1451 if (!PropertyName.IsEmpty() && !PropertyValue.IsEmpty()){
1453 if (FirstToken == TRUE){
1455 PropertyTokens.Append(PropertyName + wxT("=") + PropertyValue);
1460 PropertyTokens.Append(wxT(";") + PropertyName + wxT("=") + PropertyValue);
1470 // Add the data to the variables and form.
1472 if (BirthdayText == FALSE){
1474 Birthday = PropertySeg2;
1478 if (!PropertyTokens.IsEmpty()){
1480 BirthdayTokens = PropertyTokens;
1486 void ContactDataObject::ProcessAnniversary(wxString PropertySeg1, wxString PropertySeg2){
1488 // Process date. Preserve the remainder in the string.
1490 std::map<int, int> SplitPoints;
1491 std::map<int, int> SplitLength;
1492 std::map<int, int>::iterator SLiter;
1493 wxString PropertyData;
1494 wxString PropertyName;
1495 wxString PropertyValue;
1496 wxString PropertyTokens;
1497 bool AnniversaryText = FALSE;
1498 int intPrevValue = 13;
1500 SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue);
1504 // Look for type before continuing.
1506 for (std::map<int, int>::iterator intiter = SplitPoints.begin();
1507 intiter != SplitPoints.end(); ++intiter){
1509 SLiter = SplitLength.find(intiter->first);
1511 PropertyData = PropertySeg1.Mid(intPrevValue, SLiter->second);
1513 wxStringTokenizer PropertyElement (PropertyData, wxT("="));
1514 PropertyName = PropertyElement.GetNextToken();
1515 PropertyValue = PropertyElement.GetNextToken();
1517 intPrevValue = intiter->second;
1519 if (PropertyName == wxT("VALUE") && PropertyValue == wxT("text") && AnniversaryText == FALSE){
1521 CaptureString(&PropertySeg2, FALSE);
1522 Anniversary = PropertySeg2;
1523 AnniversaryText = TRUE;
1529 // Setup blank lines for later on.
1532 bool FirstToken = TRUE;
1534 for (std::map<int, int>::iterator intiter = SplitPoints.begin();
1535 intiter != SplitPoints.end(); ++intiter){
1537 SLiter = SplitLength.find(intiter->first);
1539 PropertyData = PropertySeg1.Mid(intPrevValue, SLiter->second);
1541 wxStringTokenizer PropertyElement (PropertyData, wxT("="));
1542 PropertyName = PropertyElement.GetNextToken();
1543 PropertyValue = PropertyElement.GetNextToken();
1545 intPrevValue = intiter->second;
1547 // Process properties.
1549 CaptureString(&PropertyValue, FALSE);
1551 if (PropertyValue.Mid((PropertyValue.Len() - 1), 1) == wxT("\"")){
1553 PropertyValue.Trim();
1554 PropertyValue.RemoveLast();
1558 if (PropertyValue.Mid(0, 1) == wxT("\"")){
1560 PropertyValue.Remove(0, 1);
1564 if (PropertyName == wxT("ALTID")){
1566 AnniversaryAltID = PropertyValue;
1568 } else if (PropertyName == wxT("CALSCALE")){
1570 AnniversaryCalScale = PropertyValue;
1572 } else if (PropertyName != wxT("VALUE")) {
1574 // Something else we don't know about so append
1575 // to the tokens variable.
1577 if (!PropertyName.IsEmpty() && !PropertyValue.IsEmpty()){
1579 if (FirstToken == TRUE){
1581 PropertyTokens.Append(PropertyName + wxT("=") + PropertyValue);
1586 PropertyTokens.Append(wxT(";") + PropertyName + wxT("=") + PropertyValue);
1596 // Add the data to the variables and form.
1598 if (AnniversaryText == FALSE){
1600 Anniversary = PropertySeg2;
1604 if (!PropertyTokens.IsEmpty()){
1606 AnniversaryTokens = PropertyTokens;
1612 void ContactDataObject::ProcessTimeZone(wxString PropertySeg1, wxString PropertySeg2, int *TimeZoneCount){
1614 std::map<int, int> SplitPoints;
1615 std::map<int, int> SplitLength;
1617 int intPrevValue = 4;
1620 SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue);
1624 PropertyType PropType = PROPERTY_NONE;
1626 // Look for type before continuing.
1628 CheckType(&PropertySeg1, &SplitPoints, &SplitLength, &intPrevValue, &PropType);
1632 std::map<int, wxString> *TZList = NULL;
1633 std::map<int, wxString> *TZListType = NULL;
1634 std::map<int, wxString> *TZListMediatype = NULL;
1635 std::map<int, wxString> *TZListAltID = NULL;
1636 std::map<int, wxString> *TZListPID = NULL;
1637 std::map<int, wxString> *TZListTokens = NULL;
1638 std::map<int, int> *TZListPref = NULL;
1642 TZList = &GeneralTZList;
1643 TZListType = &GeneralTZListType;
1644 TZListMediatype = &GeneralTZListMediatype;
1645 TZListAltID = &GeneralTZListAltID;
1646 TZListPID = &GeneralTZListPID;
1647 TZListTokens = &GeneralTZListTokens;
1648 TZListPref = &GeneralTZListPref;
1651 TZList = &HomeTZList;
1652 TZListType = &HomeTZListType;
1653 TZListMediatype = &HomeTZListMediatype;
1654 TZListAltID = &HomeTZListAltID;
1655 TZListPID = &HomeTZListPID;
1656 TZListTokens = &HomeTZListTokens;
1657 TZListPref = &HomeTZListPref;
1660 TZList = &BusinessTZList;
1661 TZListType = &BusinessTZListType;
1662 TZListMediatype = &BusinessTZListMediatype;
1663 TZListAltID = &BusinessTZListAltID;
1664 TZListPID = &BusinessTZListPID;
1665 TZListTokens = &BusinessTZListTokens;
1666 TZListPref = &BusinessTZListPref;
1670 std::map<int, int>::iterator SLiter;
1671 wxString PropertyData;
1672 wxString PropertyName;
1673 wxString PropertyValue;
1674 wxString PropertyTokens;
1675 bool FirstToken = TRUE;
1677 for (std::map<int, int>::iterator intiter = SplitPoints.begin();
1678 intiter != SplitPoints.end(); ++intiter){
1680 SLiter = SplitLength.find(intiter->first);
1682 PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second));
1684 wxStringTokenizer PropertyElement (PropertyData, wxT("="));
1685 PropertyName = PropertyElement.GetNextToken();
1686 PropertyValue = PropertyElement.GetNextToken();
1688 intPrevValue = intiter->second;
1690 CaptureString(&PropertyValue, FALSE);
1692 if (PropertyName == wxT("ALTID")){
1694 TZListAltID->erase(*TimeZoneCount);
1695 TZListAltID->insert(std::make_pair(*TimeZoneCount, PropertyValue));
1697 } else if (PropertyName == wxT("PID")){
1699 TZListPID->erase(*TimeZoneCount);
1700 TZListPID->insert(std::make_pair(*TimeZoneCount, PropertyValue));
1702 } else if (PropertyName == wxT("PREF")){
1704 ProcessIntegerValue(this, TZListPref, &PropertyValue, TimeZoneCount);
1706 } else if (PropertyName == wxT("MEDIATYPE")){
1708 TZListMediatype->erase(*TimeZoneCount);
1709 TZListMediatype->insert(std::make_pair(*TimeZoneCount, PropertyValue));
1713 // Something else we don't know about so append
1714 // to the tokens variable.
1716 if (!PropertyName.IsEmpty() && !PropertyValue.IsEmpty() && PropertyName != wxT("TYPE")){
1718 if (FirstToken == TRUE){
1720 PropertyTokens.Append(PropertyName + wxT("=") + PropertyValue);
1725 PropertyTokens.Append(wxT(";") + PropertyName + wxT("=") + PropertyValue);
1735 TZList->insert(std::make_pair(*TimeZoneCount, PropertySeg2));
1737 // Add the name token data.
1739 if (!PropertyTokens.IsEmpty()){
1741 TZListTokens->insert(std::make_pair(*TimeZoneCount, PropertyTokens));
1748 void ContactDataObject::ProcessAddress(wxString PropertySeg1, wxString PropertySeg2, int *AddressCount){
1750 size_t intPropertyLen = PropertySeg1.Len();
1751 std::map<int, int> SplitPoints;
1752 std::map<int, int> SplitLength;
1753 std::map<int, int>::iterator SLiter;
1754 wxString PropertyData;
1755 wxString PropertyName;
1756 wxString PropertyValue;
1757 wxString PropertyTokens;
1758 wxString AddressLabel;
1759 wxString AddressLang;
1760 wxString AddressAltID;
1761 wxString AddressPID;
1762 wxString AddressTokens;
1763 wxString AddressGeo;
1764 wxString AddressTimezone;
1765 wxString AddressType;
1766 wxString AddressMediatype;
1767 wxString AddressPOBox;
1768 wxString AddressExtended;
1769 wxString AddressStreet;
1770 wxString AddressLocality;
1771 wxString AddressCity;
1772 wxString AddressRegion;
1773 wxString AddressPostalCode;
1774 wxString AddressCountry;
1775 bool FirstToken = TRUE;
1776 int intSplitsFound = 0;
1777 int intSplitSize = 0;
1778 int intPrevValue = 5;
1783 SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue);
1787 PropertyType PropType = PROPERTY_NONE;
1789 // Look for type before continuing.
1791 CheckType(&PropertySeg1, &SplitPoints, &SplitLength, &intPrevValue, &PropType);
1795 std::map<int, wxString> *AddressList = NULL;
1796 std::map<int, wxString> *AddressListTown = NULL;
1797 std::map<int, wxString> *AddressListCounty = NULL;
1798 std::map<int, wxString> *AddressListPostCode = NULL;
1799 std::map<int, wxString> *AddressListCountry = NULL;
1800 std::map<int, wxString> *AddressListLabel = NULL;
1801 std::map<int, wxString> *AddressListLang = NULL;
1802 std::map<int, wxString> *AddressListAltID = NULL;
1803 std::map<int, wxString> *AddressListPID = NULL;
1804 std::map<int, wxString> *AddressListTokens = NULL;
1805 std::map<int, wxString> *AddressListGeo = NULL;
1806 std::map<int, wxString> *AddressListTimezone = NULL;
1807 std::map<int, wxString> *AddressListType = NULL;
1808 std::map<int, wxString> *AddressListMediatype = NULL;
1809 std::map<int, int> *AddressListPref = NULL;
1813 AddressList = &GeneralAddressList;
1814 AddressListTown = &GeneralAddressListTown;
1815 AddressListCounty = &GeneralAddressListCounty;
1816 AddressListPostCode = &GeneralAddressListPostCode;
1817 AddressListCountry = &GeneralAddressListCountry;
1818 AddressListLabel = &GeneralAddressListLabel;
1819 AddressListLang = &GeneralAddressListLang;
1820 AddressListAltID = &GeneralAddressListAltID;
1821 AddressListPID = &GeneralAddressListPID;
1822 AddressListTokens = &GeneralAddressListTokens;
1823 AddressListGeo = &GeneralAddressListGeo;
1824 AddressListTimezone = &GeneralAddressListTimezone;
1825 AddressListType = &GeneralAddressListType;
1826 AddressListMediatype = &GeneralAddressListMediatype;
1827 AddressListPref = &GeneralAddressListPref;
1830 AddressList = &HomeAddressList;
1831 AddressListTown = &HomeAddressListTown;
1832 AddressListCounty = &HomeAddressListCounty;
1833 AddressListPostCode = &HomeAddressListPostCode;
1834 AddressListCountry = &HomeAddressListCountry;
1835 AddressListLabel = &HomeAddressListLabel;
1836 AddressListLang = &HomeAddressListLang;
1837 AddressListAltID = &HomeAddressListAltID;
1838 AddressListPID = &HomeAddressListPID;
1839 AddressListTokens = &HomeAddressListTokens;
1840 AddressListGeo = &HomeAddressListGeo;
1841 AddressListTimezone = &HomeAddressListTimezone;
1842 AddressListType = &HomeAddressListType;
1843 AddressListMediatype = &HomeAddressListMediatype;
1844 AddressListPref = &HomeAddressListPref;
1847 AddressList = &BusinessAddressList;
1848 AddressListTown = &BusinessAddressListTown;
1849 AddressListCounty = &BusinessAddressListCounty;
1850 AddressListPostCode = &BusinessAddressListPostCode;
1851 AddressListCountry = &BusinessAddressListCountry;
1852 AddressListLabel = &BusinessAddressListLabel;
1853 AddressListLang = &BusinessAddressListLang;
1854 AddressListAltID = &BusinessAddressListAltID;
1855 AddressListPID = &BusinessAddressListPID;
1856 AddressListTokens = &BusinessAddressListTokens;
1857 AddressListGeo = &BusinessAddressListGeo;
1858 AddressListTimezone = &BusinessAddressListTimezone;
1859 AddressListType = &BusinessAddressListType;
1860 AddressListMediatype = &BusinessAddressListMediatype;
1861 AddressListPref = &BusinessAddressListPref;
1867 for (std::map<int, int>::iterator intiter = SplitPoints.begin();
1868 intiter != SplitPoints.end(); ++intiter){
1870 SLiter = SplitLength.find(intiter->first);
1872 PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second));
1874 wxStringTokenizer PropertyElement (PropertyData, wxT("="));
1875 PropertyName = PropertyElement.GetNextToken();
1876 PropertyValue = PropertyElement.GetNextToken();
1878 intPrevValue = intiter->second;
1880 CaptureString(&PropertyValue, FALSE);
1882 // Process properties.
1884 if (PropertyName == wxT("LABEL")){
1886 AddressListLabel->erase(*AddressCount);
1887 AddressListLabel->insert(std::make_pair(*AddressCount, PropertyValue));
1889 } else if (PropertyName == wxT("LANGUAGE")){
1891 AddressListLang->erase(*AddressCount);
1892 AddressListLang->insert(std::make_pair(*AddressCount, PropertyValue));
1894 } else if (PropertyName == wxT("ALTID")){
1896 AddressListAltID->erase(*AddressCount);
1897 AddressListAltID->insert(std::make_pair(*AddressCount, PropertyValue));
1899 } else if (PropertyName == wxT("PID")){
1901 AddressListPID->erase(*AddressCount);
1902 AddressListPID->insert(std::make_pair(*AddressCount, PropertyValue));
1904 } else if (PropertyName == wxT("GEO")){
1906 AddressListGeo->erase(*AddressCount);
1907 AddressListGeo->insert(std::make_pair(*AddressCount, PropertyValue));
1909 } else if (PropertyName == wxT("TZ")){
1911 AddressListTimezone->erase(*AddressCount);
1912 AddressListTimezone->insert(std::make_pair(*AddressCount, PropertyValue));
1914 } else if (PropertyName == wxT("MEDIATYPE")){
1916 AddressListMediatype->erase(*AddressCount);
1917 AddressListMediatype->insert(std::make_pair(*AddressCount, PropertyValue));
1919 } else if (PropertyName == wxT("PREF")){
1921 ProcessIntegerValue(this, AddressListPref, &PropertyValue, AddressCount);
1925 if (!PropertyName.IsEmpty() && !PropertyValue.IsEmpty() && PropertyName != wxT("TYPE")){
1927 if (FirstToken == TRUE){
1929 PropertyTokens.Append(PropertyName + wxT("=") + PropertyValue);
1934 PropertyTokens.Append(wxT(";") + PropertyName + wxT("=") + PropertyValue);
1944 // Split the address.
1946 //std::map<int, int>::iterator SLiter;
1947 intPropertyLen = PropertySeg2.Len();
1948 SplitPoints.clear();
1949 SplitLength.clear();
1954 for (int i = 0; i <= intPropertyLen; i++){
1958 if (PropertySeg2.Mid(i, 1) == wxT(";") && PropertySeg2.Mid((i - 1), 1) != wxT("\\")){
1961 SplitPoints.insert(std::make_pair(intSplitsFound, (i + 1)));
1963 if (intSplitsFound == 6){
1965 SplitLength.insert(std::make_pair(intSplitsFound, (intSplitSize - 1)));
1970 SplitLength.insert(std::make_pair(intSplitsFound, (intSplitSize - 1)));
1980 // Split the data into several parts.
1982 for (std::map<int, int>::iterator intiter = SplitPoints.begin();
1983 intiter != SplitPoints.end(); ++intiter){
1985 if (intiter->first == 1){
1987 // Deal with PO Box.
1989 SLiter = SplitLength.find(1);
1991 //txtSurname->SetValue(ContactData.Convert(wxSPropertySeg2.Mid(0, SLiter->second), TRUE));
1992 AddressPOBox = PropertySeg2.Mid(0, SLiter->second);
1993 intPrevValue = intiter->second;
1995 } else if (intiter->first == 2){
1997 // Deal with extended address.
1999 SLiter = SplitLength.find(2);
2001 AddressExtended = PropertySeg2.Mid(intPrevValue, SLiter->second);
2002 //txtForename->SetValue(ContactData.Convert(wxSPropertySeg2.Mid(intPrevValue, SLiter->second), TRUE));
2003 intPrevValue = intiter->second;
2005 } else if (intiter->first == 3){
2007 // Deal with street address.
2009 SLiter = SplitLength.find(3);
2011 AddressStreet = PropertySeg2.Mid(intPrevValue, SLiter->second);
2012 //txtOtherNames->SetValue(ContactData.Convert(wxSPropertySeg2.Mid(intPrevValue, SLiter->second), TRUE));
2013 intPrevValue = intiter->second;
2015 } else if (intiter->first == 4){
2017 // Deal with locality
2019 SLiter = SplitLength.find(4);
2021 AddressLocality = PropertySeg2.Mid(intPrevValue, SLiter->second);
2022 //txtTitle->SetValue(ContactData.Convert(wxSPropertySeg2.Mid(intPrevValue, SLiter->second), TRUE));
2023 intPrevValue = intiter->second;
2025 //txtSuffix->SetValue(ContactData.Convert(wxSPropertySeg2.Mid(intPrevValue), TRUE));
2027 } else if (intiter->first == 5){
2029 // Deal with region.
2031 SLiter = SplitLength.find(5);
2033 AddressRegion = PropertySeg2.Mid(intPrevValue, SLiter->second);
2034 //txtTitle->SetValue(ContactData.Convert(wxSPropertySeg2.Mid(intPrevValue, SLiter->second), TRUE));
2035 intPrevValue = intiter->second;
2037 //txtSuffix->SetValue(ContactData.Convert(wxSPropertySeg2.Mid(intPrevValue), TRUE));
2039 } else if (intiter->first == 6){
2041 // Deal with post code.
2043 SLiter = SplitLength.find(6);
2045 AddressPostalCode = PropertySeg2.Mid(intPrevValue, SLiter->second);
2046 //txtTitle->SetValue(ContactData.Convert(wxSPropertySeg2.Mid(intPrevValue, SLiter->second), TRUE));
2047 intPrevValue = intiter->second;
2049 // Deal with country.
2051 AddressCountry = PropertySeg2.Mid(intPrevValue, wxString::npos);
2052 //txtSuffix->SetValue(ContactData.Convert(wxSPropertySeg2.Mid(intPrevValue), TRUE));
2060 // Add the data to the General/Home/Work address variables.
2062 CaptureString(&AddressStreet, FALSE);
2063 CaptureString(&AddressLocality, FALSE);
2064 CaptureString(&AddressRegion, FALSE);
2065 CaptureString(&AddressPostalCode, FALSE);
2066 CaptureString(&AddressCountry, FALSE);
2068 if (!PropertyTokens.IsEmpty()){
2070 AddressListTokens->insert(std::make_pair(*AddressCount, PropertyTokens));
2074 AddressListCountry->insert(std::make_pair(*AddressCount, AddressCountry));
2075 AddressList->insert(std::make_pair(*AddressCount, AddressStreet));
2076 AddressListTown->insert(std::make_pair(*AddressCount, AddressLocality));
2077 AddressListCounty->insert(std::make_pair(*AddressCount, AddressRegion));
2078 AddressListPostCode->insert(std::make_pair(*AddressCount, AddressPostalCode));
2082 AddressListType->insert(std::make_pair(*AddressCount, wxT("")));
2085 AddressListType->insert(std::make_pair(*AddressCount, wxT("home")));
2088 AddressListType->insert(std::make_pair(*AddressCount, wxT("work")));
2092 AddressListTokens->insert(std::make_pair(*AddressCount, PropertyTokens));
2096 void ContactDataObject::ProcessEmail(wxString PropertySeg1, wxString PropertySeg2, int *EmailCount){
2098 std::map<int, int> SplitPoints;
2099 std::map<int, int> SplitLength;
2101 int intPrevValue = 7;
2104 SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue);
2108 PropertyType PropType = PROPERTY_NONE;
2110 // Look for type before continuing.
2112 CheckType(&PropertySeg1, &SplitPoints, &SplitLength, &intPrevValue, &PropType);
2114 std::map<int, wxString> *EmailList = NULL;
2115 std::map<int, wxString> *EmailListType = NULL;
2116 std::map<int, wxString> *EmailListAltID = NULL;
2117 std::map<int, wxString> *EmailListPID = NULL;
2118 std::map<int, wxString> *EmailListTokens = NULL;
2119 std::map<int, int> *EmailListPref = NULL;
2123 EmailList = &GeneralEmailList;
2124 EmailListType = &GeneralEmailListType;
2125 EmailListAltID = &GeneralEmailListAltID;
2126 EmailListPID = &GeneralEmailListPID;
2127 EmailListTokens = &GeneralEmailListTokens;
2128 EmailListPref = &GeneralEmailListPref;
2131 EmailList = &HomeEmailList;
2132 EmailListType = &HomeEmailListType;
2133 EmailListAltID = &HomeEmailListAltID;
2134 EmailListPID = &HomeEmailListPID;
2135 EmailListTokens = &HomeEmailListTokens;
2136 EmailListPref = &HomeEmailListPref;
2139 EmailList = &BusinessEmailList;
2140 EmailListType = &BusinessEmailListType;
2141 EmailListAltID = &BusinessEmailListAltID;
2142 EmailListPID = &BusinessEmailListPID;
2143 EmailListTokens = &BusinessEmailListTokens;
2144 EmailListPref = &BusinessEmailListPref;
2150 std::map<int,int>::iterator SLiter;
2151 wxString PropertyData;
2152 wxString PropertyName;
2153 wxString PropertyValue;
2154 wxString PropertyTokens;
2155 bool FirstToken = TRUE;
2157 for (std::map<int, int>::iterator intiter = SplitPoints.begin();
2158 intiter != SplitPoints.end(); ++intiter){
2160 SLiter = SplitLength.find(intiter->first);
2162 PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second));
2164 wxStringTokenizer PropertyElement (PropertyData, wxT("="));
2165 PropertyName = PropertyElement.GetNextToken();
2166 PropertyValue = PropertyElement.GetNextToken();
2168 intPrevValue = intiter->second;
2170 CaptureString(&PropertyValue, FALSE);
2172 // Process properties.
2174 if (PropertyName == wxT("ALTID")){
2176 EmailListAltID->erase(*EmailCount);
2177 EmailListAltID->insert(std::make_pair(*EmailCount, PropertyValue));
2179 } else if (PropertyName == wxT("PID")){
2181 EmailListPID->erase(*EmailCount);
2182 EmailListPID->insert(std::make_pair(*EmailCount, PropertyValue));
2184 } else if (PropertyName == wxT("PREF")){
2186 ProcessIntegerValue(this, EmailListPref, &PropertyValue, EmailCount);
2190 if (!PropertyName.IsEmpty() && !PropertyValue.IsEmpty() && PropertyName != wxT("TYPE")){
2192 if (FirstToken == TRUE){
2194 PropertyTokens.Append(PropertyName + wxT("=") + PropertyValue);
2199 PropertyTokens.Append(wxT(";") + PropertyName + wxT("=") + PropertyValue);
2209 EmailList->insert(std::make_pair(*EmailCount, PropertySeg2));
2211 // Add the name token data.
2213 if (!PropertyTokens.IsEmpty()){
2215 EmailListTokens->insert(std::make_pair(*EmailCount, PropertyTokens));
2222 void ContactDataObject::ProcessIM(wxString PropertySeg1, wxString PropertySeg2, int *IMCount){
2224 std::map<int, int> SplitPoints;
2225 std::map<int, int> SplitLength;
2227 int intPrevValue = 6;
2230 SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue);
2234 PropertyType PropType = PROPERTY_NONE;
2236 // Look for type before continuing.
2238 CheckType(&PropertySeg1, &SplitPoints, &SplitLength, &intPrevValue, &PropType);
2240 std::map<int, wxString> *IMList = NULL;
2241 std::map<int, wxString> *IMListType = NULL;
2242 std::map<int, wxString> *IMListAltID = NULL;
2243 std::map<int, wxString> *IMListPID = NULL;
2244 std::map<int, wxString> *IMListTokens = NULL;
2245 std::map<int, wxString> *IMListMediatype = NULL;
2246 std::map<int, int> *IMListPref = NULL;
2250 IMList = &GeneralIMList;
2251 IMListType = &GeneralIMListType;
2252 IMListAltID = &GeneralIMListAltID;
2253 IMListPID = &GeneralIMListPID;
2254 IMListTokens = &GeneralIMListTokens;
2255 IMListMediatype = &GeneralIMListMediatype;
2256 IMListPref = &GeneralIMListPref;
2259 IMList = &HomeIMList;
2260 IMListType = &HomeIMListType;
2261 IMListAltID = &HomeIMListAltID;
2262 IMListPID = &HomeIMListPID;
2263 IMListTokens = &HomeIMListTokens;
2264 IMListMediatype = &HomeIMListMediatype;
2265 IMListPref = &HomeIMListPref;
2268 IMList = &BusinessIMList;
2269 IMListType = &BusinessIMListType;
2270 IMListAltID = &BusinessIMListAltID;
2271 IMListPID = &BusinessIMListPID;
2272 IMListTokens = &BusinessIMListTokens;
2273 IMListMediatype = &BusinessIMListMediatype;
2274 IMListPref = &BusinessIMListPref;
2280 std::map<int,int>::iterator SLiter;
2281 wxString PropertyData;
2282 wxString PropertyName;
2283 wxString PropertyValue;
2284 wxString PropertyTokens;
2285 bool FirstToken = TRUE;
2287 for (std::map<int, int>::iterator intiter = SplitPoints.begin();
2288 intiter != SplitPoints.end(); ++intiter){
2290 SLiter = SplitLength.find(intiter->first);
2292 PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second));
2294 wxStringTokenizer PropertyElement (PropertyData, wxT("="));
2295 PropertyName = PropertyElement.GetNextToken();
2296 PropertyValue = PropertyElement.GetNextToken();
2298 intPrevValue = intiter->second;
2300 CaptureString(&PropertyValue, FALSE);
2302 // Process properties.
2304 if (PropertyName == wxT("ALTID")){
2306 IMListAltID->erase(*IMCount);
2307 IMListAltID->insert(std::make_pair(*IMCount, PropertyValue));
2309 } else if (PropertyName == wxT("PID")){
2311 IMListPID->erase(*IMCount);
2312 IMListPID->insert(std::make_pair(*IMCount, PropertyValue));
2314 } else if (PropertyName == wxT("MEDIATYPE")){
2316 IMListMediatype->erase(*IMCount);
2317 IMListMediatype->insert(std::make_pair(*IMCount, PropertyValue));
2319 } else if (PropertyName == wxT("PREF")){
2321 int PriorityNumber = 0;
2322 bool ValidNumber = TRUE;
2325 PriorityNumber = std::stoi(PropertyValue.ToStdString());
2328 catch(std::invalid_argument &e){
2329 ValidNumber = FALSE;
2332 if (ValidNumber == TRUE){
2334 IMListPref->erase(*IMCount);
2335 IMListPref->insert(std::make_pair(*IMCount, PriorityNumber));
2341 if (!PropertyName.IsEmpty() && !PropertyValue.IsEmpty() && PropertyName != wxT("TYPE")){
2343 if (FirstToken == TRUE){
2345 PropertyTokens.Append(PropertyName + wxT("=") + PropertyValue);
2350 PropertyTokens.Append(wxT(";") + PropertyName + wxT("=") + PropertyValue);
2360 IMList->insert(std::make_pair(*IMCount, PropertySeg2));
2362 // Add the name token data.
2364 if (!PropertyTokens.IsEmpty()){
2366 IMListTokens->insert(std::make_pair(*IMCount, PropertyTokens));
2372 void ContactDataObject::ProcessTelephone(wxString PropertySeg1, wxString PropertySeg2, int *TelephoneCount){
2374 std::map<int, int> SplitPoints;
2375 std::map<int, int> SplitLength;
2376 std::map<int, int>::iterator SLiter;
2380 PropertyType PropType = PROPERTY_NONE;
2382 // Look for type before continuing.
2385 wxString TelTypeDetail;
2386 wxString PropertyData;
2387 wxString PropertyName;
2388 wxString PropertyValue;
2389 wxString PropertyTokens;
2391 std::map<int,int> TypeSplitPoints;
2392 std::map<int,int> TypeSplitLength;
2393 std::map<int,int>::iterator TSLiter;
2395 int intSplitSize = 0;
2396 int intSplitsFound = 0;
2397 int intSplitPoint = 0;
2399 int intPrevValue = 5;
2401 SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue);
2405 // Look for type before continuing.
2407 for (std::map<int, int>::iterator intiter = SplitPoints.begin();
2408 intiter != SplitPoints.end(); ++intiter){
2410 SLiter = SplitLength.find(intiter->first);
2412 PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second));
2414 wxStringTokenizer PropertyElement (PropertyData, wxT("="));
2415 PropertyName = PropertyElement.GetNextToken();
2416 PropertyValue = PropertyElement.GetNextToken();
2418 intPrevValue = intiter->second;
2420 if (PropertyName == wxT("TYPE")){
2422 // Process each value in type and translate each
2425 // Strip out the quotes if they are there.
2427 size_t intPropertyValueLen = PropertyValue.Len();
2429 if (PropertyValue.Mid((intPropertyValueLen - 1), 1) == wxT("\"")){
2431 PropertyValue.Trim();
2432 PropertyValue.RemoveLast();
2436 if (PropertyValue.Mid(0, 1) == wxT("\"")){
2438 PropertyValue.Remove(0, 1);
2442 TelTypeDetail = PropertyValue;
2448 for (int i = 0; i <= intPropertyValueLen; i++){
2452 if (PropertyValue.Mid(i, 1) == wxT(",") && PropertyValue.Mid((i - 1), 1) != wxT("\\")){
2454 if (intSplitsFound == 0){
2456 TypeSplitPoints.insert(std::make_pair(intSplitsFound, intSplitPoint));
2457 TypeSplitLength.insert(std::make_pair(intSplitsFound, (intSplitSize - 1)));
2461 TypeSplitPoints.insert(std::make_pair(intSplitsFound, intSplitPoint));
2462 TypeSplitLength.insert(std::make_pair(intSplitsFound, intSplitSize));
2475 TypeSplitPoints.insert(std::make_pair(intSplitsFound, intSplitPoint));
2476 TypeSplitLength.insert(std::make_pair(intSplitsFound, intSplitSize));
2478 int intTypeSeek = 0;
2480 for (std::map<int, int>::iterator typeiter = TypeSplitPoints.begin();
2481 typeiter != TypeSplitPoints.end(); ++typeiter){
2483 wxString TypePropertyName;
2485 TSLiter = TypeSplitLength.find(typeiter->first);
2487 TypePropertyName = PropertyValue.Mid(typeiter->second, TSLiter->second);
2489 if (intTypeSeek == 0){
2494 TelTypeUI.Append(wxT(","));
2498 if (TypePropertyName == wxT("home")){
2500 PropType = PROPERTY_HOME;
2502 } else if (TypePropertyName == wxT("work")){
2504 PropType = PROPERTY_WORK;
2509 if (TypePropertyName == wxT("text")){
2511 TelTypeUI.Append(_("text"));
2514 } else if (TypePropertyName == wxT("voice")){
2516 TelTypeUI.Append(_("voice"));
2519 } else if (TypePropertyName == wxT("fax")){
2521 TelTypeUI.Append(_("fax"));
2524 } else if (TypePropertyName == wxT("cell")){
2526 TelTypeUI.Append(_("mobile"));
2529 } else if (TypePropertyName == wxT("video")){
2531 TelTypeUI.Append(_("video"));
2534 } else if (TypePropertyName == wxT("pager")){
2536 TelTypeUI.Append(_("pager"));
2539 } else if (TypePropertyName == wxT("textphone")){
2541 TelTypeUI.Append(_("textphone"));
2552 std::map<int, wxString> *TelephoneList = NULL;
2553 std::map<int, wxString> *TelephoneListType = NULL;
2554 std::map<int, wxString> *TelephoneListAltID = NULL;
2555 std::map<int, wxString> *TelephoneListPID = NULL;
2556 std::map<int, wxString> *TelephoneListTokens = NULL;
2557 std::map<int, wxString> *TelephoneListTypeInfo = NULL;
2558 std::map<int, int> *TelephoneListPref = NULL;
2562 TelephoneList = &GeneralTelephoneList;
2563 TelephoneListType = &GeneralTelephoneListType;
2564 TelephoneListAltID = &GeneralTelephoneListAltID;
2565 TelephoneListPID = &GeneralTelephoneListPID;
2566 TelephoneListTokens = &GeneralTelephoneListTokens;
2567 TelephoneListTypeInfo = &GeneralTelephoneListTypeInfo;
2568 TelephoneListPref = &GeneralTelephoneListPref;
2571 TelephoneList = &HomeTelephoneList;
2572 TelephoneListType = &HomeTelephoneListType;
2573 TelephoneListAltID = &HomeTelephoneListAltID;
2574 TelephoneListPID = &HomeTelephoneListPID;
2575 TelephoneListTokens = &HomeTelephoneListTokens;
2576 TelephoneListTypeInfo = &HomeTelephoneListTypeInfo;
2577 TelephoneListPref = &HomeTelephoneListPref;
2580 TelephoneList = &BusinessTelephoneList;
2581 TelephoneListType = &BusinessTelephoneListType;
2582 TelephoneListAltID = &BusinessTelephoneListAltID;
2583 TelephoneListPID = &BusinessTelephoneListPID;
2584 TelephoneListTokens = &BusinessTelephoneListTokens;
2585 TelephoneListTypeInfo = &BusinessTelephoneListTypeInfo;
2586 TelephoneListPref = &BusinessTelephoneListPref;
2590 // Process the properties.
2592 bool FirstToken = TRUE;
2595 SplitPoints.clear();
2596 SplitLength.clear();
2598 SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue);
2602 for (std::map<int, int>::iterator intiter = SplitPoints.begin();
2603 intiter != SplitPoints.end(); ++intiter){
2605 SLiter = SplitLength.find(intiter->first);
2607 PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second));
2609 wxStringTokenizer PropertyElement (PropertyData, wxT("="));
2610 PropertyName = PropertyElement.GetNextToken();
2611 PropertyValue = PropertyElement.GetNextToken();
2613 intPrevValue = intiter->second;
2615 CaptureString(&PropertyValue, FALSE);
2617 // Process properties.
2619 if (PropertyName == wxT("ALTID")){
2621 TelephoneListAltID->erase(*TelephoneCount);
2622 TelephoneListAltID->insert(std::make_pair(*TelephoneCount, PropertyValue));
2624 } else if (PropertyName == wxT("PID")){
2626 TelephoneListPID->erase(*TelephoneCount);
2627 TelephoneListPID->insert(std::make_pair(*TelephoneCount, PropertyValue));
2629 } else if (PropertyName == wxT("PREF")){
2631 int PriorityNumber = 0;
2632 bool ValidNumber = TRUE;
2635 PriorityNumber = std::stoi(PropertyValue.ToStdString());
2638 catch(std::invalid_argument &e){
2639 ValidNumber = FALSE;
2642 if (ValidNumber == TRUE){
2644 TelephoneListPref->erase(*TelephoneCount);
2645 TelephoneListPref->insert(std::make_pair(*TelephoneCount, PriorityNumber));
2651 if (!PropertyName.IsEmpty() && !PropertyValue.IsEmpty() && PropertyName != wxT("TYPE")){
2653 if (FirstToken == TRUE){
2655 PropertyTokens.Append(PropertyName + wxT("=") + PropertyValue);
2660 PropertyTokens.Append(wxT(";") + PropertyName + wxT("=") + PropertyValue);
2670 TelephoneList->insert(std::make_pair(*TelephoneCount, PropertySeg2));
2671 TelephoneListTypeInfo->insert(std::make_pair(*TelephoneCount, TelTypeUI));
2673 // Add the name token data.
2675 if (!PropertyTokens.IsEmpty()){
2677 TelephoneListTokens->insert(std::make_pair(*TelephoneCount, PropertyTokens));
2683 void ContactDataObject::ProcessLanguage(wxString PropertySeg1, wxString PropertySeg2, int *LanguageCount){
2685 std::map<int, int> SplitPoints;
2686 std::map<int, int> SplitLength;
2688 int intPrevValue = 6;
2691 SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue);
2695 PropertyType PropType = PROPERTY_NONE;
2697 // Look for type before continuing.
2699 CheckType(&PropertySeg1, &SplitPoints, &SplitLength, &intPrevValue, &PropType);
2701 std::map<int, wxString> *LanguageList = NULL;
2702 std::map<int, wxString> *LanguageListType = NULL;
2703 std::map<int, wxString> *LanguageListAltID = NULL;
2704 std::map<int, wxString> *LanguageListPID = NULL;
2705 std::map<int, wxString> *LanguageListTokens = NULL;
2706 std::map<int, int> *LanguageListPref = NULL;
2710 LanguageList = &GeneralLanguageList;
2711 LanguageListType = &GeneralLanguageListType;
2712 LanguageListAltID = &GeneralLanguageListAltID;
2713 LanguageListPID = &GeneralLanguageListPID;
2714 LanguageListTokens = &GeneralLanguageListTokens;
2715 LanguageListPref = &GeneralLanguageListPref;
2718 LanguageList = &HomeLanguageList;
2719 LanguageListType = &HomeLanguageListType;
2720 LanguageListAltID = &HomeLanguageListAltID;
2721 LanguageListPID = &HomeLanguageListPID;
2722 LanguageListTokens = &HomeLanguageListTokens;
2723 LanguageListPref = &HomeLanguageListPref;
2726 LanguageList = &BusinessLanguageList;
2727 LanguageListType = &BusinessLanguageListType;
2728 LanguageListAltID = &BusinessLanguageListAltID;
2729 LanguageListPID = &BusinessLanguageListPID;
2730 LanguageListTokens = &BusinessLanguageListTokens;
2731 LanguageListPref = &BusinessLanguageListPref;
2737 std::map<int,int>::iterator SLiter;
2738 wxString PropertyData;
2739 wxString PropertyName;
2740 wxString PropertyValue;
2741 wxString PropertyTokens;
2742 bool FirstToken = TRUE;
2744 for (std::map<int, int>::iterator intiter = SplitPoints.begin();
2745 intiter != SplitPoints.end(); ++intiter){
2747 SLiter = SplitLength.find(intiter->first);
2749 PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second));
2751 wxStringTokenizer PropertyElement (PropertyData, wxT("="));
2752 PropertyName = PropertyElement.GetNextToken();
2753 PropertyValue = PropertyElement.GetNextToken();
2755 intPrevValue = intiter->second;
2757 CaptureString(&PropertyValue, FALSE);
2759 // Process properties.
2761 if (PropertyName == wxT("ALTID")){
2763 LanguageListAltID->erase(*LanguageCount);
2764 LanguageListAltID->insert(std::make_pair(*LanguageCount, PropertyValue));
2766 } else if (PropertyName == wxT("PID")){
2768 LanguageListPID->erase(*LanguageCount);
2769 LanguageListPID->insert(std::make_pair(*LanguageCount, PropertyValue));
2771 } else if (PropertyName == wxT("PREF")){
2773 int PriorityNumber = 0;
2774 bool ValidNumber = TRUE;
2777 PriorityNumber = std::stoi(PropertyValue.ToStdString());
2780 catch(std::invalid_argument &e){
2781 ValidNumber = FALSE;
2784 if (ValidNumber == TRUE){
2786 LanguageListPref->erase(*LanguageCount);
2787 LanguageListPref->insert(std::make_pair(*LanguageCount, PriorityNumber));
2793 if (!PropertyName.IsEmpty() && !PropertyValue.IsEmpty() && PropertyName != wxT("TYPE")){
2795 if (FirstToken == TRUE){
2797 PropertyTokens.Append(PropertyName + wxT("=") + PropertyValue);
2802 PropertyTokens.Append(wxT(";") + PropertyName + wxT("=") + PropertyValue);
2812 LanguageList->insert(std::make_pair(*LanguageCount, PropertySeg2));
2814 // Add the name token data.
2816 if (!PropertyTokens.IsEmpty()){
2818 LanguageListTokens->insert(std::make_pair(*LanguageCount, PropertyTokens));
2824 void ContactDataObject::ProcessGeographic(wxString PropertySeg1, wxString PropertySeg2, int *GeographicCount){
2826 std::map<int, int> SplitPoints;
2827 std::map<int, int> SplitLength;
2829 int intPrevValue = 5;
2832 SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue);
2836 PropertyType PropType = PROPERTY_NONE;
2838 // Look for type before continuing.
2840 CheckType(&PropertySeg1, &SplitPoints, &SplitLength, &intPrevValue, &PropType);
2842 std::map<int, wxString> *GeopositionList = NULL;
2843 std::map<int, wxString> *GeopositionListType = NULL;
2844 std::map<int, wxString> *GeopositionListAltID = NULL;
2845 std::map<int, wxString> *GeopositionListPID = NULL;
2846 std::map<int, wxString> *GeopositionListTokens = NULL;
2847 std::map<int, wxString> *GeopositionListMediatype = NULL;
2848 std::map<int, int> *GeopositionListPref = NULL;
2852 GeopositionList = &GeneralGeographyList;
2853 GeopositionListType = &GeneralGeographyListType;
2854 GeopositionListAltID = &GeneralGeographyListAltID;
2855 GeopositionListPID = &GeneralGeographyListPID;
2856 GeopositionListTokens = &GeneralGeographyListTokens;
2857 GeopositionListMediatype = &GeneralGeographyListMediatype;
2858 GeopositionListPref = &GeneralGeographyListPref;
2861 GeopositionList = &HomeGeographyList;
2862 GeopositionListType = &HomeGeographyListType;
2863 GeopositionListAltID = &HomeGeographyListAltID;
2864 GeopositionListPID = &HomeGeographyListPID;
2865 GeopositionListTokens = &HomeGeographyListTokens;
2866 GeopositionListMediatype = &HomeGeographyListMediatype;
2867 GeopositionListPref = &HomeGeographyListPref;
2870 GeopositionList = &BusinessGeographyList;
2871 GeopositionListType = &BusinessGeographyListType;
2872 GeopositionListAltID = &BusinessGeographyListAltID;
2873 GeopositionListPID = &BusinessGeographyListPID;
2874 GeopositionListTokens = &BusinessGeographyListTokens;
2875 GeopositionListMediatype = &BusinessGeographyListMediatype;
2876 GeopositionListPref = &BusinessGeographyListPref;
2882 std::map<int,int>::iterator SLiter;
2883 wxString PropertyData;
2884 wxString PropertyName;
2885 wxString PropertyValue;
2886 wxString PropertyTokens;
2887 bool FirstToken = TRUE;
2889 for (std::map<int, int>::iterator intiter = SplitPoints.begin();
2890 intiter != SplitPoints.end(); ++intiter){
2892 SLiter = SplitLength.find(intiter->first);
2894 PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second));
2896 wxStringTokenizer PropertyElement (PropertyData, wxT("="));
2897 PropertyName = PropertyElement.GetNextToken();
2898 PropertyValue = PropertyElement.GetNextToken();
2900 intPrevValue = intiter->second;
2902 CaptureString(&PropertyValue, FALSE);
2904 // Process properties.
2906 if (PropertyName == wxT("ALTID")){
2908 GeopositionListAltID->erase(*GeographicCount);
2909 GeopositionListAltID->insert(std::make_pair(*GeographicCount, PropertyValue));
2911 } else if (PropertyName == wxT("PID")){
2913 GeopositionListPID->erase(*GeographicCount);
2914 GeopositionListPID->insert(std::make_pair(*GeographicCount, PropertyValue));
2916 } else if (PropertyName == wxT("MEDIATYPE")){
2918 GeopositionListMediatype->erase(*GeographicCount);
2919 GeopositionListMediatype->insert(std::make_pair(*GeographicCount, PropertyValue));
2921 } else if (PropertyName == wxT("PREF")){
2923 int PriorityNumber = 0;
2924 bool ValidNumber = TRUE;
2927 PriorityNumber = std::stoi(PropertyValue.ToStdString());
2930 catch(std::invalid_argument &e){
2931 ValidNumber = FALSE;
2934 if (ValidNumber == TRUE){
2936 GeopositionListPref->erase(*GeographicCount);
2937 GeopositionListPref->insert(std::make_pair(*GeographicCount, PriorityNumber));
2943 if (!PropertyName.IsEmpty() && !PropertyValue.IsEmpty() && PropertyName != wxT("TYPE")){
2945 if (FirstToken == TRUE){
2947 PropertyTokens.Append(PropertyName + wxT("=") + PropertyValue);
2952 PropertyTokens.Append(wxT(";") + PropertyName + wxT("=") + PropertyValue);
2962 GeopositionList->insert(std::make_pair(*GeographicCount, PropertySeg2));
2964 // Add the name token data.
2966 if (!PropertyTokens.IsEmpty()){
2968 GeopositionListTokens->insert(std::make_pair(*GeographicCount, PropertyTokens));
2974 void ContactDataObject::ProcessRelated(wxString PropertySeg1, wxString PropertySeg2, int *RelatedCount){
2976 size_t intPropertyLen = PropertySeg1.Len();
2977 std::map<int, int> SplitPoints;
2978 std::map<int, int> SplitLength;
2979 std::map<int, int>::iterator SLiter;
2980 wxString PropertyData;
2981 wxString PropertyName;
2982 wxString PropertyValue;
2983 wxString PropertyTokens;
2984 wxString RelatedType;
2985 wxString RelatedTypeOriginal;
2986 wxString RelatedName;
2987 bool FirstToken = TRUE;
2988 int intSplitsFound = 0;
2989 int intSplitSize = 0;
2990 int intPrevValue = 9;
2994 SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue);
2998 // Look for type before continuing.
3000 for (std::map<int, int>::iterator intiter = SplitPoints.begin();
3001 intiter != SplitPoints.end(); ++intiter){
3003 SLiter = SplitLength.find(intiter->first);
3005 PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second));
3007 wxStringTokenizer PropertyElement (PropertyData, wxT("="));
3008 PropertyName = PropertyElement.GetNextToken();
3009 PropertyValue = PropertyElement.GetNextToken();
3011 intPrevValue = intiter->second;
3015 RelatedTypeOriginal = PropertyValue;
3017 if (PropertyName == wxT("TYPE")){
3019 if (PropertyValue == wxT("contact")){
3021 RelatedType = _("Contact");
3023 } else if (PropertyValue == wxT("acquaintance")){
3025 RelatedType = _("Acquaintance");
3027 } else if (PropertyValue == wxT("friend")){
3029 RelatedType = _("Friend");
3031 } else if (PropertyValue == wxT("met")){
3033 RelatedType = _("Met");
3035 } else if (PropertyValue == wxT("co-worker")){
3037 RelatedType = _("Co-worker");
3039 } else if (PropertyValue == wxT("colleague")){
3041 RelatedType = _("Colleague");
3043 } else if (PropertyValue == wxT("co-resident")){
3045 RelatedType = _("Co-resident");
3047 } else if (PropertyValue == wxT("neighbor")){
3049 RelatedType = _("Neighbour");
3051 } else if (PropertyValue == wxT("child")){
3053 RelatedType = _("Child");
3055 } else if (PropertyValue == wxT("parent")){
3057 RelatedType = _("Parent");
3059 } else if (PropertyValue == wxT("sibling")){
3061 RelatedType = _("Sibling");
3063 } else if (PropertyValue == wxT("spouse")){
3065 RelatedType = _("Spouse");
3067 } else if (PropertyValue == wxT("kin")){
3069 RelatedType = _("Kin");
3071 } else if (PropertyValue == wxT("muse")){
3073 RelatedType = _("Muse");
3075 } else if (PropertyValue == wxT("crush")){
3077 RelatedType = _("Crush");
3079 } else if (PropertyValue == wxT("date")){
3081 RelatedType = _("Date");
3083 } else if (PropertyValue == wxT("sweetheart")){
3085 RelatedType = _("Sweetheart");
3087 } else if (PropertyValue == wxT("me")){
3089 RelatedType = _("Me");
3091 } else if (PropertyValue == wxT("agent")){
3093 RelatedType = _("Agent");
3095 } else if (PropertyValue == wxT("emergency")){
3097 RelatedType = _("Emergency");
3101 RelatedType = PropertyValue;
3111 for (std::map<int, int>::iterator intiter = SplitPoints.begin();
3112 intiter != SplitPoints.end(); ++intiter){
3114 SLiter = SplitLength.find(intiter->first);
3116 PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second));
3118 wxStringTokenizer PropertyElement (PropertyData, wxT("="));
3119 PropertyName = PropertyElement.GetNextToken();
3120 PropertyValue = PropertyElement.GetNextToken();
3122 intPrevValue = intiter->second;
3124 // Process properties.
3126 size_t intPropertyValueLen = PropertyValue.Len();
3128 if (PropertyValue.Mid((intPropertyValueLen - 1), 1) == wxT("\"")){
3130 PropertyValue.Trim();
3131 PropertyValue.RemoveLast();
3135 if (PropertyValue.Mid(0, 1) == wxT("\"")){
3137 PropertyValue.Remove(0, 1);
3141 CaptureString(&PropertyValue, FALSE);
3143 if (PropertyName == wxT("ALTID")){
3145 GeneralRelatedListAltID.erase(*RelatedCount);
3146 GeneralRelatedListAltID.insert(std::make_pair(*RelatedCount, PropertyValue));
3148 } else if (PropertyName == wxT("PID")){
3150 GeneralRelatedListPID.erase(*RelatedCount);
3151 GeneralRelatedListPID.insert(std::make_pair(*RelatedCount, PropertyValue));
3153 } else if (PropertyName == wxT("PREF")){
3155 int PriorityNumber = 0;
3156 bool ValidNumber = TRUE;
3159 PriorityNumber = std::stoi(PropertyValue.ToStdString());
3162 catch(std::invalid_argument &e){
3163 ValidNumber = FALSE;
3166 if (ValidNumber == TRUE){
3168 GeneralRelatedListPref.erase(*RelatedCount);
3169 GeneralRelatedListPref.insert(std::make_pair(*RelatedCount, PriorityNumber));
3173 } else if (PropertyName == wxT("LANGUAGE")){
3175 GeneralRelatedListLanguage.erase(*RelatedCount);
3176 GeneralRelatedListLanguage.insert(std::make_pair(*RelatedCount, PropertyValue));
3178 } else if (PropertyName != wxT("TYPE")) {
3180 // Something else we don't know about so append
3181 // to the tokens variable.
3183 if (!PropertyName.IsEmpty() && !PropertyValue.IsEmpty() && PropertyName != wxT("TYPE")){
3185 if (FirstToken == TRUE){
3187 PropertyTokens.Append(PropertyName + wxT("=") + PropertyValue);
3192 PropertyTokens.Append(wxT(";") + PropertyName + wxT("=") + PropertyValue);
3202 // Add the data to the General/Home/Work address variables.
3204 GeneralRelatedList.erase(*RelatedCount);
3205 GeneralRelatedListRelType.erase(*RelatedCount);
3206 GeneralRelatedListType.erase(*RelatedCount);
3207 GeneralRelatedListTokens.erase(*RelatedCount);
3208 GeneralRelatedList.insert(std::make_pair(*RelatedCount, PropertySeg2));
3209 GeneralRelatedListRelType.insert(std::make_pair(*RelatedCount, RelatedType));
3210 GeneralRelatedListType.insert(std::make_pair(*RelatedCount, RelatedType));
3211 GeneralRelatedListTokens.insert(std::make_pair(*RelatedCount, PropertyTokens));
3215 void ContactDataObject::ProcessURL(wxString PropertySeg1, wxString PropertySeg2, int *URLCount){
3217 std::map<int, int> SplitPoints;
3218 std::map<int, int> SplitLength;
3219 std::map<int, int>::iterator SLiter;
3220 wxString PropertyData;
3221 wxString PropertyName;
3222 wxString PropertyValue;
3223 wxString PropertyTokens;
3224 bool FirstToken = TRUE;
3225 int intPrevValue = 5;
3230 SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue);
3234 PropertyType PropType = PROPERTY_NONE;
3236 // Look for type before continuing.
3238 CheckType(&PropertySeg1, &SplitPoints, &SplitLength, &intPrevValue, &PropType);
3240 // Setup the pointers.
3242 std::map<int, wxString> *WebsiteList = NULL;
3243 std::map<int, wxString> *WebsiteListAltID = NULL;
3244 std::map<int, wxString> *WebsiteListPID = NULL;
3245 std::map<int, wxString> *WebsiteListType = NULL;
3246 std::map<int, wxString> *WebsiteListTokens = NULL;
3247 std::map<int, wxString> *WebsiteListMediatype = NULL;
3248 std::map<int, int> *WebsiteListPref = NULL;
3250 // Setup blank lines for later on.
3254 WebsiteList = &GeneralWebsiteList;
3255 WebsiteListType = &GeneralWebsiteListType;
3256 WebsiteListAltID = &GeneralWebsiteListAltID;
3257 WebsiteListPID = &GeneralWebsiteListPID;
3258 WebsiteListTokens = &GeneralWebsiteListTokens;
3259 WebsiteListMediatype = &GeneralWebsiteListMediatype;
3260 WebsiteListPref = &GeneralWebsiteListPref;
3263 WebsiteList = &HomeWebsiteList;
3264 WebsiteListType = &HomeWebsiteListType;
3265 WebsiteListAltID = &HomeWebsiteListAltID;
3266 WebsiteListPID = &HomeWebsiteListPID;
3267 WebsiteListTokens = &HomeWebsiteListTokens;
3268 WebsiteListMediatype = &HomeWebsiteListMediatype;
3269 WebsiteListPref = &HomeWebsiteListPref;
3272 WebsiteList = &BusinessWebsiteList;
3273 WebsiteListType = &BusinessWebsiteListType;
3274 WebsiteListAltID = &BusinessWebsiteListAltID;
3275 WebsiteListPID = &BusinessWebsiteListPID;
3276 WebsiteListTokens = &BusinessWebsiteListTokens;
3277 WebsiteListMediatype = &BusinessWebsiteListMediatype;
3278 WebsiteListPref = &BusinessWebsiteListPref;
3284 for (std::map<int, int>::iterator intiter = SplitPoints.begin();
3285 intiter != SplitPoints.end(); ++intiter){
3287 SLiter = SplitLength.find(intiter->first);
3289 PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second));
3291 wxStringTokenizer PropertyElement (PropertyData, wxT("="));
3292 PropertyName = PropertyElement.GetNextToken();
3293 PropertyValue = PropertyElement.GetNextToken();
3295 intPrevValue = intiter->second;
3297 // Process properties.
3299 size_t intPropertyValueLen = PropertyValue.Len();
3301 if (PropertyValue.Mid((intPropertyValueLen - 1), 1) == wxT("\"")){
3303 PropertyValue.Trim();
3304 PropertyValue.RemoveLast();
3308 if (PropertyValue.Mid(0, 1) == wxT("\"")){
3310 PropertyValue.Remove(0, 1);
3314 CaptureString(&PropertyValue, FALSE);
3316 if (PropertyName == wxT("ALTID")){
3318 WebsiteListAltID->erase(*URLCount);
3319 WebsiteListAltID->insert(std::make_pair(*URLCount, PropertyValue));
3321 } else if (PropertyName == wxT("PID")){
3323 WebsiteListPID->erase(*URLCount);
3324 WebsiteListPID->insert(std::make_pair(*URLCount, PropertyValue));
3326 } else if (PropertyName == wxT("PREF")){
3328 int PriorityNumber = 0;
3329 bool ValidNumber = TRUE;
3332 PriorityNumber = std::stoi(PropertyValue.ToStdString());
3335 catch(std::invalid_argument &e){
3336 ValidNumber = FALSE;
3339 if (ValidNumber == TRUE){
3341 WebsiteListPref->erase(*URLCount);
3342 WebsiteListPref->insert(std::make_pair(*URLCount, PriorityNumber));
3346 } else if (PropertyName == wxT("MEDIATYPE")){
3348 WebsiteListMediatype->erase(*URLCount);
3349 WebsiteListMediatype->insert(std::make_pair(*URLCount, PropertyValue));
3353 // Something else we don't know about so append
3354 // to the tokens variable.
3356 if (!PropertyName.IsEmpty() && !PropertyValue.IsEmpty() && PropertyName != wxT("TYPE")){
3358 if (FirstToken == TRUE){
3360 PropertyTokens.Append(PropertyName + wxT("=") + PropertyValue);
3365 PropertyTokens.Append(wxT(";") + PropertyName + wxT("=") + PropertyValue);
3375 // Add the data to the General/Home/Work address variables.
3377 CaptureString(&PropertySeg2, FALSE);
3379 WebsiteList->insert(std::make_pair(*URLCount, PropertySeg2));
3381 if (!PropertyTokens.IsEmpty()){
3383 WebsiteListTokens->insert(std::make_pair(*URLCount, PropertyTokens));
3389 void ContactDataObject::ProcessTitle(wxString PropertySeg1, wxString PropertySeg2, int *TitleCount){
3391 std::map<int, int> SplitPoints;
3392 std::map<int, int> SplitLength;
3393 std::map<int, int>::iterator SLiter;
3394 wxString PropertyData;
3395 wxString PropertyName;
3396 wxString PropertyValue;
3397 wxString PropertyTokens;
3398 bool FirstToken = TRUE;
3399 int intPrevValue = 7;
3404 SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue);
3408 PropertyType PropType = PROPERTY_NONE;
3410 // Look for type before continuing.
3412 CheckType(&PropertySeg1, &SplitPoints, &SplitLength, &intPrevValue, &PropType);
3414 // Setup the pointers.
3416 std::map<int, wxString> *TitleList = NULL;
3417 std::map<int, wxString> *TitleListAltID = NULL;
3418 std::map<int, wxString> *TitleListPID = NULL;
3419 std::map<int, wxString> *TitleListType = NULL;
3420 std::map<int, wxString> *TitleListTokens = NULL;
3421 std::map<int, wxString> *TitleListLanguage = NULL;
3422 std::map<int, int> *TitleListPref = NULL;
3424 // Setup blank lines for later on.
3428 TitleList = &GeneralTitleList;
3429 TitleListType = &GeneralTitleListType;
3430 TitleListAltID = &GeneralTitleListAltID;
3431 TitleListPID = &GeneralTitleListPID;
3432 TitleListTokens = &GeneralTitleListTokens;
3433 TitleListLanguage = &GeneralTitleListLanguage;
3434 TitleListPref = &GeneralTitleListPref;
3437 TitleList = &HomeTitleList;
3438 TitleListType = &HomeTitleListType;
3439 TitleListAltID = &HomeTitleListAltID;
3440 TitleListPID = &HomeTitleListPID;
3441 TitleListTokens = &HomeTitleListTokens;
3442 TitleListLanguage = &HomeTitleListLanguage;
3443 TitleListPref = &HomeTitleListPref;
3446 TitleList = &BusinessTitleList;
3447 TitleListType = &BusinessTitleListType;
3448 TitleListAltID = &BusinessTitleListAltID;
3449 TitleListPID = &BusinessTitleListPID;
3450 TitleListTokens = &BusinessTitleListTokens;
3451 TitleListLanguage = &BusinessTitleListLanguage;
3452 TitleListPref = &BusinessTitleListPref;
3458 for (std::map<int, int>::iterator intiter = SplitPoints.begin();
3459 intiter != SplitPoints.end(); ++intiter){
3461 SLiter = SplitLength.find(intiter->first);
3463 PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second));
3465 wxStringTokenizer PropertyElement (PropertyData, wxT("="));
3466 PropertyName = PropertyElement.GetNextToken();
3467 PropertyValue = PropertyElement.GetNextToken();
3469 intPrevValue = intiter->second;
3471 // Process properties.
3473 size_t intPropertyValueLen = PropertyValue.Len();
3475 if (PropertyValue.Mid((intPropertyValueLen - 1), 1) == wxT("\"")){
3477 PropertyValue.Trim();
3478 PropertyValue.RemoveLast();
3482 if (PropertyValue.Mid(0, 1) == wxT("\"")){
3484 PropertyValue.Remove(0, 1);
3488 CaptureString(&PropertyValue, FALSE);
3490 if (PropertyName == wxT("ALTID")){
3492 TitleListAltID->erase(*TitleCount);
3493 TitleListAltID->insert(std::make_pair(*TitleCount, PropertyValue));
3495 } else if (PropertyName == wxT("PID")){
3497 TitleListPID->erase(*TitleCount);
3498 TitleListPID->insert(std::make_pair(*TitleCount, PropertyValue));
3500 } else if (PropertyName == wxT("PREF")){
3502 int PriorityNumber = 0;
3503 bool ValidNumber = TRUE;
3506 PriorityNumber = std::stoi(PropertyValue.ToStdString());
3509 catch(std::invalid_argument &e){
3510 ValidNumber = FALSE;
3513 if (ValidNumber == TRUE){
3515 TitleListPref->erase(*TitleCount);
3516 TitleListPref->insert(std::make_pair(*TitleCount, PriorityNumber));
3520 } else if (PropertyName == wxT("LANGUAGE")){
3522 TitleListLanguage->erase(*TitleCount);
3523 TitleListLanguage->insert(std::make_pair(*TitleCount, PropertyValue));
3527 // Something else we don't know about so append
3528 // to the tokens variable.
3530 if (!PropertyName.IsEmpty() && !PropertyValue.IsEmpty() && PropertyName != wxT("TYPE")){
3532 if (FirstToken == TRUE){
3534 PropertyTokens.Append(PropertyName + wxT("=") + PropertyValue);
3539 PropertyTokens.Append(wxT(";") + PropertyName + wxT("=") + PropertyValue);
3549 // Add the data to the General/Home/Work address variables.
3551 CaptureString(&PropertySeg2, FALSE);
3553 TitleList->insert(std::make_pair(*TitleCount, PropertySeg2));
3555 if (!PropertyTokens.IsEmpty()){
3557 TitleListTokens->insert(std::make_pair(*TitleCount, PropertyTokens));
3563 void ContactDataObject::ProcessRole(wxString PropertySeg1, wxString PropertySeg2, int *RoleCount){
3565 std::map<int, int> SplitPoints;
3566 std::map<int, int> SplitLength;
3567 std::map<int, int>::iterator SLiter;
3568 wxString PropertyData;
3569 wxString PropertyName;
3570 wxString PropertyValue;
3571 wxString PropertyTokens;
3572 bool FirstToken = TRUE;
3573 int intPrevValue = 6;
3578 SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue);
3582 PropertyType PropType = PROPERTY_NONE;
3584 // Look for type before continuing.
3586 CheckType(&PropertySeg1, &SplitPoints, &SplitLength, &intPrevValue, &PropType);
3588 // Setup the pointers.
3590 std::map<int, wxString> *RoleList = NULL;
3591 std::map<int, wxString> *RoleListAltID = NULL;
3592 std::map<int, wxString> *RoleListPID = NULL;
3593 std::map<int, wxString> *RoleListType = NULL;
3594 std::map<int, wxString> *RoleListTokens = NULL;
3595 std::map<int, wxString> *RoleListLanguage = NULL;
3596 std::map<int, int> *RoleListPref = NULL;
3598 // Setup blank lines for later on.
3602 RoleList = &GeneralRoleList;
3603 RoleListType = &GeneralRoleListType;
3604 RoleListAltID = &GeneralRoleListAltID;
3605 RoleListPID = &GeneralRoleListPID;
3606 RoleListTokens = &GeneralRoleListTokens;
3607 RoleListLanguage = &GeneralRoleListLanguage;
3608 RoleListPref = &GeneralRoleListPref;
3611 RoleList = &HomeRoleList;
3612 RoleListType = &HomeRoleListType;
3613 RoleListAltID = &HomeRoleListAltID;
3614 RoleListPID = &HomeRoleListPID;
3615 RoleListTokens = &HomeRoleListTokens;
3616 RoleListLanguage = &HomeRoleListLanguage;
3617 RoleListPref = &HomeRoleListPref;
3620 RoleList = &BusinessRoleList;
3621 RoleListType = &BusinessRoleListType;
3622 RoleListAltID = &BusinessRoleListAltID;
3623 RoleListPID = &BusinessRoleListPID;
3624 RoleListTokens = &BusinessRoleListTokens;
3625 RoleListLanguage = &BusinessRoleListLanguage;
3626 RoleListPref = &BusinessRoleListPref;
3632 for (std::map<int, int>::iterator intiter = SplitPoints.begin();
3633 intiter != SplitPoints.end(); ++intiter){
3635 SLiter = SplitLength.find(intiter->first);
3637 PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second));
3639 wxStringTokenizer PropertyElement (PropertyData, wxT("="));
3640 PropertyName = PropertyElement.GetNextToken();
3641 PropertyValue = PropertyElement.GetNextToken();
3643 intPrevValue = intiter->second;
3645 // Process properties.
3647 size_t intPropertyValueLen = PropertyValue.Len();
3649 if (PropertyValue.Mid((intPropertyValueLen - 1), 1) == wxT("\"")){
3651 PropertyValue.Trim();
3652 PropertyValue.RemoveLast();
3656 if (PropertyValue.Mid(0, 1) == wxT("\"")){
3658 PropertyValue.Remove(0, 1);
3662 CaptureString(&PropertyValue, FALSE);
3664 if (PropertyName == wxT("ALTID")){
3666 RoleListAltID->erase(*RoleCount);
3667 RoleListAltID->insert(std::make_pair(*RoleCount, PropertyValue));
3669 } else if (PropertyName == wxT("PID")){
3671 RoleListPID->erase(*RoleCount);
3672 RoleListPID->insert(std::make_pair(*RoleCount, PropertyValue));
3674 } else if (PropertyName == wxT("PREF")){
3676 int PriorityNumber = 0;
3677 bool ValidNumber = TRUE;
3680 PriorityNumber = std::stoi(PropertyValue.ToStdString());
3683 catch(std::invalid_argument &e){
3684 ValidNumber = FALSE;
3687 if (ValidNumber == TRUE){
3689 RoleListPref->erase(*RoleCount);
3690 RoleListPref->insert(std::make_pair(*RoleCount, PriorityNumber));
3694 } else if (PropertyName == wxT("LANGUAGE")){
3696 RoleListLanguage->erase(*RoleCount);
3697 RoleListLanguage->insert(std::make_pair(*RoleCount, PropertyValue));
3701 // Something else we don't know about so append
3702 // to the tokens variable.
3704 if (!PropertyName.IsEmpty() && !PropertyValue.IsEmpty() && PropertyName != wxT("TYPE")){
3706 if (FirstToken == TRUE){
3708 PropertyTokens.Append(PropertyName + wxT("=") + PropertyValue);
3713 PropertyTokens.Append(wxT(";") + PropertyName + wxT("=") + PropertyValue);
3723 // Add the data to the General/Home/Work address variables.
3725 CaptureString(&PropertySeg2, FALSE);
3727 RoleList->insert(std::make_pair(*RoleCount, PropertySeg2));
3729 if (!PropertyTokens.IsEmpty()){
3731 RoleListTokens->insert(std::make_pair(*RoleCount, PropertyTokens));
3737 void ContactDataObject::ProcessOrganisation(wxString PropertySeg1, wxString PropertySeg2, int *OrganisationCount){
3739 std::map<int, int> SplitPoints;
3740 std::map<int, int> SplitLength;
3741 std::map<int, int>::iterator SLiter;
3742 wxString PropertyData;
3743 wxString PropertyName;
3744 wxString PropertyValue;
3745 wxString PropertyTokens;
3746 bool FirstToken = TRUE;
3747 int intPrevValue = 5;
3752 SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue);
3756 PropertyType PropType = PROPERTY_NONE;
3758 // Look for type before continuing.
3760 CheckType(&PropertySeg1, &SplitPoints, &SplitLength, &intPrevValue, &PropType);
3762 // Setup the pointers.
3764 std::map<int, wxString> *OrganisationsList = NULL;
3765 std::map<int, wxString> *OrganisationsListAltID = NULL;
3766 std::map<int, wxString> *OrganisationsListPID = NULL;
3767 std::map<int, wxString> *OrganisationsListType = NULL;
3768 std::map<int, wxString> *OrganisationsListTokens = NULL;
3769 std::map<int, wxString> *OrganisationsListLanguage = NULL;
3770 std::map<int, wxString> *OrganisationsListSortAs = NULL;
3771 std::map<int, int> *OrganisationsListPref = NULL;
3773 // Setup blank lines for later on.
3777 OrganisationsList = &GeneralOrganisationsList;
3778 OrganisationsListType = &GeneralOrganisationsListType;
3779 OrganisationsListAltID = &GeneralOrganisationsListAltID;
3780 OrganisationsListPID = &GeneralOrganisationsListPID;
3781 OrganisationsListTokens = &GeneralOrganisationsListTokens;
3782 OrganisationsListLanguage = &GeneralOrganisationsListLanguage;
3783 OrganisationsListSortAs = &GeneralOrganisationsListSortAs;
3784 OrganisationsListPref = &GeneralOrganisationsListPref;
3787 OrganisationsList = &HomeOrganisationsList;
3788 OrganisationsListType = &HomeOrganisationsListType;
3789 OrganisationsListAltID = &HomeOrganisationsListAltID;
3790 OrganisationsListPID = &HomeOrganisationsListPID;
3791 OrganisationsListTokens = &HomeOrganisationsListTokens;
3792 OrganisationsListLanguage = &HomeOrganisationsListLanguage;
3793 OrganisationsListSortAs = &HomeOrganisationsListSortAs;
3794 OrganisationsListPref = &HomeOrganisationsListPref;
3797 OrganisationsList = &BusinessOrganisationsList;
3798 OrganisationsListType = &BusinessOrganisationsListType;
3799 OrganisationsListAltID = &BusinessOrganisationsListAltID;
3800 OrganisationsListPID = &BusinessOrganisationsListPID;
3801 OrganisationsListTokens = &BusinessOrganisationsListTokens;
3802 OrganisationsListLanguage = &BusinessOrganisationsListLanguage;
3803 OrganisationsListSortAs = &BusinessOrganisationsListSortAs;
3804 OrganisationsListPref = &BusinessOrganisationsListPref;
3810 for (std::map<int, int>::iterator intiter = SplitPoints.begin();
3811 intiter != SplitPoints.end(); ++intiter){
3813 SLiter = SplitLength.find(intiter->first);
3815 PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second));
3817 wxStringTokenizer PropertyElement (PropertyData, wxT("="));
3818 PropertyName = PropertyElement.GetNextToken();
3819 PropertyValue = PropertyElement.GetNextToken();
3821 intPrevValue = intiter->second;
3823 // Process properties.
3825 size_t intPropertyValueLen = PropertyValue.Len();
3827 if (PropertyValue.Mid((intPropertyValueLen - 1), 1) == wxT("\"")){
3829 PropertyValue.Trim();
3830 PropertyValue.RemoveLast();
3834 if (PropertyValue.Mid(0, 1) == wxT("\"")){
3836 PropertyValue.Remove(0, 1);
3840 CaptureString(&PropertyValue, FALSE);
3842 if (PropertyName == wxT("ALTID")){
3844 OrganisationsListAltID->erase(*OrganisationCount);
3845 OrganisationsListAltID->insert(std::make_pair(*OrganisationCount, PropertyValue));
3847 } else if (PropertyName == wxT("PID")){
3849 OrganisationsListPID->erase(*OrganisationCount);
3850 OrganisationsListPID->insert(std::make_pair(*OrganisationCount, PropertyValue));
3852 } else if (PropertyName == wxT("SORT-AS")){
3854 OrganisationsListSortAs->erase(*OrganisationCount);
3855 OrganisationsListSortAs->insert(std::make_pair(*OrganisationCount, PropertyValue));
3857 } else if (PropertyName == wxT("PREF")){
3859 int PriorityNumber = 0;
3860 bool ValidNumber = TRUE;
3863 PriorityNumber = std::stoi(PropertyValue.ToStdString());
3866 catch(std::invalid_argument &e){
3867 ValidNumber = FALSE;
3870 if (ValidNumber == TRUE){
3872 OrganisationsListPref->erase(*OrganisationCount);
3873 OrganisationsListPref->insert(std::make_pair(*OrganisationCount, PriorityNumber));
3877 } else if (PropertyName == wxT("LANGUAGE")){
3879 OrganisationsListLanguage->erase(*OrganisationCount);
3880 OrganisationsListLanguage->insert(std::make_pair(*OrganisationCount, PropertyValue));
3884 // Something else we don't know about so append
3885 // to the tokens variable.
3887 if (!PropertyName.IsEmpty() && !PropertyValue.IsEmpty() && PropertyName != wxT("TYPE")){
3889 if (FirstToken == TRUE){
3891 PropertyTokens.Append(PropertyName + wxT("=") + PropertyValue);
3896 PropertyTokens.Append(wxT(";") + PropertyName + wxT("=") + PropertyValue);
3906 // Add the data to the General/Home/Work address variables.
3908 CaptureString(&PropertySeg2, FALSE);
3910 OrganisationsList->insert(std::make_pair(*OrganisationCount, PropertySeg2));
3912 if (!PropertyTokens.IsEmpty()){
3914 OrganisationsListTokens->insert(std::make_pair(*OrganisationCount, PropertyTokens));
3920 void ContactDataObject::ProcessNote(wxString PropertySeg1, wxString PropertySeg2, int *NoteCount){
3922 std::map<int, int> SplitPoints;
3923 std::map<int, int> SplitLength;
3924 std::map<int, int>::iterator SLiter;
3925 wxString PropertyData;
3926 wxString PropertyName;
3927 wxString PropertyValue;
3928 wxString PropertyTokens;
3929 bool FirstToken = TRUE;
3930 int intPrevValue = 6;
3935 SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue);
3939 PropertyType PropType = PROPERTY_NONE;
3941 // Look for type before continuing.
3943 CheckType(&PropertySeg1, &SplitPoints, &SplitLength, &intPrevValue, &PropType);
3945 // Setup the pointers.
3947 std::map<int, wxString> *NoteList = NULL;
3948 std::map<int, wxString> *NoteListAltID = NULL;
3949 std::map<int, wxString> *NoteListPID = NULL;
3950 std::map<int, wxString> *NoteListType = NULL;
3951 std::map<int, wxString> *NoteListTokens = NULL;
3952 std::map<int, wxString> *NoteListLanguage = NULL;
3953 std::map<int, int> *NoteListPref = NULL;
3955 // Setup blank lines for later on.
3959 NoteList = &GeneralNoteList;
3960 NoteListType = &GeneralNoteListType;
3961 NoteListAltID = &GeneralNoteListAltID;
3962 NoteListPID = &GeneralNoteListPID;
3963 NoteListTokens = &GeneralNoteListTokens;
3964 NoteListLanguage = &GeneralNoteListLanguage;
3965 NoteListPref = &GeneralNoteListPref;
3968 NoteList = &HomeNoteList;
3969 NoteListType = &HomeNoteListType;
3970 NoteListAltID = &HomeNoteListAltID;
3971 NoteListPID = &HomeNoteListPID;
3972 NoteListTokens = &HomeNoteListTokens;
3973 NoteListLanguage = &HomeNoteListLanguage;
3974 NoteListPref = &HomeNoteListPref;
3977 NoteList = &BusinessNoteList;
3978 NoteListType = &BusinessNoteListType;
3979 NoteListAltID = &BusinessNoteListAltID;
3980 NoteListPID = &BusinessNoteListPID;
3981 NoteListTokens = &BusinessNoteListTokens;
3982 NoteListLanguage = &BusinessNoteListLanguage;
3983 NoteListPref = &BusinessNoteListPref;
3989 for (std::map<int, int>::iterator intiter = SplitPoints.begin();
3990 intiter != SplitPoints.end(); ++intiter){
3992 SLiter = SplitLength.find(intiter->first);
3994 PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second));
3996 wxStringTokenizer PropertyElement (PropertyData, wxT("="));
3997 PropertyName = PropertyElement.GetNextToken();
3998 PropertyValue = PropertyElement.GetNextToken();
4000 intPrevValue = intiter->second;
4002 // Process properties.
4004 size_t intPropertyValueLen = PropertyValue.Len();
4006 if (PropertyValue.Mid((intPropertyValueLen - 1), 1) == wxT("\"")){
4008 PropertyValue.Trim();
4009 PropertyValue.RemoveLast();
4013 if (PropertyValue.Mid(0, 1) == wxT("\"")){
4015 PropertyValue.Remove(0, 1);
4019 CaptureString(&PropertyValue, FALSE);
4021 if (PropertyName == wxT("ALTID")){
4023 NoteListAltID->erase(*NoteCount);
4024 NoteListAltID->insert(std::make_pair(*NoteCount, PropertyValue));
4026 } else if (PropertyName == wxT("PID")){
4028 NoteListPID->erase(*NoteCount);
4029 NoteListPID->insert(std::make_pair(*NoteCount, PropertyValue));
4031 } else if (PropertyName == wxT("PREF")){
4033 int PriorityNumber = 0;
4034 bool ValidNumber = TRUE;
4037 PriorityNumber = std::stoi(PropertyValue.ToStdString());
4040 catch(std::invalid_argument &e){
4041 ValidNumber = FALSE;
4044 if (ValidNumber == TRUE){
4046 NoteListPref->erase(*NoteCount);
4047 NoteListPref->insert(std::make_pair(*NoteCount, PriorityNumber));
4051 } else if (PropertyName == wxT("LANGUAGE")){
4053 NoteListLanguage->erase(*NoteCount);
4054 NoteListLanguage->insert(std::make_pair(*NoteCount, PropertyValue));
4058 // Something else we don't know about so append
4059 // to the tokens variable.
4061 if (!PropertyName.IsEmpty() && !PropertyValue.IsEmpty() && PropertyName != wxT("TYPE")){
4063 if (FirstToken == TRUE){
4065 PropertyTokens.Append(PropertyName + wxT("=") + PropertyValue);
4070 PropertyTokens.Append(wxT(";") + PropertyName + wxT("=") + PropertyValue);
4080 // Add the data to the General/Home/Work address variables.
4082 CaptureString(&PropertySeg2, FALSE);
4084 NoteList->insert(std::make_pair(*NoteCount, PropertySeg2));
4086 if (!PropertyTokens.IsEmpty()){
4088 NoteListTokens->insert(std::make_pair(*NoteCount, PropertyTokens));
4094 void ContactDataObject::ProcessCategory(wxString PropertySeg1, wxString PropertySeg2, int *CategoryCount){
4096 std::map<int, int> SplitPoints;
4097 std::map<int, int> SplitLength;
4098 std::map<int, int>::iterator SLiter;
4099 wxString PropertyData;
4100 wxString PropertyName;
4101 wxString PropertyValue;
4102 wxString PropertyTokens;
4103 bool FirstToken = TRUE;
4104 int intPrevValue = 12;
4109 SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue);
4113 PropertyType PropType = PROPERTY_NONE;
4115 // Look for type before continuing.
4117 CheckType(&PropertySeg1, &SplitPoints, &SplitLength, &intPrevValue, &PropType);
4119 // Setup blank lines for later on.
4125 CategoriesListType.insert(std::make_pair(*CategoryCount, "home"));
4128 CategoriesListType.insert(std::make_pair(*CategoryCount, "work"));
4134 for (std::map<int, int>::iterator intiter = SplitPoints.begin();
4135 intiter != SplitPoints.end(); ++intiter){
4137 SLiter = SplitLength.find(intiter->first);
4139 PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second));
4141 wxStringTokenizer PropertyElement (PropertyData, wxT("="));
4142 PropertyName = PropertyElement.GetNextToken();
4143 PropertyValue = PropertyElement.GetNextToken();
4145 intPrevValue = intiter->second;
4147 // Process properties.
4149 size_t intPropertyValueLen = PropertyValue.Len();
4151 if (PropertyValue.Mid((intPropertyValueLen - 1), 1) == wxT("\"")){
4153 PropertyValue.Trim();
4154 PropertyValue.RemoveLast();
4158 if (PropertyValue.Mid(0, 1) == wxT("\"")){
4160 PropertyValue.Remove(0, 1);
4164 CaptureString(&PropertyValue, FALSE);
4166 if (PropertyName == wxT("ALTID")){
4168 CategoriesListAltID.erase(*CategoryCount);
4169 CategoriesListAltID.insert(std::make_pair(*CategoryCount, PropertyValue));
4171 } else if (PropertyName == wxT("PID")){
4173 CategoriesListPID.erase(*CategoryCount);
4174 CategoriesListPID.insert(std::make_pair(*CategoryCount, PropertyValue));
4176 } else if (PropertyName == wxT("PREF")){
4178 int PriorityNumber = 0;
4179 bool ValidNumber = TRUE;
4182 PriorityNumber = std::stoi(PropertyValue.ToStdString());
4185 catch(std::invalid_argument &e){
4186 ValidNumber = FALSE;
4189 if (ValidNumber == TRUE){
4191 CategoriesListPref.erase(*CategoryCount);
4192 CategoriesListPref.insert(std::make_pair(*CategoryCount, PriorityNumber));
4196 } else if (PropertyName == wxT("LANGUAGE")){
4198 CategoriesListLanguage.erase(*CategoryCount);
4199 CategoriesListLanguage.insert(std::make_pair(*CategoryCount, PropertyValue));
4203 // Something else we don't know about so append
4204 // to the tokens variable.
4206 if (!PropertyName.IsEmpty() && !PropertyValue.IsEmpty() && PropertyName != wxT("TYPE")){
4208 if (FirstToken == TRUE){
4210 PropertyTokens.Append(PropertyName + wxT("=") + PropertyValue);
4215 PropertyTokens.Append(wxT(";") + PropertyName + wxT("=") + PropertyValue);
4225 // Deal with multiple categories.
4227 int intOrigCatCount = *CategoryCount;
4228 bool FirstCategoryProcessed = TRUE;
4229 bool AfterFirstToken = FALSE;
4230 int intSplitSize = 0;
4231 int intSplitsFound = 0;
4232 int intSplitSeek = 0;
4233 int intPropertyLen = PropertySeg2.Len();
4235 SplitPoints.clear();
4236 SplitLength.clear();
4239 for (int i = 0; i <= intPropertyLen; i++){
4241 if (intSplitSize == 0 && PropertySeg2.Mid(i, 1) == wxT(" ")){
4249 if (PropertySeg2.Mid(i, 1) == wxT(",") && PropertySeg2.Mid((i - 1), 1) != wxT("\\")){
4251 if (AfterFirstToken == TRUE){
4253 SplitPoints.insert(std::make_pair(intSplitsFound, (i - intSplitSize + 1)));
4254 SplitLength.insert(std::make_pair(intSplitsFound, (intSplitSize - 2)));
4258 SplitPoints.insert(std::make_pair(intSplitsFound, 0));
4259 SplitLength.insert(std::make_pair(intSplitsFound, (intSplitSize - 2)));
4260 AfterFirstToken = TRUE;
4272 if (SplitPoints.size() > 0){
4274 SplitPoints.insert(std::make_pair(intSplitsFound, (intSplitSeek + 1)));
4275 SplitLength.insert(std::make_pair(intSplitsFound, intSplitSize));
4279 if (SplitPoints.size() == 0){
4281 CategoriesList.insert(std::make_pair(*CategoryCount, PropertySeg2));
4283 if (!PropertyTokens.IsEmpty()){
4285 CategoriesListTokens.insert(std::make_pair(*CategoryCount, PropertyTokens));
4291 for (std::map<int, int>::iterator intiter = SplitPoints.begin();
4292 intiter != SplitPoints.end(); ++intiter){
4294 SLiter = SplitLength.find(intiter->first);
4296 intPrevValue = intiter->second;
4298 PropertyData = PropertySeg2.Mid(intPrevValue, (SLiter->second + 1));
4300 // Add the data to the General/Home/Work address variables.
4302 // Trim any whitespace from the start and end.
4304 PropertyData = PropertyData.Trim(FALSE);
4305 PropertyData = PropertyData.Trim(TRUE);
4307 CaptureString(&PropertyData, FALSE);
4309 if (FirstCategoryProcessed == TRUE){
4311 FirstCategoryProcessed = FALSE;
4313 CategoriesList.insert(std::make_pair(*CategoryCount, PropertyData));
4315 if (!PropertyTokens.IsEmpty()){
4317 CategoriesListTokens.insert(std::make_pair(*CategoryCount, PropertyTokens));
4327 CategoriesList.insert(std::make_pair(*CategoryCount, PropertyData));
4329 if (!PropertyTokens.IsEmpty()){
4331 CategoriesListTokens.insert(std::make_pair(*CategoryCount, PropertyTokens));
4337 // Copy the properties to each of the categories (if it exists).
4339 if (!PropertyTokens.IsEmpty()){
4341 CategoriesListTokens.insert(std::make_pair(*CategoryCount, CategoriesListTokens.find(intOrigCatCount)->second));
4345 // Check if ALTID was used.
4347 if (CategoriesListAltID.find(intOrigCatCount) != CategoriesListAltID.end()){
4349 CategoriesListAltID.insert(std::make_pair(*CategoryCount, CategoriesListAltID.find(intOrigCatCount)->second));
4353 // Check if PID was used.
4355 if (CategoriesListPID.find(intOrigCatCount) != CategoriesListPID.end()){
4357 CategoriesListPID.insert(std::make_pair(*CategoryCount, CategoriesListPID.find(intOrigCatCount)->second));
4361 // Check if PREF was used.
4363 if (CategoriesListPref.find(intOrigCatCount) != CategoriesListPref.end()){
4365 CategoriesListPref.insert(std::make_pair(*CategoryCount, CategoriesListPref.find(intOrigCatCount)->second));
4369 // Check if LANGUAGE was used.
4371 if (CategoriesListLanguage.find(intOrigCatCount) != CategoriesListLanguage.end()){
4373 CategoriesListLanguage.insert(std::make_pair(*CategoryCount, CategoriesListLanguage.find(intOrigCatCount)->second));
4377 // Check if TYPE was used.
4383 CategoriesListType.insert(std::make_pair(*CategoryCount, "home"));
4386 CategoriesListType.insert(std::make_pair(*CategoryCount, "work"));
4394 void ContactDataObject::ProcessPhoto(wxString PropertySeg1, wxString PropertySeg2, int *PhotoCount){
4396 size_t intPropertyLen = PropertySeg1.Len();
4397 std::map<int, int> SplitPoints;
4398 std::map<int, int> SplitLength;
4399 std::map<int, int>::iterator SLiter;
4400 wxString PropertyData;
4401 wxString PropertyName;
4402 wxString PropertyValue;
4403 wxString PropertyTokens;
4404 bool FirstToken = TRUE;
4405 int intSplitsFound = 0;
4406 int intSplitSize = 0;
4407 int intPrevValue = 7;
4411 SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue);
4415 PropertyType PropType = PROPERTY_NONE;
4417 // Look for type before continuing.
4419 CheckType(&PropertySeg1, &SplitPoints, &SplitLength, &intPrevValue, &PropType);
4423 for (std::map<int, int>::iterator intiter = SplitPoints.begin();
4424 intiter != SplitPoints.end(); ++intiter){
4426 SLiter = SplitLength.find(intiter->first);
4428 PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second));
4430 wxStringTokenizer PropertyElement (PropertyData, wxT("="));
4431 PropertyName = PropertyElement.GetNextToken();
4432 PropertyValue = PropertyElement.GetNextToken();
4434 intPrevValue = intiter->second;
4436 // Process properties.
4438 size_t intPropertyValueLen = PropertyValue.Len();
4440 if (PropertyValue.Mid((intPropertyValueLen - 1), 1) == wxT("\"")){
4442 PropertyValue.Trim();
4443 PropertyValue.RemoveLast();
4447 if (PropertyValue.Mid(0, 1) == wxT("\"")){
4449 PropertyValue.Remove(0, 1);
4453 CaptureString(&PropertyValue, FALSE);
4455 if (PropertyName == wxT("ALTID")){
4457 PicturesListAltID.erase(*PhotoCount);
4458 PicturesListAltID.insert(std::make_pair(*PhotoCount, PropertyValue));
4460 } else if (PropertyName == wxT("PID")){
4462 PicturesListPID.erase(*PhotoCount);
4463 PicturesListPID.insert(std::make_pair(*PhotoCount, PropertyValue));
4465 } else if (PropertyName == wxT("PREF")){
4467 int PriorityNumber = 0;
4468 bool ValidNumber = TRUE;
4471 PriorityNumber = std::stoi(PropertyValue.ToStdString());
4474 catch(std::invalid_argument &e){
4475 ValidNumber = FALSE;
4478 if (ValidNumber == TRUE){
4480 PicturesListPref.erase(*PhotoCount);
4481 PicturesListPref.insert(std::make_pair(*PhotoCount, PriorityNumber));
4485 } else if (PropertyName == wxT("MEDIATYPE")){
4487 PicturesListMediatype.erase(*PhotoCount);
4488 PicturesListMediatype.insert(std::make_pair(*PhotoCount, PropertyValue));
4492 // Something else we don't know about so append
4493 // to the tokens variable.
4495 if (!PropertyName.IsEmpty() && !PropertyValue.IsEmpty() && PropertyName != wxT("TYPE")){
4497 if (FirstToken == TRUE){
4499 PropertyTokens.Append(PropertyName + wxT("=") + PropertyValue);
4504 PropertyTokens.Append(wxT(";") + PropertyName + wxT("=") + PropertyValue);
4514 intPropertyLen = PropertySeg2.Len();
4515 SplitPoints.clear();
4516 SplitLength.clear();
4521 CaptureString(&PropertySeg2, FALSE);
4523 for (int i = 0; i <= intPropertyLen; i++){
4527 if (PropertySeg2.Mid(i, 1) == wxT(";")){
4530 SplitPoints.insert(std::make_pair(intSplitsFound, (i + 1)));
4532 if (intSplitsFound == 6){
4534 SplitLength.insert(std::make_pair(intSplitsFound, (intSplitSize - 1)));
4539 SplitLength.insert(std::make_pair(intSplitsFound, (intSplitSize - 1)));
4549 wxString wxSPhotoURI;
4550 wxString wxSPhotoMIME;
4551 wxString wxSPhotoEncoding;
4552 wxString wxSPhotoData;
4553 std::string base64enc;
4555 if (intSplitsFound == 0){
4559 std::map<int, int>::iterator striter;
4561 striter = SplitLength.find(1);
4563 wxStringTokenizer wSTDataType(PropertySeg2.Mid(0, striter->second), wxT(":"));
4565 while (wSTDataType.HasMoreTokens() == TRUE){
4567 wxSPhotoURI = wSTDataType.GetNextToken();
4568 wxSPhotoMIME = wSTDataType.GetNextToken();
4573 wxStringTokenizer wSTDataInfo(PropertySeg2.Mid((striter->second + 1)), wxT(","));
4575 while (wSTDataInfo.HasMoreTokens() == TRUE){
4577 wxSPhotoEncoding = wSTDataInfo.GetNextToken();
4578 wxSPhotoData = wSTDataInfo.GetNextToken();
4579 base64enc = wxSPhotoData.mb_str();
4586 // Add the data to the General/Home/Work address variables.
4588 PicturesList.insert(std::make_pair(*PhotoCount, base64enc));
4589 PicturesListPictureType.insert(std::make_pair(*PhotoCount, wxSPhotoMIME));
4590 PicturesListPicEncType.insert(std::make_pair(*PhotoCount, wxSPhotoEncoding));
4596 PicturesListType.insert(std::make_pair(*PhotoCount, "home"));
4599 PicturesListType.insert(std::make_pair(*PhotoCount, "work"));
4603 if (!PropertyTokens.IsEmpty()){
4605 PicturesListTokens.insert(std::make_pair(*PhotoCount, PropertyTokens));
4611 void ContactDataObject::ProcessLogo(wxString PropertySeg1, wxString PropertySeg2, int *LogoCount){
4613 size_t intPropertyLen = PropertySeg1.Len();
4614 std::map<int, int> SplitPoints;
4615 std::map<int, int> SplitLength;
4616 std::map<int, int>::iterator SLiter;
4617 wxString PropertyData;
4618 wxString PropertyName;
4619 wxString PropertyValue;
4620 wxString PropertyTokens;
4621 bool FirstToken = TRUE;
4622 int intSplitsFound = 0;
4623 int intSplitSize = 0;
4624 int intPrevValue = 6;
4628 SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue);
4632 PropertyType PropType = PROPERTY_NONE;
4634 // Look for type before continuing.
4636 CheckType(&PropertySeg1, &SplitPoints, &SplitLength, &intPrevValue, &PropType);
4640 for (std::map<int, int>::iterator intiter = SplitPoints.begin();
4641 intiter != SplitPoints.end(); ++intiter){
4643 SLiter = SplitLength.find(intiter->first);
4645 PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second));
4647 wxStringTokenizer PropertyElement (PropertyData, wxT("="));
4648 PropertyName = PropertyElement.GetNextToken();
4649 PropertyValue = PropertyElement.GetNextToken();
4651 intPrevValue = intiter->second;
4653 // Process properties.
4655 size_t intPropertyValueLen = PropertyValue.Len();
4657 if (PropertyValue.Mid((intPropertyValueLen - 1), 1) == wxT("\"")){
4659 PropertyValue.Trim();
4660 PropertyValue.RemoveLast();
4664 if (PropertyValue.Mid(0, 1) == wxT("\"")){
4666 PropertyValue.Remove(0, 1);
4670 CaptureString(&PropertyValue, FALSE);
4672 if (PropertyName == wxT("ALTID")){
4674 LogosListAltID.erase(*LogoCount);
4675 LogosListAltID.insert(std::make_pair(*LogoCount, PropertyValue));
4677 } else if (PropertyName == wxT("PID")){
4679 LogosListPID.erase(*LogoCount);
4680 LogosListPID.insert(std::make_pair(*LogoCount, PropertyValue));
4682 } else if (PropertyName == wxT("PREF")){
4684 int PriorityNumber = 0;
4685 bool ValidNumber = TRUE;
4688 PriorityNumber = std::stoi(PropertyValue.ToStdString());
4691 catch(std::invalid_argument &e){
4692 ValidNumber = FALSE;
4695 if (ValidNumber == TRUE){
4697 LogosListPref.erase(*LogoCount);
4698 LogosListPref.insert(std::make_pair(*LogoCount, PriorityNumber));
4702 } else if (PropertyName == wxT("MEDIATYPE")){
4704 LogosListMediatype.erase(*LogoCount);
4705 LogosListMediatype.insert(std::make_pair(*LogoCount, PropertyValue));
4709 // Something else we don't know about so append
4710 // to the tokens variable.
4712 if (!PropertyName.IsEmpty() && !PropertyValue.IsEmpty() && PropertyName != wxT("TYPE")){
4714 if (FirstToken == TRUE){
4716 PropertyTokens.Append(PropertyName + wxT("=") + PropertyValue);
4721 PropertyTokens.Append(wxT(";") + PropertyName + wxT("=") + PropertyValue);
4731 intPropertyLen = PropertySeg2.Len();
4732 SplitPoints.clear();
4733 SplitLength.clear();
4738 CaptureString(&PropertySeg2, FALSE);
4740 for (int i = 0; i <= intPropertyLen; i++){
4744 if (PropertySeg2.Mid(i, 1) == wxT(";")){
4747 SplitPoints.insert(std::make_pair(intSplitsFound, (i + 1)));
4749 if (intSplitsFound == 6){
4751 SplitLength.insert(std::make_pair(intSplitsFound, (intSplitSize - 1)));
4756 SplitLength.insert(std::make_pair(intSplitsFound, (intSplitSize - 1)));
4766 wxString wxSPhotoURI;
4767 wxString wxSPhotoMIME;
4768 wxString wxSPhotoEncoding;
4769 wxString wxSPhotoData;
4770 std::string base64enc;
4772 if (intSplitsFound == 0){
4776 std::map<int, int>::iterator striter;
4778 striter = SplitLength.find(1);
4780 wxStringTokenizer wSTDataType(PropertySeg2.Mid(0, striter->second), wxT(":"));
4782 while (wSTDataType.HasMoreTokens() == TRUE){
4784 wxSPhotoURI = wSTDataType.GetNextToken();
4785 wxSPhotoMIME = wSTDataType.GetNextToken();
4790 wxStringTokenizer wSTDataInfo(PropertySeg2.Mid((striter->second + 1)), wxT(","));
4792 while (wSTDataInfo.HasMoreTokens() == TRUE){
4794 wxSPhotoEncoding = wSTDataInfo.GetNextToken();
4795 wxSPhotoData = wSTDataInfo.GetNextToken();
4796 base64enc = wxSPhotoData.mb_str();
4803 // Add the data to the General/Home/Work address variables.
4805 LogosList.insert(std::make_pair(*LogoCount, base64enc));
4806 LogosListPictureType.insert(std::make_pair(*LogoCount, wxSPhotoMIME));
4807 LogosListPicEncType.insert(std::make_pair(*LogoCount, wxSPhotoEncoding));
4813 LogosListType.insert(std::make_pair(*LogoCount, "home"));
4816 LogosListType.insert(std::make_pair(*LogoCount, "work"));
4820 if (!PropertyTokens.IsEmpty()){
4822 LogosListTokens.insert(std::make_pair(*LogoCount, PropertyTokens));
4828 void ContactDataObject::ProcessSound(wxString PropertySeg1, wxString PropertySeg2, int *SoundCount){
4830 size_t intPropertyLen = PropertySeg1.Len();
4831 std::map<int, int> SplitPoints;
4832 std::map<int, int> SplitLength;
4833 std::map<int, int>::iterator SLiter;
4834 wxString PropertyData;
4835 wxString PropertyName;
4836 wxString PropertyValue;
4837 wxString PropertyTokens;
4838 bool FirstToken = TRUE;
4839 int intSplitsFound = 0;
4840 int intSplitSize = 0;
4841 int intPrevValue = 7;
4845 SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue);
4849 PropertyType PropType = PROPERTY_NONE;
4851 // Look for type before continuing.
4853 CheckType(&PropertySeg1, &SplitPoints, &SplitLength, &intPrevValue, &PropType);
4857 for (std::map<int, int>::iterator intiter = SplitPoints.begin();
4858 intiter != SplitPoints.end(); ++intiter){
4860 SLiter = SplitLength.find(intiter->first);
4862 PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second));
4864 wxStringTokenizer PropertyElement (PropertyData, wxT("="));
4865 PropertyName = PropertyElement.GetNextToken();
4866 PropertyValue = PropertyElement.GetNextToken();
4868 intPrevValue = intiter->second;
4870 // Process properties.
4872 size_t intPropertyValueLen = PropertyValue.Len();
4874 if (PropertyValue.Mid((intPropertyValueLen - 1), 1) == wxT("\"")){
4876 PropertyValue.Trim();
4877 PropertyValue.RemoveLast();
4881 if (PropertyValue.Mid(0, 1) == wxT("\"")){
4883 PropertyValue.Remove(0, 1);
4887 CaptureString(&PropertyValue, FALSE);
4889 if (PropertyName == wxT("ALTID")){
4891 SoundsListAltID.erase(*SoundCount);
4892 SoundsListAltID.insert(std::make_pair(*SoundCount, PropertyValue));
4894 } else if (PropertyName == wxT("PID")){
4896 SoundsListPID.erase(*SoundCount);
4897 SoundsListPID.insert(std::make_pair(*SoundCount, PropertyValue));
4899 } else if (PropertyName == wxT("PREF")){
4901 int PriorityNumber = 0;
4902 bool ValidNumber = TRUE;
4905 PriorityNumber = std::stoi(PropertyValue.ToStdString());
4908 catch(std::invalid_argument &e){
4909 ValidNumber = FALSE;
4912 if (ValidNumber == TRUE){
4914 SoundsListPref.erase(*SoundCount);
4915 SoundsListPref.insert(std::make_pair(*SoundCount, PriorityNumber));
4919 } else if (PropertyName == wxT("MEDIATYPE")){
4921 SoundsListMediatype.erase(*SoundCount);
4922 SoundsListMediatype.insert(std::make_pair(*SoundCount, PropertyValue));
4924 } else if (PropertyName == wxT("LANGUAGE")){
4926 SoundsListLanguage.erase(*SoundCount);
4927 SoundsListLanguage.insert(std::make_pair(*SoundCount, PropertyValue));
4931 // Something else we don't know about so append
4932 // to the tokens variable.
4934 if (!PropertyName.IsEmpty() && !PropertyValue.IsEmpty() && PropertyName != wxT("TYPE")){
4936 if (FirstToken == TRUE){
4938 PropertyTokens.Append(PropertyName + wxT("=") + PropertyValue);
4943 PropertyTokens.Append(wxT(";") + PropertyName + wxT("=") + PropertyValue);
4953 intPropertyLen = PropertySeg2.Len();
4954 SplitPoints.clear();
4955 SplitLength.clear();
4960 CaptureString(&PropertySeg2, FALSE);
4962 for (int i = 0; i <= intPropertyLen; i++){
4966 if (PropertySeg2.Mid(i, 1) == wxT(";")){
4969 SplitPoints.insert(std::make_pair(intSplitsFound, (i + 1)));
4971 if (intSplitsFound == 6){
4973 SplitLength.insert(std::make_pair(intSplitsFound, (intSplitSize - 1)));
4978 SplitLength.insert(std::make_pair(intSplitsFound, (intSplitSize - 1)));
4988 wxString wxSSoundURI;
4989 wxString wxSSoundMIME;
4990 wxString wxSSoundEncoding;
4991 wxString wxSSoundData;
4992 std::string base64enc;
4994 if (intSplitsFound == 0){
4998 std::map<int, int>::iterator striter;
5000 striter = SplitLength.find(1);
5002 wxStringTokenizer wSTDataType(PropertySeg2.Mid(0, striter->second), wxT(":"));
5004 while (wSTDataType.HasMoreTokens() == TRUE){
5006 wxSSoundURI = wSTDataType.GetNextToken();
5007 wxSSoundMIME = wSTDataType.GetNextToken();
5012 wxStringTokenizer wSTDataInfo(PropertySeg2.Mid((striter->second + 1)), wxT(","));
5014 while (wSTDataInfo.HasMoreTokens() == TRUE){
5016 wxSSoundEncoding = wSTDataInfo.GetNextToken();
5017 wxSSoundData = wSTDataInfo.GetNextToken();
5018 base64enc = wxSSoundData.mb_str();
5025 // Add the data to the General/Home/Work address variables.
5031 SoundsListType.insert(std::make_pair(*SoundCount, "home"));
5034 SoundsListType.insert(std::make_pair(*SoundCount, "work"));
5038 SoundsList.insert(std::make_pair(*SoundCount, base64enc));
5039 SoundsListAudioEncType.insert(std::make_pair(*SoundCount, wxSSoundEncoding));
5040 SoundsListAudioType.insert(std::make_pair(*SoundCount, wxSSoundMIME));
5042 if (!PropertyTokens.IsEmpty()){
5044 SoundsListTokens.insert(std::make_pair(*SoundCount, PropertyTokens));
5050 void ContactDataObject::ProcessCalendarURI(wxString PropertySeg1, wxString PropertySeg2, int *CalURICount){
5052 size_t intPropertyLen = PropertySeg1.Len();
5053 std::map<int, int> SplitPoints;
5054 std::map<int, int> SplitLength;
5055 std::map<int, int>::iterator SLiter;
5056 wxString PropertyData;
5057 wxString PropertyName;
5058 wxString PropertyValue;
5059 wxString PropertyTokens;
5060 bool FirstToken = TRUE;
5061 int intSplitsFound = 0;
5062 int intSplitSize = 0;
5063 int intPrevValue = 8;
5067 SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue);
5071 PropertyType PropType = PROPERTY_NONE;
5073 // Look for type before continuing.
5075 CheckType(&PropertySeg1, &SplitPoints, &SplitLength, &intPrevValue, &PropType);
5079 for (std::map<int, int>::iterator intiter = SplitPoints.begin();
5080 intiter != SplitPoints.end(); ++intiter){
5082 SLiter = SplitLength.find(intiter->first);
5084 PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second));
5086 wxStringTokenizer PropertyElement (PropertyData, wxT("="));
5087 PropertyName = PropertyElement.GetNextToken();
5088 PropertyValue = PropertyElement.GetNextToken();
5090 intPrevValue = intiter->second;
5092 // Process properties.
5094 size_t intPropertyValueLen = PropertyValue.Len();
5096 if (PropertyValue.Mid((intPropertyValueLen - 1), 1) == wxT("\"")){
5098 PropertyValue.Trim();
5099 PropertyValue.RemoveLast();
5103 if (PropertyValue.Mid(0, 1) == wxT("\"")){
5105 PropertyValue.Remove(0, 1);
5109 CaptureString(&PropertyValue, FALSE);
5111 if (PropertyName == wxT("ALTID")){
5113 CalendarListAltID.erase(*CalURICount);
5114 CalendarListAltID.insert(std::make_pair(*CalURICount, PropertyValue));
5116 } else if (PropertyName == wxT("PID")){
5118 CalendarListPID.erase(*CalURICount);
5119 CalendarListPID.insert(std::make_pair(*CalURICount, PropertyValue));
5121 } else if (PropertyName == wxT("PREF")){
5123 int PriorityNumber = 0;
5124 bool ValidNumber = TRUE;
5127 PriorityNumber = std::stoi(PropertyValue.ToStdString());
5130 catch(std::invalid_argument &e){
5131 ValidNumber = FALSE;
5134 if (ValidNumber == TRUE){
5136 CalendarListPref.erase(*CalURICount);
5137 CalendarListPref.insert(std::make_pair(*CalURICount, PriorityNumber));
5141 } else if (PropertyName == wxT("MEDIATYPE")){
5143 CalendarListMediatype.erase(*CalURICount);
5144 CalendarListMediatype.insert(std::make_pair(*CalURICount, PropertyValue));
5148 // Something else we don't know about so append
5149 // to the tokens variable.
5151 if (!PropertyName.IsEmpty() && !PropertyValue.IsEmpty() && PropertyName != wxT("TYPE")){
5153 if (FirstToken == TRUE){
5155 PropertyTokens.Append(PropertyName + wxT("=") + PropertyValue);
5160 PropertyTokens.Append(wxT(";") + PropertyName + wxT("=") + PropertyValue);
5170 intPropertyLen = PropertySeg2.Len();
5171 SplitPoints.clear();
5172 SplitLength.clear();
5177 CaptureString(&PropertySeg2, FALSE);
5179 // Add the data to the General/Home/Work address variables.
5185 CalendarListType.insert(std::make_pair(*CalURICount, "home"));
5188 CalendarListType.insert(std::make_pair(*CalURICount, "work"));
5192 CalendarList.insert(std::make_pair(*CalURICount, PropertySeg2));
5194 if (!PropertyTokens.IsEmpty()){
5196 CalendarListTokens.insert(std::make_pair(*CalURICount, PropertyTokens));
5202 void ContactDataObject::ProcessCalendarAddressURI(wxString PropertySeg1, wxString PropertySeg2, int *CalAdrURICount){
5204 size_t intPropertyLen = PropertySeg1.Len();
5205 std::map<int, int> SplitPoints;
5206 std::map<int, int> SplitLength;
5207 std::map<int, int>::iterator SLiter;
5208 wxString PropertyData;
5209 wxString PropertyName;
5210 wxString PropertyValue;
5211 wxString PropertyTokens;
5212 bool FirstToken = TRUE;
5213 int intSplitsFound = 0;
5214 int intSplitSize = 0;
5215 int intPrevValue = 8;
5219 SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue);
5223 PropertyType PropType = PROPERTY_NONE;
5225 // Look for type before continuing.
5227 CheckType(&PropertySeg1, &SplitPoints, &SplitLength, &intPrevValue, &PropType);
5231 for (std::map<int, int>::iterator intiter = SplitPoints.begin();
5232 intiter != SplitPoints.end(); ++intiter){
5234 SLiter = SplitLength.find(intiter->first);
5236 PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second));
5238 wxStringTokenizer PropertyElement (PropertyData, wxT("="));
5239 PropertyName = PropertyElement.GetNextToken();
5240 PropertyValue = PropertyElement.GetNextToken();
5242 intPrevValue = intiter->second;
5244 // Process properties.
5246 size_t intPropertyValueLen = PropertyValue.Len();
5248 if (PropertyValue.Mid((intPropertyValueLen - 1), 1) == wxT("\"")){
5250 PropertyValue.Trim();
5251 PropertyValue.RemoveLast();
5255 if (PropertyValue.Mid(0, 1) == wxT("\"")){
5257 PropertyValue.Remove(0, 1);
5261 CaptureString(&PropertyValue, FALSE);
5263 if (PropertyName == wxT("ALTID")){
5265 CalendarRequestListAltID.erase(*CalAdrURICount);
5266 CalendarRequestListAltID.insert(std::make_pair(*CalAdrURICount, PropertyValue));
5268 } else if (PropertyName == wxT("PID")){
5270 CalendarRequestListPID.erase(*CalAdrURICount);
5271 CalendarRequestListPID.insert(std::make_pair(*CalAdrURICount, PropertyValue));
5273 } else if (PropertyName == wxT("PREF")){
5275 int PriorityNumber = 0;
5276 bool ValidNumber = TRUE;
5279 PriorityNumber = std::stoi(PropertyValue.ToStdString());
5282 catch(std::invalid_argument &e){
5283 ValidNumber = FALSE;
5286 if (ValidNumber == TRUE){
5288 CalendarRequestListPref.erase(*CalAdrURICount);
5289 CalendarRequestListPref.insert(std::make_pair(*CalAdrURICount, PriorityNumber));
5293 } else if (PropertyName == wxT("MEDIATYPE")){
5295 CalendarRequestListMediatype.erase(*CalAdrURICount);
5296 CalendarRequestListMediatype.insert(std::make_pair(*CalAdrURICount, PropertyValue));
5300 // Something else we don't know about so append
5301 // to the tokens variable.
5303 if (!PropertyName.IsEmpty() && !PropertyValue.IsEmpty() && PropertyName != wxT("TYPE")){
5305 if (FirstToken == TRUE){
5307 PropertyTokens.Append(PropertyName + wxT("=") + PropertyValue);
5312 PropertyTokens.Append(wxT(";") + PropertyName + wxT("=") + PropertyValue);
5322 intPropertyLen = PropertySeg2.Len();
5323 SplitPoints.clear();
5324 SplitLength.clear();
5329 CaptureString(&PropertySeg2, FALSE);
5331 // Add the data to the General/Home/Work address variables.
5337 CalendarRequestListType.insert(std::make_pair(*CalAdrURICount, "home"));
5340 CalendarRequestListType.insert(std::make_pair(*CalAdrURICount, "work"));
5344 CalendarRequestList.insert(std::make_pair(*CalAdrURICount, PropertySeg2));
5346 if (!PropertyTokens.IsEmpty()){
5348 CalendarRequestListTokens.insert(std::make_pair(*CalAdrURICount, PropertyTokens));
5354 void ContactDataObject::ProcessCalendarFreeBusy(wxString PropertySeg1, wxString PropertySeg2, int *FreeBusyAddressCount){
5356 size_t intPropertyLen = PropertySeg1.Len();
5357 std::map<int, int> SplitPoints;
5358 std::map<int, int> SplitLength;
5359 std::map<int, int>::iterator SLiter;
5360 wxString PropertyData;
5361 wxString PropertyName;
5362 wxString PropertyValue;
5363 wxString PropertyTokens;
5364 bool FirstToken = TRUE;
5365 int intSplitsFound = 0;
5366 int intSplitSize = 0;
5367 int intPrevValue = 7;
5371 SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue);
5375 PropertyType PropType = PROPERTY_NONE;
5377 // Look for type before continuing.
5379 CheckType(&PropertySeg1, &SplitPoints, &SplitLength, &intPrevValue, &PropType);
5383 for (std::map<int, int>::iterator intiter = SplitPoints.begin();
5384 intiter != SplitPoints.end(); ++intiter){
5386 SLiter = SplitLength.find(intiter->first);
5388 PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second));
5390 wxStringTokenizer PropertyElement (PropertyData, wxT("="));
5391 PropertyName = PropertyElement.GetNextToken();
5392 PropertyValue = PropertyElement.GetNextToken();
5394 intPrevValue = intiter->second;
5396 // Process properties.
5398 size_t intPropertyValueLen = PropertyValue.Len();
5400 if (PropertyValue.Mid((intPropertyValueLen - 1), 1) == wxT("\"")){
5402 PropertyValue.Trim();
5403 PropertyValue.RemoveLast();
5407 if (PropertyValue.Mid(0, 1) == wxT("\"")){
5409 PropertyValue.Remove(0, 1);
5413 CaptureString(&PropertyValue, FALSE);
5415 if (PropertyName == wxT("ALTID")){
5417 FreeBusyListAltID.erase(*FreeBusyAddressCount);
5418 FreeBusyListAltID.insert(std::make_pair(*FreeBusyAddressCount, PropertyValue));
5420 } else if (PropertyName == wxT("PID")){
5422 FreeBusyListPID.erase(*FreeBusyAddressCount);
5423 FreeBusyListPID.insert(std::make_pair(*FreeBusyAddressCount, PropertyValue));
5425 } else if (PropertyName == wxT("PREF")){
5427 int PriorityNumber = 0;
5428 bool ValidNumber = TRUE;
5431 PriorityNumber = std::stoi(PropertyValue.ToStdString());
5434 catch(std::invalid_argument &e){
5435 ValidNumber = FALSE;
5438 if (ValidNumber == TRUE){
5440 FreeBusyListPref.erase(*FreeBusyAddressCount);
5441 FreeBusyListPref.insert(std::make_pair(*FreeBusyAddressCount, PriorityNumber));
5445 } else if (PropertyName == wxT("MEDIATYPE")){
5447 FreeBusyListMediatype.erase(*FreeBusyAddressCount);
5448 FreeBusyListMediatype.insert(std::make_pair(*FreeBusyAddressCount, PropertyValue));
5452 // Something else we don't know about so append
5453 // to the tokens variable.
5455 if (!PropertyName.IsEmpty() && !PropertyValue.IsEmpty() && PropertyName != wxT("TYPE")){
5457 if (FirstToken == TRUE){
5459 PropertyTokens.Append(PropertyName + wxT("=") + PropertyValue);
5464 PropertyTokens.Append(wxT(";") + PropertyName + wxT("=") + PropertyValue);
5474 intPropertyLen = PropertySeg2.Len();
5475 SplitPoints.clear();
5476 SplitLength.clear();
5481 CaptureString(&PropertySeg2, FALSE);
5483 // Add the data to the General/Home/Work address variables.
5489 FreeBusyListType.insert(std::make_pair(*FreeBusyAddressCount, "home"));
5492 FreeBusyListType.insert(std::make_pair(*FreeBusyAddressCount, "work"));
5496 FreeBusyList.insert(std::make_pair(*FreeBusyAddressCount, PropertySeg2));
5498 if (!PropertyTokens.IsEmpty()){
5500 FreeBusyListTokens.insert(std::make_pair(*FreeBusyAddressCount, PropertyTokens));
5506 void ContactDataObject::ProcessKey(wxString PropertySeg1, wxString PropertySeg2, int *KeyCount){
5508 size_t intPropertyLen = PropertySeg1.Len();
5509 std::map<int, int> SplitPoints;
5510 std::map<int, int> SplitLength;
5511 std::map<int, int>::iterator SLiter;
5512 wxString PropertyData;
5513 wxString PropertyName;
5514 wxString PropertyValue;
5515 wxString PropertyTokens;
5516 bool FirstToken = TRUE;
5517 int intSplitsFound = 0;
5518 int intSplitSize = 0;
5519 int intPrevValue = 5;
5524 SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue);
5528 PropertyType PropType = PROPERTY_NONE;
5530 // Look for type before continuing.
5532 CheckType(&PropertySeg1, &SplitPoints, &SplitLength, &intPrevValue, &PropType);
5536 for (std::map<int, int>::iterator intiter = SplitPoints.begin();
5537 intiter != SplitPoints.end(); ++intiter){
5539 SLiter = SplitLength.find(intiter->first);
5541 PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second));
5543 wxStringTokenizer PropertyElement (PropertyData, wxT("="));
5544 PropertyName = PropertyElement.GetNextToken();
5545 PropertyValue = PropertyElement.GetNextToken();
5547 intPrevValue = intiter->second;
5549 // Process properties.
5551 size_t intPropertyValueLen = PropertyValue.Len();
5553 if (PropertyValue.Mid((intPropertyValueLen - 1), 1) == wxT("\"")){
5555 PropertyValue.Trim();
5556 PropertyValue.RemoveLast();
5560 if (PropertyValue.Mid(0, 1) == wxT("\"")){
5562 PropertyValue.Remove(0, 1);
5566 if (PropertyName == wxT("ALTID")){
5568 KeyListAltID.erase(*KeyCount);
5569 KeyListAltID.insert(std::make_pair(*KeyCount, PropertyValue));
5571 } else if (PropertyName == wxT("PID")){
5573 KeyListPID.erase(*KeyCount);
5574 KeyListPID.insert(std::make_pair(*KeyCount, PropertyValue));
5576 } else if (PropertyName == wxT("PREF")){
5578 int PriorityNumber = 0;
5579 bool ValidNumber = TRUE;
5582 PriorityNumber = std::stoi(PropertyValue.ToStdString());
5585 catch(std::invalid_argument &e){
5586 ValidNumber = FALSE;
5589 if (ValidNumber == TRUE){
5591 KeyListPref.erase(*KeyCount);
5592 KeyListPref.insert(std::make_pair(*KeyCount, PriorityNumber));
5598 // Something else we don't know about so append
5599 // to the tokens variable.
5601 if (!PropertyName.IsEmpty() && !PropertyValue.IsEmpty() && PropertyName != wxT("TYPE")){
5603 if (FirstToken == TRUE){
5605 PropertyTokens.Append(PropertyName + wxT("=") + PropertyValue);
5610 PropertyTokens.Append(wxT(";") + PropertyName + wxT("=") + PropertyValue);
5620 intPropertyLen = PropertySeg2.Len();
5621 SplitPoints.clear();
5622 SplitLength.clear();
5627 for (int i = 0; i <= intPropertyLen; i++){
5631 if (PropertySeg2.Mid(i, 1) == wxT(";") && PropertySeg2.Mid((i - 1), 1) != wxT("\\")){
5634 SplitPoints.insert(std::make_pair(intSplitsFound, (i + 1)));
5636 if (intSplitsFound == 6){
5638 SplitLength.insert(std::make_pair(intSplitsFound, (intSplitSize - 1)));
5643 SplitLength.insert(std::make_pair(intSplitsFound, (intSplitSize - 1)));
5654 wxString wxSKeyMIME;
5655 wxString wxSKeyEncoding;
5656 wxString wxSKeyData;
5657 std::string base64enc;
5659 if (intSplitsFound == 0){
5663 std::map<int, int>::iterator striter;
5665 striter = SplitLength.find(1);
5667 wxStringTokenizer wSTDataType(PropertySeg2.Mid(0, striter->second), wxT(":"));
5669 while (wSTDataType.HasMoreTokens() == TRUE){
5671 wxSKeyURI = wSTDataType.GetNextToken();
5672 wxSKeyMIME = wSTDataType.GetNextToken();
5677 if (wxSKeyURI == wxT("data")){
5679 wxStringTokenizer wSTDataInfo(PropertySeg2.Mid((striter->second + 1)), wxT(","));
5681 while (wSTDataInfo.HasMoreTokens() == TRUE){
5683 wxSKeyEncoding = wSTDataInfo.GetNextToken();
5684 wxSKeyData = wSTDataInfo.GetNextToken();
5693 // Add the data to the General/Home/Work address variables.
5695 if (wxSKeyURI == wxT("data")){
5697 KeyListDataEncType.erase(*KeyCount);
5698 KeyListKeyType.erase(*KeyCount);
5699 KeyListDataEncType.insert(std::make_pair(*KeyCount, wxSKeyEncoding));
5700 KeyListKeyType.insert(std::make_pair(*KeyCount, TRUE));
5702 KeyList.erase(*KeyCount);
5703 KeyList.insert(std::make_pair(*KeyCount, wxSKeyData));
5707 KeyList.erase(*KeyCount);
5708 KeyList.insert(std::make_pair(*KeyCount, PropertySeg2));
5712 KeyListDataType.insert(std::make_pair(*KeyCount, wxSKeyMIME));
5718 KeyListType.insert(std::make_pair(*KeyCount, wxT("home")));
5721 KeyListType.insert(std::make_pair(*KeyCount, wxT("work")));
5725 if (!PropertyTokens.IsEmpty()){
5727 KeyListTokens.insert(std::make_pair(*KeyCount, PropertyTokens));
5733 void ContactDataObject::ProcessVendor(wxString PropertySeg1, wxString PropertySeg2, int *VendorCount){
5735 // Split the Vendor three ways.
5737 wxStringTokenizer wSTVendorDetails(PropertySeg1, wxT("-"));
5740 wxString wxSVNDPropName;
5743 while (wSTVendorDetails.HasMoreTokens() == TRUE){
5745 wSTVendorDetails.GetNextToken();
5746 wxSVNDID = wSTVendorDetails.GetNextToken();
5747 wxSVNDPropName = wSTVendorDetails.GetNextToken();
5752 if (!wxSVNDID.IsEmpty() && !wxSVNDPropName.IsEmpty()){
5754 // Add the data to the vendor variables.
5756 VendorList.erase(*VendorCount);
5757 VendorListPEN.erase(*VendorCount);
5758 VendorListElement.erase(*VendorCount);
5760 VendorList.insert(std::make_pair(*VendorCount, PropertySeg2));
5761 VendorListPEN.insert(std::make_pair(*VendorCount, wxSVNDID));
5762 VendorListElement.insert(std::make_pair(*VendorCount, wxSVNDPropName));
5768 void ProcessIntegerValue(ContactDataObject *ContactData,
5769 std::map<int,int> *PrefPtr,
5770 wxString *PropertyValue,
5773 int PriorityNumber = 0;
5774 bool ValidNumber = TRUE;
5777 PriorityNumber = std::stoi(PropertyValue->ToStdString());
5780 catch(std::invalid_argument &e){
5781 ValidNumber = FALSE;
5784 if (ValidNumber == TRUE){
5786 PrefPtr->erase(*ItemCount);
5787 PrefPtr->insert(std::make_pair(*ItemCount, PriorityNumber));
5793 void SplitValues(wxString *PropertyLine,
5794 std::map<int,int> *SplitPoints,
5795 std::map<int,int> *SplitLength,
5798 size_t intPropertyLen = PropertyLine->Len();
5799 int intSplitsFound = 0;
5800 int intSplitSize = 0;
5801 int intSplitSeek = 0;
5803 for (int i = intSize; i <= intPropertyLen; i++){
5807 if (PropertyLine->Mid(i, 1) == wxT(";") &&
5808 PropertyLine->Mid((i - 1), 1) != wxT("\\")){
5810 if (intSplitsFound == 0){
5812 SplitLength->insert(std::make_pair(intSplitsFound, (intSplitSize)));
5816 SplitLength->insert(std::make_pair(intSplitsFound, (intSplitSize - 1)));
5820 SplitPoints->insert(std::make_pair(intSplitsFound, (i + 1)));
5830 if (intSplitsFound == 0){
5832 SplitPoints->insert(std::make_pair(intSplitsFound, (8 + 1)));
5833 SplitLength->insert(std::make_pair(intSplitsFound, intSplitSize));
5837 SplitPoints->insert(std::make_pair(intSplitsFound, (intSplitSeek + 1)));
5838 SplitLength->insert(std::make_pair(intSplitsFound, intSplitSize));
5844 void CheckType(wxString *PropertySeg1,
5845 std::map<int,int> *SplitPoints,
5846 std::map<int,int> *SplitLength,
5848 PropertyType *PropType){
5850 wxString PropertyData;
5851 wxString PropertyName;
5852 wxString PropertyValue;
5853 std::map<int,int>::iterator SLiter;
5855 for (std::map<int, int>::iterator intiter = SplitPoints->begin();
5856 intiter != SplitPoints->end(); ++intiter){
5858 SLiter = SplitLength->find(intiter->first);
5860 PropertyData = PropertySeg1->Mid(*intPrevValue, (SLiter->second));
5862 wxStringTokenizer PropertyElement (PropertyData, wxT("="));
5863 PropertyName = PropertyElement.GetNextToken();
5864 PropertyValue = PropertyElement.GetNextToken();
5866 *intPrevValue = intiter->second;
5868 if (PropertyName == wxT("TYPE")){
5870 if (PropertyValue == wxT("work")){
5872 *PropType = PROPERTY_WORK;
5874 } else if (PropertyValue == wxT("home")){
5876 *PropType = PROPERTY_HOME;
5880 *PropType = PROPERTY_NONE;