// frmContactEditor-Load.cpp - frmContactEditor load contact 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 #include #include #include #include #include "frmContactEditor.h" #include "../enums.h" #include "../version.h" #include "../vcard/vcard.h" #include "../common/textprocessing.h" #include "../common/dirs.h" bool frmContactEditor::LoadContact(wxString Filename){ // Load the contact into the contact editor. wxFFile ContactFile; wxString wxSContactString; wxString ContactLine; vCard ContactData; XABViewMode XVMData; if (StartupEditMode == FALSE){ XVMData = MainPtr->GetViewMode(); } wxSContactFilename = Filename; // Check if we are using wxWidgets version 2.8 or less and // execute the required command accordingly. #if wxABI_VERSION < 20900 ContactFile.Open(Filename.c_str(), wxT("r")); #else ContactFile.Open(Filename, wxT("r")); #endif if (ContactFile.IsOpened() == FALSE){ return FALSE; } ContactFile.ReadAll(&wxSContactString, wxConvAuto()); // Split the lines. std::map ContactFileLines; std::map::iterator striter; wxStringTokenizer wSTContactFileLines(wxSContactString, wxT("\r\n")); int ContactLineSeek = 0; while (wSTContactFileLines.HasMoreTokens() == TRUE){ ContactLine = wSTContactFileLines.GetNextToken(); ContactFileLines.insert(std::make_pair(ContactLineSeek, ContactLine)); ContactLineSeek++; } // Get the line. bool QuoteMode = FALSE; bool PropertyFind = TRUE; bool HasExtraNicknames = FALSE; bool IgnoreGender = FALSE; bool ExtraLineSeek = TRUE; bool BirthdayProcessed = FALSE; bool AnniversaryProcessed = FALSE; bool FNProcessed = FALSE; bool GenderProcessed = FALSE; bool NameProcessed = FALSE; bool UIDProcessed = FALSE; bool KindProcessed = FALSE; bool ETagFound = FALSE; bool ETagOrigFound = FALSE; bool VersionProcessed = FALSE; int intExtraNickname = 0; wxString wxSProperty; wxString wxSPropertySeg1; wxString wxSPropertySeg2; wxString wxSPropertyNextLine; size_t ContactLineLen = 0; int QuoteBreakPoint = 0; int FNCount = 0; int NameCount = 0; int NicknameCount = 0; int ADRCount = 0; int EmailCount = 0; int IMPPCount = 0; int TelCount = 0; int LangCount = 0; int TZCount = 0; int GeoCount = 0; int URLCount = 0; int RelatedCount = 0; int TitleCount = 0; int RoleCount = 0; int OrgCount = 0; int NoteCount = 0; int CategoryCount = 0; int GroupCount = 0; int PhotoCount = 0; int LogoCount = 0; int SoundCount = 0; int CalAdrCount = 0; int CalReqAdrCount = 0; int FreeBusyCount = 0; int KeyCount = 0; int VendorCount = 0; int XTokenCount = 0; //int intValueSeek = 1; for (std::map::iterator iter = ContactFileLines.begin(); iter != ContactFileLines.end(); ++iter){ // Find the colon which splits the start bit from the data part. 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; } wxSPropertyNextLine = iter->second; if (wxSPropertyNextLine.Mid(0, 1) == wxT(" ") || wxSPropertyNextLine.Mid(0, 1) == wxT("\t")){ wxSPropertyNextLine.Remove(0, 1); //wxSPropertyNextLine.Trim(FALSE); //ContactLine.Trim(); ContactLine.Append(wxSPropertyNextLine); } 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){ wxSProperty.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). wxSPropertySeg1 = ContactLine.Mid(0, QuoteBreakPoint); wxSPropertySeg2 = ContactLine.Mid((QuoteBreakPoint + 1)); // Add the data into the contact editor depending on what it is. if (wxSProperty == wxT("VERSION") && VersionProcessed == FALSE){ // Check if version is 4.0, otherwise don't // load. if (wxSPropertySeg2 != wxT("4.0")){ wxMessageBox(_("This file is not a vCard 4.0 contact and is not supported under Xestia Address Book."), _("Contact not supported"), wxICON_ERROR); this->Close(); return FALSE; } VersionProcessed = TRUE; } if (wxSProperty == wxT("KIND") && KindProcessed == FALSE){ // See frmContactEditor-LoadGroup.cpp LoadKind(wxSPropertySeg2); } else if (wxSProperty == wxT("MEMBER")){ // See frmContactEditor-LoadGroup.cpp LoadMember(wxSPropertySeg2, &GroupCount); } else if (wxSProperty == wxT("FN")){ // See frmContactEditor-LoadName.cpp LoadFN(wxSPropertySeg1, wxSPropertySeg2, &FNCount, &FNProcessed, &ContactData); } else if (wxSProperty == wxT("N") && NameProcessed == FALSE){ // See frmContactEditor-LoadName.cpp LoadN(wxSPropertySeg1, wxSPropertySeg2, &NameProcessed, &ContactData); } else if (wxSProperty == wxT("NICKNAME")){ // See frmContactEditor-LoadNickname.cpp LoadNickname(wxSPropertySeg1, wxSPropertySeg2, &NicknameCount, &ContactData); } else if (wxSProperty == wxT("GENDER") && GenderProcessed == FALSE){ // See frmContactEditor-LoadGender.cpp LoadGender(wxSPropertySeg1, wxSPropertySeg2, &GenderProcessed, &ContactData); } else if (wxSProperty == wxT("BDAY") && BirthdayProcessed == FALSE){ // See frmContactEditor-LoadBADays.cpp LoadBDay(wxSPropertySeg1, wxSPropertySeg2, &BirthdayProcessed); } else if (wxSProperty == wxT("ANNIVERSARY") && AnniversaryProcessed == FALSE){ // See frmContactEditor-LoadBADays.cpp LoadAnniversary(wxSPropertySeg1, wxSPropertySeg2, &AnniversaryProcessed); } else if (wxSProperty == wxT("TZ")){ // See frmContactEditor-LoadTimeZone.cpp LoadTimeZone(wxSPropertySeg1, wxSPropertySeg2, &TZCount); } else if (wxSProperty == wxT("ADR")){ // See frmContactEditor-LoadAddress.cpp LoadADR(wxSPropertySeg1, wxSPropertySeg2, &ADRCount); } else if (wxSProperty == wxT("EMAIL")){ // See frmContactEditor-LoadEmail.cpp LoadEmail(wxSPropertySeg1, wxSPropertySeg2, &EmailCount); } else if (wxSProperty == wxT("IMPP")){ // See frmContactEditor-LoadIM.cpp LoadIM(wxSPropertySeg1, wxSPropertySeg2, &IMPPCount); } else if (wxSProperty == wxT("TEL")){ // See frmContactEditor-LoadTelephone.cpp LoadTelephone(wxSPropertySeg1, wxSPropertySeg2, &TelCount); } else if (wxSProperty == wxT("LANG")){ // See frmContactEditor-LoadLanguage.cpp LoadLanguage(wxSPropertySeg1, wxSPropertySeg2, &LangCount); } else if (wxSProperty == wxT("GEO")){ // See frmContactEditor-LoadGeo.cpp LoadGeo(wxSPropertySeg1, wxSPropertySeg2, &GeoCount); } else if (wxSProperty == wxT("RELATED")){ // See fromContactEditor-LoadRelated.cpp LoadRelated(wxSPropertySeg1, wxSPropertySeg2, &RelatedCount); } else if (wxSProperty == wxT("URL")){ // See frmContactEditor-LoadURL.cpp LoadURL(wxSPropertySeg1, wxSPropertySeg2, &URLCount); } else if (wxSProperty == wxT("TITLE")) { // See frmContactEditor-LoadTitle.cpp LoadTitle(wxSPropertySeg1, wxSPropertySeg2, &TitleCount); } else if (wxSProperty == wxT("ROLE")) { // See frmContactEditor-LoadRole.cpp LoadRole(wxSPropertySeg1, wxSPropertySeg2, &RoleCount); } else if (wxSProperty == wxT("ORG")) { // See frmContactEditor-LoadOrg.cpp LoadOrg(wxSPropertySeg1, wxSPropertySeg2, &OrgCount); } else if (wxSProperty == wxT("NOTE")) { // See frmContactEditor-LoadNote.cpp LoadNote(wxSPropertySeg1, wxSPropertySeg2, &NoteCount); } else if (wxSProperty == wxT("CATEGORIES")) { // See frmContactEditor-LoadCategory.cpp LoadCategory(wxSPropertySeg1, wxSPropertySeg2, &CategoryCount); } else if (wxSProperty == wxT("PHOTO")) { // See frmContactEditor-LoadPhoto.cpp LoadPhoto(wxSPropertySeg1, wxSPropertySeg2, &PhotoCount); } else if (wxSProperty == wxT("LOGO")) { // See frmContactEditor-LoadLogo.cpp LoadLogo(wxSPropertySeg1, wxSPropertySeg2, &LogoCount); } else if (wxSProperty == wxT("SOUND")) { // See frmContactEditor-LoadSound.cpp LoadSound(wxSPropertySeg1, wxSPropertySeg2, &SoundCount); } else if (wxSProperty == wxT("CALURI")){ // See frmContactEditor-LoadCalendar.cpp LoadCalURI(wxSPropertySeg1, wxSPropertySeg2, &CalAdrCount); } else if (wxSProperty == wxT("CALADRURI")){ // See frmContactEditor-LoadCalendar.cpp LoadCalAdrURI(wxSPropertySeg1, wxSPropertySeg2, &CalReqAdrCount); } else if (wxSProperty == wxT("FBURL")){ // See frmContactEditor-LoadCalendar.cpp LoadCalFreeBusy(wxSPropertySeg1, wxSPropertySeg2, &FreeBusyCount); } else if (wxSProperty == wxT("KEY")){ // See frmContactEditor-LoadKey.cpp LoadKey(wxSPropertySeg1, wxSPropertySeg2, &KeyCount); } else if (wxSProperty == wxT("UID") && UIDProcessed == FALSE){ UIDToken = wxSPropertySeg2; UIDProcessed = TRUE; } else if (wxSProperty.Mid(0, 3) == wxT("VND")){ // Split the Vendor three ways. wxStringTokenizer wSTVendorDetails(wxSPropertySeg1, wxT("-")); wxString wxSVNDID; wxString wxSVNDPropName; long ListCtrlIndex; while (wSTVendorDetails.HasMoreTokens() == TRUE){ wSTVendorDetails.GetNextToken(); wxSVNDID = wSTVendorDetails.GetNextToken(); wxSVNDPropName = wSTVendorDetails.GetNextToken(); break; } if (!wxSVNDID.IsEmpty() && !wxSVNDPropName.IsEmpty()){ // Setup the values for later processing. VendorList.insert(std::make_pair(intValueSeek, wxSPropertySeg2)); VendorListPEN.insert(std::make_pair(intValueSeek, wxSVNDID)); VendorListElement.insert(std::make_pair(intValueSeek, wxSVNDPropName)); // Add the data to the vendor variables. wxListItem coldata; coldata.SetId(intValueSeek); coldata.SetData(intValueSeek); coldata.SetText(wxSVNDID + wxT("-") + wxSVNDPropName); ListCtrlIndex = lboVendorNamespace->InsertItem(coldata); VendorList.erase(intValueSeek); VendorListPEN.erase(intValueSeek); VendorListElement.erase(intValueSeek); VendorList.insert(std::make_pair(intValueSeek, wxSPropertySeg2)); VendorListPEN.insert(std::make_pair(intValueSeek, wxSVNDID)); VendorListElement.insert(std::make_pair(intValueSeek, wxSVNDPropName)); VendorCount++; intValueSeek++; } } else if (wxSProperty.Mid(0, 2) == wxT("X-")){ long ListCtrlIndex; XTokenList.insert(std::make_pair(intValueSeek, wxSPropertySeg2)); XTokenListTokens.insert(std::make_pair(intValueSeek, wxSPropertySeg1.Mid(2))); // Add to the form. wxListItem coldata; coldata.SetId(intValueSeek); coldata.SetData(intValueSeek); coldata.SetText(wxSPropertySeg1.Mid(2)); ListCtrlIndex = lboXToken->InsertItem(coldata); XTokenCount++; intValueSeek++; } // Reset the variables. QuoteMode = FALSE; PropertyFind = TRUE; ExtraLineSeek = TRUE; ContactLineLen = 0; QuoteBreakPoint = 0; ContactLine.Clear(); wxSProperty.Clear(); } FMTimer.SetFilename(Filename); FMTimer.Start(10000, FALSE); EditMode = TRUE; return TRUE; } void frmContactEditor::SplitValues(wxString *PropertyLine, std::map *SplitPoints, std::map *SplitLength, int intSize){ size_t intPropertyLen = PropertyLine->Len(); int intSplitsFound = 0; int intSplitSize = 0; int intSplitSeek = 0; for (int i = intSize; i <= intPropertyLen; i++){ intSplitSize++; if (PropertyLine->Mid(i, 1) == wxT(";") && PropertyLine->Mid((i - 1), 1) != wxT("\\")){ if (intSplitsFound == 0){ SplitLength->insert(std::make_pair(intSplitsFound, (intSplitSize))); } else { SplitLength->insert(std::make_pair(intSplitsFound, (intSplitSize - 1))); } SplitPoints->insert(std::make_pair(intSplitsFound, (i + 1))); intSplitsFound++; intSplitSeek = i; intSplitSize = 0; } } if (intSplitsFound == 0){ SplitPoints->insert(std::make_pair(intSplitsFound, (8 + 1))); SplitLength->insert(std::make_pair(intSplitsFound, intSplitSize)); } else { SplitPoints->insert(std::make_pair(intSplitsFound, (intSplitSeek + 1))); SplitLength->insert(std::make_pair(intSplitsFound, intSplitSize)); } }