+ RoleListTokens->insert(std::make_pair(*RoleCount, PropertyTokens));
+
+ }
+
+}
+
+void ContactDataObject::ProcessOrganisation(wxString PropertySeg1, wxString PropertySeg2, int *OrganisationCount){
+
+ std::map<int, int> SplitPoints;
+ std::map<int, int> SplitLength;
+ std::map<int, int>::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<int, wxString> *OrganisationsList = NULL;
+ std::map<int, wxString> *OrganisationsListAltID = NULL;
+ std::map<int, wxString> *OrganisationsListPID = NULL;
+ std::map<int, wxString> *OrganisationsListType = NULL;
+ std::map<int, wxString> *OrganisationsListTokens = NULL;
+ std::map<int, wxString> *OrganisationsListLanguage = NULL;
+ std::map<int, wxString> *OrganisationsListSortAs = NULL;
+ std::map<int, int> *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<int, int>::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")){
+
+ ProcessIntegerValue(OrganisationsListPref, &PropertyValue, OrganisationCount);
+
+ } 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<int, int> SplitPoints;
+ std::map<int, int> SplitLength;
+ std::map<int, int>::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<int, wxString> *NoteList = NULL;
+ std::map<int, wxString> *NoteListAltID = NULL;
+ std::map<int, wxString> *NoteListPID = NULL;
+ std::map<int, wxString> *NoteListType = NULL;
+ std::map<int, wxString> *NoteListTokens = NULL;
+ std::map<int, wxString> *NoteListLanguage = NULL;
+ std::map<int, int> *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<int, int>::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("PREF")){
+
+ ProcessIntegerValue(NoteListPref, &PropertyValue, NoteCount);
+
+ } 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 ContactDataObject::ProcessCategory(wxString PropertySeg1, wxString PropertySeg2, int *CategoryCount){
+
+ std::map<int, int> SplitPoints;
+ std::map<int, int> SplitLength;
+ std::map<int, int>::iterator SLiter;
+ wxString PropertyData;
+ wxString PropertyName;
+ wxString PropertyValue;
+ wxString PropertyTokens;
+ bool FirstToken = TRUE;
+ int intPrevValue = 12;
+ int intPref = 0;
+ int intType = 0;
+ long ListCtrlIndex;
+
+ 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;
+
+ for (std::map<int, int>::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")){
+
+ CategoriesListAltID.erase(*CategoryCount);
+ CategoriesListAltID.insert(std::make_pair(*CategoryCount, PropertyValue));
+
+ } else if (PropertyName == wxT("PID")){
+
+ CategoriesListPID.erase(*CategoryCount);
+ CategoriesListPID.insert(std::make_pair(*CategoryCount, PropertyValue));
+
+ } else if (PropertyName == wxT("PREF")){
+
+ ProcessIntegerValue(&CategoriesListPref, &PropertyValue, CategoryCount);
+
+ } else if (PropertyName == wxT("LANGUAGE")){
+
+ CategoriesListLanguage.erase(*CategoryCount);
+ CategoriesListLanguage.insert(std::make_pair(*CategoryCount, 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);
+
+ }
+
+ }
+
+ }
+
+ }
+
+ // 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<int, int>::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){
+
+ size_t intPropertyLen = PropertySeg1.Len();
+ std::map<int, int> SplitPoints;
+ std::map<int, int> SplitLength;
+ std::map<int, int>::iterator SLiter;
+ wxString PropertyData;
+ wxString PropertyName;
+ wxString PropertyValue;
+ wxString PropertyTokens;
+ bool FirstToken = TRUE;
+ int intSplitsFound = 0;
+ int intSplitSize = 0;
+ int intPrevValue = 7;
+ int intPref = 0;
+ int intType = 0;
+
+ SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue);
+
+ intPrevValue = 6;
+
+ PropertyType PropType = PROPERTY_NONE;
+
+ // Look for type before continuing.
+
+ CheckType(&PropertySeg1, &SplitPoints, &SplitLength, &intPrevValue, &PropType);
+
+ intPrevValue = 6;
+
+ for (std::map<int, int>::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")){
+
+ PicturesListAltID.erase(*PhotoCount);
+ PicturesListAltID.insert(std::make_pair(*PhotoCount, PropertyValue));
+
+ } else if (PropertyName == wxT("PID")){
+
+ PicturesListPID.erase(*PhotoCount);
+ PicturesListPID.insert(std::make_pair(*PhotoCount, PropertyValue));
+
+ } else if (PropertyName == wxT("PREF")){
+
+ ProcessIntegerValue(&PicturesListPref, &PropertyValue, PhotoCount);
+
+ } else if (PropertyName == wxT("MEDIATYPE")){
+
+ PicturesListMediatype.erase(*PhotoCount);
+ PicturesListMediatype.insert(std::make_pair(*PhotoCount, 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);
+
+ }
+
+ }
+
+ }
+
+ }
+
+ 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<int, int>::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){
+
+ size_t intPropertyLen = PropertySeg1.Len();
+ std::map<int, int> SplitPoints;
+ std::map<int, int> SplitLength;
+ std::map<int, int>::iterator SLiter;
+ wxString PropertyData;
+ wxString PropertyName;
+ wxString PropertyValue;
+ wxString PropertyTokens;
+ bool FirstToken = TRUE;
+ int intSplitsFound = 0;
+ int intSplitSize = 0;
+ int intPrevValue = 6;
+ int intPref = 0;
+ int intType = 0;
+
+ SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue);
+
+ intPrevValue = 5;
+
+ PropertyType PropType = PROPERTY_NONE;
+
+ // Look for type before continuing.
+
+ CheckType(&PropertySeg1, &SplitPoints, &SplitLength, &intPrevValue, &PropType);
+
+ intPrevValue = 5;
+
+ for (std::map<int, int>::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")){
+
+ LogosListAltID.erase(*LogoCount);
+ LogosListAltID.insert(std::make_pair(*LogoCount, PropertyValue));
+
+ } else if (PropertyName == wxT("PID")){
+
+ LogosListPID.erase(*LogoCount);
+ LogosListPID.insert(std::make_pair(*LogoCount, PropertyValue));
+
+ } else if (PropertyName == wxT("PREF")){
+
+ ProcessIntegerValue(&LogosListPref, &PropertyValue, LogoCount);
+
+ } else if (PropertyName == wxT("MEDIATYPE")){
+
+ LogosListMediatype.erase(*LogoCount);
+ LogosListMediatype.insert(std::make_pair(*LogoCount, 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);
+
+ }
+
+ }
+
+ }
+
+ }
+
+ 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<int, int>::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));
+