// 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();
}
}