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