// ContactDataObject.cpp - Client Data Object. // // (c) 2012-2015 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){ 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; int ContactLineLen = 0; int QuoteBreakPoint = 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; 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("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("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++; } } return CONTACTLOAD_OK; } void ContactDataObject::ProcessKind(wxString KindType){ 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::ProcessMember(wxString PropertySeg1, wxString PropertySeg2, int *GroupCount){ std::map SplitPoints; std::map SplitLength; int intPrevValue = 8; int intPref = 0; int intType = 0; SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue); intPrevValue = 7; 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)); wxStringTokenizer PropertyElement (PropertyData, wxT("=")); PropertyName = PropertyElement.GetNextToken(); PropertyValue = PropertyElement.GetNextToken(); intPrevValue = intiter->second; CaptureString(&PropertyValue, FALSE); if (PropertyName == wxT("ALTID")){ GroupsListAltID.erase(*GroupCount); GroupsListAltID.insert(std::make_pair(*GroupCount, PropertyValue)); } else if (PropertyName == wxT("PID")){ GroupsListPID.erase(*GroupCount); GroupsListPID.insert(std::make_pair(*GroupCount, PropertyValue)); } else if (PropertyName == wxT("PREF")){ int PriorityNumber = 0; bool ValidNumber = TRUE; try{ PriorityNumber = std::stoi(PropertyValue.ToStdString()); } catch(std::invalid_argument &e){ ValidNumber = FALSE; } if (ValidNumber == TRUE){ GroupsListPref.erase(*GroupCount); GroupsListPref.insert(std::make_pair(*GroupCount, PriorityNumber)); } } else if (PropertyName == wxT("MEDIATYPE")){ GroupsListMediaType.erase(*GroupCount); GroupsListMediaType.insert(std::make_pair(*GroupCount, PropertyValue)); } else if (!PropertyName.IsEmpty() && !PropertyValue.IsEmpty()){ if (FirstToken == TRUE){ PropertyTokens.Append(PropertyName + wxT("=") + PropertyValue); FirstToken = FALSE; } else { PropertyTokens.Append(wxT(";") + PropertyName + wxT("=") + PropertyValue); } } } 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){ std::map SplitPoints; std::map SplitLength; int intPrevValue = 4; int intPref = 0; int intType = 0; SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue); intPrevValue = 3; 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)); wxStringTokenizer PropertyElement (PropertyData, wxT("=")); PropertyName = PropertyElement.GetNextToken(); PropertyValue = PropertyElement.GetNextToken(); 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)); } } else if (PropertyName == wxT("LANGUAGE")){ FullNamesListLanguage.erase(*FNCount); FullNamesListLanguage.insert(std::make_pair(*FNCount, PropertyValue)); } else if (PropertyName == wxT("ALTID")){ FullNamesListAltID.erase(*FNCount); FullNamesListAltID.insert(std::make_pair(*FNCount, PropertyValue)); } else if (PropertyName == wxT("PID")){ FullNamesListPID.erase(*FNCount); FullNamesListPID.insert(std::make_pair(*FNCount, PropertyValue)); } else if (PropertyName == wxT("PREF")){ int PriorityNumber = 0; bool ValidNumber = TRUE; try{ PriorityNumber = std::stoi(PropertyValue.ToStdString()); } catch(std::invalid_argument &e){ ValidNumber = FALSE; } if (ValidNumber == TRUE){ FullNamesListPref.erase(*FNCount); FullNamesListPref.insert(std::make_pair(*FNCount, PriorityNumber)); } } else if (!PropertyName.IsEmpty() && !PropertyValue.IsEmpty()){ if (FirstToken == TRUE){ PropertyTokens.Append(PropertyName + wxT("=") + PropertyValue); FirstToken = FALSE; } else { PropertyTokens.Append(wxT(";") + PropertyName + wxT("=") + PropertyValue); } } } FullNamesList.insert(std::make_pair(*FNCount, PropertySeg2)); if (!PropertyTokens.IsEmpty()){ FullNamesListTokens.insert(std::make_pair(*FNCount, PropertyTokens)); } } void ContactDataObject::ProcessN(wxString PropertySeg1, wxString PropertySeg2){ std::map SplitPoints; std::map SplitLength; int intPrevValue = 3; int intPref = 0; int intType = 0; 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)); wxStringTokenizer PropertyElement (PropertyData, wxT("=")); PropertyName = PropertyElement.GetNextToken(); PropertyValue = PropertyElement.GetNextToken(); 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()){ if (FirstToken == TRUE){ PropertyTokens.Append(PropertyName + wxT("=") + PropertyValue); FirstToken = FALSE; } else { PropertyTokens.Append(wxT(";") + PropertyName + wxT("=") + PropertyValue); } } } // 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::ProcessNickname(wxString PropertySeg1, wxString PropertySeg2, int *NicknameCount){ std::map SplitPoints; std::map SplitLength; int intPrevValue = 10; int intPref = 0; 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; for (std::map::iterator intiter = SplitPoints.begin(); intiter != SplitPoints.end(); ++intiter){ SLiter = SplitLength.find(intiter->first); PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second)); wxStringTokenizer PropertyElement (PropertyData, wxT("=")); PropertyName = PropertyElement.GetNextToken(); PropertyValue = PropertyElement.GetNextToken(); intPrevValue = intiter->second; CaptureString(&PropertyValue, FALSE); if (PropertyName == wxT("ALTID")){ NicknamesListAltID->erase(*NicknameCount); NicknamesListAltID->insert(std::make_pair(*NicknameCount, PropertyValue)); } else if (PropertyName == wxT("PID")){ NicknamesListPID->erase(*NicknameCount); NicknamesListPID->insert(std::make_pair(*NicknameCount, PropertyValue)); } else if (PropertyName == wxT("PREF")){ int PriorityNumber = 0; bool ValidNumber = TRUE; try{ PriorityNumber = std::stoi(PropertyValue.ToStdString()); } catch(std::invalid_argument &e){ ValidNumber = FALSE; } if (ValidNumber == TRUE){ NicknamesListPref->erase(*NicknameCount); NicknamesListPref->insert(std::make_pair(*NicknameCount, PriorityNumber)); } } else if (PropertyName == wxT("LANGUAGE")){ NicknamesListLanguage->erase(*NicknameCount); NicknamesListLanguage->insert(std::make_pair(*NicknameCount, PropertyValue)); } else { // Something else we don't know about so append // to the tokens variable. 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); } } } } 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){ 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)); wxStringTokenizer PropertyElement (PropertyData, wxT("=")); PropertyName = PropertyElement.GetNextToken(); PropertyValue = PropertyElement.GetNextToken(); 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); } if (!PropertyName.IsEmpty() && !PropertyValue.IsEmpty()){ if (FirstToken == TRUE){ PropertyTokens.Append(PropertyName + wxT("=") + PropertyValue); FirstToken = FALSE; } else { PropertyTokens.Append(wxT(";") + PropertyName + wxT("=") + PropertyValue); } } } 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 date. Preserve the remainder in the string. std::map SplitPoints; std::map SplitLength; std::map::iterator SLiter; wxString PropertyData; wxString PropertyName; wxString PropertyValue; wxString PropertyTokens; bool BirthdayText = FALSE; 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); wxStringTokenizer PropertyElement (PropertyData, wxT("=")); PropertyName = PropertyElement.GetNextToken(); PropertyValue = PropertyElement.GetNextToken(); 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); wxStringTokenizer PropertyElement (PropertyData, wxT("=")); PropertyName = PropertyElement.GetNextToken(); PropertyValue = PropertyElement.GetNextToken(); 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. if (!PropertyName.IsEmpty() && !PropertyValue.IsEmpty()){ if (FirstToken == TRUE){ PropertyTokens.Append(PropertyName + wxT("=") + PropertyValue); FirstToken = FALSE; } else { PropertyTokens.Append(wxT(";") + PropertyName + wxT("=") + PropertyValue); } } } } // 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 date. Preserve the remainder in the string. std::map SplitPoints; std::map SplitLength; std::map::iterator SLiter; wxString PropertyData; wxString PropertyName; wxString PropertyValue; wxString PropertyTokens; bool AnniversaryText = FALSE; 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); wxStringTokenizer PropertyElement (PropertyData, wxT("=")); PropertyName = PropertyElement.GetNextToken(); PropertyValue = PropertyElement.GetNextToken(); 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); wxStringTokenizer PropertyElement (PropertyData, wxT("=")); PropertyName = PropertyElement.GetNextToken(); PropertyValue = PropertyElement.GetNextToken(); 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. if (!PropertyName.IsEmpty() && !PropertyValue.IsEmpty()){ if (FirstToken == TRUE){ PropertyTokens.Append(PropertyName + wxT("=") + PropertyValue); FirstToken = FALSE; } else { PropertyTokens.Append(wxT(";") + PropertyName + wxT("=") + PropertyValue); } } } } // 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){ std::map SplitPoints; std::map SplitLength; int intPrevValue = 4; int intPref = 0; 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; for (std::map::iterator intiter = SplitPoints.begin(); intiter != SplitPoints.end(); ++intiter){ SLiter = SplitLength.find(intiter->first); PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second)); wxStringTokenizer PropertyElement (PropertyData, wxT("=")); PropertyName = PropertyElement.GetNextToken(); PropertyValue = PropertyElement.GetNextToken(); intPrevValue = intiter->second; CaptureString(&PropertyValue, FALSE); if (PropertyName == wxT("ALTID")){ TZListAltID->erase(*TimeZoneCount); TZListAltID->insert(std::make_pair(*TimeZoneCount, PropertyValue)); } else if (PropertyName == wxT("PID")){ TZListPID->erase(*TimeZoneCount); TZListPID->insert(std::make_pair(*TimeZoneCount, PropertyValue)); } else if (PropertyName == wxT("PREF")){ int PriorityNumber = 0; bool ValidNumber = TRUE; try{ PriorityNumber = std::stoi(PropertyValue.ToStdString()); } catch(std::invalid_argument &e){ ValidNumber = FALSE; } if (ValidNumber == TRUE){ TZListPref->erase(*TimeZoneCount); TZListPref->insert(std::make_pair(*TimeZoneCount, PriorityNumber)); } } else if (PropertyName == wxT("MEDIATYPE")){ TZListMediatype->erase(*TimeZoneCount); TZListMediatype->insert(std::make_pair(*TimeZoneCount, PropertyValue)); } else { // Something else we don't know about so append // to the tokens variable. 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); } } } } 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){ 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; int intPref = 0; int intType = 0; long ListCtrlIndex; 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)); wxStringTokenizer PropertyElement (PropertyData, wxT("=")); PropertyName = PropertyElement.GetNextToken(); PropertyValue = PropertyElement.GetNextToken(); intPrevValue = intiter->second; CaptureString(&PropertyValue, FALSE); // Process properties. if (PropertyName == wxT("LABEL")){ AddressListLabel->erase(*AddressCount); AddressListLabel->insert(std::make_pair(*AddressCount, PropertyValue)); } else if (PropertyName == wxT("LANGUAGE")){ AddressListLang->erase(*AddressCount); AddressListLang->insert(std::make_pair(*AddressCount, PropertyValue)); } else if (PropertyName == wxT("ALTID")){ AddressListAltID->erase(*AddressCount); AddressListAltID->insert(std::make_pair(*AddressCount, PropertyValue)); } else if (PropertyName == wxT("PID")){ AddressListPID->erase(*AddressCount); AddressListPID->insert(std::make_pair(*AddressCount, PropertyValue)); } else if (PropertyName == wxT("GEO")){ AddressListGeo->erase(*AddressCount); AddressListGeo->insert(std::make_pair(*AddressCount, PropertyValue)); } else if (PropertyName == wxT("TZ")){ AddressListTimezone->erase(*AddressCount); AddressListTimezone->insert(std::make_pair(*AddressCount, PropertyValue)); } else if (PropertyName == wxT("MEDIATYPE")){ AddressListMediatype->erase(*AddressCount); AddressListMediatype->insert(std::make_pair(*AddressCount, PropertyValue)); } else if (PropertyName == wxT("PREF")){ int PriorityNumber = 0; bool ValidNumber = TRUE; try{ PriorityNumber = std::stoi(PropertyValue.ToStdString()); } catch(std::invalid_argument &e){ ValidNumber = FALSE; } if (ValidNumber == TRUE){ AddressListPref->erase(*AddressCount); AddressListPref->insert(std::make_pair(*AddressCount, PriorityNumber)); } } else { 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); } } } } // 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); //txtSurname->SetValue(ContactData.Convert(wxSPropertySeg2.Mid(0, SLiter->second), TRUE)); 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); //txtForename->SetValue(ContactData.Convert(wxSPropertySeg2.Mid(intPrevValue, SLiter->second), TRUE)); intPrevValue = intiter->second; } else if (intiter->first == 3){ // Deal with street address. SLiter = SplitLength.find(3); AddressStreet = PropertySeg2.Mid(intPrevValue, SLiter->second); //txtOtherNames->SetValue(ContactData.Convert(wxSPropertySeg2.Mid(intPrevValue, SLiter->second), TRUE)); intPrevValue = intiter->second; } else if (intiter->first == 4){ // Deal with locality SLiter = SplitLength.find(4); AddressLocality = PropertySeg2.Mid(intPrevValue, SLiter->second); //txtTitle->SetValue(ContactData.Convert(wxSPropertySeg2.Mid(intPrevValue, SLiter->second), TRUE)); intPrevValue = intiter->second; //txtSuffix->SetValue(ContactData.Convert(wxSPropertySeg2.Mid(intPrevValue), TRUE)); } else if (intiter->first == 5){ // Deal with region. SLiter = SplitLength.find(5); AddressRegion = PropertySeg2.Mid(intPrevValue, SLiter->second); //txtTitle->SetValue(ContactData.Convert(wxSPropertySeg2.Mid(intPrevValue, SLiter->second), TRUE)); intPrevValue = intiter->second; //txtSuffix->SetValue(ContactData.Convert(wxSPropertySeg2.Mid(intPrevValue), TRUE)); } else if (intiter->first == 6){ // Deal with post code. SLiter = SplitLength.find(6); AddressPostalCode = PropertySeg2.Mid(intPrevValue, SLiter->second); //txtTitle->SetValue(ContactData.Convert(wxSPropertySeg2.Mid(intPrevValue, SLiter->second), TRUE)); intPrevValue = intiter->second; // Deal with country. AddressCountry = PropertySeg2.Mid(intPrevValue, wxString::npos); //txtSuffix->SetValue(ContactData.Convert(wxSPropertySeg2.Mid(intPrevValue), TRUE)); 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){ std::map SplitPoints; std::map SplitLength; int intPrevValue = 7; int intPref = 0; 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; for (std::map::iterator intiter = SplitPoints.begin(); intiter != SplitPoints.end(); ++intiter){ SLiter = SplitLength.find(intiter->first); PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second)); wxStringTokenizer PropertyElement (PropertyData, wxT("=")); PropertyName = PropertyElement.GetNextToken(); PropertyValue = PropertyElement.GetNextToken(); intPrevValue = intiter->second; CaptureString(&PropertyValue, FALSE); // Process properties. if (PropertyName == wxT("ALTID")){ EmailListAltID->erase(*EmailCount); EmailListAltID->insert(std::make_pair(*EmailCount, PropertyValue)); } else if (PropertyName == wxT("PID")){ EmailListPID->erase(*EmailCount); EmailListPID->insert(std::make_pair(*EmailCount, PropertyValue)); } else if (PropertyName == wxT("PREF")){ int PriorityNumber = 0; bool ValidNumber = TRUE; try{ PriorityNumber = std::stoi(PropertyValue.ToStdString()); } catch(std::invalid_argument &e){ ValidNumber = FALSE; } if (ValidNumber == TRUE){ EmailListPref->erase(*EmailCount); EmailListPref->insert(std::make_pair(*EmailCount, PriorityNumber)); } } else { 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); } } } } 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){ std::map SplitPoints; std::map SplitLength; int intPrevValue = 6; int intPref = 0; 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 *IMListPref = NULL; switch(PropType){ case PROPERTY_NONE: IMList = &GeneralIMList; IMListType = &GeneralIMListType; IMListAltID = &GeneralIMListAltID; IMListPID = &GeneralIMListPID; IMListTokens = &GeneralIMListTokens; IMListMediatype = &GeneralIMListMediatype; IMListPref = &GeneralIMListPref; break; case PROPERTY_HOME: IMList = &HomeIMList; IMListType = &HomeIMListType; IMListAltID = &HomeIMListAltID; IMListPID = &HomeIMListPID; IMListTokens = &HomeIMListTokens; IMListMediatype = &HomeIMListMediatype; IMListPref = &HomeIMListPref; break; case PROPERTY_WORK: IMList = &BusinessIMList; IMListType = &BusinessIMListType; IMListAltID = &BusinessIMListAltID; IMListPID = &BusinessIMListPID; IMListTokens = &BusinessIMListTokens; IMListMediatype = &BusinessIMListMediatype; IMListPref = &BusinessIMListPref; break; } intPrevValue = 5; std::map::iterator SLiter; wxString PropertyData; wxString PropertyName; wxString PropertyValue; wxString PropertyTokens; 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)); wxStringTokenizer PropertyElement (PropertyData, wxT("=")); PropertyName = PropertyElement.GetNextToken(); PropertyValue = PropertyElement.GetNextToken(); intPrevValue = intiter->second; CaptureString(&PropertyValue, FALSE); // Process properties. if (PropertyName == wxT("ALTID")){ IMListAltID->erase(*IMCount); IMListAltID->insert(std::make_pair(*IMCount, PropertyValue)); } else if (PropertyName == wxT("PID")){ IMListPID->erase(*IMCount); IMListPID->insert(std::make_pair(*IMCount, PropertyValue)); } else if (PropertyName == wxT("MEDIATYPE")){ IMListMediatype->erase(*IMCount); IMListMediatype->insert(std::make_pair(*IMCount, PropertyValue)); } else if (PropertyName == wxT("PREF")){ int PriorityNumber = 0; bool ValidNumber = TRUE; try{ PriorityNumber = std::stoi(PropertyValue.ToStdString()); } catch(std::invalid_argument &e){ ValidNumber = FALSE; } if (ValidNumber == TRUE){ IMListPref->erase(*IMCount); IMListPref->insert(std::make_pair(*IMCount, PriorityNumber)); } } else { 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); } } } } IMList->insert(std::make_pair(*IMCount, PropertySeg2)); // Add the name token data. if (!PropertyTokens.IsEmpty()){ IMListTokens->insert(std::make_pair(*IMCount, PropertyTokens)); } } void ContactDataObject::ProcessTelephone(wxString PropertySeg1, wxString PropertySeg2, int *TelephoneCount){ std::map SplitPoints; std::map SplitLength; std::map::iterator SLiter; int intPref = 0; 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 intType = 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)); wxStringTokenizer PropertyElement (PropertyData, wxT("=")); PropertyName = PropertyElement.GetNextToken(); PropertyValue = PropertyElement.GetNextToken(); 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; 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")){ PropType = PROPERTY_HOME; } else if (TypePropertyName == wxT("work")){ PropType = PROPERTY_WORK; } 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(_("mobile")); 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 *TelephoneListPref = NULL; switch(PropType){ case PROPERTY_NONE: TelephoneList = &GeneralTelephoneList; TelephoneListType = &GeneralTelephoneListType; TelephoneListAltID = &GeneralTelephoneListAltID; TelephoneListPID = &GeneralTelephoneListPID; TelephoneListTokens = &GeneralTelephoneListTokens; TelephoneListTypeInfo = &GeneralTelephoneListTypeInfo; TelephoneListPref = &GeneralTelephoneListPref; break; case PROPERTY_HOME: TelephoneList = &HomeTelephoneList; TelephoneListType = &HomeTelephoneListType; TelephoneListAltID = &HomeTelephoneListAltID; TelephoneListPID = &HomeTelephoneListPID; TelephoneListTokens = &HomeTelephoneListTokens; TelephoneListTypeInfo = &HomeTelephoneListTypeInfo; TelephoneListPref = &HomeTelephoneListPref; break; case PROPERTY_WORK: TelephoneList = &BusinessTelephoneList; TelephoneListType = &BusinessTelephoneListType; TelephoneListAltID = &BusinessTelephoneListAltID; TelephoneListPID = &BusinessTelephoneListPID; TelephoneListTokens = &BusinessTelephoneListTokens; TelephoneListTypeInfo = &BusinessTelephoneListTypeInfo; TelephoneListPref = &BusinessTelephoneListPref; break; } // Process the properties. bool FirstToken = TRUE; intPrevValue = 5; SplitPoints.clear(); SplitLength.clear(); 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)); wxStringTokenizer PropertyElement (PropertyData, wxT("=")); PropertyName = PropertyElement.GetNextToken(); PropertyValue = PropertyElement.GetNextToken(); intPrevValue = intiter->second; CaptureString(&PropertyValue, FALSE); // Process properties. if (PropertyName == wxT("ALTID")){ TelephoneListAltID->erase(*TelephoneCount); TelephoneListAltID->insert(std::make_pair(*TelephoneCount, PropertyValue)); } else if (PropertyName == wxT("PID")){ TelephoneListPID->erase(*TelephoneCount); TelephoneListPID->insert(std::make_pair(*TelephoneCount, PropertyValue)); } else if (PropertyName == wxT("PREF")){ int PriorityNumber = 0; bool ValidNumber = TRUE; try{ PriorityNumber = std::stoi(PropertyValue.ToStdString()); } catch(std::invalid_argument &e){ ValidNumber = FALSE; } if (ValidNumber == TRUE){ TelephoneListPref->erase(*TelephoneCount); TelephoneListPref->insert(std::make_pair(*TelephoneCount, PriorityNumber)); } } else { 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); } } } } TelephoneList->insert(std::make_pair(*TelephoneCount, PropertySeg2)); 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){ std::map SplitPoints; std::map SplitLength; int intPrevValue = 6; int intPref = 0; 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; for (std::map::iterator intiter = SplitPoints.begin(); intiter != SplitPoints.end(); ++intiter){ SLiter = SplitLength.find(intiter->first); PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second)); wxStringTokenizer PropertyElement (PropertyData, wxT("=")); PropertyName = PropertyElement.GetNextToken(); PropertyValue = PropertyElement.GetNextToken(); intPrevValue = intiter->second; CaptureString(&PropertyValue, FALSE); // Process properties. if (PropertyName == wxT("ALTID")){ LanguageListAltID->erase(*LanguageCount); LanguageListAltID->insert(std::make_pair(*LanguageCount, PropertyValue)); } else if (PropertyName == wxT("PID")){ LanguageListPID->erase(*LanguageCount); LanguageListPID->insert(std::make_pair(*LanguageCount, PropertyValue)); } else if (PropertyName == wxT("PREF")){ int PriorityNumber = 0; bool ValidNumber = TRUE; try{ PriorityNumber = std::stoi(PropertyValue.ToStdString()); } catch(std::invalid_argument &e){ ValidNumber = FALSE; } if (ValidNumber == TRUE){ LanguageListPref->erase(*LanguageCount); LanguageListPref->insert(std::make_pair(*LanguageCount, PriorityNumber)); } } else { 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); } } } } 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){ std::map SplitPoints; std::map SplitLength; int intPrevValue = 5; int intPref = 0; 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 *GeopositionListPref = NULL; switch(PropType){ case PROPERTY_NONE: GeopositionList = &GeneralGeographyList; GeopositionListType = &GeneralGeographyListType; GeopositionListAltID = &GeneralGeographyListAltID; GeopositionListPID = &GeneralGeographyListPID; GeopositionListTokens = &GeneralGeographyListTokens; GeopositionListMediatype = &GeneralGeographyListMediatype; GeopositionListPref = &GeneralGeographyListPref; break; case PROPERTY_HOME: GeopositionList = &HomeGeographyList; GeopositionListType = &HomeGeographyListType; GeopositionListAltID = &HomeGeographyListAltID; GeopositionListPID = &HomeGeographyListPID; GeopositionListTokens = &HomeGeographyListTokens; GeopositionListMediatype = &HomeGeographyListMediatype; GeopositionListPref = &HomeGeographyListPref; break; case PROPERTY_WORK: GeopositionList = &BusinessGeographyList; GeopositionListType = &BusinessGeographyListType; GeopositionListAltID = &BusinessGeographyListAltID; GeopositionListPID = &BusinessGeographyListPID; GeopositionListTokens = &BusinessGeographyListTokens; GeopositionListMediatype = &BusinessGeographyListMediatype; GeopositionListPref = &BusinessGeographyListPref; break; } intPrevValue = 4; std::map::iterator SLiter; wxString PropertyData; wxString PropertyName; wxString PropertyValue; wxString PropertyTokens; 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)); wxStringTokenizer PropertyElement (PropertyData, wxT("=")); PropertyName = PropertyElement.GetNextToken(); PropertyValue = PropertyElement.GetNextToken(); intPrevValue = intiter->second; CaptureString(&PropertyValue, FALSE); // Process properties. if (PropertyName == wxT("ALTID")){ GeopositionListAltID->erase(*GeographicCount); GeopositionListAltID->insert(std::make_pair(*GeographicCount, PropertyValue)); } else if (PropertyName == wxT("PID")){ GeopositionListPID->erase(*GeographicCount); GeopositionListPID->insert(std::make_pair(*GeographicCount, PropertyValue)); } else if (PropertyName == wxT("MEDIATYPE")){ GeopositionListMediatype->erase(*GeographicCount); GeopositionListMediatype->insert(std::make_pair(*GeographicCount, PropertyValue)); } else if (PropertyName == wxT("PREF")){ int PriorityNumber = 0; bool ValidNumber = TRUE; try{ PriorityNumber = std::stoi(PropertyValue.ToStdString()); } catch(std::invalid_argument &e){ ValidNumber = FALSE; } if (ValidNumber == TRUE){ GeopositionListPref->erase(*GeographicCount); GeopositionListPref->insert(std::make_pair(*GeographicCount, PriorityNumber)); } } else { 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); } } } } GeopositionList->insert(std::make_pair(*GeographicCount, PropertySeg2)); // Add the name token data. if (!PropertyTokens.IsEmpty()){ GeopositionListTokens->insert(std::make_pair(*GeographicCount, PropertyTokens)); } } void ContactDataObject::ProcessRelated(wxString PropertySeg1, wxString PropertySeg2, int *RelatedCount){ size_t intPropertyLen = PropertySeg1.Len(); 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 intSplitsFound = 0; int intSplitSize = 0; int intPrevValue = 9; int intPref = 0; long ListCtrlIndex; 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)); wxStringTokenizer PropertyElement (PropertyData, wxT("=")); PropertyName = PropertyElement.GetNextToken(); PropertyValue = PropertyElement.GetNextToken(); 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; for (std::map::iterator intiter = SplitPoints.begin(); intiter != SplitPoints.end(); ++intiter){ SLiter = SplitLength.find(intiter->first); PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second)); wxStringTokenizer PropertyElement (PropertyData, wxT("=")); PropertyName = PropertyElement.GetNextToken(); PropertyValue = PropertyElement.GetNextToken(); 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); if (PropertyName == wxT("ALTID")){ GeneralRelatedListAltID.erase(*RelatedCount); GeneralRelatedListAltID.insert(std::make_pair(*RelatedCount, PropertyValue)); } else if (PropertyName == wxT("PID")){ GeneralRelatedListPID.erase(*RelatedCount); GeneralRelatedListPID.insert(std::make_pair(*RelatedCount, PropertyValue)); } else if (PropertyName == wxT("PREF")){ int PriorityNumber = 0; bool ValidNumber = TRUE; try{ PriorityNumber = std::stoi(PropertyValue.ToStdString()); } catch(std::invalid_argument &e){ ValidNumber = FALSE; } if (ValidNumber == TRUE){ GeneralRelatedListPref.erase(*RelatedCount); GeneralRelatedListPref.insert(std::make_pair(*RelatedCount, PriorityNumber)); } } else if (PropertyName == wxT("LANGUAGE")){ GeneralRelatedListLanguage.erase(*RelatedCount); GeneralRelatedListLanguage.insert(std::make_pair(*RelatedCount, PropertyValue)); } else if (PropertyName != wxT("TYPE")) { // Something else we don't know about so append // to the tokens variable. 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); } } } } // 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){ std::map SplitPoints; std::map SplitLength; std::map::iterator SLiter; wxString PropertyData; wxString PropertyName; wxString PropertyValue; wxString PropertyTokens; bool FirstToken = TRUE; int intPrevValue = 5; int intPref = 0; int intType = 0; long ListCtrlIndex; 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; for (std::map::iterator intiter = SplitPoints.begin(); intiter != SplitPoints.end(); ++intiter){ SLiter = SplitLength.find(intiter->first); PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second)); wxStringTokenizer PropertyElement (PropertyData, wxT("=")); PropertyName = PropertyElement.GetNextToken(); PropertyValue = PropertyElement.GetNextToken(); 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); if (PropertyName == wxT("ALTID")){ WebsiteListAltID->erase(*URLCount); WebsiteListAltID->insert(std::make_pair(*URLCount, PropertyValue)); } else if (PropertyName == wxT("PID")){ WebsiteListPID->erase(*URLCount); WebsiteListPID->insert(std::make_pair(*URLCount, PropertyValue)); } else if (PropertyName == wxT("PREF")){ int PriorityNumber = 0; bool ValidNumber = TRUE; try{ PriorityNumber = std::stoi(PropertyValue.ToStdString()); } catch(std::invalid_argument &e){ ValidNumber = FALSE; } if (ValidNumber == TRUE){ WebsiteListPref->erase(*URLCount); WebsiteListPref->insert(std::make_pair(*URLCount, PriorityNumber)); } } else if (PropertyName == wxT("MEDIATYPE")){ WebsiteListMediatype->erase(*URLCount); WebsiteListMediatype->insert(std::make_pair(*URLCount, PropertyValue)); } else { // Something else we don't know about so append // to the tokens variable. 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); } } } } // 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){ std::map SplitPoints; std::map SplitLength; std::map::iterator SLiter; wxString PropertyData; wxString PropertyName; wxString PropertyValue; wxString PropertyTokens; bool FirstToken = TRUE; int intPrevValue = 7; int intPref = 0; int intType = 0; long ListCtrlIndex; 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; for (std::map::iterator intiter = SplitPoints.begin(); intiter != SplitPoints.end(); ++intiter){ SLiter = SplitLength.find(intiter->first); PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second)); wxStringTokenizer PropertyElement (PropertyData, wxT("=")); PropertyName = PropertyElement.GetNextToken(); PropertyValue = PropertyElement.GetNextToken(); 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); if (PropertyName == wxT("ALTID")){ TitleListAltID->erase(*TitleCount); TitleListAltID->insert(std::make_pair(*TitleCount, PropertyValue)); } else if (PropertyName == wxT("PID")){ TitleListPID->erase(*TitleCount); TitleListPID->insert(std::make_pair(*TitleCount, PropertyValue)); } else if (PropertyName == wxT("PREF")){ int PriorityNumber = 0; bool ValidNumber = TRUE; try{ PriorityNumber = std::stoi(PropertyValue.ToStdString()); } catch(std::invalid_argument &e){ ValidNumber = FALSE; } if (ValidNumber == TRUE){ TitleListPref->erase(*TitleCount); TitleListPref->insert(std::make_pair(*TitleCount, PriorityNumber)); } } else if (PropertyName == wxT("LANGUAGE")){ TitleListLanguage->erase(*TitleCount); TitleListLanguage->insert(std::make_pair(*TitleCount, PropertyValue)); } else { // Something else we don't know about so append // to the tokens variable. 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); } } } } // 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){ std::map SplitPoints; std::map SplitLength; std::map::iterator SLiter; wxString PropertyData; wxString PropertyName; wxString PropertyValue; wxString PropertyTokens; bool FirstToken = TRUE; int intPrevValue = 6; int intPref = 0; int intType = 0; long ListCtrlIndex; 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; for (std::map::iterator intiter = SplitPoints.begin(); intiter != SplitPoints.end(); ++intiter){ SLiter = SplitLength.find(intiter->first); PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second)); wxStringTokenizer PropertyElement (PropertyData, wxT("=")); PropertyName = PropertyElement.GetNextToken(); PropertyValue = PropertyElement.GetNextToken(); 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); if (PropertyName == wxT("ALTID")){ RoleListAltID->erase(*RoleCount); RoleListAltID->insert(std::make_pair(*RoleCount, PropertyValue)); } else if (PropertyName == wxT("PID")){ RoleListPID->erase(*RoleCount); RoleListPID->insert(std::make_pair(*RoleCount, PropertyValue)); } else if (PropertyName == wxT("PREF")){ int PriorityNumber = 0; bool ValidNumber = TRUE; try{ PriorityNumber = std::stoi(PropertyValue.ToStdString()); } catch(std::invalid_argument &e){ ValidNumber = FALSE; } if (ValidNumber == TRUE){ RoleListPref->erase(*RoleCount); RoleListPref->insert(std::make_pair(*RoleCount, PriorityNumber)); } } else if (PropertyName == wxT("LANGUAGE")){ RoleListLanguage->erase(*RoleCount); RoleListLanguage->insert(std::make_pair(*RoleCount, PropertyValue)); } else { // Something else we don't know about so append // to the tokens variable. 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); } } } } // 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){ std::map SplitPoints; std::map SplitLength; std::map::iterator SLiter; wxString PropertyData; wxString PropertyName; wxString PropertyValue; wxString PropertyTokens; bool FirstToken = TRUE; int intPrevValue = 5; int intPref = 0; int intType = 0; long ListCtrlIndex; 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; for (std::map::iterator intiter = SplitPoints.begin(); intiter != SplitPoints.end(); ++intiter){ SLiter = SplitLength.find(intiter->first); PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second)); wxStringTokenizer PropertyElement (PropertyData, wxT("=")); PropertyName = PropertyElement.GetNextToken(); PropertyValue = PropertyElement.GetNextToken(); 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); if (PropertyName == wxT("ALTID")){ OrganisationsListAltID->erase(*OrganisationCount); OrganisationsListAltID->insert(std::make_pair(*OrganisationCount, PropertyValue)); } else if (PropertyName == wxT("PID")){ OrganisationsListPID->erase(*OrganisationCount); OrganisationsListPID->insert(std::make_pair(*OrganisationCount, PropertyValue)); } else if (PropertyName == wxT("SORT-AS")){ OrganisationsListSortAs->erase(*OrganisationCount); OrganisationsListSortAs->insert(std::make_pair(*OrganisationCount, PropertyValue)); } else if (PropertyName == wxT("PREF")){ int PriorityNumber = 0; bool ValidNumber = TRUE; try{ PriorityNumber = std::stoi(PropertyValue.ToStdString()); } catch(std::invalid_argument &e){ ValidNumber = FALSE; } if (ValidNumber == TRUE){ OrganisationsListPref->erase(*OrganisationCount); OrganisationsListPref->insert(std::make_pair(*OrganisationCount, PriorityNumber)); } } else if (PropertyName == wxT("LANGUAGE")){ OrganisationsListLanguage->erase(*OrganisationCount); OrganisationsListLanguage->insert(std::make_pair(*OrganisationCount, PropertyValue)); } else { // Something else we don't know about so append // to the tokens variable. 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); } } } } // 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){ std::map SplitPoints; std::map SplitLength; std::map::iterator SLiter; wxString PropertyData; wxString PropertyName; wxString PropertyValue; wxString PropertyTokens; bool FirstToken = TRUE; int intPrevValue = 6; int intPref = 0; int intType = 0; long ListCtrlIndex; 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 *NoteListSortAs = 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; for (std::map::iterator intiter = SplitPoints.begin(); intiter != SplitPoints.end(); ++intiter){ SLiter = SplitLength.find(intiter->first); PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second)); wxStringTokenizer PropertyElement (PropertyData, wxT("=")); PropertyName = PropertyElement.GetNextToken(); PropertyValue = PropertyElement.GetNextToken(); 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); if (PropertyName == wxT("ALTID")){ NoteListAltID->erase(*NoteCount); NoteListAltID->insert(std::make_pair(*NoteCount, PropertyValue)); } else if (PropertyName == wxT("PID")){ NoteListPID->erase(*NoteCount); NoteListPID->insert(std::make_pair(*NoteCount, PropertyValue)); } else if (PropertyName == wxT("SORT-AS")){ NoteListSortAs->erase(*NoteCount); NoteListSortAs->insert(std::make_pair(*NoteCount, PropertyValue)); } else if (PropertyName == wxT("PREF")){ int PriorityNumber = 0; bool ValidNumber = TRUE; try{ PriorityNumber = std::stoi(PropertyValue.ToStdString()); } catch(std::invalid_argument &e){ ValidNumber = FALSE; } if (ValidNumber == TRUE){ NoteListPref->erase(*NoteCount); NoteListPref->insert(std::make_pair(*NoteCount, PriorityNumber)); } } else if (PropertyName == wxT("LANGUAGE")){ NoteListLanguage->erase(*NoteCount); NoteListLanguage->insert(std::make_pair(*NoteCount, PropertyValue)); } else { // Something else we don't know about so append // to the tokens variable. 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); } } } } // 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 SplitValues(wxString *PropertyLine, std::map *SplitPoints, std::map *SplitLength, int intSize){ 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){ 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)); wxStringTokenizer PropertyElement (PropertyData, wxT("=")); PropertyName = PropertyElement.GetNextToken(); PropertyValue = PropertyElement.GetNextToken(); *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; } } }