+ 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<int,int>::iterator SLiter;
+ wxString PropertyData;
+ wxString PropertyName;
+ wxString PropertyValue;
+ wxString PropertyTokens;
+ bool FirstToken = TRUE;
+ bool PropertyMatched = FALSE;
+
+ 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;
+
+ CaptureString(&PropertyValue, FALSE);
+
+ // Process properties.
+
+ ProcessStringValue(&PropertyName, "ALTID", LanguageListAltID, &PropertyValue, LanguageCount, &PropertyMatched);
+ ProcessStringValue(&PropertyName, "PID", LanguageListPID, &PropertyValue, LanguageCount, &PropertyMatched);
+ ProcessIntegerValue(&PropertyName, "PREF", LanguageListPref, &PropertyValue, LanguageCount, &PropertyMatched);
+
+ if (PropertyMatched == TRUE){
+
+ PropertyMatched = FALSE;
+ continue;
+
+ }
+
+ 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<int, int> SplitPoints;
+ std::map<int, int> 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<int, wxString> *GeopositionList = NULL;
+ std::map<int, wxString> *GeopositionListType = NULL;
+ std::map<int, wxString> *GeopositionListAltID = NULL;
+ std::map<int, wxString> *GeopositionListPID = NULL;
+ std::map<int, wxString> *GeopositionListTokens = NULL;
+ std::map<int, wxString> *GeopositionListMediatype = NULL;
+ std::map<int, int> *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<int,int>::iterator SLiter;
+ wxString PropertyData;
+ wxString PropertyName;
+ wxString PropertyValue;
+ wxString PropertyTokens;
+ bool FirstToken = TRUE;
+ bool PropertyMatched = FALSE;
+
+ 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;
+
+ CaptureString(&PropertyValue, FALSE);
+
+ // Process properties.
+
+ ProcessStringValue(&PropertyName, "ALTID", GeopositionListAltID, &PropertyValue, GeographicCount, &PropertyMatched);
+ ProcessStringValue(&PropertyName, "PID", GeopositionListPID, &PropertyValue, GeographicCount, &PropertyMatched);
+ ProcessStringValue(&PropertyName, "MEDIATYPE", GeopositionListMediatype, &PropertyValue, GeographicCount, &PropertyMatched);
+ ProcessIntegerValue(&PropertyName, "PREF", GeopositionListPref, &PropertyValue, GeographicCount, &PropertyMatched);
+
+ if (PropertyMatched == TRUE){
+
+ PropertyMatched = FALSE;
+ continue;
+
+ }
+
+ 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<int, int> SplitPoints;
+ std::map<int, int> SplitLength;
+ std::map<int, int>::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<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 these.
+
+ RelatedTypeOriginal = PropertyValue;
+
+ if (PropertyName == wxT("TYPE")){
+
+ if (PropertyValue == wxT("contact")){
+
+ RelatedType = _("Contact");
+
+ } else if (PropertyValue == wxT("acquaintance")){
+
+ RelatedType = _("Acquaintance");
+
+ } else if (PropertyValue == wxT("friend")){
+
+ RelatedType = _("Friend");
+
+ } else if (PropertyValue == wxT("met")){
+
+ RelatedType = _("Met");
+
+ } else if (PropertyValue == wxT("co-worker")){
+
+ RelatedType = _("Co-worker");
+
+ } else if (PropertyValue == wxT("colleague")){
+
+ RelatedType = _("Colleague");
+
+ } else if (PropertyValue == wxT("co-resident")){
+
+ RelatedType = _("Co-resident");
+
+ } else if (PropertyValue == wxT("neighbor")){
+
+ RelatedType = _("Neighbour");
+
+ } else if (PropertyValue == wxT("child")){
+
+ RelatedType = _("Child");
+
+ } else if (PropertyValue == wxT("parent")){
+
+ RelatedType = _("Parent");
+
+ } else if (PropertyValue == wxT("sibling")){
+
+ RelatedType = _("Sibling");
+
+ } else if (PropertyValue == wxT("spouse")){
+
+ RelatedType = _("Spouse");
+
+ } else if (PropertyValue == wxT("kin")){
+
+ RelatedType = _("Kin");
+
+ } else if (PropertyValue == wxT("muse")){
+
+ RelatedType = _("Muse");
+
+ } else if (PropertyValue == wxT("crush")){
+
+ RelatedType = _("Crush");
+
+ } else if (PropertyValue == wxT("date")){
+
+ RelatedType = _("Date");
+
+ } else if (PropertyValue == wxT("sweetheart")){
+
+ RelatedType = _("Sweetheart");
+
+ } else if (PropertyValue == wxT("me")){
+
+ RelatedType = _("Me");
+
+ } else if (PropertyValue == wxT("agent")){
+
+ RelatedType = _("Agent");
+
+ } else if (PropertyValue == wxT("emergency")){
+
+ RelatedType = _("Emergency");
+
+ } else {
+
+ RelatedType = PropertyValue;
+
+ }
+
+ }
+
+ }
+
+ intPrevValue = 8;
+
+ bool PropertyMatched = FALSE;
+
+ for (std::map<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);
+
+ ProcessStringValue(&PropertyName, "ALTID", &GeneralRelatedListAltID, &PropertyValue, RelatedCount, &PropertyMatched);
+ ProcessStringValue(&PropertyName, "PID", &GeneralRelatedListPID, &PropertyValue, RelatedCount, &PropertyMatched);
+ ProcessStringValue(&PropertyName, "LANGUAGE", &GeneralRelatedListLanguage, &PropertyValue, RelatedCount, &PropertyMatched);
+ ProcessIntegerValue(&PropertyName, "PREF", &GeneralRelatedListPref, &PropertyValue, RelatedCount, &PropertyMatched);
+
+ if (PropertyMatched == TRUE){
+
+ PropertyMatched = FALSE;
+ continue;
+
+ }
+
+ 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<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> *WebsiteList = NULL;
+ std::map<int, wxString> *WebsiteListAltID = NULL;
+ std::map<int, wxString> *WebsiteListPID = NULL;
+ std::map<int, wxString> *WebsiteListType = NULL;
+ std::map<int, wxString> *WebsiteListTokens = NULL;
+ std::map<int, wxString> *WebsiteListMediatype = NULL;
+ std::map<int, int> *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<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")){
+
+ 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")){
+
+ ProcessIntegerValue(WebsiteListPref, &PropertyValue, URLCount);
+
+ } 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<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 = 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<int, wxString> *TitleList = NULL;
+ std::map<int, wxString> *TitleListAltID = NULL;
+ std::map<int, wxString> *TitleListPID = NULL;
+ std::map<int, wxString> *TitleListType = NULL;
+ std::map<int, wxString> *TitleListTokens = NULL;
+ std::map<int, wxString> *TitleListLanguage = NULL;
+ std::map<int, int> *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<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")){
+
+ 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")){
+
+ ProcessIntegerValue(TitleListPref, &PropertyValue, TitleCount);
+
+ } 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<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> *RoleList = NULL;
+ std::map<int, wxString> *RoleListAltID = NULL;
+ std::map<int, wxString> *RoleListPID = NULL;
+ std::map<int, wxString> *RoleListType = NULL;
+ std::map<int, wxString> *RoleListTokens = NULL;
+ std::map<int, wxString> *RoleListLanguage = NULL;
+ std::map<int, int> *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<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")){
+
+ 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")){
+
+ ProcessIntegerValue(RoleListPref, &PropertyValue, RoleCount);
+
+ } 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<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;