// ContactDataObject.cpp - Client Data Object. // // (c) 2012-2016 Xestia Software Development. // // This file is part of Xestia Address Book. // // Xestia Address Book is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by the // Free Software Foundation, version 3 of the license. // // Xestia Address Book is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License along // with Xestia Address Book. If not, see #include "ContactDataObject.h" ContactLoadStatus ContactDataObject::LoadFile(wxString Filename){ // Load the ContactDataObject using the Filename given. if (!wxFileExists(Filename)){ return CONTACTLOAD_FILEMISSING; } wxFile ContactFile; if (!ContactFile.Open(Filename, wxFile::read, wxS_DEFAULT)){ return CONTACTLOAD_FILEERROR; } // Check that the vCard is a valid vCard 4.0 file. vCard vCard4FormatCheck; vCard4FormatCheck.LoadFile(Filename); if (vCard4FormatCheck.Get("VERSION") != wxT("4.0")){ return CONTACTLOAD_FILEINVALIDFORMAT; } // Check that the vCard meets the base specification. if (!vCard4FormatCheck.MeetBaseSpecification()){ return CONTACTLOAD_FILEBASESPECFAIL; } wxStringTokenizer wSTContactFileLines(vCard4FormatCheck.WriteString(), wxT("\r\n")); std::map ContactFileLines; int ContactLineSeek = 0; while (wSTContactFileLines.HasMoreTokens() == TRUE){ wxString ContactLine = wSTContactFileLines.GetNextToken(); ContactFileLines.insert(std::make_pair(ContactLineSeek, ContactLine)); ContactLineSeek++; } wxString wxSPropertyNextLine; bool ExtraLineSeek = TRUE; bool QuoteMode = FALSE; bool PropertyFind = TRUE; bool KindProcessed = FALSE; bool NameProcessed = FALSE; bool GenderProcessed = FALSE; bool BirthdayProcessed = FALSE; bool AnniversaryProcessed = FALSE; bool UIDProcessed = FALSE; bool RevisionProcessed = FALSE; int ContactLineLen = 0; int QuoteBreakPoint = 0; int SourceCount = 0; int GroupCount = 0; int FNCount = 0; int NicknameCount = 0; int TimeZoneCount = 0; int AddressCount = 0; int EmailCount = 0; int IMCount = 0; int TelephoneCount = 0; int LanguageCount = 0; int GeographicCount = 0; int RelatedCount = 0; int URLCount = 0; int TitleCount = 0; int RoleCount = 0; int OrganisationCount = 0; int NoteCount = 0; int CategoryCount = 0; int PhotoCount = 0; int LogoCount = 0; int SoundCount = 0; int CalendarCount = 0; int CalendarAddressCount = 0; int FreeBusyAddressCount = 0; int KeyCount = 0; int VendorCount = 0; int XTokenCount = 0; int XMLCount = 0; int ClientPIDCount = 0; wxString ContactLine; wxString PropertyLine; wxString PropertySeg1; wxString PropertySeg2; wxString PropertyNextLine; wxString Property; for (std::map::iterator iter = ContactFileLines.begin(); iter != ContactFileLines.end(); ++iter){ ExtraLineSeek = TRUE; QuoteMode = FALSE; PropertyFind = TRUE; ContactLineLen = 0; QuoteBreakPoint = 0; ContactLine.Clear(); PropertyLine.Clear(); PropertySeg1.Clear(); PropertySeg2.Clear(); Property.Clear(); ContactLine = iter->second; while (ExtraLineSeek == TRUE){ // Check if there is extra data on the next line // (indicated by space or tab at the start) and add data. iter++; if (iter == ContactFileLines.end()){ iter--; break; } PropertyNextLine = iter->second; if (PropertyNextLine.Mid(0, 1) == wxT(" ") || PropertyNextLine.Mid(0, 1) == wxT("\t")){ PropertyNextLine.Remove(0, 1); ContactLine.Append(PropertyNextLine); } else { iter--; ExtraLineSeek = FALSE; } } ContactLineLen = ContactLine.Len(); // Make sure we are not in quotation mode. // Make sure colon does not have \ or \\ before it. for (int i = 0; i <= ContactLineLen; i++){ if ((ContactLine.Mid(i, 1) == wxT(";") || ContactLine.Mid(i, 1) == wxT(":")) && PropertyFind == TRUE){ PropertyFind = FALSE; } else if (PropertyFind == TRUE){ Property.Append(ContactLine.Mid(i, 1)); } if (ContactLine.Mid(i, 1) == wxT("\"")){ if (QuoteMode == TRUE){ QuoteMode = FALSE; } else { QuoteMode = TRUE; } } if (ContactLine.Mid(i, 1) == wxT(":") && ContactLine.Mid((i - 1), 1) != wxT("\\") && QuoteMode == FALSE){ QuoteBreakPoint = i; break; } } // Split that line at the point into two variables (ignore the colon). PropertySeg1 = ContactLine.Mid(0, QuoteBreakPoint); PropertySeg2 = ContactLine.Mid((QuoteBreakPoint + 1)); if (Property == wxT("KIND") && KindProcessed == FALSE){ ProcessKind(PropertySeg2); } else if (Property == wxT("UID") && UIDProcessed == FALSE){ UIDToken = PropertySeg2; UIDProcessed = TRUE; } else if (Property == wxT("SOURCE")){ ProcessSource(PropertySeg1, PropertySeg2, &SourceCount); SourceCount++; } else if (Property == wxT("XML")){ ProcessXML(PropertySeg1, PropertySeg2, &XMLCount); XMLCount++; } else if (Property == wxT("REV") && RevisionProcessed == FALSE){ ProcessRevision(PropertySeg1, PropertySeg2); RevisionProcessed = TRUE; } else if (Property == wxT("MEMBER")){ ProcessMember(PropertySeg1, PropertySeg2, &GroupCount); GroupCount++; } else if (Property == wxT("FN")){ ProcessFN(PropertySeg1, PropertySeg2, &FNCount); FNCount++; } else if (Property == wxT("N") && NameProcessed == FALSE){ ProcessN(PropertySeg1, PropertySeg2); NameProcessed = TRUE; } else if (Property == wxT("CLIENTPIDMAP")){ ProcessClientPIDMap(PropertySeg1, PropertySeg2, &ClientPIDCount); ClientPIDCount++; } else if (Property == wxT("NICKNAME")){ ProcessNickname(PropertySeg1, PropertySeg2, &NicknameCount); NicknameCount++; } else if (Property == wxT("GENDER") && GenderProcessed == FALSE){ ProcessGender(PropertySeg1, PropertySeg2); GenderProcessed = TRUE; } else if (Property == wxT("BDAY") && BirthdayProcessed == FALSE){ ProcessBirthday(PropertySeg1, PropertySeg2); BirthdayProcessed = TRUE; } else if (Property == wxT("ANNIVERSARY") && AnniversaryProcessed == FALSE){ ProcessAnniversary(PropertySeg1, PropertySeg2); AnniversaryProcessed = TRUE; } else if (Property == wxT("TZ")){ ProcessTimeZone(PropertySeg1, PropertySeg2, &TimeZoneCount); TimeZoneCount++; } else if (Property == wxT("ADR")){ ProcessAddress(PropertySeg1, PropertySeg2, &AddressCount); AddressCount++; } else if (Property == wxT("EMAIL")){ ProcessEmail(PropertySeg1, PropertySeg2, &EmailCount); EmailCount++; } else if (Property == wxT("IMPP")){ ProcessIM(PropertySeg1, PropertySeg2, &IMCount); IMCount++; } else if (Property == wxT("TEL")){ ProcessTelephone(PropertySeg1, PropertySeg2, &TelephoneCount); TelephoneCount++; } else if (Property == wxT("LANG")){ // See frmContactEditor-LoadLanguage.cpp ProcessLanguage(PropertySeg1, PropertySeg2, &LanguageCount); LanguageCount++; } else if (Property == wxT("GEO")){ // See frmContactEditor-LoadGeo.cpp ProcessGeographic(PropertySeg1, PropertySeg2, &GeographicCount); GeographicCount++; } else if (Property == wxT("RELATED")){ // See fromContactEditor-LoadRelated.cpp ProcessRelated(PropertySeg1, PropertySeg2, &RelatedCount); RelatedCount++; } else if (Property == wxT("URL")){ // See frmContactEditor-LoadURL.cpp ProcessURL(PropertySeg1, PropertySeg2, &URLCount); URLCount++; } else if (Property == wxT("TITLE")) { // See frmContactEditor-LoadTitle.cpp ProcessTitle(PropertySeg1, PropertySeg2, &TitleCount); TitleCount++; } else if (Property == wxT("ROLE")) { // See frmContactEditor-LoadTitle.cpp ProcessRole(PropertySeg1, PropertySeg2, &RoleCount); RoleCount++; } else if (Property == wxT("ORG")) { // See frmContactEditor-LoadOrg.cpp ProcessOrganisation(PropertySeg1, PropertySeg2, &OrganisationCount); OrganisationCount++; } else if (Property == wxT("NOTE")) { // See frmContactEditor-LoadNote.cpp ProcessNote(PropertySeg1, PropertySeg2, &NoteCount); NoteCount++; } else if (Property == wxT("CATEGORIES")) { // See frmContactEditor-LoadCategory.cpp ProcessCategory(PropertySeg1, PropertySeg2, &CategoryCount); CategoryCount++; } else if (Property == wxT("PHOTO")) { // See frmContactEditor-LoadPhoto.cpp ProcessPhoto(PropertySeg1, PropertySeg2, &PhotoCount); PhotoCount++; } else if (Property == wxT("LOGO")) { // See frmContactEditor-LoadPhoto.cpp ProcessLogo(PropertySeg1, PropertySeg2, &LogoCount); LogoCount++; } else if (Property == wxT("SOUND")) { // See frmContactEditor-LoadSound.cpp ProcessSound(PropertySeg1, PropertySeg2, &SoundCount); SoundCount++; } else if (Property == wxT("CALURI")){ // See frmContactEditor-LoadCalendar.cpp ProcessCalendarURI(PropertySeg1, PropertySeg2, &CalendarCount); CalendarCount++; } else if (Property == wxT("CALADRURI")){ ProcessCalendarAddressURI(PropertySeg1, PropertySeg2, &CalendarAddressCount); CalendarAddressCount++; } else if (Property == wxT("FBURL")){ // See frmContactEditor-LoadCalendar.cpp ProcessCalendarFreeBusy(PropertySeg1, PropertySeg2, &FreeBusyAddressCount); FreeBusyAddressCount++; } else if (Property == wxT("KEY")){ // See frmContactEditor-LoadKey.cpp ProcessKey(PropertySeg1, PropertySeg2, &KeyCount); KeyCount++; } else if (Property.Mid(0, 3) == wxT("VND")){ ProcessVendor(PropertySeg1, PropertySeg2, &VendorCount); VendorCount++; } else if (Property.Mid(0, 2) == wxT("X-")){ XTokenList.insert(std::make_pair(XTokenCount, PropertySeg2)); XTokenListTokens.insert(std::make_pair(XTokenCount, PropertySeg1.Mid(2))); XTokenCount++; } } return CONTACTLOAD_OK; } void ContactDataObject::ProcessKind(wxString KindType){ // Process the type of contact. if (KindType == wxT("individual")){ ContactKind = CONTACTKIND_INDIVIDUAL; } else if (KindType == wxT("group")){ ContactKind = CONTACTKIND_GROUP; } else if (KindType == wxT("org")){ ContactKind = CONTACTKIND_ORGANISATION; } else if (KindType == wxT("location")){ ContactKind = CONTACTKIND_LOCATION; } else { ContactKind = CONTACTKIND_NONE; } } void ContactDataObject::ProcessRevision(wxString PropertySeg1, wxString PropertySeg2){ // Process the revision date. std::map SplitPoints; std::map SplitLength; std::map::iterator SLiter; wxString PropertyData; wxString PropertyName; wxString PropertyValue; wxString PropertyTokens; bool FirstToken = TRUE; int intPrevValue = 5; SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue); intPrevValue = 4; for (std::map::iterator intiter = SplitPoints.begin(); intiter != SplitPoints.end(); ++intiter){ SLiter = SplitLength.find(intiter->first); PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second)); ProcessNameValue(&PropertyData, &PropertyName, &PropertyValue); intPrevValue = intiter->second; // Process properties. size_t intPropertyValueLen = PropertyValue.Len(); if (PropertyValue.Mid((intPropertyValueLen - 1), 1) == wxT("\"")){ PropertyValue.Trim(); PropertyValue.RemoveLast(); } if (PropertyValue.Mid(0, 1) == wxT("\"")){ PropertyValue.Remove(0, 1); } CaptureString(&PropertyValue, FALSE); ProcessTokens(&PropertyName, &PropertyValue, &PropertyTokens, &FirstToken); } CaptureString(&PropertySeg2, FALSE); Revision = PropertySeg2; if (!PropertyTokens.IsEmpty()){ RevisionTokens = PropertyTokens; } } void ContactDataObject::ProcessSource(wxString PropertySeg1, wxString PropertySeg2, int *SourceCount){ // Process the source address. std::map SplitPoints; std::map SplitLength; std::map::iterator SLiter; wxString PropertyData; wxString PropertyName; wxString PropertyValue; wxString PropertyTokens; bool FirstToken = TRUE; bool PropertyMatched = FALSE; int intPrevValue = 8; SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue); intPrevValue = 7; PropertyType PropType = PROPERTY_NONE; // Look for type before continuing. CheckType(&PropertySeg1, &SplitPoints, &SplitLength, &intPrevValue, &PropType); intPrevValue = 7; for (std::map::iterator intiter = SplitPoints.begin(); intiter != SplitPoints.end(); ++intiter){ SLiter = SplitLength.find(intiter->first); PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second)); ProcessNameValue(&PropertyData, &PropertyName, &PropertyValue); intPrevValue = intiter->second; // Process properties. size_t intPropertyValueLen = PropertyValue.Len(); if (PropertyValue.Mid((intPropertyValueLen - 1), 1) == wxT("\"")){ PropertyValue.Trim(); PropertyValue.RemoveLast(); } if (PropertyValue.Mid(0, 1) == wxT("\"")){ PropertyValue.Remove(0, 1); } CaptureString(&PropertyValue, FALSE); ProcessStringValue(&PropertyName, "ALTID", &SourceListAltID, &PropertyValue, SourceCount, &PropertyMatched); ProcessStringValue(&PropertyName, "PID", &SourceListPID, &PropertyValue, SourceCount, &PropertyMatched); ProcessStringValue(&PropertyName, "MEDIATYPE", &SourceListMediatype, &PropertyValue, SourceCount, &PropertyMatched); ProcessIntegerValue(&PropertyName, "PREF", &SourceListPref, &PropertyValue, SourceCount, &PropertyMatched); if (PropertyMatched == TRUE){ PropertyMatched = FALSE; continue; } ProcessTokens(&PropertyName, &PropertyValue, &PropertyTokens, &FirstToken); } SplitPoints.clear(); SplitLength.clear(); intPrevValue = 0; CaptureString(&PropertySeg2, FALSE); // Add the data to the General/Home/Work address variables. switch(PropType){ case PROPERTY_NONE: break; case PROPERTY_HOME: SourceListType.insert(std::make_pair(*SourceCount, "home")); break; case PROPERTY_WORK: SourceListType.insert(std::make_pair(*SourceCount, "work")); break; } SourceList.insert(std::make_pair(*SourceCount, PropertySeg2)); if (!PropertyTokens.IsEmpty()){ SourceListTokens.insert(std::make_pair(*SourceCount, PropertyTokens)); } } void ContactDataObject::ProcessXML(wxString PropertySeg1, wxString PropertySeg2, int *XMLCount){ // Process the XML data. std::map SplitPoints; std::map SplitLength; int intPrevValue = 5; SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue); intPrevValue = 4; wxString PropertyName; wxString PropertyValue; wxString PropertyData; wxString PropertyTokens; std::map::iterator SLiter; bool PropertyMatched = FALSE; for (std::map::iterator intiter = SplitPoints.begin(); intiter != SplitPoints.end(); ++intiter){ SLiter = SplitLength.find(intiter->first); PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second)); ProcessNameValue(&PropertyData, &PropertyName, &PropertyValue); intPrevValue = intiter->second; CaptureString(&PropertyValue, FALSE); ProcessStringValue(&PropertyName, "ALTID", &XMLListAltID, &PropertyValue, XMLCount, &PropertyMatched); if (PropertyMatched == TRUE){ PropertyMatched = FALSE; continue; } } XMLList.insert(std::make_pair(*XMLCount, PropertySeg2)); } void ContactDataObject::ProcessMember(wxString PropertySeg1, wxString PropertySeg2, int *GroupCount){ // Process the membership data. std::map SplitPoints; std::map SplitLength; int intPrevValue = 8; SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue); intPrevValue = 7; wxString PropertyName; wxString PropertyValue; wxString PropertyData; wxString PropertyTokens; std::map::iterator SLiter; bool FirstToken = TRUE; bool PropertyMatched = FALSE; for (std::map::iterator intiter = SplitPoints.begin(); intiter != SplitPoints.end(); ++intiter){ SLiter = SplitLength.find(intiter->first); PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second)); ProcessNameValue(&PropertyData, &PropertyName, &PropertyValue); intPrevValue = intiter->second; CaptureString(&PropertyValue, FALSE); ProcessStringValue(&PropertyName, "ALTID", &GroupsListAltID, &PropertyValue, GroupCount, &PropertyMatched); ProcessStringValue(&PropertyName, "PID", &GroupsListPID, &PropertyValue, GroupCount, &PropertyMatched); ProcessStringValue(&PropertyName, "MEDIATYPE", &GroupsListMediaType, &PropertyValue, GroupCount, &PropertyMatched); ProcessIntegerValue(&PropertyName, "PREF", &GroupsListPref, &PropertyValue, GroupCount, &PropertyMatched); if (PropertyMatched == TRUE){ PropertyMatched = FALSE; continue; } ProcessTokens(&PropertyName, &PropertyValue, &PropertyTokens, &FirstToken); } GroupsList.insert(std::make_pair(*GroupCount, PropertySeg2)); if (!PropertyTokens.IsEmpty()){ GroupsListTokens.insert(std::make_pair(*GroupCount, PropertyTokens)); } } void ContactDataObject::ProcessFN(wxString PropertySeg1, wxString PropertySeg2, int *FNCount){ // Process the full name. std::map SplitPoints; std::map SplitLength; int intPrevValue = 4; SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue); intPrevValue = 3; wxString PropertyName; wxString PropertyValue; wxString PropertyData; wxString PropertyTokens; std::map::iterator SLiter; bool FirstToken = TRUE; bool PropertyMatched = FALSE; for (std::map::iterator intiter = SplitPoints.begin(); intiter != SplitPoints.end(); ++intiter){ SLiter = SplitLength.find(intiter->first); PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second)); ProcessNameValue(&PropertyData, &PropertyName, &PropertyValue); intPrevValue = intiter->second; CaptureString(&PropertyValue, FALSE); if (PropertyName == wxT("TYPE")){ if (!PropertyValue.IsEmpty() || PropertyValue == wxT("home") || PropertyValue == wxT("work") ){ FullNamesListType.erase(*FNCount); FullNamesListType.insert(std::make_pair(*FNCount, PropertyValue)); } PropertyMatched = TRUE; } ProcessStringValue(&PropertyName, "ALTID", &FullNamesListAltID, &PropertyValue, FNCount, &PropertyMatched); ProcessStringValue(&PropertyName, "PID", &FullNamesListPID, &PropertyValue, FNCount, &PropertyMatched); ProcessStringValue(&PropertyName, "LANGUAGE", &FullNamesListLanguage, &PropertyValue, FNCount, &PropertyMatched); ProcessIntegerValue(&PropertyName, "PREF", &FullNamesListPref, &PropertyValue, FNCount, &PropertyMatched); if (PropertyMatched == TRUE){ PropertyMatched = FALSE; continue; } ProcessTokens(&PropertyName, &PropertyValue, &PropertyTokens, &FirstToken); } FullNamesList.insert(std::make_pair(*FNCount, PropertySeg2)); if (!PropertyTokens.IsEmpty()){ FullNamesListTokens.insert(std::make_pair(*FNCount, PropertyTokens)); } } void ContactDataObject::ProcessN(wxString PropertySeg1, wxString PropertySeg2){ // Process the name. std::map SplitPoints; std::map SplitLength; int intPrevValue = 3; SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue); intPrevValue = 2; wxString PropertyName; wxString PropertyValue; wxString PropertyData; wxString PropertyTokens; std::map::iterator SLiter; bool FirstToken = TRUE; for (std::map::iterator intiter = SplitPoints.begin(); intiter != SplitPoints.end(); ++intiter){ SLiter = SplitLength.find(intiter->first); PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second)); ProcessNameValue(&PropertyData, &PropertyName, &PropertyValue); intPrevValue = intiter->second; CaptureString(&PropertyValue, FALSE); if (PropertyName == wxT("ALTID")){ NameAltID = PropertyValue; } else if (PropertyName == wxT("LANGUAGE")){ NameLanguage = PropertyValue; } else if (PropertyName == wxT("SORT-AS")){ if (PropertyValue.Left(1) == wxT("\"") && PropertyValue.Right(1) == wxT("\"") && PropertyValue.Len() >= 3){ NameDisplayAs = PropertyValue.Mid(1, (PropertyValue.Len() - 2)); } } else if (!PropertyName.IsEmpty() && !PropertyValue.IsEmpty()){ ProcessTokens(&PropertyName, &PropertyValue, &PropertyTokens, &FirstToken); } } // Split the name data. int intSplitSeek = 0; int intSplitsFound = 0; int intSplitSize = 0; int intPropertyLen = PropertySeg2.Len(); std::map NameValues; intPrevValue = 0; for (int i = 0; i <= intPropertyLen; i++){ if (PropertySeg2.Mid(i, 1) == wxT(";") && PropertySeg2.Mid((i - 1), 1) != wxT("\\")){ NameValues.insert(std::make_pair(++intSplitsFound, PropertySeg2.Mid(intSplitSeek, intSplitSize))); intSplitSeek = i; intSplitSeek++; if (intSplitsFound == 4){ NameValues.insert(std::make_pair(++intSplitsFound, PropertySeg2.Mid(intSplitSeek, wxString::npos))); break; } intSplitSize = 0; continue; } intSplitSize++; } // Split the data into several parts. for (std::map::iterator iter = NameValues.begin(); iter != NameValues.end(); ++iter){ if (iter->first == 1){ // Deal with family name. NameSurname = iter->second; } else if (iter->first == 2){ // Deal with given names. NameForename = iter->second; } else if (iter->first == 3){ // Deal with additional names. NameOtherNames = iter->second; } else if (iter->first == 4){ // Deal with honorifix prefixes and suffixes. NameTitle = iter->second; iter++; if (iter == NameValues.end()){ break; } NameSuffix = iter->second; } } // Add the name token data. if (!PropertyTokens.IsEmpty()){ NameTokens = PropertyTokens; } } void ContactDataObject::ProcessClientPIDMap(wxString PropertySeg1, wxString PropertySeg2, int *ClientPIDCount){ // Process the Client PID Map. std::map SplitPoints; std::map SplitLength; std::map::iterator SLiter; wxString PropertyData; wxString PropertyName; wxString PropertyValue; wxString PropertyTokens; bool FirstToken = TRUE; int intPrevValue = 14; SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue); intPrevValue = 13; for (std::map::iterator intiter = SplitPoints.begin(); intiter != SplitPoints.end(); ++intiter){ SLiter = SplitLength.find(intiter->first); PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second)); ProcessNameValue(&PropertyData, &PropertyName, &PropertyValue); intPrevValue = intiter->second; // Process properties. CaptureString(&PropertyValue, FALSE); ProcessTokens(&PropertyName, &PropertyValue, &PropertyTokens, &FirstToken); } CaptureString(&PropertySeg2, FALSE); ClientPIDList.insert(std::make_pair(*ClientPIDCount, PropertySeg2)); if (!PropertyTokens.IsEmpty()){ ClientPIDListTokens.insert(std::make_pair(*ClientPIDCount, PropertyTokens)); } } void ContactDataObject::ProcessNickname(wxString PropertySeg1, wxString PropertySeg2, int *NicknameCount){ // Process the Nickname. std::map SplitPoints; std::map SplitLength; int intPrevValue = 10; SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue); intPrevValue = 9; PropertyType PropType = PROPERTY_NONE; // Look for type before continuing. CheckType(&PropertySeg1, &SplitPoints, &SplitLength, &intPrevValue, &PropType); intPrevValue = 9; std::map *NicknamesList = NULL; std::map *NicknamesListType = NULL; std::map *NicknamesListLanguage = NULL; std::map *NicknamesListAltID = NULL; std::map *NicknamesListPID = NULL; std::map *NicknamesListTokens = NULL; std::map *NicknamesListPref = NULL; switch(PropType){ case PROPERTY_NONE: NicknamesList = &GeneralNicknamesList; NicknamesListType = &GeneralNicknamesListType; NicknamesListLanguage = &GeneralNicknamesListLanguage; NicknamesListAltID = &GeneralNicknamesListAltID; NicknamesListPID = &GeneralNicknamesListPID; NicknamesListTokens = &GeneralNicknamesListTokens; NicknamesListPref = &GeneralNicknamesListPref; break; case PROPERTY_HOME: NicknamesList = &HomeNicknamesList; NicknamesListType = &HomeNicknamesListType; NicknamesListLanguage = &HomeNicknamesListLanguage; NicknamesListAltID = &HomeNicknamesListAltID; NicknamesListPID = &HomeNicknamesListPID; NicknamesListTokens = &HomeNicknamesListTokens; NicknamesListPref = &HomeNicknamesListPref; break; case PROPERTY_WORK: NicknamesList = &BusinessNicknamesList; NicknamesListType = &BusinessNicknamesListType; NicknamesListLanguage = &BusinessNicknamesListLanguage; NicknamesListAltID = &BusinessNicknamesListAltID; NicknamesListPID = &BusinessNicknamesListPID; NicknamesListTokens = &BusinessNicknamesListTokens; NicknamesListPref = &BusinessNicknamesListPref; break; } std::map::iterator SLiter; wxString PropertyData; wxString PropertyName; wxString PropertyValue; wxString PropertyTokens; bool FirstToken = TRUE; bool PropertyMatched = FALSE; for (std::map::iterator intiter = SplitPoints.begin(); intiter != SplitPoints.end(); ++intiter){ SLiter = SplitLength.find(intiter->first); PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second)); ProcessNameValue(&PropertyData, &PropertyName, &PropertyValue); intPrevValue = intiter->second; CaptureString(&PropertyValue, FALSE); ProcessStringValue(&PropertyName, "ALTID", NicknamesListAltID, &PropertyValue, NicknameCount, &PropertyMatched); ProcessStringValue(&PropertyName, "PID", NicknamesListPID, &PropertyValue, NicknameCount, &PropertyMatched); ProcessStringValue(&PropertyName, "LANGUAGE", NicknamesListLanguage, &PropertyValue, NicknameCount, &PropertyMatched); ProcessIntegerValue(&PropertyName, "PREF", NicknamesListPref, &PropertyValue, NicknameCount, &PropertyMatched); if (PropertyMatched == TRUE){ PropertyMatched = FALSE; continue; } ProcessTokens(&PropertyName, &PropertyValue, &PropertyTokens, &FirstToken); } NicknamesList->insert(std::make_pair(*NicknameCount, PropertySeg2)); // Add the name token data. if (!PropertyTokens.IsEmpty()){ NicknamesListTokens->insert(std::make_pair(*NicknameCount, PropertyTokens)); } } void ContactDataObject::ProcessGender(wxString PropertySeg1, wxString PropertySeg2){ // Process the gender. std::map SplitPoints; std::map SplitLength; std::map::iterator SLiter; wxString PropertyData; wxString PropertyName; wxString PropertyValue; wxString PropertyTokens; bool FirstToken = TRUE; int intPrevValue = 8; SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue); intPrevValue = 7; for (std::map::iterator intiter = SplitPoints.begin(); intiter != SplitPoints.end(); ++intiter){ SLiter = SplitLength.find(intiter->first); PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second)); ProcessNameValue(&PropertyData, &PropertyName, &PropertyValue); intPrevValue = intiter->second; // Process properties. size_t intPropertyValueLen = PropertyValue.Len(); if (PropertyValue.Mid((intPropertyValueLen - 1), 1) == wxT("\"")){ PropertyValue.Trim(); PropertyValue.RemoveLast(); } if (PropertyValue.Mid(0, 1) == wxT("\"")){ PropertyValue.Remove(0, 1); } ProcessTokens(&PropertyName, &PropertyValue, &PropertyTokens, &FirstToken); } wxStringTokenizer GenderData (PropertySeg2, wxT(";")); wxString GenderComponent; if (GenderData.CountTokens() >= 2){ Gender = GenderData.GetNextToken(); GenderDetails = GenderData.GetString(); CaptureString(&GenderDetails, FALSE); } else { Gender = GenderData.GetNextToken(); } if (!PropertyTokens.IsEmpty()){ GenderTokens = PropertyTokens; } } void ContactDataObject::ProcessBirthday(wxString PropertySeg1, wxString PropertySeg2){ // Process birthday date. std::map SplitPoints; std::map SplitLength; std::map::iterator SLiter; wxString PropertyData; wxString PropertyName; wxString PropertyValue; wxString PropertyTokens; int intPrevValue = 6; SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue); intPrevValue = 5; // Look for type before continuing. for (std::map::iterator intiter = SplitPoints.begin(); intiter != SplitPoints.end(); ++intiter){ SLiter = SplitLength.find(intiter->first); PropertyData = PropertySeg1.Mid(intPrevValue, SLiter->second); ProcessNameValue(&PropertyData, &PropertyName, &PropertyValue); intPrevValue = intiter->second; if (PropertyName == wxT("VALUE") && PropertyValue == wxT("text") && BirthdayText == FALSE){ CaptureString(&PropertySeg2, FALSE); Birthday = PropertySeg2; BirthdayText = TRUE; } } // Setup blank lines for later on. intPrevValue = 5; bool FirstToken = TRUE; for (std::map::iterator intiter = SplitPoints.begin(); intiter != SplitPoints.end(); ++intiter){ SLiter = SplitLength.find(intiter->first); PropertyData = PropertySeg1.Mid(intPrevValue, SLiter->second); ProcessNameValue(&PropertyData, &PropertyName, &PropertyValue); intPrevValue = intiter->second; // Process properties. CaptureString(&PropertyValue, FALSE); if (PropertyValue.Mid((PropertyValue.Len() - 1), 1) == wxT("\"")){ PropertyValue.Trim(); PropertyValue.RemoveLast(); } if (PropertyValue.Mid(0, 1) == wxT("\"")){ PropertyValue.Remove(0, 1); } if (PropertyName == wxT("ALTID")){ BirthdayAltID = PropertyValue; } else if (PropertyName == wxT("CALSCALE")){ BirthdayCalScale = PropertyValue; } else if (PropertyName != wxT("VALUE")) { // Something else we don't know about so append // to the tokens variable. ProcessTokens(&PropertyName, &PropertyValue, &PropertyTokens, &FirstToken); } } // Add the data to the variables and form. if (BirthdayText == FALSE){ Birthday = PropertySeg2; } if (!PropertyTokens.IsEmpty()){ BirthdayTokens = PropertyTokens; } } void ContactDataObject::ProcessAnniversary(wxString PropertySeg1, wxString PropertySeg2){ // Process the anniversary. std::map SplitPoints; std::map SplitLength; std::map::iterator SLiter; wxString PropertyData; wxString PropertyName; wxString PropertyValue; wxString PropertyTokens; int intPrevValue = 13; SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue); intPrevValue = 12; // Look for type before continuing. for (std::map::iterator intiter = SplitPoints.begin(); intiter != SplitPoints.end(); ++intiter){ SLiter = SplitLength.find(intiter->first); PropertyData = PropertySeg1.Mid(intPrevValue, SLiter->second); ProcessNameValue(&PropertyData, &PropertyName, &PropertyValue); intPrevValue = intiter->second; if (PropertyName == wxT("VALUE") && PropertyValue == wxT("text") && AnniversaryText == FALSE){ CaptureString(&PropertySeg2, FALSE); Anniversary = PropertySeg2; AnniversaryText = TRUE; } } // Setup blank lines for later on. intPrevValue = 12; bool FirstToken = TRUE; for (std::map::iterator intiter = SplitPoints.begin(); intiter != SplitPoints.end(); ++intiter){ SLiter = SplitLength.find(intiter->first); PropertyData = PropertySeg1.Mid(intPrevValue, SLiter->second); ProcessNameValue(&PropertyData, &PropertyName, &PropertyValue); intPrevValue = intiter->second; // Process properties. CaptureString(&PropertyValue, FALSE); if (PropertyValue.Mid((PropertyValue.Len() - 1), 1) == wxT("\"")){ PropertyValue.Trim(); PropertyValue.RemoveLast(); } if (PropertyValue.Mid(0, 1) == wxT("\"")){ PropertyValue.Remove(0, 1); } if (PropertyName == wxT("ALTID")){ AnniversaryAltID = PropertyValue; } else if (PropertyName == wxT("CALSCALE")){ AnniversaryCalScale = PropertyValue; } else if (PropertyName != wxT("VALUE")) { // Something else we don't know about so append // to the tokens variable. ProcessTokens(&PropertyName, &PropertyValue, &PropertyTokens, &FirstToken); } } // Add the data to the variables and form. if (AnniversaryText == FALSE){ Anniversary = PropertySeg2; } if (!PropertyTokens.IsEmpty()){ AnniversaryTokens = PropertyTokens; } } void ContactDataObject::ProcessTimeZone(wxString PropertySeg1, wxString PropertySeg2, int *TimeZoneCount){ // Process the timezone. std::map SplitPoints; std::map SplitLength; int intPrevValue = 4; SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue); intPrevValue = 3; PropertyType PropType = PROPERTY_NONE; // Look for type before continuing. CheckType(&PropertySeg1, &SplitPoints, &SplitLength, &intPrevValue, &PropType); intPrevValue = 3; std::map *TZList = NULL; std::map *TZListType = NULL; std::map *TZListMediatype = NULL; std::map *TZListAltID = NULL; std::map *TZListPID = NULL; std::map *TZListTokens = NULL; std::map *TZListPref = NULL; switch(PropType){ case PROPERTY_NONE: TZList = &GeneralTZList; TZListType = &GeneralTZListType; TZListMediatype = &GeneralTZListMediatype; TZListAltID = &GeneralTZListAltID; TZListPID = &GeneralTZListPID; TZListTokens = &GeneralTZListTokens; TZListPref = &GeneralTZListPref; break; case PROPERTY_HOME: TZList = &HomeTZList; TZListType = &HomeTZListType; TZListMediatype = &HomeTZListMediatype; TZListAltID = &HomeTZListAltID; TZListPID = &HomeTZListPID; TZListTokens = &HomeTZListTokens; TZListPref = &HomeTZListPref; break; case PROPERTY_WORK: TZList = &BusinessTZList; TZListType = &BusinessTZListType; TZListMediatype = &BusinessTZListMediatype; TZListAltID = &BusinessTZListAltID; TZListPID = &BusinessTZListPID; TZListTokens = &BusinessTZListTokens; TZListPref = &BusinessTZListPref; break; } std::map::iterator SLiter; wxString PropertyData; wxString PropertyName; wxString PropertyValue; wxString PropertyTokens; bool FirstToken = TRUE; bool PropertyMatched = FALSE; for (std::map::iterator intiter = SplitPoints.begin(); intiter != SplitPoints.end(); ++intiter){ SLiter = SplitLength.find(intiter->first); PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second)); ProcessNameValue(&PropertyData, &PropertyName, &PropertyValue); intPrevValue = intiter->second; CaptureString(&PropertyValue, FALSE); ProcessStringValue(&PropertyName, "ALTID", TZListAltID, &PropertyValue, TimeZoneCount, &PropertyMatched); ProcessStringValue(&PropertyName, "PID", TZListPID, &PropertyValue, TimeZoneCount, &PropertyMatched); ProcessStringValue(&PropertyName, "MEDIATYPE", TZListMediatype, &PropertyValue, TimeZoneCount, &PropertyMatched); ProcessIntegerValue(&PropertyName, "PREF", TZListPref, &PropertyValue, TimeZoneCount, &PropertyMatched); if (PropertyMatched == TRUE){ PropertyMatched = FALSE; continue; } if (!PropertyName.IsEmpty() && !PropertyValue.IsEmpty() && PropertyName != wxT("TYPE")){ ProcessTokens(&PropertyName, &PropertyValue, &PropertyTokens, &FirstToken); } } TZList->insert(std::make_pair(*TimeZoneCount, PropertySeg2)); // Add the name token data. if (!PropertyTokens.IsEmpty()){ TZListTokens->insert(std::make_pair(*TimeZoneCount, PropertyTokens)); } } void ContactDataObject::ProcessAddress(wxString PropertySeg1, wxString PropertySeg2, int *AddressCount){ // Process the address. size_t intPropertyLen = PropertySeg1.Len(); std::map SplitPoints; std::map SplitLength; std::map::iterator SLiter; wxString PropertyData; wxString PropertyName; wxString PropertyValue; wxString PropertyTokens; wxString AddressLabel; wxString AddressLang; wxString AddressAltID; wxString AddressPID; wxString AddressTokens; wxString AddressGeo; wxString AddressTimezone; wxString AddressType; wxString AddressMediatype; wxString AddressPOBox; wxString AddressExtended; wxString AddressStreet; wxString AddressLocality; wxString AddressCity; wxString AddressRegion; wxString AddressPostalCode; wxString AddressCountry; bool FirstToken = TRUE; int intSplitsFound = 0; int intSplitSize = 0; int intPrevValue = 5; bool PropertyMatched = FALSE; SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue); intPrevValue = 4; PropertyType PropType = PROPERTY_NONE; // Look for type before continuing. CheckType(&PropertySeg1, &SplitPoints, &SplitLength, &intPrevValue, &PropType); intPrevValue = 4; std::map *AddressList = NULL; std::map *AddressListTown = NULL; std::map *AddressListCounty = NULL; std::map *AddressListPostCode = NULL; std::map *AddressListCountry = NULL; std::map *AddressListLabel = NULL; std::map *AddressListLang = NULL; std::map *AddressListAltID = NULL; std::map *AddressListPID = NULL; std::map *AddressListTokens = NULL; std::map *AddressListGeo = NULL; std::map *AddressListTimezone = NULL; std::map *AddressListType = NULL; std::map *AddressListMediatype = NULL; std::map *AddressListPref = NULL; switch(PropType){ case PROPERTY_NONE: AddressList = &GeneralAddressList; AddressListTown = &GeneralAddressListTown; AddressListCounty = &GeneralAddressListCounty; AddressListPostCode = &GeneralAddressListPostCode; AddressListCountry = &GeneralAddressListCountry; AddressListLabel = &GeneralAddressListLabel; AddressListLang = &GeneralAddressListLang; AddressListAltID = &GeneralAddressListAltID; AddressListPID = &GeneralAddressListPID; AddressListTokens = &GeneralAddressListTokens; AddressListGeo = &GeneralAddressListGeo; AddressListTimezone = &GeneralAddressListTimezone; AddressListType = &GeneralAddressListType; AddressListMediatype = &GeneralAddressListMediatype; AddressListPref = &GeneralAddressListPref; break; case PROPERTY_HOME: AddressList = &HomeAddressList; AddressListTown = &HomeAddressListTown; AddressListCounty = &HomeAddressListCounty; AddressListPostCode = &HomeAddressListPostCode; AddressListCountry = &HomeAddressListCountry; AddressListLabel = &HomeAddressListLabel; AddressListLang = &HomeAddressListLang; AddressListAltID = &HomeAddressListAltID; AddressListPID = &HomeAddressListPID; AddressListTokens = &HomeAddressListTokens; AddressListGeo = &HomeAddressListGeo; AddressListTimezone = &HomeAddressListTimezone; AddressListType = &HomeAddressListType; AddressListMediatype = &HomeAddressListMediatype; AddressListPref = &HomeAddressListPref; break; case PROPERTY_WORK: AddressList = &BusinessAddressList; AddressListTown = &BusinessAddressListTown; AddressListCounty = &BusinessAddressListCounty; AddressListPostCode = &BusinessAddressListPostCode; AddressListCountry = &BusinessAddressListCountry; AddressListLabel = &BusinessAddressListLabel; AddressListLang = &BusinessAddressListLang; AddressListAltID = &BusinessAddressListAltID; AddressListPID = &BusinessAddressListPID; AddressListTokens = &BusinessAddressListTokens; AddressListGeo = &BusinessAddressListGeo; AddressListTimezone = &BusinessAddressListTimezone; AddressListType = &BusinessAddressListType; AddressListMediatype = &BusinessAddressListMediatype; AddressListPref = &BusinessAddressListPref; break; } intPrevValue = 4; for (std::map::iterator intiter = SplitPoints.begin(); intiter != SplitPoints.end(); ++intiter){ SLiter = SplitLength.find(intiter->first); PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second)); ProcessNameValue(&PropertyData, &PropertyName, &PropertyValue); intPrevValue = intiter->second; if (PropertyName == "GEO"){ CaptureString(&PropertyValue, TRUE); } else { CaptureString(&PropertyValue, FALSE); } // Process properties. ProcessStringValue(&PropertyName, "LABEL", AddressListLabel, &PropertyValue, AddressCount, &PropertyMatched); ProcessStringValue(&PropertyName, "LANGUAGE", AddressListLang, &PropertyValue, AddressCount, &PropertyMatched); ProcessStringValue(&PropertyName, "ALTID", AddressListAltID, &PropertyValue, AddressCount, &PropertyMatched); ProcessStringValue(&PropertyName, "PID", AddressListPID, &PropertyValue, AddressCount, &PropertyMatched); ProcessStringValue(&PropertyName, "GEO", AddressListGeo, &PropertyValue, AddressCount, &PropertyMatched); ProcessStringValue(&PropertyName, "TZ", AddressListTimezone, &PropertyValue, AddressCount, &PropertyMatched); ProcessStringValue(&PropertyName, "MEDIATYPE", AddressListMediatype, &PropertyValue, AddressCount, &PropertyMatched); ProcessIntegerValue(&PropertyName, "PREF", AddressListPref, &PropertyValue, AddressCount, &PropertyMatched); if (PropertyMatched == TRUE){ PropertyMatched = FALSE; continue; } ProcessTokens(&PropertyName, &PropertyValue, &PropertyTokens, &FirstToken); } // Split the address. //std::map::iterator SLiter; intPropertyLen = PropertySeg2.Len(); SplitPoints.clear(); SplitLength.clear(); intSplitsFound = 0; intSplitSize = 0; intPrevValue = 0; for (int i = 0; i <= intPropertyLen; i++){ intSplitSize++; if (PropertySeg2.Mid(i, 1) == wxT(";") && PropertySeg2.Mid((i - 1), 1) != wxT("\\")){ intSplitsFound++; SplitPoints.insert(std::make_pair(intSplitsFound, (i + 1))); if (intSplitsFound == 6){ SplitLength.insert(std::make_pair(intSplitsFound, (intSplitSize - 1))); break; } else { SplitLength.insert(std::make_pair(intSplitsFound, (intSplitSize - 1))); } intSplitSize = 0; } } // Split the data into several parts. for (std::map::iterator intiter = SplitPoints.begin(); intiter != SplitPoints.end(); ++intiter){ if (intiter->first == 1){ // Deal with PO Box. SLiter = SplitLength.find(1); AddressPOBox = PropertySeg2.Mid(0, SLiter->second); intPrevValue = intiter->second; } else if (intiter->first == 2){ // Deal with extended address. SLiter = SplitLength.find(2); AddressExtended = PropertySeg2.Mid(intPrevValue, SLiter->second); intPrevValue = intiter->second; } else if (intiter->first == 3){ // Deal with street address. SLiter = SplitLength.find(3); AddressStreet = PropertySeg2.Mid(intPrevValue, SLiter->second); intPrevValue = intiter->second; } else if (intiter->first == 4){ // Deal with locality SLiter = SplitLength.find(4); AddressLocality = PropertySeg2.Mid(intPrevValue, SLiter->second); intPrevValue = intiter->second; } else if (intiter->first == 5){ // Deal with region. SLiter = SplitLength.find(5); AddressRegion = PropertySeg2.Mid(intPrevValue, SLiter->second); intPrevValue = intiter->second; } else if (intiter->first == 6){ // Deal with post code. SLiter = SplitLength.find(6); AddressPostalCode = PropertySeg2.Mid(intPrevValue, SLiter->second); intPrevValue = intiter->second; // Deal with country. AddressCountry = PropertySeg2.Mid(intPrevValue, wxString::npos); break; } } // Add the data to the General/Home/Work address variables. CaptureString(&AddressStreet, FALSE); CaptureString(&AddressLocality, FALSE); CaptureString(&AddressRegion, FALSE); CaptureString(&AddressPostalCode, FALSE); CaptureString(&AddressCountry, FALSE); if (!PropertyTokens.IsEmpty()){ AddressListTokens->insert(std::make_pair(*AddressCount, PropertyTokens)); } AddressListCountry->insert(std::make_pair(*AddressCount, AddressCountry)); AddressList->insert(std::make_pair(*AddressCount, AddressStreet)); AddressListTown->insert(std::make_pair(*AddressCount, AddressLocality)); AddressListCounty->insert(std::make_pair(*AddressCount, AddressRegion)); AddressListPostCode->insert(std::make_pair(*AddressCount, AddressPostalCode)); switch(PropType){ case PROPERTY_NONE: AddressListType->insert(std::make_pair(*AddressCount, wxT(""))); break; case PROPERTY_HOME: AddressListType->insert(std::make_pair(*AddressCount, wxT("home"))); break; case PROPERTY_WORK: AddressListType->insert(std::make_pair(*AddressCount, wxT("work"))); break; } AddressListTokens->insert(std::make_pair(*AddressCount, PropertyTokens)); } void ContactDataObject::ProcessEmail(wxString PropertySeg1, wxString PropertySeg2, int *EmailCount){ // Process the email address. std::map SplitPoints; std::map SplitLength; int intPrevValue = 7; SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue); intPrevValue = 6; PropertyType PropType = PROPERTY_NONE; // Look for type before continuing. CheckType(&PropertySeg1, &SplitPoints, &SplitLength, &intPrevValue, &PropType); std::map *EmailList = NULL; std::map *EmailListType = NULL; std::map *EmailListAltID = NULL; std::map *EmailListPID = NULL; std::map *EmailListTokens = NULL; std::map *EmailListPref = NULL; switch(PropType){ case PROPERTY_NONE: EmailList = &GeneralEmailList; EmailListType = &GeneralEmailListType; EmailListAltID = &GeneralEmailListAltID; EmailListPID = &GeneralEmailListPID; EmailListTokens = &GeneralEmailListTokens; EmailListPref = &GeneralEmailListPref; break; case PROPERTY_HOME: EmailList = &HomeEmailList; EmailListType = &HomeEmailListType; EmailListAltID = &HomeEmailListAltID; EmailListPID = &HomeEmailListPID; EmailListTokens = &HomeEmailListTokens; EmailListPref = &HomeEmailListPref; break; case PROPERTY_WORK: EmailList = &BusinessEmailList; EmailListType = &BusinessEmailListType; EmailListAltID = &BusinessEmailListAltID; EmailListPID = &BusinessEmailListPID; EmailListTokens = &BusinessEmailListTokens; EmailListPref = &BusinessEmailListPref; break; } intPrevValue = 6; std::map::iterator SLiter; wxString PropertyData; wxString PropertyName; wxString PropertyValue; wxString PropertyTokens; bool FirstToken = TRUE; bool PropertyMatched = FALSE; for (std::map::iterator intiter = SplitPoints.begin(); intiter != SplitPoints.end(); ++intiter){ SLiter = SplitLength.find(intiter->first); PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second)); ProcessNameValue(&PropertyData, &PropertyName, &PropertyValue); intPrevValue = intiter->second; CaptureString(&PropertyValue, FALSE); // Process properties. ProcessStringValue(&PropertyName, "ALTID", EmailListAltID, &PropertyValue, EmailCount, &PropertyMatched); ProcessStringValue(&PropertyName, "PID", EmailListPID, &PropertyValue, EmailCount, &PropertyMatched); ProcessIntegerValue(&PropertyName, "PREF", EmailListPref, &PropertyValue, EmailCount, &PropertyMatched); if (PropertyMatched == TRUE){ PropertyMatched = FALSE; continue; } ProcessTokens(&PropertyName, &PropertyValue, &PropertyTokens, &FirstToken); } EmailList->insert(std::make_pair(*EmailCount, PropertySeg2)); // Add the name token data. if (!PropertyTokens.IsEmpty()){ EmailListTokens->insert(std::make_pair(*EmailCount, PropertyTokens)); } } void ContactDataObject::ProcessIM(wxString PropertySeg1, wxString PropertySeg2, int *IMCount){ // Process the IM. std::map SplitPoints; std::map SplitLength; int intPrevValue = 6; SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue); intPrevValue = 5; PropertyType PropType = PROPERTY_NONE; // Look for type before continuing. CheckType(&PropertySeg1, &SplitPoints, &SplitLength, &intPrevValue, &PropType); std::map *IMList = NULL; std::map *IMListType = NULL; std::map *IMListAltID = NULL; std::map *IMListPID = NULL; std::map *IMListTokens = NULL; std::map *IMListMediatype = NULL; std::map *IMListTypeInfo = NULL; std::map *IMListPref = NULL; switch(PropType){ case PROPERTY_NONE: IMList = &GeneralIMList; IMListType = &GeneralIMListType; IMListAltID = &GeneralIMListAltID; IMListPID = &GeneralIMListPID; IMListTokens = &GeneralIMListTokens; IMListMediatype = &GeneralIMListMediatype; IMListTypeInfo = &GeneralIMListTypeInfo; IMListPref = &GeneralIMListPref; break; case PROPERTY_HOME: IMList = &HomeIMList; IMListType = &HomeIMListType; IMListAltID = &HomeIMListAltID; IMListPID = &HomeIMListPID; IMListTokens = &HomeIMListTokens; IMListMediatype = &HomeIMListMediatype; IMListTypeInfo = &HomeIMListTypeInfo; IMListPref = &HomeIMListPref; break; case PROPERTY_WORK: IMList = &BusinessIMList; IMListType = &BusinessIMListType; IMListAltID = &BusinessIMListAltID; IMListPID = &BusinessIMListPID; IMListTokens = &BusinessIMListTokens; IMListMediatype = &BusinessIMListMediatype; IMListTypeInfo = &BusinessIMListTypeInfo; IMListPref = &BusinessIMListPref; break; } intPrevValue = 5; std::map::iterator SLiter; wxString PropertyData; wxString PropertyName; wxString PropertyValue; wxString PropertyTokens; bool FirstToken = TRUE; bool PropertyMatched = FALSE; for (std::map::iterator intiter = SplitPoints.begin(); intiter != SplitPoints.end(); ++intiter){ SLiter = SplitLength.find(intiter->first); PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second)); ProcessNameValue(&PropertyData, &PropertyName, &PropertyValue); intPrevValue = intiter->second; CaptureString(&PropertyValue, FALSE); ProcessStringValue(&PropertyName, "ALTID", IMListAltID, &PropertyValue, IMCount, &PropertyMatched); ProcessStringValue(&PropertyName, "PID", IMListPID, &PropertyValue, IMCount, &PropertyMatched); ProcessStringValue(&PropertyName, "MEDIATYPE", IMListMediatype, &PropertyValue, IMCount, &PropertyMatched); ProcessIntegerValue(&PropertyName, "PREF", IMListPref, &PropertyValue, IMCount, &PropertyMatched); // Process properties. if (PropertyMatched == TRUE){ PropertyMatched = FALSE; continue; } ProcessTokens(&PropertyName, &PropertyValue, &PropertyTokens, &FirstToken); } wxStringTokenizer IMPPSplitData(PropertySeg2, wxT(":")); if (IMPPSplitData.CountTokens() > 1){ IMListTypeInfo->insert(std::make_pair(*IMCount, IMPPSplitData.GetNextToken())); IMList->insert(std::make_pair(*IMCount, IMPPSplitData.GetString())); } else { IMList->insert(std::make_pair(*IMCount, PropertySeg2)); IMListTypeInfo->insert(std::make_pair(*IMCount, "none")); } // Add the name token data. if (!PropertyTokens.IsEmpty()){ IMListTokens->insert(std::make_pair(*IMCount, PropertyTokens)); } } void ContactDataObject::ProcessTelephone(wxString PropertySeg1, wxString PropertySeg2, int *TelephoneCount){ // Process the telephone. std::map SplitPoints; std::map SplitLength; std::map::iterator SLiter; PropertyType PropType = PROPERTY_NONE; // Look for type before continuing. wxString TelTypeUI; wxString TelTypeDetail; wxString PropertyData; wxString PropertyName; wxString PropertyValue; wxString PropertyTokens; std::map TypeSplitPoints; std::map TypeSplitLength; std::map::iterator TSLiter; int intSplitSize = 0; int intSplitsFound = 0; int intSplitPoint = 0; int intPrevValue = 5; SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue); intPrevValue = 4; // Look for type before continuing. for (std::map::iterator intiter = SplitPoints.begin(); intiter != SplitPoints.end(); ++intiter){ SLiter = SplitLength.find(intiter->first); PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second)); ProcessNameValue(&PropertyData, &PropertyName, &PropertyValue); intPrevValue = intiter->second; if (PropertyName == wxT("TYPE")){ // Process each value in type and translate each // part. // Strip out the quotes if they are there. size_t intPropertyValueLen = PropertyValue.Len(); if (PropertyValue.Mid((intPropertyValueLen - 1), 1) == wxT("\"")){ PropertyValue.Trim(); PropertyValue.RemoveLast(); } if (PropertyValue.Mid(0, 1) == wxT("\"")){ PropertyValue.Remove(0, 1); } TelTypeDetail = PropertyValue; intSplitSize = 0; intSplitsFound = 0; intSplitPoint = 0; for (int i = 0; i <= intPropertyValueLen; i++){ intSplitSize++; if (PropertyValue.Mid(i, 1) == wxT(",") && PropertyValue.Mid((i - 1), 1) != wxT("\\")){ if (intSplitsFound == 0){ TypeSplitPoints.insert(std::make_pair(intSplitsFound, intSplitPoint)); TypeSplitLength.insert(std::make_pair(intSplitsFound, (intSplitSize - 1))); } else { TypeSplitPoints.insert(std::make_pair(intSplitsFound, intSplitPoint)); TypeSplitLength.insert(std::make_pair(intSplitsFound, intSplitSize)); } intSplitsFound++; i++; intSplitPoint = i; intSplitSize = 0; } } TypeSplitPoints.insert(std::make_pair(intSplitsFound, intSplitPoint)); TypeSplitLength.insert(std::make_pair(intSplitsFound, intSplitSize)); int intTypeSeek = 0; bool TypeFound = FALSE; for (std::map::iterator typeiter = TypeSplitPoints.begin(); typeiter != TypeSplitPoints.end(); ++typeiter){ wxString TypePropertyName; TSLiter = TypeSplitLength.find(typeiter->first); TypePropertyName = PropertyValue.Mid(typeiter->second, TSLiter->second); if (intTypeSeek == 0){ } else { TelTypeUI.Append(wxT(",")); } if (TypePropertyName == wxT("home") && TypeFound == FALSE){ PropType = PROPERTY_HOME; TypeFound = TRUE; } else if (TypePropertyName == wxT("work") && TypeFound == FALSE){ PropType = PROPERTY_WORK; TypeFound = TRUE; } if (TypePropertyName == wxT("text")){ TelTypeUI.Append(_("text")); intTypeSeek++; } else if (TypePropertyName == wxT("voice")){ TelTypeUI.Append(_("voice")); intTypeSeek++; } else if (TypePropertyName == wxT("fax")){ TelTypeUI.Append(_("fax")); intTypeSeek++; } else if (TypePropertyName == wxT("cell")){ TelTypeUI.Append(_("cell")); intTypeSeek++; } else if (TypePropertyName == wxT("video")){ TelTypeUI.Append(_("video")); intTypeSeek++; } else if (TypePropertyName == wxT("pager")){ TelTypeUI.Append(_("pager")); intTypeSeek++; } else if (TypePropertyName == wxT("textphone")){ TelTypeUI.Append(_("textphone")); intTypeSeek++; } } } } std::map *TelephoneList = NULL; std::map *TelephoneListType = NULL; std::map *TelephoneListAltID = NULL; std::map *TelephoneListPID = NULL; std::map *TelephoneListTokens = NULL; std::map *TelephoneListTypeInfo = NULL; std::map *TelephoneListDataType = NULL; std::map *TelephoneListPref = NULL; switch(PropType){ case PROPERTY_NONE: TelephoneList = &GeneralTelephoneList; TelephoneListType = &GeneralTelephoneListType; TelephoneListAltID = &GeneralTelephoneListAltID; TelephoneListPID = &GeneralTelephoneListPID; TelephoneListTokens = &GeneralTelephoneListTokens; TelephoneListTypeInfo = &GeneralTelephoneListTypeInfo; TelephoneListDataType = &GeneralTelephoneListDataType; TelephoneListPref = &GeneralTelephoneListPref; break; case PROPERTY_HOME: TelephoneList = &HomeTelephoneList; TelephoneListType = &HomeTelephoneListType; TelephoneListAltID = &HomeTelephoneListAltID; TelephoneListPID = &HomeTelephoneListPID; TelephoneListTokens = &HomeTelephoneListTokens; TelephoneListTypeInfo = &HomeTelephoneListTypeInfo; TelephoneListDataType = &HomeTelephoneListDataType; TelephoneListPref = &HomeTelephoneListPref; break; case PROPERTY_WORK: TelephoneList = &BusinessTelephoneList; TelephoneListType = &BusinessTelephoneListType; TelephoneListAltID = &BusinessTelephoneListAltID; TelephoneListPID = &BusinessTelephoneListPID; TelephoneListTokens = &BusinessTelephoneListTokens; TelephoneListTypeInfo = &BusinessTelephoneListTypeInfo; TelephoneListDataType = &BusinessTelephoneListDataType; TelephoneListPref = &BusinessTelephoneListPref; break; } // Process the properties. bool FirstToken = TRUE; intPrevValue = 5; SplitPoints.clear(); SplitLength.clear(); SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue); intPrevValue = 4; bool PropertyMatched = FALSE; for (std::map::iterator intiter = SplitPoints.begin(); intiter != SplitPoints.end(); ++intiter){ SLiter = SplitLength.find(intiter->first); PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second)); ProcessNameValue(&PropertyData, &PropertyName, &PropertyValue); intPrevValue = intiter->second; CaptureString(&PropertyValue, FALSE); // Process properties. ProcessStringValue(&PropertyName, "ALTID", TelephoneListAltID, &PropertyValue, TelephoneCount, &PropertyMatched); ProcessStringValue(&PropertyName, "PID", TelephoneListPID, &PropertyValue, TelephoneCount, &PropertyMatched); ProcessIntegerValue(&PropertyName, "PREF", TelephoneListPref, &PropertyValue, TelephoneCount, &PropertyMatched); if (PropertyMatched == TRUE){ PropertyMatched = FALSE; continue; } ProcessTokens(&PropertyName, &PropertyValue, &PropertyTokens, &FirstToken); } // Check for the type information and split it down. wxStringTokenizer TelSplitData(PropertySeg2, wxT(":")); if (TelSplitData.CountTokens() > 1){ TelephoneListDataType->insert(std::make_pair(*TelephoneCount, TelSplitData.GetNextToken())); TelephoneList->insert(std::make_pair(*TelephoneCount, TelSplitData.GetString())); } else { TelephoneList->insert(std::make_pair(*TelephoneCount, PropertySeg2)); TelephoneListDataType->insert(std::make_pair(*TelephoneCount, "tel")); } TelephoneListTypeInfo->insert(std::make_pair(*TelephoneCount, TelTypeUI)); // Add the name token data. if (!PropertyTokens.IsEmpty()){ TelephoneListTokens->insert(std::make_pair(*TelephoneCount, PropertyTokens)); } } void ContactDataObject::ProcessLanguage(wxString PropertySeg1, wxString PropertySeg2, int *LanguageCount){ // Process the language. std::map SplitPoints; std::map SplitLength; int intPrevValue = 6; SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue); intPrevValue = 5; PropertyType PropType = PROPERTY_NONE; // Look for type before continuing. CheckType(&PropertySeg1, &SplitPoints, &SplitLength, &intPrevValue, &PropType); std::map *LanguageList = NULL; std::map *LanguageListType = NULL; std::map *LanguageListAltID = NULL; std::map *LanguageListPID = NULL; std::map *LanguageListTokens = NULL; std::map *LanguageListPref = NULL; switch(PropType){ case PROPERTY_NONE: LanguageList = &GeneralLanguageList; LanguageListType = &GeneralLanguageListType; LanguageListAltID = &GeneralLanguageListAltID; LanguageListPID = &GeneralLanguageListPID; LanguageListTokens = &GeneralLanguageListTokens; LanguageListPref = &GeneralLanguageListPref; break; case PROPERTY_HOME: LanguageList = &HomeLanguageList; LanguageListType = &HomeLanguageListType; LanguageListAltID = &HomeLanguageListAltID; LanguageListPID = &HomeLanguageListPID; LanguageListTokens = &HomeLanguageListTokens; LanguageListPref = &HomeLanguageListPref; break; case PROPERTY_WORK: LanguageList = &BusinessLanguageList; LanguageListType = &BusinessLanguageListType; LanguageListAltID = &BusinessLanguageListAltID; LanguageListPID = &BusinessLanguageListPID; LanguageListTokens = &BusinessLanguageListTokens; LanguageListPref = &BusinessLanguageListPref; break; } intPrevValue = 5; std::map::iterator SLiter; wxString PropertyData; wxString PropertyName; wxString PropertyValue; wxString PropertyTokens; bool FirstToken = TRUE; bool PropertyMatched = FALSE; for (std::map::iterator intiter = SplitPoints.begin(); intiter != SplitPoints.end(); ++intiter){ SLiter = SplitLength.find(intiter->first); PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second)); ProcessNameValue(&PropertyData, &PropertyName, &PropertyValue); intPrevValue = intiter->second; CaptureString(&PropertyValue, FALSE); // Process properties. ProcessStringValue(&PropertyName, "ALTID", LanguageListAltID, &PropertyValue, LanguageCount, &PropertyMatched); ProcessStringValue(&PropertyName, "PID", LanguageListPID, &PropertyValue, LanguageCount, &PropertyMatched); ProcessIntegerValue(&PropertyName, "PREF", LanguageListPref, &PropertyValue, LanguageCount, &PropertyMatched); if (PropertyMatched == TRUE){ PropertyMatched = FALSE; continue; } ProcessTokens(&PropertyName, &PropertyValue, &PropertyTokens, &FirstToken); } LanguageList->insert(std::make_pair(*LanguageCount, PropertySeg2)); // Add the name token data. if (!PropertyTokens.IsEmpty()){ LanguageListTokens->insert(std::make_pair(*LanguageCount, PropertyTokens)); } } void ContactDataObject::ProcessGeographic(wxString PropertySeg1, wxString PropertySeg2, int *GeographicCount){ // Process the geographic location. std::map SplitPoints; std::map SplitLength; int intPrevValue = 5; SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue); intPrevValue = 4; PropertyType PropType = PROPERTY_NONE; // Look for type before continuing. CheckType(&PropertySeg1, &SplitPoints, &SplitLength, &intPrevValue, &PropType); std::map *GeopositionList = NULL; std::map *GeopositionListType = NULL; std::map *GeopositionListAltID = NULL; std::map *GeopositionListPID = NULL; std::map *GeopositionListTokens = NULL; std::map *GeopositionListMediatype = NULL; std::map *GeopositionListDataType = NULL; std::map *GeopositionListPref = NULL; switch(PropType){ case PROPERTY_NONE: GeopositionList = &GeneralGeographyList; GeopositionListType = &GeneralGeographyListType; GeopositionListAltID = &GeneralGeographyListAltID; GeopositionListPID = &GeneralGeographyListPID; GeopositionListTokens = &GeneralGeographyListTokens; GeopositionListMediatype = &GeneralGeographyListMediatype; GeopositionListDataType = &GeneralGeographyListDataType; GeopositionListPref = &GeneralGeographyListPref; break; case PROPERTY_HOME: GeopositionList = &HomeGeographyList; GeopositionListType = &HomeGeographyListType; GeopositionListAltID = &HomeGeographyListAltID; GeopositionListPID = &HomeGeographyListPID; GeopositionListTokens = &HomeGeographyListTokens; GeopositionListMediatype = &HomeGeographyListMediatype; GeopositionListDataType = &HomeGeographyListDataType; GeopositionListPref = &HomeGeographyListPref; break; case PROPERTY_WORK: GeopositionList = &BusinessGeographyList; GeopositionListType = &BusinessGeographyListType; GeopositionListAltID = &BusinessGeographyListAltID; GeopositionListPID = &BusinessGeographyListPID; GeopositionListTokens = &BusinessGeographyListTokens; GeopositionListMediatype = &BusinessGeographyListMediatype; GeopositionListDataType = &BusinessGeographyListDataType; GeopositionListPref = &BusinessGeographyListPref; break; } intPrevValue = 4; std::map::iterator SLiter; wxString PropertyData; wxString PropertyName; wxString PropertyValue; wxString PropertyTokens; bool FirstToken = TRUE; bool PropertyMatched = FALSE; for (std::map::iterator intiter = SplitPoints.begin(); intiter != SplitPoints.end(); ++intiter){ SLiter = SplitLength.find(intiter->first); PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second)); ProcessNameValue(&PropertyData, &PropertyName, &PropertyValue); intPrevValue = intiter->second; CaptureString(&PropertyValue, FALSE); // Process properties. ProcessStringValue(&PropertyName, "ALTID", GeopositionListAltID, &PropertyValue, GeographicCount, &PropertyMatched); ProcessStringValue(&PropertyName, "PID", GeopositionListPID, &PropertyValue, GeographicCount, &PropertyMatched); ProcessStringValue(&PropertyName, "MEDIATYPE", GeopositionListMediatype, &PropertyValue, GeographicCount, &PropertyMatched); ProcessIntegerValue(&PropertyName, "PREF", GeopositionListPref, &PropertyValue, GeographicCount, &PropertyMatched); if (PropertyMatched == TRUE){ PropertyMatched = FALSE; continue; } ProcessTokens(&PropertyName, &PropertyValue, &PropertyTokens, &FirstToken); } wxStringTokenizer GeoSplitData(PropertySeg2, wxT(":")); if (GeoSplitData.CountTokens() > 1){ GeopositionListDataType->insert(std::make_pair(*GeographicCount, GeoSplitData.GetNextToken())); GeopositionList->insert(std::make_pair(*GeographicCount, GeoSplitData.GetString())); } else { GeopositionList->insert(std::make_pair(*GeographicCount, PropertySeg2)); GeopositionListDataType->insert(std::make_pair(*GeographicCount, "tel")); } // Add the name token data. if (!PropertyTokens.IsEmpty()){ GeopositionListTokens->insert(std::make_pair(*GeographicCount, PropertyTokens)); } } void ContactDataObject::ProcessRelated(wxString PropertySeg1, wxString PropertySeg2, int *RelatedCount){ // Process the relation. std::map SplitPoints; std::map SplitLength; std::map::iterator SLiter; wxString PropertyData; wxString PropertyName; wxString PropertyValue; wxString PropertyTokens; wxString RelatedType; wxString RelatedTypeOriginal; wxString RelatedName; bool FirstToken = TRUE; int intPrevValue = 9; SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue); intPrevValue = 8; // Look for type before continuing. for (std::map::iterator intiter = SplitPoints.begin(); intiter != SplitPoints.end(); ++intiter){ SLiter = SplitLength.find(intiter->first); PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second)); ProcessNameValue(&PropertyData, &PropertyName, &PropertyValue); intPrevValue = intiter->second; // Process these. RelatedTypeOriginal = PropertyValue; if (PropertyName == wxT("TYPE")){ if (PropertyValue == wxT("contact")){ RelatedType = _("Contact"); } else if (PropertyValue == wxT("acquaintance")){ RelatedType = _("Acquaintance"); } else if (PropertyValue == wxT("friend")){ RelatedType = _("Friend"); } else if (PropertyValue == wxT("met")){ RelatedType = _("Met"); } else if (PropertyValue == wxT("co-worker")){ RelatedType = _("Co-worker"); } else if (PropertyValue == wxT("colleague")){ RelatedType = _("Colleague"); } else if (PropertyValue == wxT("co-resident")){ RelatedType = _("Co-resident"); } else if (PropertyValue == wxT("neighbor")){ RelatedType = _("Neighbour"); } else if (PropertyValue == wxT("child")){ RelatedType = _("Child"); } else if (PropertyValue == wxT("parent")){ RelatedType = _("Parent"); } else if (PropertyValue == wxT("sibling")){ RelatedType = _("Sibling"); } else if (PropertyValue == wxT("spouse")){ RelatedType = _("Spouse"); } else if (PropertyValue == wxT("kin")){ RelatedType = _("Kin"); } else if (PropertyValue == wxT("muse")){ RelatedType = _("Muse"); } else if (PropertyValue == wxT("crush")){ RelatedType = _("Crush"); } else if (PropertyValue == wxT("date")){ RelatedType = _("Date"); } else if (PropertyValue == wxT("sweetheart")){ RelatedType = _("Sweetheart"); } else if (PropertyValue == wxT("me")){ RelatedType = _("Me"); } else if (PropertyValue == wxT("agent")){ RelatedType = _("Agent"); } else if (PropertyValue == wxT("emergency")){ RelatedType = _("Emergency"); } else { RelatedType = PropertyValue; } } } intPrevValue = 8; bool PropertyMatched = FALSE; for (std::map::iterator intiter = SplitPoints.begin(); intiter != SplitPoints.end(); ++intiter){ SLiter = SplitLength.find(intiter->first); PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second)); ProcessNameValue(&PropertyData, &PropertyName, &PropertyValue); intPrevValue = intiter->second; // Process properties. size_t intPropertyValueLen = PropertyValue.Len(); if (PropertyValue.Mid((intPropertyValueLen - 1), 1) == wxT("\"")){ PropertyValue.Trim(); PropertyValue.RemoveLast(); } if (PropertyValue.Mid(0, 1) == wxT("\"")){ PropertyValue.Remove(0, 1); } CaptureString(&PropertyValue, FALSE); ProcessStringValue(&PropertyName, "ALTID", &GeneralRelatedListAltID, &PropertyValue, RelatedCount, &PropertyMatched); ProcessStringValue(&PropertyName, "PID", &GeneralRelatedListPID, &PropertyValue, RelatedCount, &PropertyMatched); ProcessStringValue(&PropertyName, "LANGUAGE", &GeneralRelatedListLanguage, &PropertyValue, RelatedCount, &PropertyMatched); ProcessIntegerValue(&PropertyName, "PREF", &GeneralRelatedListPref, &PropertyValue, RelatedCount, &PropertyMatched); if (PropertyMatched == TRUE){ PropertyMatched = FALSE; continue; } ProcessTokens(&PropertyName, &PropertyValue, &PropertyTokens, &FirstToken); } // Add the data to the General/Home/Work address variables. GeneralRelatedList.erase(*RelatedCount); GeneralRelatedListRelType.erase(*RelatedCount); GeneralRelatedListType.erase(*RelatedCount); GeneralRelatedListTokens.erase(*RelatedCount); GeneralRelatedList.insert(std::make_pair(*RelatedCount, PropertySeg2)); GeneralRelatedListRelType.insert(std::make_pair(*RelatedCount, RelatedType)); GeneralRelatedListType.insert(std::make_pair(*RelatedCount, RelatedType)); GeneralRelatedListTokens.insert(std::make_pair(*RelatedCount, PropertyTokens)); } void ContactDataObject::ProcessURL(wxString PropertySeg1, wxString PropertySeg2, int *URLCount){ // Process the URL. std::map SplitPoints; std::map SplitLength; std::map::iterator SLiter; wxString PropertyData; wxString PropertyName; wxString PropertyValue; wxString PropertyTokens; bool FirstToken = TRUE; int intPrevValue = 5; SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue); intPrevValue = 4; PropertyType PropType = PROPERTY_NONE; // Look for type before continuing. CheckType(&PropertySeg1, &SplitPoints, &SplitLength, &intPrevValue, &PropType); // Setup the pointers. std::map *WebsiteList = NULL; std::map *WebsiteListAltID = NULL; std::map *WebsiteListPID = NULL; std::map *WebsiteListType = NULL; std::map *WebsiteListTokens = NULL; std::map *WebsiteListMediatype = NULL; std::map *WebsiteListPref = NULL; // Setup blank lines for later on. switch(PropType){ case PROPERTY_NONE: WebsiteList = &GeneralWebsiteList; WebsiteListType = &GeneralWebsiteListType; WebsiteListAltID = &GeneralWebsiteListAltID; WebsiteListPID = &GeneralWebsiteListPID; WebsiteListTokens = &GeneralWebsiteListTokens; WebsiteListMediatype = &GeneralWebsiteListMediatype; WebsiteListPref = &GeneralWebsiteListPref; break; case PROPERTY_HOME: WebsiteList = &HomeWebsiteList; WebsiteListType = &HomeWebsiteListType; WebsiteListAltID = &HomeWebsiteListAltID; WebsiteListPID = &HomeWebsiteListPID; WebsiteListTokens = &HomeWebsiteListTokens; WebsiteListMediatype = &HomeWebsiteListMediatype; WebsiteListPref = &HomeWebsiteListPref; break; case PROPERTY_WORK: WebsiteList = &BusinessWebsiteList; WebsiteListType = &BusinessWebsiteListType; WebsiteListAltID = &BusinessWebsiteListAltID; WebsiteListPID = &BusinessWebsiteListPID; WebsiteListTokens = &BusinessWebsiteListTokens; WebsiteListMediatype = &BusinessWebsiteListMediatype; WebsiteListPref = &BusinessWebsiteListPref; break; } intPrevValue = 4; bool PropertyMatched = FALSE; for (std::map::iterator intiter = SplitPoints.begin(); intiter != SplitPoints.end(); ++intiter){ SLiter = SplitLength.find(intiter->first); PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second)); ProcessNameValue(&PropertyData, &PropertyName, &PropertyValue); intPrevValue = intiter->second; // Process properties. size_t intPropertyValueLen = PropertyValue.Len(); if (PropertyValue.Mid((intPropertyValueLen - 1), 1) == wxT("\"")){ PropertyValue.Trim(); PropertyValue.RemoveLast(); } if (PropertyValue.Mid(0, 1) == wxT("\"")){ PropertyValue.Remove(0, 1); } CaptureString(&PropertyValue, FALSE); ProcessStringValue(&PropertyName, "ALTID", WebsiteListAltID, &PropertyValue, URLCount, &PropertyMatched); ProcessStringValue(&PropertyName, "PID", WebsiteListPID, &PropertyValue, URLCount, &PropertyMatched); ProcessStringValue(&PropertyName, "MEDIATYPE", WebsiteListMediatype, &PropertyValue, URLCount, &PropertyMatched); ProcessIntegerValue(&PropertyName, "PREF", WebsiteListPref, &PropertyValue, URLCount, &PropertyMatched); if (PropertyMatched == TRUE){ PropertyMatched = FALSE; continue; } ProcessTokens(&PropertyName, &PropertyValue, &PropertyTokens, &FirstToken); } // Add the data to the General/Home/Work address variables. CaptureString(&PropertySeg2, FALSE); WebsiteList->insert(std::make_pair(*URLCount, PropertySeg2)); if (!PropertyTokens.IsEmpty()){ WebsiteListTokens->insert(std::make_pair(*URLCount, PropertyTokens)); } } void ContactDataObject::ProcessTitle(wxString PropertySeg1, wxString PropertySeg2, int *TitleCount){ // Process the title. std::map SplitPoints; std::map SplitLength; std::map::iterator SLiter; wxString PropertyData; wxString PropertyName; wxString PropertyValue; wxString PropertyTokens; bool FirstToken = TRUE; int intPrevValue = 7; SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue); intPrevValue = 6; PropertyType PropType = PROPERTY_NONE; // Look for type before continuing. CheckType(&PropertySeg1, &SplitPoints, &SplitLength, &intPrevValue, &PropType); // Setup the pointers. std::map *TitleList = NULL; std::map *TitleListAltID = NULL; std::map *TitleListPID = NULL; std::map *TitleListType = NULL; std::map *TitleListTokens = NULL; std::map *TitleListLanguage = NULL; std::map *TitleListPref = NULL; // Setup blank lines for later on. switch(PropType){ case PROPERTY_NONE: TitleList = &GeneralTitleList; TitleListType = &GeneralTitleListType; TitleListAltID = &GeneralTitleListAltID; TitleListPID = &GeneralTitleListPID; TitleListTokens = &GeneralTitleListTokens; TitleListLanguage = &GeneralTitleListLanguage; TitleListPref = &GeneralTitleListPref; break; case PROPERTY_HOME: TitleList = &HomeTitleList; TitleListType = &HomeTitleListType; TitleListAltID = &HomeTitleListAltID; TitleListPID = &HomeTitleListPID; TitleListTokens = &HomeTitleListTokens; TitleListLanguage = &HomeTitleListLanguage; TitleListPref = &HomeTitleListPref; break; case PROPERTY_WORK: TitleList = &BusinessTitleList; TitleListType = &BusinessTitleListType; TitleListAltID = &BusinessTitleListAltID; TitleListPID = &BusinessTitleListPID; TitleListTokens = &BusinessTitleListTokens; TitleListLanguage = &BusinessTitleListLanguage; TitleListPref = &BusinessTitleListPref; break; } intPrevValue = 6; bool PropertyMatched = FALSE; for (std::map::iterator intiter = SplitPoints.begin(); intiter != SplitPoints.end(); ++intiter){ SLiter = SplitLength.find(intiter->first); PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second)); ProcessNameValue(&PropertyData, &PropertyName, &PropertyValue); intPrevValue = intiter->second; // Process properties. size_t intPropertyValueLen = PropertyValue.Len(); if (PropertyValue.Mid((intPropertyValueLen - 1), 1) == wxT("\"")){ PropertyValue.Trim(); PropertyValue.RemoveLast(); } if (PropertyValue.Mid(0, 1) == wxT("\"")){ PropertyValue.Remove(0, 1); } CaptureString(&PropertyValue, FALSE); ProcessStringValue(&PropertyName, "ALTID", TitleListAltID, &PropertyValue, TitleCount, &PropertyMatched); ProcessStringValue(&PropertyName, "PID", TitleListPID, &PropertyValue, TitleCount, &PropertyMatched); ProcessStringValue(&PropertyName, "LANGUAGE", TitleListLanguage, &PropertyValue, TitleCount, &PropertyMatched); ProcessIntegerValue(&PropertyName, "PREF", TitleListPref, &PropertyValue, TitleCount, &PropertyMatched); if (PropertyMatched == TRUE){ PropertyMatched = FALSE; continue; } ProcessTokens(&PropertyName, &PropertyValue, &PropertyTokens, &FirstToken); } // Add the data to the General/Home/Work address variables. CaptureString(&PropertySeg2, FALSE); TitleList->insert(std::make_pair(*TitleCount, PropertySeg2)); if (!PropertyTokens.IsEmpty()){ TitleListTokens->insert(std::make_pair(*TitleCount, PropertyTokens)); } } void ContactDataObject::ProcessRole(wxString PropertySeg1, wxString PropertySeg2, int *RoleCount){ // Process the role. std::map SplitPoints; std::map SplitLength; std::map::iterator SLiter; wxString PropertyData; wxString PropertyName; wxString PropertyValue; wxString PropertyTokens; bool FirstToken = TRUE; int intPrevValue = 6; SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue); intPrevValue = 5; PropertyType PropType = PROPERTY_NONE; // Look for type before continuing. CheckType(&PropertySeg1, &SplitPoints, &SplitLength, &intPrevValue, &PropType); // Setup the pointers. std::map *RoleList = NULL; std::map *RoleListAltID = NULL; std::map *RoleListPID = NULL; std::map *RoleListType = NULL; std::map *RoleListTokens = NULL; std::map *RoleListLanguage = NULL; std::map *RoleListPref = NULL; // Setup blank lines for later on. switch(PropType){ case PROPERTY_NONE: RoleList = &GeneralRoleList; RoleListType = &GeneralRoleListType; RoleListAltID = &GeneralRoleListAltID; RoleListPID = &GeneralRoleListPID; RoleListTokens = &GeneralRoleListTokens; RoleListLanguage = &GeneralRoleListLanguage; RoleListPref = &GeneralRoleListPref; break; case PROPERTY_HOME: RoleList = &HomeRoleList; RoleListType = &HomeRoleListType; RoleListAltID = &HomeRoleListAltID; RoleListPID = &HomeRoleListPID; RoleListTokens = &HomeRoleListTokens; RoleListLanguage = &HomeRoleListLanguage; RoleListPref = &HomeRoleListPref; break; case PROPERTY_WORK: RoleList = &BusinessRoleList; RoleListType = &BusinessRoleListType; RoleListAltID = &BusinessRoleListAltID; RoleListPID = &BusinessRoleListPID; RoleListTokens = &BusinessRoleListTokens; RoleListLanguage = &BusinessRoleListLanguage; RoleListPref = &BusinessRoleListPref; break; } intPrevValue = 5; bool PropertyMatched = FALSE; for (std::map::iterator intiter = SplitPoints.begin(); intiter != SplitPoints.end(); ++intiter){ SLiter = SplitLength.find(intiter->first); PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second)); ProcessNameValue(&PropertyData, &PropertyName, &PropertyValue); intPrevValue = intiter->second; // Process properties. size_t intPropertyValueLen = PropertyValue.Len(); if (PropertyValue.Mid((intPropertyValueLen - 1), 1) == wxT("\"")){ PropertyValue.Trim(); PropertyValue.RemoveLast(); } if (PropertyValue.Mid(0, 1) == wxT("\"")){ PropertyValue.Remove(0, 1); } CaptureString(&PropertyValue, FALSE); ProcessStringValue(&PropertyName, "ALTID", RoleListAltID, &PropertyValue, RoleCount, &PropertyMatched); ProcessStringValue(&PropertyName, "PID", RoleListPID, &PropertyValue, RoleCount, &PropertyMatched); ProcessStringValue(&PropertyName, "LANGUAGE", RoleListLanguage, &PropertyValue, RoleCount, &PropertyMatched); ProcessIntegerValue(&PropertyName, "PREF", RoleListPref, &PropertyValue, RoleCount, &PropertyMatched); if (PropertyMatched == TRUE){ PropertyMatched = FALSE; continue; } ProcessTokens(&PropertyName, &PropertyValue, &PropertyTokens, &FirstToken); } // Add the data to the General/Home/Work address variables. CaptureString(&PropertySeg2, FALSE); RoleList->insert(std::make_pair(*RoleCount, PropertySeg2)); if (!PropertyTokens.IsEmpty()){ RoleListTokens->insert(std::make_pair(*RoleCount, PropertyTokens)); } } void ContactDataObject::ProcessOrganisation(wxString PropertySeg1, wxString PropertySeg2, int *OrganisationCount){ // Process the organisation. std::map SplitPoints; std::map SplitLength; std::map::iterator SLiter; wxString PropertyData; wxString PropertyName; wxString PropertyValue; wxString PropertyTokens; bool FirstToken = TRUE; int intPrevValue = 5; SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue); intPrevValue = 4; PropertyType PropType = PROPERTY_NONE; // Look for type before continuing. CheckType(&PropertySeg1, &SplitPoints, &SplitLength, &intPrevValue, &PropType); // Setup the pointers. std::map *OrganisationsList = NULL; std::map *OrganisationsListAltID = NULL; std::map *OrganisationsListPID = NULL; std::map *OrganisationsListType = NULL; std::map *OrganisationsListTokens = NULL; std::map *OrganisationsListLanguage = NULL; std::map *OrganisationsListSortAs = NULL; std::map *OrganisationsListPref = NULL; // Setup blank lines for later on. switch(PropType){ case PROPERTY_NONE: OrganisationsList = &GeneralOrganisationsList; OrganisationsListType = &GeneralOrganisationsListType; OrganisationsListAltID = &GeneralOrganisationsListAltID; OrganisationsListPID = &GeneralOrganisationsListPID; OrganisationsListTokens = &GeneralOrganisationsListTokens; OrganisationsListLanguage = &GeneralOrganisationsListLanguage; OrganisationsListSortAs = &GeneralOrganisationsListSortAs; OrganisationsListPref = &GeneralOrganisationsListPref; break; case PROPERTY_HOME: OrganisationsList = &HomeOrganisationsList; OrganisationsListType = &HomeOrganisationsListType; OrganisationsListAltID = &HomeOrganisationsListAltID; OrganisationsListPID = &HomeOrganisationsListPID; OrganisationsListTokens = &HomeOrganisationsListTokens; OrganisationsListLanguage = &HomeOrganisationsListLanguage; OrganisationsListSortAs = &HomeOrganisationsListSortAs; OrganisationsListPref = &HomeOrganisationsListPref; break; case PROPERTY_WORK: OrganisationsList = &BusinessOrganisationsList; OrganisationsListType = &BusinessOrganisationsListType; OrganisationsListAltID = &BusinessOrganisationsListAltID; OrganisationsListPID = &BusinessOrganisationsListPID; OrganisationsListTokens = &BusinessOrganisationsListTokens; OrganisationsListLanguage = &BusinessOrganisationsListLanguage; OrganisationsListSortAs = &BusinessOrganisationsListSortAs; OrganisationsListPref = &BusinessOrganisationsListPref; break; } intPrevValue = 4; bool PropertyMatched = FALSE; for (std::map::iterator intiter = SplitPoints.begin(); intiter != SplitPoints.end(); ++intiter){ SLiter = SplitLength.find(intiter->first); PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second)); ProcessNameValue(&PropertyData, &PropertyName, &PropertyValue); intPrevValue = intiter->second; // Process properties. size_t intPropertyValueLen = PropertyValue.Len(); if (PropertyValue.Mid((intPropertyValueLen - 1), 1) == wxT("\"")){ PropertyValue.Trim(); PropertyValue.RemoveLast(); } if (PropertyValue.Mid(0, 1) == wxT("\"")){ PropertyValue.Remove(0, 1); } CaptureString(&PropertyValue, FALSE); ProcessStringValue(&PropertyName, "ALTID", OrganisationsListAltID, &PropertyValue, OrganisationCount, &PropertyMatched); ProcessStringValue(&PropertyName, "PID", OrganisationsListPID, &PropertyValue, OrganisationCount, &PropertyMatched); ProcessStringValue(&PropertyName, "LANGUAGE", OrganisationsListLanguage, &PropertyValue, OrganisationCount, &PropertyMatched); ProcessStringValue(&PropertyName, "SORT-AS", OrganisationsListSortAs, &PropertyValue, OrganisationCount, &PropertyMatched); ProcessIntegerValue(&PropertyName, "PREF", OrganisationsListPref, &PropertyValue, OrganisationCount, &PropertyMatched); if (PropertyMatched == TRUE){ PropertyMatched = FALSE; continue; } ProcessTokens(&PropertyName, &PropertyValue, &PropertyTokens, &FirstToken); } // Add the data to the General/Home/Work address variables. CaptureString(&PropertySeg2, FALSE); OrganisationsList->insert(std::make_pair(*OrganisationCount, PropertySeg2)); if (!PropertyTokens.IsEmpty()){ OrganisationsListTokens->insert(std::make_pair(*OrganisationCount, PropertyTokens)); } } void ContactDataObject::ProcessNote(wxString PropertySeg1, wxString PropertySeg2, int *NoteCount){ // Process the note. std::map SplitPoints; std::map SplitLength; std::map::iterator SLiter; wxString PropertyData; wxString PropertyName; wxString PropertyValue; wxString PropertyTokens; bool FirstToken = TRUE; int intPrevValue = 6; SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue); intPrevValue = 5; PropertyType PropType = PROPERTY_NONE; // Look for type before continuing. CheckType(&PropertySeg1, &SplitPoints, &SplitLength, &intPrevValue, &PropType); // Setup the pointers. std::map *NoteList = NULL; std::map *NoteListAltID = NULL; std::map *NoteListPID = NULL; std::map *NoteListType = NULL; std::map *NoteListTokens = NULL; std::map *NoteListLanguage = NULL; std::map *NoteListPref = NULL; // Setup blank lines for later on. switch(PropType){ case PROPERTY_NONE: NoteList = &GeneralNoteList; NoteListType = &GeneralNoteListType; NoteListAltID = &GeneralNoteListAltID; NoteListPID = &GeneralNoteListPID; NoteListTokens = &GeneralNoteListTokens; NoteListLanguage = &GeneralNoteListLanguage; NoteListPref = &GeneralNoteListPref; break; case PROPERTY_HOME: NoteList = &HomeNoteList; NoteListType = &HomeNoteListType; NoteListAltID = &HomeNoteListAltID; NoteListPID = &HomeNoteListPID; NoteListTokens = &HomeNoteListTokens; NoteListLanguage = &HomeNoteListLanguage; NoteListPref = &HomeNoteListPref; break; case PROPERTY_WORK: NoteList = &BusinessNoteList; NoteListType = &BusinessNoteListType; NoteListAltID = &BusinessNoteListAltID; NoteListPID = &BusinessNoteListPID; NoteListTokens = &BusinessNoteListTokens; NoteListLanguage = &BusinessNoteListLanguage; NoteListPref = &BusinessNoteListPref; break; } intPrevValue = 5; bool PropertyMatched = FALSE; for (std::map::iterator intiter = SplitPoints.begin(); intiter != SplitPoints.end(); ++intiter){ SLiter = SplitLength.find(intiter->first); PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second)); ProcessNameValue(&PropertyData, &PropertyName, &PropertyValue); intPrevValue = intiter->second; // Process properties. size_t intPropertyValueLen = PropertyValue.Len(); if (PropertyValue.Mid((intPropertyValueLen - 1), 1) == wxT("\"")){ PropertyValue.Trim(); PropertyValue.RemoveLast(); } if (PropertyValue.Mid(0, 1) == wxT("\"")){ PropertyValue.Remove(0, 1); } CaptureString(&PropertyValue, FALSE); ProcessStringValue(&PropertyName, "ALTID", NoteListAltID, &PropertyValue, NoteCount, &PropertyMatched); ProcessStringValue(&PropertyName, "PID", NoteListPID, &PropertyValue, NoteCount, &PropertyMatched); ProcessStringValue(&PropertyName, "LANGUAGE", NoteListLanguage, &PropertyValue, NoteCount, &PropertyMatched); ProcessIntegerValue(&PropertyName, "PREF", NoteListPref, &PropertyValue, NoteCount, &PropertyMatched); if (PropertyMatched == TRUE){ PropertyMatched = FALSE; continue; } ProcessTokens(&PropertyName, &PropertyValue, &PropertyTokens, &FirstToken); } // Add the data to the General/Home/Work address variables. CaptureString(&PropertySeg2, FALSE); NoteList->insert(std::make_pair(*NoteCount, PropertySeg2)); if (!PropertyTokens.IsEmpty()){ NoteListTokens->insert(std::make_pair(*NoteCount, PropertyTokens)); } } void ContactDataObject::ProcessCategory(wxString PropertySeg1, wxString PropertySeg2, int *CategoryCount){ // Process the category. std::map SplitPoints; std::map SplitLength; std::map::iterator SLiter; wxString PropertyData; wxString PropertyName; wxString PropertyValue; wxString PropertyTokens; bool FirstToken = TRUE; int intPrevValue = 12; SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue); intPrevValue = 11; PropertyType PropType = PROPERTY_NONE; // Look for type before continuing. CheckType(&PropertySeg1, &SplitPoints, &SplitLength, &intPrevValue, &PropType); // Setup blank lines for later on. switch(PropType){ case PROPERTY_NONE: break; case PROPERTY_HOME: CategoriesListType.insert(std::make_pair(*CategoryCount, "home")); break; case PROPERTY_WORK: CategoriesListType.insert(std::make_pair(*CategoryCount, "work")); break; } intPrevValue = 11; bool PropertyMatched = FALSE; for (std::map::iterator intiter = SplitPoints.begin(); intiter != SplitPoints.end(); ++intiter){ SLiter = SplitLength.find(intiter->first); PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second)); ProcessNameValue(&PropertyData, &PropertyName, &PropertyValue); intPrevValue = intiter->second; // Process properties. size_t intPropertyValueLen = PropertyValue.Len(); if (PropertyValue.Mid((intPropertyValueLen - 1), 1) == wxT("\"")){ PropertyValue.Trim(); PropertyValue.RemoveLast(); } if (PropertyValue.Mid(0, 1) == wxT("\"")){ PropertyValue.Remove(0, 1); } CaptureString(&PropertyValue, FALSE); ProcessStringValue(&PropertyName, "ALTID", &CategoriesListAltID, &PropertyValue, CategoryCount, &PropertyMatched); ProcessStringValue(&PropertyName, "PID", &CategoriesListPID, &PropertyValue, CategoryCount, &PropertyMatched); ProcessStringValue(&PropertyName, "LANGUAGE", &CategoriesListLanguage, &PropertyValue, CategoryCount, &PropertyMatched); ProcessIntegerValue(&PropertyName, "PREF", &CategoriesListPref, &PropertyValue, CategoryCount, &PropertyMatched); if (PropertyMatched == TRUE){ PropertyMatched = FALSE; continue; } ProcessTokens(&PropertyName, &PropertyValue, &PropertyTokens, &FirstToken); } // Deal with multiple categories. int intOrigCatCount = *CategoryCount; bool FirstCategoryProcessed = TRUE; bool AfterFirstToken = FALSE; int intSplitSize = 0; int intSplitsFound = 0; int intSplitSeek = 0; int intPropertyLen = PropertySeg2.Len(); SplitPoints.clear(); SplitLength.clear(); intPrevValue = 0; for (int i = 0; i <= intPropertyLen; i++){ if (intSplitSize == 0 && PropertySeg2.Mid(i, 1) == wxT(" ")){ continue; } intSplitSize++; if (PropertySeg2.Mid(i, 1) == wxT(",") && PropertySeg2.Mid((i - 1), 1) != wxT("\\")){ if (AfterFirstToken == TRUE){ SplitPoints.insert(std::make_pair(intSplitsFound, (i - intSplitSize + 1))); SplitLength.insert(std::make_pair(intSplitsFound, (intSplitSize - 2))); } else { SplitPoints.insert(std::make_pair(intSplitsFound, 0)); SplitLength.insert(std::make_pair(intSplitsFound, (intSplitSize - 2))); AfterFirstToken = TRUE; } intSplitsFound++; intSplitSeek = i; intSplitSize = 0; } } if (SplitPoints.size() > 0){ SplitPoints.insert(std::make_pair(intSplitsFound, (intSplitSeek + 1))); SplitLength.insert(std::make_pair(intSplitsFound, intSplitSize)); } if (SplitPoints.size() == 0){ CategoriesList.insert(std::make_pair(*CategoryCount, PropertySeg2)); if (!PropertyTokens.IsEmpty()){ CategoriesListTokens.insert(std::make_pair(*CategoryCount, PropertyTokens)); } } for (std::map::iterator intiter = SplitPoints.begin(); intiter != SplitPoints.end(); ++intiter){ SLiter = SplitLength.find(intiter->first); intPrevValue = intiter->second; PropertyData = PropertySeg2.Mid(intPrevValue, (SLiter->second + 1)); // Add the data to the General/Home/Work address variables. // Trim any whitespace from the start and end. PropertyData = PropertyData.Trim(FALSE); PropertyData = PropertyData.Trim(TRUE); CaptureString(&PropertyData, FALSE); if (FirstCategoryProcessed == TRUE){ FirstCategoryProcessed = FALSE; CategoriesList.insert(std::make_pair(*CategoryCount, PropertyData)); if (!PropertyTokens.IsEmpty()){ CategoriesListTokens.insert(std::make_pair(*CategoryCount, PropertyTokens)); } continue; } else { (*CategoryCount)++; CategoriesList.insert(std::make_pair(*CategoryCount, PropertyData)); if (!PropertyTokens.IsEmpty()){ CategoriesListTokens.insert(std::make_pair(*CategoryCount, PropertyTokens)); } } // Copy the properties to each of the categories (if it exists). if (!PropertyTokens.IsEmpty()){ CategoriesListTokens.insert(std::make_pair(*CategoryCount, CategoriesListTokens.find(intOrigCatCount)->second)); } // Check if ALTID was used. if (CategoriesListAltID.find(intOrigCatCount) != CategoriesListAltID.end()){ CategoriesListAltID.insert(std::make_pair(*CategoryCount, CategoriesListAltID.find(intOrigCatCount)->second)); } // Check if PID was used. if (CategoriesListPID.find(intOrigCatCount) != CategoriesListPID.end()){ CategoriesListPID.insert(std::make_pair(*CategoryCount, CategoriesListPID.find(intOrigCatCount)->second)); } // Check if PREF was used. if (CategoriesListPref.find(intOrigCatCount) != CategoriesListPref.end()){ CategoriesListPref.insert(std::make_pair(*CategoryCount, CategoriesListPref.find(intOrigCatCount)->second)); } // Check if LANGUAGE was used. if (CategoriesListLanguage.find(intOrigCatCount) != CategoriesListLanguage.end()){ CategoriesListLanguage.insert(std::make_pair(*CategoryCount, CategoriesListLanguage.find(intOrigCatCount)->second)); } // Check if TYPE was used. switch(PropType){ case PROPERTY_NONE: break; case PROPERTY_HOME: CategoriesListType.insert(std::make_pair(*CategoryCount, "home")); break; case PROPERTY_WORK: CategoriesListType.insert(std::make_pair(*CategoryCount, "work")); break; } } } void ContactDataObject::ProcessPhoto(wxString PropertySeg1, wxString PropertySeg2, int *PhotoCount){ // Process the photo. size_t intPropertyLen = PropertySeg1.Len(); std::map SplitPoints; std::map SplitLength; std::map::iterator SLiter; wxString PropertyData; wxString PropertyName; wxString PropertyValue; wxString PropertyTokens; bool FirstToken = TRUE; int intSplitsFound = 0; int intSplitSize = 0; int intPrevValue = 7; SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue); intPrevValue = 6; PropertyType PropType = PROPERTY_NONE; // Look for type before continuing. CheckType(&PropertySeg1, &SplitPoints, &SplitLength, &intPrevValue, &PropType); intPrevValue = 6; bool PropertyMatched = FALSE; for (std::map::iterator intiter = SplitPoints.begin(); intiter != SplitPoints.end(); ++intiter){ SLiter = SplitLength.find(intiter->first); PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second)); ProcessNameValue(&PropertyData, &PropertyName, &PropertyValue); intPrevValue = intiter->second; // Process properties. size_t intPropertyValueLen = PropertyValue.Len(); if (PropertyValue.Mid((intPropertyValueLen - 1), 1) == wxT("\"")){ PropertyValue.Trim(); PropertyValue.RemoveLast(); } if (PropertyValue.Mid(0, 1) == wxT("\"")){ PropertyValue.Remove(0, 1); } CaptureString(&PropertyValue, FALSE); ProcessStringValue(&PropertyName, "ALTID", &PicturesListAltID, &PropertyValue, PhotoCount, &PropertyMatched); ProcessStringValue(&PropertyName, "PID", &PicturesListPID, &PropertyValue, PhotoCount, &PropertyMatched); ProcessStringValue(&PropertyName, "MEDIATYPE", &PicturesListMediatype, &PropertyValue, PhotoCount, &PropertyMatched); ProcessIntegerValue(&PropertyName, "PREF", &PicturesListPref, &PropertyValue, PhotoCount, &PropertyMatched); if (PropertyMatched == TRUE){ PropertyMatched = FALSE; continue; } ProcessTokens(&PropertyName, &PropertyValue, &PropertyTokens, &FirstToken); } intPropertyLen = PropertySeg2.Len(); SplitPoints.clear(); SplitLength.clear(); intSplitsFound = 0; intSplitSize = 0; intPrevValue = 0; CaptureString(&PropertySeg2, FALSE); for (int i = 0; i <= intPropertyLen; i++){ intSplitSize++; if (PropertySeg2.Mid(i, 1) == wxT(";")){ intSplitsFound++; SplitPoints.insert(std::make_pair(intSplitsFound, (i + 1))); if (intSplitsFound == 6){ SplitLength.insert(std::make_pair(intSplitsFound, (intSplitSize - 1))); break; } else { SplitLength.insert(std::make_pair(intSplitsFound, (intSplitSize - 1))); } intSplitSize = 0; } } wxString wxSPhotoURI; wxString wxSPhotoMIME; wxString wxSPhotoEncoding; wxString wxSPhotoData; std::string base64enc; if (intSplitsFound == 0){ } else { std::map::iterator striter; striter = SplitLength.find(1); wxStringTokenizer wSTDataType(PropertySeg2.Mid(0, striter->second), wxT(":")); while (wSTDataType.HasMoreTokens() == TRUE){ wxSPhotoURI = wSTDataType.GetNextToken(); wxSPhotoMIME = wSTDataType.GetNextToken(); break; } wxStringTokenizer wSTDataInfo(PropertySeg2.Mid((striter->second + 1)), wxT(",")); while (wSTDataInfo.HasMoreTokens() == TRUE){ wxSPhotoEncoding = wSTDataInfo.GetNextToken(); wxSPhotoData = wSTDataInfo.GetNextToken(); base64enc = wxSPhotoData.mb_str(); break; } } // Add the data to the General/Home/Work address variables. PicturesList.insert(std::make_pair(*PhotoCount, base64enc)); PicturesListPictureType.insert(std::make_pair(*PhotoCount, wxSPhotoMIME)); PicturesListPicEncType.insert(std::make_pair(*PhotoCount, wxSPhotoEncoding)); switch(PropType){ case PROPERTY_NONE: break; case PROPERTY_HOME: PicturesListType.insert(std::make_pair(*PhotoCount, "home")); break; case PROPERTY_WORK: PicturesListType.insert(std::make_pair(*PhotoCount, "work")); break; } if (!PropertyTokens.IsEmpty()){ PicturesListTokens.insert(std::make_pair(*PhotoCount, PropertyTokens)); } } void ContactDataObject::ProcessLogo(wxString PropertySeg1, wxString PropertySeg2, int *LogoCount){ // Process the logo. size_t intPropertyLen = PropertySeg1.Len(); std::map SplitPoints; std::map SplitLength; std::map::iterator SLiter; wxString PropertyData; wxString PropertyName; wxString PropertyValue; wxString PropertyTokens; bool FirstToken = TRUE; int intSplitsFound = 0; int intSplitSize = 0; int intPrevValue = 6; SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue); intPrevValue = 5; PropertyType PropType = PROPERTY_NONE; // Look for type before continuing. CheckType(&PropertySeg1, &SplitPoints, &SplitLength, &intPrevValue, &PropType); intPrevValue = 5; bool PropertyMatched = FALSE; for (std::map::iterator intiter = SplitPoints.begin(); intiter != SplitPoints.end(); ++intiter){ SLiter = SplitLength.find(intiter->first); PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second)); ProcessNameValue(&PropertyData, &PropertyName, &PropertyValue); intPrevValue = intiter->second; // Process properties. size_t intPropertyValueLen = PropertyValue.Len(); if (PropertyValue.Mid((intPropertyValueLen - 1), 1) == wxT("\"")){ PropertyValue.Trim(); PropertyValue.RemoveLast(); } if (PropertyValue.Mid(0, 1) == wxT("\"")){ PropertyValue.Remove(0, 1); } CaptureString(&PropertyValue, FALSE); ProcessStringValue(&PropertyName, "ALTID", &LogosListAltID, &PropertyValue, LogoCount, &PropertyMatched); ProcessStringValue(&PropertyName, "PID", &LogosListPID, &PropertyValue, LogoCount, &PropertyMatched); ProcessStringValue(&PropertyName, "MEDIATYPE", &LogosListMediatype, &PropertyValue, LogoCount, &PropertyMatched); ProcessIntegerValue(&PropertyName, "PREF", &LogosListPref, &PropertyValue, LogoCount, &PropertyMatched); if (PropertyMatched == TRUE){ PropertyMatched = FALSE; continue; } ProcessTokens(&PropertyName, &PropertyValue, &PropertyTokens, &FirstToken); } intPropertyLen = PropertySeg2.Len(); SplitPoints.clear(); SplitLength.clear(); intSplitsFound = 0; intSplitSize = 0; intPrevValue = 0; CaptureString(&PropertySeg2, FALSE); for (int i = 0; i <= intPropertyLen; i++){ intSplitSize++; if (PropertySeg2.Mid(i, 1) == wxT(";")){ intSplitsFound++; SplitPoints.insert(std::make_pair(intSplitsFound, (i + 1))); if (intSplitsFound == 6){ SplitLength.insert(std::make_pair(intSplitsFound, (intSplitSize - 1))); break; } else { SplitLength.insert(std::make_pair(intSplitsFound, (intSplitSize - 1))); } intSplitSize = 0; } } wxString wxSPhotoURI; wxString wxSPhotoMIME; wxString wxSPhotoEncoding; wxString wxSPhotoData; std::string base64enc; if (intSplitsFound == 0){ } else { std::map::iterator striter; striter = SplitLength.find(1); wxStringTokenizer wSTDataType(PropertySeg2.Mid(0, striter->second), wxT(":")); while (wSTDataType.HasMoreTokens() == TRUE){ wxSPhotoURI = wSTDataType.GetNextToken(); wxSPhotoMIME = wSTDataType.GetNextToken(); break; } wxStringTokenizer wSTDataInfo(PropertySeg2.Mid((striter->second + 1)), wxT(",")); while (wSTDataInfo.HasMoreTokens() == TRUE){ wxSPhotoEncoding = wSTDataInfo.GetNextToken(); wxSPhotoData = wSTDataInfo.GetNextToken(); base64enc = wxSPhotoData.mb_str(); break; } } // Add the data to the General/Home/Work address variables. LogosList.insert(std::make_pair(*LogoCount, base64enc)); LogosListPictureType.insert(std::make_pair(*LogoCount, wxSPhotoMIME)); LogosListPicEncType.insert(std::make_pair(*LogoCount, wxSPhotoEncoding)); switch(PropType){ case PROPERTY_NONE: break; case PROPERTY_HOME: LogosListType.insert(std::make_pair(*LogoCount, "home")); break; case PROPERTY_WORK: LogosListType.insert(std::make_pair(*LogoCount, "work")); break; } if (!PropertyTokens.IsEmpty()){ LogosListTokens.insert(std::make_pair(*LogoCount, PropertyTokens)); } } void ContactDataObject::ProcessSound(wxString PropertySeg1, wxString PropertySeg2, int *SoundCount){ // Process the sound. size_t intPropertyLen = PropertySeg1.Len(); std::map SplitPoints; std::map SplitLength; std::map::iterator SLiter; wxString PropertyData; wxString PropertyName; wxString PropertyValue; wxString PropertyTokens; bool FirstToken = TRUE; int intSplitsFound = 0; int intSplitSize = 0; int intPrevValue = 7; SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue); intPrevValue = 6; PropertyType PropType = PROPERTY_NONE; // Look for type before continuing. CheckType(&PropertySeg1, &SplitPoints, &SplitLength, &intPrevValue, &PropType); intPrevValue = 6; bool PropertyMatched = FALSE; for (std::map::iterator intiter = SplitPoints.begin(); intiter != SplitPoints.end(); ++intiter){ SLiter = SplitLength.find(intiter->first); PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second)); ProcessNameValue(&PropertyData, &PropertyName, &PropertyValue); intPrevValue = intiter->second; // Process properties. size_t intPropertyValueLen = PropertyValue.Len(); if (PropertyValue.Mid((intPropertyValueLen - 1), 1) == wxT("\"")){ PropertyValue.Trim(); PropertyValue.RemoveLast(); } if (PropertyValue.Mid(0, 1) == wxT("\"")){ PropertyValue.Remove(0, 1); } CaptureString(&PropertyValue, FALSE); ProcessStringValue(&PropertyName, "ALTID", &SoundsListAltID, &PropertyValue, SoundCount, &PropertyMatched); ProcessStringValue(&PropertyName, "PID", &SoundsListPID, &PropertyValue, SoundCount, &PropertyMatched); ProcessStringValue(&PropertyName, "MEDIATYPE", &SoundsListMediatype, &PropertyValue, SoundCount, &PropertyMatched); ProcessStringValue(&PropertyName, "LANGUAGE", &SoundsListLanguage, &PropertyValue, SoundCount, &PropertyMatched); ProcessIntegerValue(&PropertyName, "PREF", &SoundsListPref, &PropertyValue, SoundCount, &PropertyMatched); if (PropertyMatched == TRUE){ PropertyMatched = FALSE; continue; } ProcessTokens(&PropertyName, &PropertyValue, &PropertyTokens, &FirstToken); } intPropertyLen = PropertySeg2.Len(); SplitPoints.clear(); SplitLength.clear(); intSplitsFound = 0; intSplitSize = 0; intPrevValue = 0; CaptureString(&PropertySeg2, FALSE); for (int i = 0; i <= intPropertyLen; i++){ intSplitSize++; if (PropertySeg2.Mid(i, 1) == wxT(";")){ intSplitsFound++; SplitPoints.insert(std::make_pair(intSplitsFound, (i + 1))); if (intSplitsFound == 6){ SplitLength.insert(std::make_pair(intSplitsFound, (intSplitSize - 1))); break; } else { SplitLength.insert(std::make_pair(intSplitsFound, (intSplitSize - 1))); } intSplitSize = 0; } } wxString wxSSoundURI; wxString wxSSoundMIME; wxString wxSSoundEncoding; wxString wxSSoundData; std::string base64enc; if (intSplitsFound == 0){ } else { std::map::iterator striter; striter = SplitLength.find(1); wxStringTokenizer wSTDataType(PropertySeg2.Mid(0, striter->second), wxT(":")); while (wSTDataType.HasMoreTokens() == TRUE){ wxSSoundURI = wSTDataType.GetNextToken(); wxSSoundMIME = wSTDataType.GetNextToken(); break; } wxStringTokenizer wSTDataInfo(PropertySeg2.Mid((striter->second + 1)), wxT(",")); while (wSTDataInfo.HasMoreTokens() == TRUE){ wxSSoundEncoding = wSTDataInfo.GetNextToken(); wxSSoundData = wSTDataInfo.GetNextToken(); base64enc = wxSSoundData.mb_str(); break; } } // Add the data to the General/Home/Work address variables. switch(PropType){ case PROPERTY_NONE: break; case PROPERTY_HOME: SoundsListType.insert(std::make_pair(*SoundCount, "home")); break; case PROPERTY_WORK: SoundsListType.insert(std::make_pair(*SoundCount, "work")); break; } SoundsList.insert(std::make_pair(*SoundCount, base64enc)); SoundsListAudioEncType.insert(std::make_pair(*SoundCount, wxSSoundEncoding)); SoundsListAudioType.insert(std::make_pair(*SoundCount, wxSSoundMIME)); if (!PropertyTokens.IsEmpty()){ SoundsListTokens.insert(std::make_pair(*SoundCount, PropertyTokens)); } } void ContactDataObject::ProcessCalendarURI(wxString PropertySeg1, wxString PropertySeg2, int *CalURICount){ // Process the calendar URI. size_t intPropertyLen = PropertySeg1.Len(); std::map SplitPoints; std::map SplitLength; std::map::iterator SLiter; wxString PropertyData; wxString PropertyName; wxString PropertyValue; wxString PropertyTokens; bool FirstToken = TRUE; int intPrevValue = 8; SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue); intPrevValue = 7; PropertyType PropType = PROPERTY_NONE; // Look for type before continuing. CheckType(&PropertySeg1, &SplitPoints, &SplitLength, &intPrevValue, &PropType); intPrevValue = 7; bool PropertyMatched = FALSE; for (std::map::iterator intiter = SplitPoints.begin(); intiter != SplitPoints.end(); ++intiter){ SLiter = SplitLength.find(intiter->first); PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second)); ProcessNameValue(&PropertyData, &PropertyName, &PropertyValue); intPrevValue = intiter->second; // Process properties. size_t intPropertyValueLen = PropertyValue.Len(); if (PropertyValue.Mid((intPropertyValueLen - 1), 1) == wxT("\"")){ PropertyValue.Trim(); PropertyValue.RemoveLast(); } if (PropertyValue.Mid(0, 1) == wxT("\"")){ PropertyValue.Remove(0, 1); } CaptureString(&PropertyValue, FALSE); ProcessStringValue(&PropertyName, "ALTID", &CalendarListAltID, &PropertyValue, CalURICount, &PropertyMatched); ProcessStringValue(&PropertyName, "PID", &CalendarListPID, &PropertyValue, CalURICount, &PropertyMatched); ProcessStringValue(&PropertyName, "MEDIATYPE", &CalendarListMediatype, &PropertyValue, CalURICount, &PropertyMatched); ProcessIntegerValue(&PropertyName, "PREF", &CalendarListPref, &PropertyValue, CalURICount, &PropertyMatched); if (PropertyMatched == TRUE){ PropertyMatched = FALSE; continue; } ProcessTokens(&PropertyName, &PropertyValue, &PropertyTokens, &FirstToken); } SplitPoints.clear(); SplitLength.clear(); intPrevValue = 0; CaptureString(&PropertySeg2, FALSE); // Add the data to the General/Home/Work address variables. switch(PropType){ case PROPERTY_NONE: break; case PROPERTY_HOME: CalendarListType.insert(std::make_pair(*CalURICount, "home")); break; case PROPERTY_WORK: CalendarListType.insert(std::make_pair(*CalURICount, "work")); break; } CalendarList.insert(std::make_pair(*CalURICount, PropertySeg2)); if (!PropertyTokens.IsEmpty()){ CalendarListTokens.insert(std::make_pair(*CalURICount, PropertyTokens)); } } void ContactDataObject::ProcessCalendarAddressURI(wxString PropertySeg1, wxString PropertySeg2, int *CalAdrURICount){ // Process the calendar address URI. std::map SplitPoints; std::map SplitLength; std::map::iterator SLiter; wxString PropertyData; wxString PropertyName; wxString PropertyValue; wxString PropertyTokens; bool FirstToken = TRUE; int intPrevValue = 8; SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue); intPrevValue = 7; PropertyType PropType = PROPERTY_NONE; // Look for type before continuing. CheckType(&PropertySeg1, &SplitPoints, &SplitLength, &intPrevValue, &PropType); intPrevValue = 7; bool PropertyMatched = FALSE; for (std::map::iterator intiter = SplitPoints.begin(); intiter != SplitPoints.end(); ++intiter){ SLiter = SplitLength.find(intiter->first); PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second)); ProcessNameValue(&PropertyData, &PropertyName, &PropertyValue); intPrevValue = intiter->second; // Process properties. size_t intPropertyValueLen = PropertyValue.Len(); if (PropertyValue.Mid((intPropertyValueLen - 1), 1) == wxT("\"")){ PropertyValue.Trim(); PropertyValue.RemoveLast(); } if (PropertyValue.Mid(0, 1) == wxT("\"")){ PropertyValue.Remove(0, 1); } CaptureString(&PropertyValue, FALSE); ProcessStringValue(&PropertyName, "ALTID", &CalendarRequestListAltID, &PropertyValue, CalAdrURICount, &PropertyMatched); ProcessStringValue(&PropertyName, "PID", &CalendarRequestListPID, &PropertyValue, CalAdrURICount, &PropertyMatched); ProcessStringValue(&PropertyName, "MEDIATYPE", &CalendarRequestListMediatype, &PropertyValue, CalAdrURICount, &PropertyMatched); ProcessIntegerValue(&PropertyName, "PREF", &CalendarRequestListPref, &PropertyValue, CalAdrURICount, &PropertyMatched); if (PropertyMatched == TRUE){ PropertyMatched = FALSE; continue; } ProcessTokens(&PropertyName, &PropertyValue, &PropertyTokens, &FirstToken); } SplitPoints.clear(); SplitLength.clear(); intPrevValue = 0; CaptureString(&PropertySeg2, FALSE); // Add the data to the General/Home/Work address variables. switch(PropType){ case PROPERTY_NONE: break; case PROPERTY_HOME: CalendarRequestListType.insert(std::make_pair(*CalAdrURICount, "home")); break; case PROPERTY_WORK: CalendarRequestListType.insert(std::make_pair(*CalAdrURICount, "work")); break; } CalendarRequestList.insert(std::make_pair(*CalAdrURICount, PropertySeg2)); if (!PropertyTokens.IsEmpty()){ CalendarRequestListTokens.insert(std::make_pair(*CalAdrURICount, PropertyTokens)); } } void ContactDataObject::ProcessCalendarFreeBusy(wxString PropertySeg1, wxString PropertySeg2, int *FreeBusyAddressCount){ // Process the calendar free busy URL. size_t intPropertyLen = PropertySeg1.Len(); std::map SplitPoints; std::map SplitLength; std::map::iterator SLiter; wxString PropertyData; wxString PropertyName; wxString PropertyValue; wxString PropertyTokens; bool FirstToken = TRUE; int intPrevValue = 7; SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue); intPrevValue = 6; PropertyType PropType = PROPERTY_NONE; // Look for type before continuing. CheckType(&PropertySeg1, &SplitPoints, &SplitLength, &intPrevValue, &PropType); intPrevValue = 6; bool PropertyMatched = FALSE; for (std::map::iterator intiter = SplitPoints.begin(); intiter != SplitPoints.end(); ++intiter){ SLiter = SplitLength.find(intiter->first); PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second)); ProcessNameValue(&PropertyData, &PropertyName, &PropertyValue); intPrevValue = intiter->second; // Process properties. size_t intPropertyValueLen = PropertyValue.Len(); if (PropertyValue.Mid((intPropertyValueLen - 1), 1) == wxT("\"")){ PropertyValue.Trim(); PropertyValue.RemoveLast(); } if (PropertyValue.Mid(0, 1) == wxT("\"")){ PropertyValue.Remove(0, 1); } CaptureString(&PropertyValue, FALSE); ProcessStringValue(&PropertyName, "ALTID", &FreeBusyListAltID, &PropertyValue, FreeBusyAddressCount, &PropertyMatched); ProcessStringValue(&PropertyName, "PID", &FreeBusyListPID, &PropertyValue, FreeBusyAddressCount, &PropertyMatched); ProcessStringValue(&PropertyName, "MEDIATYPE", &FreeBusyListMediatype, &PropertyValue, FreeBusyAddressCount, &PropertyMatched); ProcessIntegerValue(&PropertyName, "PREF", &FreeBusyListPref, &PropertyValue, FreeBusyAddressCount, &PropertyMatched); if (PropertyMatched == TRUE){ PropertyMatched = FALSE; continue; } ProcessTokens(&PropertyName, &PropertyValue, &PropertyTokens, &FirstToken); } intPropertyLen = PropertySeg2.Len(); SplitPoints.clear(); SplitLength.clear(); intPrevValue = 0; CaptureString(&PropertySeg2, FALSE); // Add the data to the General/Home/Work address variables. switch(PropType){ case PROPERTY_NONE: break; case PROPERTY_HOME: FreeBusyListType.insert(std::make_pair(*FreeBusyAddressCount, "home")); break; case PROPERTY_WORK: FreeBusyListType.insert(std::make_pair(*FreeBusyAddressCount, "work")); break; } FreeBusyList.insert(std::make_pair(*FreeBusyAddressCount, PropertySeg2)); if (!PropertyTokens.IsEmpty()){ FreeBusyListTokens.insert(std::make_pair(*FreeBusyAddressCount, PropertyTokens)); } } void ContactDataObject::ProcessKey(wxString PropertySeg1, wxString PropertySeg2, int *KeyCount){ // Process the key. std::map SplitPoints; std::map SplitLength; std::map::iterator SLiter; wxString PropertyData; wxString PropertyName; wxString PropertyValue; wxString PropertyTokens; bool FirstToken = TRUE; int intSplitsFound = 0; int intSplitSize = 0; int intPrevValue = 5; SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue); intPrevValue = 4; PropertyType PropType = PROPERTY_NONE; // Look for type before continuing. CheckType(&PropertySeg1, &SplitPoints, &SplitLength, &intPrevValue, &PropType); intPrevValue = 4; bool PropertyMatched = FALSE; for (std::map::iterator intiter = SplitPoints.begin(); intiter != SplitPoints.end(); ++intiter){ SLiter = SplitLength.find(intiter->first); PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second)); ProcessNameValue(&PropertyData, &PropertyName, &PropertyValue); intPrevValue = intiter->second; // Process properties. size_t intPropertyValueLen = PropertyValue.Len(); if (PropertyValue.Mid((intPropertyValueLen - 1), 1) == wxT("\"")){ PropertyValue.Trim(); PropertyValue.RemoveLast(); } if (PropertyValue.Mid(0, 1) == wxT("\"")){ PropertyValue.Remove(0, 1); } ProcessStringValue(&PropertyName, "ALTID", &KeyListAltID, &PropertyValue, KeyCount, &PropertyMatched); ProcessStringValue(&PropertyName, "PID", &KeyListPID, &PropertyValue, KeyCount, &PropertyMatched); ProcessIntegerValue(&PropertyName, "PREF", &KeyListPref, &PropertyValue, KeyCount, &PropertyMatched); if (PropertyMatched == TRUE){ PropertyMatched = FALSE; continue; } ProcessTokens(&PropertyName, &PropertyValue, &PropertyTokens, &FirstToken); } size_t intPropertyLen = PropertySeg2.Len(); SplitPoints.clear(); SplitLength.clear(); intSplitsFound = 0; intSplitSize = 0; intPrevValue = 0; for (int i = 0; i <= intPropertyLen; i++){ intSplitSize++; if (PropertySeg2.Mid(i, 1) == wxT(";") && PropertySeg2.Mid((i - 1), 1) != wxT("\\")){ intSplitsFound++; SplitPoints.insert(std::make_pair(intSplitsFound, (i + 1))); if (intSplitsFound == 6){ SplitLength.insert(std::make_pair(intSplitsFound, (intSplitSize - 1))); break; } else { SplitLength.insert(std::make_pair(intSplitsFound, (intSplitSize - 1))); } intSplitSize = 0; } } wxString wxSKeyURI; wxString wxSKeyMIME; wxString wxSKeyEncoding; wxString wxSKeyData; std::string base64enc; if (intSplitsFound == 0){ } else { std::map::iterator striter; striter = SplitLength.find(1); wxStringTokenizer wSTDataType(PropertySeg2.Mid(0, striter->second), wxT(":")); while (wSTDataType.HasMoreTokens() == TRUE){ wxSKeyURI = wSTDataType.GetNextToken(); wxSKeyMIME = wSTDataType.GetNextToken(); break; } if (wxSKeyURI == wxT("data")){ wxStringTokenizer wSTDataInfo(PropertySeg2.Mid((striter->second + 1)), wxT(",")); while (wSTDataInfo.HasMoreTokens() == TRUE){ wxSKeyEncoding = wSTDataInfo.GetNextToken(); wxSKeyData = wSTDataInfo.GetNextToken(); break; } } } // Add the data to the General/Home/Work address variables. if (wxSKeyURI == wxT("data")){ KeyListDataEncType.erase(*KeyCount); KeyListKeyType.erase(*KeyCount); KeyListDataEncType.insert(std::make_pair(*KeyCount, wxSKeyEncoding)); KeyListKeyType.insert(std::make_pair(*KeyCount, TRUE)); KeyList.erase(*KeyCount); KeyList.insert(std::make_pair(*KeyCount, wxSKeyData)); } else { KeyList.erase(*KeyCount); KeyList.insert(std::make_pair(*KeyCount, PropertySeg2)); } KeyListDataType.insert(std::make_pair(*KeyCount, wxSKeyMIME)); switch (PropType){ case PROPERTY_NONE: break; case PROPERTY_HOME: KeyListType.insert(std::make_pair(*KeyCount, wxT("home"))); break; case PROPERTY_WORK: KeyListType.insert(std::make_pair(*KeyCount, wxT("work"))); break; } if (!PropertyTokens.IsEmpty()){ KeyListTokens.insert(std::make_pair(*KeyCount, PropertyTokens)); } } void ContactDataObject::ProcessVendor(wxString PropertySeg1, wxString PropertySeg2, int *VendorCount){ // Process the vendor information. // Split the Vendor three ways. wxStringTokenizer wSTVendorDetails(PropertySeg1, wxT("-")); wxString wxSVNDID; wxString wxSVNDPropName; while (wSTVendorDetails.HasMoreTokens() == TRUE){ wSTVendorDetails.GetNextToken(); wxSVNDID = wSTVendorDetails.GetNextToken(); wxSVNDPropName = wSTVendorDetails.GetNextToken(); break; } if (!wxSVNDID.IsEmpty() && !wxSVNDPropName.IsEmpty()){ // Add the data to the vendor variables. VendorList.erase(*VendorCount); VendorListPEN.erase(*VendorCount); VendorListElement.erase(*VendorCount); VendorList.insert(std::make_pair(*VendorCount, PropertySeg2)); VendorListPEN.insert(std::make_pair(*VendorCount, wxSVNDID)); VendorListElement.insert(std::make_pair(*VendorCount, wxSVNDPropName)); } } void ContactDataObject::ClearData(){ // Clear the contact information. NameTitle.clear(); NameForename.clear(); NameSurname.clear(); NameOtherNames.clear(); NameSuffix.clear(); NameNickname.clear(); NameDisplayAs.clear(); NameLanguage.clear(); NameAltID.clear(); NameTokens.clear(); Birthday.clear(); BirthdayAltID.clear(); BirthdayCalScale.clear(); BirthdayTokens.clear(); Anniversary.clear(); AnniversaryAltID.clear(); AnniversaryCalScale.clear(); AnniversaryTokens.clear(); Gender.clear(); GenderDetails.clear(); GenderTokens.clear(); UIDToken.clear(); Revision.clear(); RevisionTokens.clear(); SourceList.clear(); SourceListAltID.clear(); SourceListPID.clear(); SourceListType.clear(); SourceListTokens.clear(); SourceListMediatype.clear(); SourceListPref.clear(); XMLList.clear(); XMLListAltID.clear(); ClientPIDList.clear(); ClientPIDListTokens.clear(); FullNamesList.clear(); FullNamesListType.clear(); FullNamesListLanguage.clear(); FullNamesListAltID.clear(); FullNamesListPID.clear(); FullNamesListTokens.clear(); FullNamesListPref.clear(); GeneralNicknamesList.clear(); GeneralNicknamesListType.clear(); GeneralNicknamesListLanguage.clear(); GeneralNicknamesListAltID.clear(); GeneralNicknamesListPID.clear(); GeneralNicknamesListTokens.clear(); GeneralNicknamesListPref.clear(); GeneralAddressList.clear(); GeneralAddressListTown.clear(); GeneralAddressListCounty.clear(); GeneralAddressListPostCode.clear(); GeneralAddressListCountry.clear(); GeneralAddressListLabel.clear(); GeneralAddressListLang.clear(); GeneralAddressListAltID.clear(); GeneralAddressListPID.clear(); GeneralAddressListTokens.clear(); GeneralAddressListGeo.clear(); GeneralAddressListTimezone.clear(); GeneralAddressListType.clear(); GeneralAddressListMediatype.clear(); GeneralAddressListPref.clear(); GeneralEmailList.clear(); GeneralEmailListAltID.clear(); GeneralEmailListPID.clear(); GeneralEmailListType.clear(); GeneralEmailListTokens.clear(); GeneralEmailListPref.clear(); GeneralIMList.clear(); GeneralIMListAltID.clear(); GeneralIMListPID.clear(); GeneralIMListType.clear(); GeneralIMListTypeInfo.clear(); GeneralIMListTokens.clear(); GeneralIMListMediatype.clear(); GeneralIMListPref.clear(); GeneralTelephoneList.clear(); GeneralTelephoneListAltID.clear(); GeneralTelephoneListPID.clear(); GeneralTelephoneListType.clear(); GeneralTelephoneListTokens.clear(); GeneralTelephoneListTypeInfo.clear(); GeneralTelephoneListPref.clear(); GeneralLanguageList.clear(); GeneralLanguageListAltID.clear(); GeneralLanguageListPID.clear(); GeneralLanguageListType.clear(); GeneralLanguageListTokens.clear(); GeneralLanguageListPref.clear(); GeneralTZList.clear(); GeneralTZListAltID.clear(); GeneralTZListPID.clear(); GeneralTZListType.clear(); GeneralTZListTokens.clear(); GeneralTZListMediatype.clear(); GeneralTZListPref.clear(); GeneralGeographyList.clear(); GeneralGeographyListAltID.clear(); GeneralGeographyListPID.clear(); GeneralGeographyListType.clear(); GeneralGeographyListTokens.clear(); GeneralGeographyListMediatype.clear(); GeneralGeographyListPref.clear(); GeneralRelatedList.clear(); GeneralRelatedListRelType.clear(); GeneralRelatedListLanguage.clear(); GeneralRelatedListAltID.clear(); GeneralRelatedListPID.clear(); GeneralRelatedListType.clear(); GeneralRelatedListTokens.clear(); GeneralRelatedListPref.clear(); GeneralWebsiteList.clear(); GeneralWebsiteListAltID.clear(); GeneralWebsiteListPID.clear(); GeneralWebsiteListType.clear(); GeneralWebsiteListTokens.clear(); GeneralWebsiteListMediatype.clear(); GeneralWebsiteListPref.clear(); GeneralTitleList.clear(); GeneralTitleListLanguage.clear(); GeneralTitleListAltID.clear(); GeneralTitleListPID.clear(); GeneralTitleListType.clear(); GeneralTitleListTokens.clear(); GeneralTitleListPref.clear(); GeneralRoleList.clear(); GeneralRoleListLanguage.clear(); GeneralRoleListAltID.clear(); GeneralRoleListPID.clear(); GeneralRoleListType.clear(); GeneralRoleListTokens.clear(); GeneralRoleListPref.clear(); GeneralOrganisationsList.clear(); GeneralOrganisationsListLanguage.clear(); GeneralOrganisationsListAltID.clear(); GeneralOrganisationsListPID.clear(); GeneralOrganisationsListType.clear(); GeneralOrganisationsListTokens.clear(); GeneralOrganisationsListSortAs.clear(); GeneralOrganisationsListPref.clear(); GeneralNoteList.clear(); GeneralNoteListLanguage.clear(); GeneralNoteListAltID.clear(); GeneralNoteListPID.clear(); GeneralNoteListType.clear(); GeneralNoteListTokens.clear(); GeneralNoteListPref.clear(); /* Items on Home Tab */ HomeNicknamesList.clear(); HomeNicknamesListType.clear(); HomeNicknamesListLanguage.clear(); HomeNicknamesListAltID.clear(); HomeNicknamesListPID.clear(); HomeNicknamesListTokens.clear(); HomeNicknamesListPref.clear(); HomeAddressList.clear(); HomeAddressListTown.clear(); HomeAddressListCounty.clear(); HomeAddressListPostCode.clear(); HomeAddressListCountry.clear(); HomeAddressListLabel.clear(); HomeAddressListLang.clear(); HomeAddressListAltID.clear(); HomeAddressListPID.clear(); HomeAddressListTokens.clear(); HomeAddressListGeo.clear(); HomeAddressListTimezone.clear(); HomeAddressListType.clear(); HomeAddressListMediatype.clear(); HomeAddressListPref.clear(); HomeEmailList.clear(); HomeEmailListAltID.clear(); HomeEmailListPID.clear(); HomeEmailListType.clear(); HomeEmailListTokens.clear(); HomeEmailListPref.clear(); HomeIMList.clear(); HomeIMListAltID.clear(); HomeIMListPID.clear(); HomeIMListType.clear(); HomeIMListTypeInfo.clear(); HomeIMListTokens.clear(); HomeIMListMediatype.clear(); HomeIMListPref.clear(); HomeTelephoneList.clear(); HomeTelephoneListAltID.clear(); HomeTelephoneListPID.clear(); HomeTelephoneListType.clear(); HomeTelephoneListTokens.clear(); HomeTelephoneListTypeInfo.clear(); HomeTelephoneListPref.clear(); HomeLanguageList.clear(); HomeLanguageListAltID.clear(); HomeLanguageListPID.clear(); HomeLanguageListType.clear(); HomeLanguageListTokens.clear(); HomeLanguageListPref.clear(); HomeTZList.clear(); HomeTZListAltID.clear(); HomeTZListPID.clear(); HomeTZListType.clear(); HomeTZListTokens.clear(); HomeTZListMediatype.clear(); HomeTZListPref.clear(); HomeGeographyList.clear(); HomeGeographyListAltID.clear(); HomeGeographyListPID.clear(); HomeGeographyListType.clear(); HomeGeographyListTokens.clear(); HomeGeographyListMediatype.clear(); HomeGeographyListPref.clear(); HomeWebsiteList.clear(); HomeWebsiteListAltID.clear(); HomeWebsiteListPID.clear(); HomeWebsiteListType.clear(); HomeWebsiteListTokens.clear(); HomeWebsiteListMediatype.clear(); HomeWebsiteListPref.clear(); HomeTitleList.clear(); HomeTitleListLanguage.clear(); HomeTitleListAltID.clear(); HomeTitleListPID.clear(); HomeTitleListType.clear(); HomeTitleListTokens.clear(); HomeTitleListPref.clear(); HomeRoleList.clear(); HomeRoleListLanguage.clear(); HomeRoleListAltID.clear(); HomeRoleListPID.clear(); HomeRoleListType.clear(); HomeRoleListTokens.clear(); HomeRoleListPref.clear(); HomeOrganisationsList.clear(); HomeOrganisationsListLanguage.clear(); HomeOrganisationsListAltID.clear(); HomeOrganisationsListPID.clear(); HomeOrganisationsListType.clear(); HomeOrganisationsListTokens.clear(); HomeOrganisationsListSortAs.clear(); HomeOrganisationsListPref.clear(); HomeNoteList.clear(); HomeNoteListLanguage.clear(); HomeNoteListAltID.clear(); HomeNoteListPID.clear(); HomeNoteListType.clear(); HomeNoteListTokens.clear(); HomeNoteListPref.clear(); /* Items on the Business tab */ BusinessNicknamesList.clear(); BusinessNicknamesListType.clear(); BusinessNicknamesListLanguage.clear(); BusinessNicknamesListAltID.clear(); BusinessNicknamesListPID.clear(); BusinessNicknamesListTokens.clear(); BusinessNicknamesListPref.clear(); BusinessAddressList.clear(); BusinessAddressListTown.clear(); BusinessAddressListCounty.clear(); BusinessAddressListPostCode.clear(); BusinessAddressListCountry.clear(); BusinessAddressListLabel.clear(); BusinessAddressListLang.clear(); BusinessAddressListAltID.clear(); BusinessAddressListPID.clear(); BusinessAddressListTokens.clear(); BusinessAddressListGeo.clear(); BusinessAddressListTimezone.clear(); BusinessAddressListType.clear(); BusinessAddressListMediatype.clear(); BusinessAddressListPref.clear(); BusinessEmailList.clear(); BusinessEmailListAltID.clear(); BusinessEmailListPID.clear(); BusinessEmailListType.clear(); BusinessEmailListTokens.clear(); BusinessEmailListPref.clear(); BusinessIMList.clear(); BusinessIMListAltID.clear(); BusinessIMListPID.clear(); BusinessIMListType.clear(); BusinessIMListTokens.clear(); BusinessIMListMediatype.clear(); BusinessIMListPref.clear(); BusinessTelephoneList.clear(); BusinessTelephoneListAltID.clear(); BusinessTelephoneListPID.clear(); BusinessTelephoneListType.clear(); BusinessTelephoneListTokens.clear(); BusinessTelephoneListPref.clear(); BusinessLanguageList.clear(); BusinessLanguageListAltID.clear(); BusinessLanguageListPID.clear(); BusinessLanguageListType.clear(); BusinessLanguageListTokens.clear(); BusinessLanguageListPref.clear(); BusinessTZList.clear(); BusinessTZListAltID.clear(); BusinessTZListPID.clear(); BusinessTZListType.clear(); BusinessTZListTokens.clear(); BusinessTZListMediatype.clear(); BusinessTZListPref.clear(); BusinessGeographyList.clear(); BusinessGeographyListAltID.clear(); BusinessGeographyListPID.clear(); BusinessGeographyListType.clear(); BusinessGeographyListTokens.clear(); BusinessGeographyListMediatype.clear(); BusinessGeographyListPref.clear(); BusinessWebsiteList.clear(); BusinessWebsiteListAltID.clear(); BusinessWebsiteListPID.clear(); BusinessWebsiteListType.clear(); BusinessWebsiteListTokens.clear(); BusinessWebsiteListMediatype.clear(); BusinessWebsiteListPref.clear(); BusinessTitleList.clear(); BusinessTitleListLanguage.clear(); BusinessTitleListAltID.clear(); BusinessTitleListPID.clear(); BusinessTitleListType.clear(); BusinessTitleListTokens.clear(); BusinessTitleListPref.clear(); BusinessRoleList.clear(); BusinessRoleListLanguage.clear(); BusinessRoleListAltID.clear(); BusinessRoleListPID.clear(); BusinessRoleListType.clear(); BusinessRoleListTokens.clear(); BusinessRoleListPref.clear(); BusinessOrganisationsList.clear(); BusinessOrganisationsListLanguage.clear(); BusinessOrganisationsListAltID.clear(); BusinessOrganisationsListPID.clear(); BusinessOrganisationsListType.clear(); BusinessOrganisationsListTokens.clear(); BusinessOrganisationsListSortAs.clear(); BusinessOrganisationsListPref.clear(); BusinessNoteList.clear(); BusinessNoteListLanguage.clear(); BusinessNoteListAltID.clear(); BusinessNoteListPID.clear(); BusinessNoteListType.clear(); BusinessNoteListTokens.clear(); BusinessNoteListPref.clear(); /* Items on the Categories tab */ CategoriesList.clear(); CategoriesListAltID.clear(); CategoriesListPID.clear(); CategoriesListType.clear(); CategoriesListTokens.clear(); CategoriesListLanguage.clear(); CategoriesListPref.clear(); /* Items on the Groups tab */ GroupsList.clear(); GroupsListAltID.clear(); GroupsListPID.clear(); GroupsListType.clear(); GroupsListMediaType.clear(); GroupsListTokens.clear(); GroupsListPref.clear(); /* Items on the Pictures tab */ PicturesList.clear(); PicturesListAltID.clear(); PicturesListPID.clear(); PicturesListType.clear(); PicturesListPicEncType.clear(); PicturesListPictureType.clear(); PicturesListTokens.clear(); PicturesListMediatype.clear(); PicturesListPref.clear(); /* Items on the Logos tab */ LogosList.clear(); LogosListAltID.clear(); LogosListPID.clear(); LogosListType.clear(); LogosListPicEncType.clear(); LogosListPictureType.clear(); LogosListTokens.clear(); LogosListMediatype.clear(); LogosListPref.clear(); /* Items on the Sounds tab */ SoundsList.clear(); SoundsListAltID.clear(); SoundsListPID.clear(); SoundsListType.clear(); SoundsListAudioEncType.clear(); SoundsListAudioType.clear(); SoundsListTokens.clear(); SoundsListMediatype.clear(); SoundsListPref.clear(); /* Items on the Calendaring tab */ CalendarList.clear(); CalendarListAltID.clear(); CalendarListPID.clear(); CalendarListType.clear(); CalendarListTokens.clear(); CalendarListMediatype.clear(); CalendarListPref.clear(); CalendarRequestList.clear(); CalendarRequestListAltID.clear(); CalendarRequestListPID.clear(); CalendarRequestListType.clear(); CalendarRequestListTokens.clear(); CalendarRequestListMediatype.clear(); CalendarRequestListPref.clear(); FreeBusyList.clear(); FreeBusyListAltID.clear(); FreeBusyListPID.clear(); FreeBusyListType.clear(); FreeBusyListTokens.clear(); FreeBusyListMediatype.clear(); FreeBusyListPref.clear(); /* Items on the Security tab */ KeyList.clear(); KeyListAltID.clear(); KeyListPID.clear(); KeyListKeyType.clear(); KeyListDataType.clear(); KeyListDataEncType.clear(); KeyListType.clear(); KeyListTokens.clear(); KeyListPref.clear(); /* Items on the Other tab */ VendorList.clear(); VendorListPEN.clear(); VendorListElement.clear(); XTokenList.clear(); XTokenListTokens.clear(); } void ProcessNameValue(wxString *PropertyData, wxString *PropertyName, wxString *PropertyValue){ // Proces the name and value information. wxStringTokenizer PropertyElement (*PropertyData, wxT("=")); *PropertyName = PropertyElement.GetNextToken(); *PropertyValue = PropertyElement.GetNextToken(); } void ProcessTokens(wxString *PropertyName, wxString *PropertyValue, wxString *PropertyTokens, bool *FirstToken){ // Process the tokens. if (!PropertyName->IsEmpty() && !PropertyValue->IsEmpty() && *PropertyName != wxT("TYPE")){ if (*FirstToken == TRUE){ PropertyTokens->Append(*PropertyName + wxT("=") + *PropertyValue); *FirstToken = FALSE; } else { PropertyTokens->Append(wxT(";") + *PropertyName + wxT("=") + *PropertyValue); } } } void ProcessStringValue(wxString *PropertyName, wxString PropertyNameMatch, std::map *MapPtr, wxString *PropertyValue, int *ItemCount, bool *PropertyMatched){ // Process the string value. if (*PropertyName == PropertyNameMatch){ MapPtr->erase(*ItemCount); MapPtr->insert(std::make_pair(*ItemCount, *PropertyValue)); *PropertyMatched = TRUE; } } void ProcessIntegerValue(wxString *PropertyName, wxString PropertyNameMatch, std::map *PrefPtr, wxString *PropertyValue, int *ItemCount, bool *PropertyMatched){ // Process the integer value. if (*PropertyName == PropertyNameMatch){ *PropertyMatched = TRUE; } else { return; } int PriorityNumber = 0; bool ValidNumber = TRUE; try{ PriorityNumber = std::stoi(PropertyValue->ToStdString()); } catch(std::invalid_argument &e){ ValidNumber = FALSE; } if (ValidNumber == TRUE){ PrefPtr->erase(*ItemCount); PrefPtr->insert(std::make_pair(*ItemCount, PriorityNumber)); } } void SplitValues(wxString *PropertyLine, std::map *SplitPoints, std::map *SplitLength, int intSize){ // Split values from a string supplied by PropertyLine. size_t intPropertyLen = PropertyLine->Len(); int intSplitsFound = 0; int intSplitSize = 0; int intSplitSeek = 0; for (int i = intSize; i <= intPropertyLen; i++){ intSplitSize++; if (PropertyLine->Mid(i, 1) == wxT(";") && PropertyLine->Mid((i - 1), 1) != wxT("\\")){ if (intSplitsFound == 0){ SplitLength->insert(std::make_pair(intSplitsFound, (intSplitSize))); } else { SplitLength->insert(std::make_pair(intSplitsFound, (intSplitSize - 1))); } SplitPoints->insert(std::make_pair(intSplitsFound, (i + 1))); intSplitsFound++; intSplitSeek = i; intSplitSize = 0; } } if (intSplitsFound == 0){ SplitPoints->insert(std::make_pair(intSplitsFound, (8 + 1))); SplitLength->insert(std::make_pair(intSplitsFound, intSplitSize)); } else { SplitPoints->insert(std::make_pair(intSplitsFound, (intSplitSeek + 1))); SplitLength->insert(std::make_pair(intSplitsFound, intSplitSize)); } } void CheckType(wxString *PropertySeg1, std::map *SplitPoints, std::map *SplitLength, int *intPrevValue, PropertyType *PropType){ // Check the information type. wxString PropertyData; wxString PropertyName; wxString PropertyValue; std::map::iterator SLiter; for (std::map::iterator intiter = SplitPoints->begin(); intiter != SplitPoints->end(); ++intiter){ SLiter = SplitLength->find(intiter->first); PropertyData = PropertySeg1->Mid(*intPrevValue, (SLiter->second)); ProcessNameValue(&PropertyData, &PropertyName, &PropertyValue); *intPrevValue = intiter->second; if (PropertyName == wxT("TYPE")){ if (PropertyValue == wxT("work")){ *PropType = PROPERTY_WORK; } else if (PropertyValue == wxT("home")){ *PropType = PROPERTY_HOME; } else { *PropType = PROPERTY_NONE; } return; } } }