// convert.h - Convert subroutines.
//
// (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 "convert.h"
#include "vcard/vcard.h"
#include "vcard/vcard34conv.h"
ConvertResult ConvertContact(wxString InputFormat, wxString OutputFormat,
wxString InputFilename, wxString OutputFilename){
std::vector ValidFormats = {
wxT("vCard3"),
wxT("vCard4")
};
bool ValidInput = false;
bool ValidOutput = false;
// Check that the input format is valid.
for (long l = 0; l < ValidFormats.size(); l++){
if (InputFormat == ValidFormats[l]){
ValidInput = true;
break;
}
}
if (ValidInput == false){
return CONVERTRESULT_INVALIDINPUTFORMAT;
}
// Check that the output format is valid.
for (long l = 0; l < ValidFormats.size(); l++){
if (OutputFormat == ValidFormats[l]){
ValidOutput = true;
break;
}
}
if (ValidOutput == false){
return CONVERTRESULT_INVALIDOUTPUTFORMAT;
}
// Check that the input and output formats
// are not the same.
if (InputFormat == OutputFormat){
return CONVERTRESULT_FORMATSSAME;
}
// Check that the input filename is not empty.
if (InputFilename.empty()){
return CONVERTRESULT_INPUTFILEEMPTY;
}
// Check that the input file given exists.
if (!wxFileExists(InputFilename)){
return CONVERTRESULT_INPUTFILEMISSING;
}
wxFile InputFile;
if (!InputFile.Open(InputFilename, wxFile::read, wxS_DEFAULT)){
int InputFileErrNo = InputFile.GetLastError();
return CONVERTRESULT_INPUTFILEERROR;
}
// Check that the output file can be opened.
bool OutputPipe = false;
wxFile OutputFile;
if (!OutputFilename.IsEmpty()){
if (!OutputFile.Open(OutputFilename, wxFile::write, wxS_DEFAULT)){
return CONVERTRESULT_OUTPUTFILEERROR;
}
} else {
OutputPipe = true;
}
// Check that the file has the correct file format.
vCard vCard4Format;
wxString FinalData;
if (InputFormat == "vCard4"){
// Read from the file.
wxString InputFileData;
InputFile.ReadAll(&InputFileData, wxConvAuto());
vCard vCard4Format;
vCard4Format.LoadString(InputFileData);
if (vCard4Format.Get("VERSION") != "4.0"){
return CONVERTRESULT_INPUTFILEINVALIDFORMAT;
}
} else if (InputFormat == "vCard3"){
// Read from the file.
wxString InputFileData;
InputFile.ReadAll(&InputFileData, wxConvAuto());
vCard InputvCard;
InputvCard.LoadString(InputFileData);
if (InputvCard.Get("VERSION") != "3.0"){
return CONVERTRESULT_INPUTFILEINVALIDFORMAT;
}
vCard34Conv vCard34ConvObj;
vCard vCard4Format;
vCard34ConvObj.ConvertToV4(&InputFileData, &vCard4Format);
FinalData = vCard4Format.WriteString();
}
// Convert the vCard into the required format and
// get the string value.
if (OutputFormat == "vCard4"){
// Do nothing as the vCard is already in the vCard 4.0
// format.
} else if (OutputFormat == "vCard3"){
// Convert the vCard to vCard 3.0.
vCard34Conv vCard34ConvObj;
vCard vCard3Format;
vCard34ConvObj.ConvertToV3(InputFilename, &FinalData);
}
// Check if we are outputting to console or to file.
if (OutputPipe == false){
// We are outputting to a file.
OutputFile.Write(FinalData, wxConvUTF8);
} else {
// Write out the data to the console.
FinalData.Trim();
std::cout << FinalData << std::endl;
}
return CONVERTRESULT_OK;
}