// ContactDataObject-Save.cpp - Client Data Object. // // (c) 2012-2016 Xestia Software Development. // // This file is part of Xestia Address Book. // // Xestia Address Book is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by the // Free Software Foundation, version 3 of the license. // // Xestia Address Book is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License along // with Xestia Address Book. If not, see #include "ContactDataObject.h" #include "../../version.h" ContactSaveStatus ContactDataObject::SaveString(wxString *SaveData){ ContactSaveStatus SaveDataStatus = CONTACTSAVE_UNITTESTFAIL; // Write the header for the vCard data file. SaveData->Append("BEGIN:VCARD\n"); SaveData->Append("VERSION:4.0\n"); // Write the product ID. #ifdef XAB_UNITTEST SaveData->Append("PRODID:-//Xestia//Address Book Unit Testing//KW\n"); #else SaveData->Append(wxT("PRODID:-//Xestia//Address Book Version ")); SaveData->Append(wxT(XSDAB_VERSION)); SaveData->Append(wxT("//KW\n")); #endif wxString ProcessData = ""; // Process UID. if (UIDToken.size() > 0){ ProcessData.Append("UID:"); ProcessData.Append(UIDToken); ProcessData.Append("\n"); SaveData->Append(ProcessData); ProcessData.clear(); } // Process KIND. switch(ContactKind){ case CONTACTKIND_NONE: break; case CONTACTKIND_INDIVIDUAL: SaveData->Append("KIND:individual\n"); break; case CONTACTKIND_GROUP: SaveData->Append("KIND:group\n"); break; case CONTACTKIND_ORGANISATION: SaveData->Append("KIND:org\n"); break; case CONTACTKIND_LOCATION: SaveData->Append("KIND:location\n"); break; default: break; } // Process XML. for (std::map::iterator XMLIter = XMLList.begin(); XMLIter != XMLList.end(); XMLIter++){ ProcessData.Append("XML"); if (XMLListAltID[XMLIter->first].size() > 0){ ProcessData.Append(";ALTID="); ProcessData.Append(XMLListAltID[XMLIter->first]); } ProcessData.Append(":"); ProcessData.Append(XMLIter->second); ProcessData.Append("\n"); ProcessData = OutputText(&ProcessData); SaveData->Append(ProcessData); ProcessData.clear(); } // Process SOURCE. SaveSource(&SourceList, &SourceListAltID, &SourceListPID, &SourceListType, &SourceListMediatype, &SourceListPref, &SourceListTokens, SaveData); // Process CLIENTPIDMAP. for (std::map::iterator CPIDIter = ClientPIDList.begin(); CPIDIter != ClientPIDList.end(); CPIDIter++){ ProcessData.Append("CLIENTPIDMAP"); if (ClientPIDListTokens[CPIDIter->first].size() > 0){ ProcessData.Append(";"); ProcessData.Append(ClientPIDListTokens[CPIDIter->first]); } ProcessData.Append(":"); ProcessData.Append(CPIDIter->second); ProcessData.Append("\n"); ProcessData = OutputText(&ProcessData); SaveData->Append(ProcessData); ProcessData.clear(); } // Process FN. for (std::map::iterator FNIter = FullNamesList.begin(); FNIter != FullNamesList.end(); FNIter++){ ProcessData.Append("FN"); // Check if there is a value for TYPE. if (FullNamesListType[FNIter->first].size() > 0){ ProcessData.Append(";TYPE="); ProcessData.Append(FullNamesListType[FNIter->first]); } // Check if there is a value for LANGUAGE. if (FullNamesListLanguage[FNIter->first].size() > 0){ ProcessData.Append(";LANGUAGE="); ProcessData.Append(FullNamesListLanguage[FNIter->first]); } // Check if there is a value for ALTID. if (FullNamesListAltID[FNIter->first].size() > 0){ ProcessData.Append(";ALTID="); ProcessData.Append(FullNamesListAltID[FNIter->first]); } // Check if there is a value for PID. if (FullNamesListPID[FNIter->first].size() > 0){ ProcessData.Append(";PID="); ProcessData.Append(FullNamesListPID[FNIter->first]); } // Check if there is a value for PREF. if (FullNamesListPref[FNIter->first] > 0){ ProcessData.Append(";PREF="); ProcessData.Append(wxString::Format("%i", FullNamesListPref[FNIter->first])); } // Check if there is a value for tokens. if (FullNamesListTokens[FNIter->first].size() > 0){ ProcessData.Append(";"); ProcessData.Append(FullNamesListTokens[FNIter->first]); } ProcessData.Append(":"); ProcessData.Append(FNIter->second); ProcessData.Append("\n"); ProcessData = OutputText(&ProcessData); SaveData->Append(ProcessData); ProcessData.clear(); } // Process TITLE. SaveTitle(&GeneralTitleList, &GeneralTitleListLanguage, &GeneralTitleListAltID, &GeneralTitleListPID, &GeneralTitleListType, &GeneralTitleListPref, &GeneralTitleListTokens, SaveData, ""); SaveTitle(&HomeTitleList, &HomeTitleListLanguage, &HomeTitleListAltID, &HomeTitleListPID, &HomeTitleListType, &HomeTitleListPref, &HomeTitleListTokens, SaveData, "home"); SaveTitle(&BusinessTitleList, &BusinessTitleListLanguage, &BusinessTitleListAltID, &BusinessTitleListPID, &BusinessTitleListType, &BusinessTitleListPref, &BusinessTitleListTokens, SaveData, "work"); // Write the end part of the vCard data file. SaveData->Append("END:VCARD"); SaveDataStatus = CONTACTSAVE_OK; return SaveDataStatus; } void ContactDataObject::SaveTitle(map *TitleList, map *TitleListLanguage, map *TitleListAltID, map *TitleListPID, map *TitleListType, map *TitleListPref, map *TitleListTokens, wxString *SaveData, wxString DataType){ wxString ProcessData = ""; for (std::map::iterator TitleIter = TitleList->begin(); TitleIter != TitleList->end(); TitleIter++){ ProcessData.Append("TITLE"); // Check if there is a value for TYPE. if (DataType.size() > 0){ ProcessData.Append(";TYPE="); ProcessData.Append(DataType); } // Check if there is a value for ALTID. if ((*TitleListAltID)[TitleIter->first].size() > 0){ ProcessData.Append(";ALTID="); ProcessData.Append((*TitleListAltID)[TitleIter->first]); } // Check if there is a value for LANGUAGE. if ((*TitleListLanguage)[TitleIter->first].size() > 0){ ProcessData.Append(";LANGUAGE="); ProcessData.Append((*TitleListLanguage)[TitleIter->first]); } // Check if there is a value for PID. if ((*TitleListPID)[TitleIter->first].size() > 0){ ProcessData.Append(";PID="); ProcessData.Append((*TitleListPID)[TitleIter->first]); } // Check if there is a value for PREF. if ((*TitleListPref)[TitleIter->first] > 0){ ProcessData.Append(";PREF="); ProcessData.Append(wxString::Format("%i", (*TitleListPref)[TitleIter->first])); } // Check if there is a value for tokens. if ((*TitleListTokens)[TitleIter->first].size() > 0){ ProcessData.Append(";"); ProcessData.Append((*TitleListTokens)[TitleIter->first]); } ProcessData.Append(":"); ProcessData.Append(TitleIter->second); ProcessData.Append("\n"); ProcessData = OutputText(&ProcessData); SaveData->Append(ProcessData); ProcessData.clear(); } } void ContactDataObject::SaveSource(map *SourceList, map *SourceListAltID, map *SourceListPID, map *SourceListType, map *SourceListMediatype, map *SourceListPref, map *SourceListTokens, wxString *SaveData){ wxString ProcessData = ""; for (std::map::iterator SourceIter = SourceList->begin(); SourceIter != SourceList->end(); SourceIter++){ ProcessData.Append("SOURCE"); // Check if there is a value for TYPE. if ((*SourceListType)[SourceIter->first].size() > 0){ ProcessData.Append(";TYPE="); ProcessData.Append((*SourceListType)[SourceIter->first]); } // Check if there is a value for ALTID. if ((*SourceListAltID)[SourceIter->first].size() > 0){ ProcessData.Append(";ALTID="); ProcessData.Append((*SourceListAltID)[SourceIter->first]); } // Check if there is a value for LANGUAGE. if ((*SourceListMediatype)[SourceIter->first].size() > 0){ ProcessData.Append(";MEDIATYPE="); ProcessData.Append((*SourceListMediatype)[SourceIter->first]); } // Check if there is a value for PID. if ((*SourceListPID)[SourceIter->first].size() > 0){ ProcessData.Append(";PID="); ProcessData.Append((*SourceListPID)[SourceIter->first]); } // Check if there is a value for PREF. if ((*SourceListPref)[SourceIter->first] > 0){ ProcessData.Append(";PREF="); ProcessData.Append(wxString::Format("%i", (*SourceListPref)[SourceIter->first])); } // Check if there is a value for tokens. if ((*SourceListTokens)[SourceIter->first].size() > 0){ ProcessData.Append(";"); ProcessData.Append((*SourceListTokens)[SourceIter->first]); } ProcessData.Append(":"); ProcessData.Append(SourceIter->second); ProcessData.Append("\n"); ProcessData = OutputText(&ProcessData); SaveData->Append(ProcessData); ProcessData.clear(); } }