From d0aff1878b93bd25d923176e4e18829b7040da1c Mon Sep 17 00:00:00 2001 From: Steve Brokenshire Date: Tue, 8 Dec 2015 21:53:40 +0000 Subject: [PATCH] Added source code, headers and unit test to check that a file has loaded OK in ContactDataObject. --- source/contacteditor/ContactDataObject.cpp | 123 ++++++++++++++++++++- source/contacteditor/ContactDataObject.h | 3 + source/tests/xestiaab_contactload.h | 4 + 3 files changed, 129 insertions(+), 1 deletion(-) diff --git a/source/contacteditor/ContactDataObject.cpp b/source/contacteditor/ContactDataObject.cpp index 3d4d319..49a5f2c 100644 --- a/source/contacteditor/ContactDataObject.cpp +++ b/source/contacteditor/ContactDataObject.cpp @@ -54,8 +54,129 @@ ContactLoadStatus ContactDataObject::LoadFile(wxString Filename){ } + 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_UNITTESTFAIL; + return CONTACTLOAD_OK; } \ No newline at end of file diff --git a/source/contacteditor/ContactDataObject.h b/source/contacteditor/ContactDataObject.h index 2c6b394..050bd53 100644 --- a/source/contacteditor/ContactDataObject.h +++ b/source/contacteditor/ContactDataObject.h @@ -22,10 +22,13 @@ #include #include #include +#include + #include "../vcard/vcard.h" enum ContactLoadStatus{ CONTACTLOAD_UNITTESTFAIL = -1, + CONTACTLOAD_OK, CONTACTLOAD_FILEMISSING, CONTACTLOAD_FILEERROR, CONTACTLOAD_FILEINVALIDFORMAT, diff --git a/source/tests/xestiaab_contactload.h b/source/tests/xestiaab_contactload.h index 93c62d7..1820bbf 100644 --- a/source/tests/xestiaab_contactload.h +++ b/source/tests/xestiaab_contactload.h @@ -41,6 +41,10 @@ TEST(ContactLoad, ContactLoadTests){ ASSERT_EQ(CONTACTLOAD_FILEBASESPECFAIL, TestFile.LoadFile("LoadCheck-Load3.vcf")); + // Check that the vCard 4.0 file loads OK. + + ASSERT_EQ(CONTACTLOAD_OK, TestFile.LoadFile("LoadCheck-Load4.vcf")); + } // TODO: Add tests for the Contact Loading process. \ No newline at end of file -- 2.39.2