// ContactDataObject.cpp - Client Data Object. // // (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 "ContactDataObject.h" ContactLoadStatus ContactDataObject::LoadFile(wxString Filename){ if (!wxFileExists(Filename)){ return CONTACTLOAD_FILEMISSING; } wxFile ContactFile; if (!ContactFile.Open(Filename, wxFile::read, wxS_DEFAULT)){ return CONTACTLOAD_FILEERROR; } // Check that the vCard is a valid vCard 4.0 file. vCard vCard4FormatCheck; vCard4FormatCheck.LoadFile(Filename); if (vCard4FormatCheck.Get("VERSION") != wxT("4.0")){ return CONTACTLOAD_FILEINVALIDFORMAT; } // Check that the vCard meets the base specification. if (!vCard4FormatCheck.MeetBaseSpecification()){ return CONTACTLOAD_FILEBASESPECFAIL; } wxStringTokenizer wSTContactFileLines(vCard4FormatCheck.WriteString(), wxT("\r\n")); std::map ContactFileLines; int ContactLineSeek = 0; while (wSTContactFileLines.HasMoreTokens() == TRUE){ wxString ContactLine = wSTContactFileLines.GetNextToken(); ContactFileLines.insert(std::make_pair(ContactLineSeek, ContactLine)); ContactLineSeek++; } wxString wxSPropertyNextLine; bool ExtraLineSeek = TRUE; bool QuoteMode = FALSE; bool PropertyFind = TRUE; int ContactLineLen = 0; int QuoteBreakPoint = 0; wxString ContactLine; wxString PropertyLine; wxString PropertySeg1; wxString PropertySeg2; wxString PropertyNextLine; wxString Property; for (std::map::iterator iter = ContactFileLines.begin(); iter != ContactFileLines.end(); ++iter){ ExtraLineSeek = TRUE; QuoteMode = FALSE; PropertyFind = TRUE; ContactLineLen = 0; QuoteBreakPoint = 0; ContactLine.Clear(); PropertyLine.Clear(); PropertySeg1.Clear(); PropertySeg2.Clear(); Property.Clear(); ContactLine = iter->second; while (ExtraLineSeek == TRUE){ // Check if there is extra data on the next line // (indicated by space or tab at the start) and add data. iter++; if (iter == ContactFileLines.end()){ iter--; break; } PropertyNextLine = iter->second; if (PropertyNextLine.Mid(0, 1) == wxT(" ") || PropertyNextLine.Mid(0, 1) == wxT("\t")){ PropertyNextLine.Remove(0, 1); ContactLine.Append(PropertyNextLine); } else { iter--; ExtraLineSeek = FALSE; } } ContactLineLen = ContactLine.Len(); // Make sure we are not in quotation mode. // Make sure colon does not have \ or \\ before it. for (int i = 0; i <= ContactLineLen; i++){ if ((ContactLine.Mid(i, 1) == wxT(";") || ContactLine.Mid(i, 1) == wxT(":")) && PropertyFind == TRUE){ PropertyFind = FALSE; } else if (PropertyFind == TRUE){ Property.Append(ContactLine.Mid(i, 1)); } if (ContactLine.Mid(i, 1) == wxT("\"")){ if (QuoteMode == TRUE){ QuoteMode = FALSE; } else { QuoteMode = TRUE; } } if (ContactLine.Mid(i, 1) == wxT(":") && ContactLine.Mid((i - 1), 1) != wxT("\\") && QuoteMode == FALSE){ QuoteBreakPoint = i; break; } } // Split that line at the point into two variables (ignore the colon). PropertySeg1 = ContactLine.Mid(0, QuoteBreakPoint); PropertySeg2 = ContactLine.Mid((QuoteBreakPoint + 1)); } return CONTACTLOAD_OK; }