From 991f1b1f9333b7b4aae5543cc1c10474d33e83be Mon Sep 17 00:00:00 2001 From: Steve Brokenshire Date: Sat, 26 Dec 2015 18:33:23 +0000 Subject: [PATCH] Added source code, headers and unit tests for the CALADR vCard property for ContactDataObject. --- source/contacteditor/ContactDataObject.cpp | 164 ++++++++++++++++++++- source/contacteditor/ContactDataObject.h | 1 + source/tests/LoadCheck-Load4.vcf | 6 + source/tests/xestiaab_contactload.h | 141 +++++++++++++++++- 4 files changed, 307 insertions(+), 5 deletions(-) diff --git a/source/contacteditor/ContactDataObject.cpp b/source/contacteditor/ContactDataObject.cpp index 05241d2..d14043c 100644 --- a/source/contacteditor/ContactDataObject.cpp +++ b/source/contacteditor/ContactDataObject.cpp @@ -100,7 +100,8 @@ ContactLoadStatus ContactDataObject::LoadFile(wxString Filename){ int PhotoCount = 0; int LogoCount = 0; int SoundCount = 0; - int CalAdrCount = 0; + int CalendarCount = 0; + int CalendarAddressCount = 0; wxString ContactLine; wxString PropertyLine; wxString PropertySeg1; @@ -358,8 +359,13 @@ ContactLoadStatus ContactDataObject::LoadFile(wxString Filename){ // See frmContactEditor-LoadCalendar.cpp - ProcessCalendarURI(PropertySeg1, PropertySeg2, &CalAdrCount); - CalAdrCount++; + ProcessCalendarURI(PropertySeg1, PropertySeg2, &CalendarCount); + CalendarCount++; + + } else if (Property == wxT("CALADRURI")){ + + ProcessCalendarAddressURI(PropertySeg1, PropertySeg2, &CalendarAddressCount); + CalendarAddressCount++; } @@ -4883,6 +4889,158 @@ void ContactDataObject::ProcessCalendarURI(wxString PropertySeg1, wxString Prope } +void ContactDataObject::ProcessCalendarAddressURI(wxString PropertySeg1, wxString PropertySeg2, int *CalAdrURICount){ + + size_t intPropertyLen = PropertySeg1.Len(); + std::map SplitPoints; + std::map SplitLength; + std::map::iterator SLiter; + wxString PropertyData; + wxString PropertyName; + wxString PropertyValue; + wxString PropertyTokens; + bool FirstToken = TRUE; + int intSplitsFound = 0; + int intSplitSize = 0; + int intPrevValue = 8; + int intPref = 0; + int intType = 0; + + SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue); + + intPrevValue = 7; + + PropertyType PropType = PROPERTY_NONE; + + // Look for type before continuing. + + CheckType(&PropertySeg1, &SplitPoints, &SplitLength, &intPrevValue, &PropType); + + intPrevValue = 7; + + for (std::map::iterator intiter = SplitPoints.begin(); + intiter != SplitPoints.end(); ++intiter){ + + SLiter = SplitLength.find(intiter->first); + + PropertyData = PropertySeg1.Mid(intPrevValue, (SLiter->second)); + + wxStringTokenizer PropertyElement (PropertyData, wxT("=")); + PropertyName = PropertyElement.GetNextToken(); + PropertyValue = PropertyElement.GetNextToken(); + + intPrevValue = intiter->second; + + // Process properties. + + size_t intPropertyValueLen = PropertyValue.Len(); + + if (PropertyValue.Mid((intPropertyValueLen - 1), 1) == wxT("\"")){ + + PropertyValue.Trim(); + PropertyValue.RemoveLast(); + + } + + if (PropertyValue.Mid(0, 1) == wxT("\"")){ + + PropertyValue.Remove(0, 1); + + } + + CaptureString(&PropertyValue, FALSE); + + if (PropertyName == wxT("ALTID")){ + + CalendarRequestListAltID.erase(*CalAdrURICount); + CalendarRequestListAltID.insert(std::make_pair(*CalAdrURICount, PropertyValue)); + + } else if (PropertyName == wxT("PID")){ + + CalendarRequestListPID.erase(*CalAdrURICount); + CalendarRequestListPID.insert(std::make_pair(*CalAdrURICount, PropertyValue)); + + } else if (PropertyName == wxT("PREF")){ + + int PriorityNumber = 0; + bool ValidNumber = TRUE; + + try{ + PriorityNumber = std::stoi(PropertyValue.ToStdString()); + } + + catch(std::invalid_argument &e){ + ValidNumber = FALSE; + } + + if (ValidNumber == TRUE){ + + CalendarRequestListPref.erase(*CalAdrURICount); + CalendarRequestListPref.insert(std::make_pair(*CalAdrURICount, PriorityNumber)); + + } + + } else if (PropertyName == wxT("MEDIATYPE")){ + + CalendarRequestListMediatype.erase(*CalAdrURICount); + CalendarRequestListMediatype.insert(std::make_pair(*CalAdrURICount, PropertyValue)); + + } else { + + // Something else we don't know about so append + // to the tokens variable. + + if (!PropertyName.IsEmpty() && !PropertyValue.IsEmpty() && PropertyName != wxT("TYPE")){ + + if (FirstToken == TRUE){ + + PropertyTokens.Append(PropertyName + wxT("=") + PropertyValue); + FirstToken = FALSE; + + } else { + + PropertyTokens.Append(wxT(";") + PropertyName + wxT("=") + PropertyValue); + + } + + } + + } + + } + + intPropertyLen = PropertySeg2.Len(); + SplitPoints.clear(); + SplitLength.clear(); + intSplitsFound = 0; + intSplitSize = 0; + intPrevValue = 0; + + CaptureString(&PropertySeg2, FALSE); + + // Add the data to the General/Home/Work address variables. + + switch(PropType){ + case PROPERTY_NONE: + break; + case PROPERTY_HOME: + CalendarRequestListType.insert(std::make_pair(*CalAdrURICount, "home")); + break; + case PROPERTY_WORK: + CalendarRequestListType.insert(std::make_pair(*CalAdrURICount, "work")); + break; + } + + CalendarRequestList.insert(std::make_pair(*CalAdrURICount, PropertySeg2)); + + if (!PropertyTokens.IsEmpty()){ + + CalendarRequestListTokens.insert(std::make_pair(*CalAdrURICount, PropertyTokens)); + + } + +} + void SplitValues(wxString *PropertyLine, std::map *SplitPoints, std::map *SplitLength, diff --git a/source/contacteditor/ContactDataObject.h b/source/contacteditor/ContactDataObject.h index 6f2ad83..79c1a70 100644 --- a/source/contacteditor/ContactDataObject.h +++ b/source/contacteditor/ContactDataObject.h @@ -80,6 +80,7 @@ class ContactDataObject{ void ProcessLogo(wxString PropertySeg1, wxString PropertySeg2, int *LogoCount); void ProcessSound(wxString PropertySeg1, wxString PropertySeg2, int *SoundCount); void ProcessCalendarURI(wxString PropertySeg1, wxString PropertySeg2, int *CalAdrCount); + void ProcessCalendarAddressURI(wxString PropertySeg1, wxString PropertySeg2, int *CalAdrURICount); public: diff --git a/source/tests/LoadCheck-Load4.vcf b/source/tests/LoadCheck-Load4.vcf index 057eeba..b4e5fb4 100644 --- a/source/tests/LoadCheck-Load4.vcf +++ b/source/tests/LoadCheck-Load4.vcf @@ -492,4 +492,10 @@ CALURI;TYPE=home;ALTID=44;PID=41;MEDIATYPE=text/dryplain;PREF=42;CALENDARS=G ROUNDED:http://example.com/home CALURI;TYPE=work;ALTID=54;PID=51;PREF=52;MEDIATYPE=text/stillwetink;CALENDAR S=CANCELLED:http://example.com/business +CALADRURI;ALTID=14;PID=11;PREF=12;MEDIATYPE=text/plain;REQUEST=YES:http://ex + ample.com/request +CALADRURI;TYPE=home;ALTID=24;PID=21;PREF=22;MEDIATYPE=text/dryplain;REQUEST= + MAYBE:http://example.com/home/request +CALADRURI;TYPE=work;ALTID=34;PID=31;PREF=32;MEDIATYPE=text/stillwetink;REQUE + ST=NO:http://example.com/business/request END:VCARD diff --git a/source/tests/xestiaab_contactload.h b/source/tests/xestiaab_contactload.h index cbbac4a..aca50e4 100644 --- a/source/tests/xestiaab_contactload.h +++ b/source/tests/xestiaab_contactload.h @@ -3210,8 +3210,6 @@ TEST(ContactLoad, SoundTests){ TEST(ContactLoad, CalendarURITests){ - // Setup the sound files first. - ContactDataObject TestFile; // Check that the vCard 4.0 file loads OK. @@ -3348,4 +3346,143 @@ TEST(ContactLoad, CalendarURITests){ } +TEST(ContactLoad, CalendarAddressURITests){ + + ContactDataObject TestFile; + + // Check that the vCard 4.0 file loads OK. + + ASSERT_EQ(CONTACTLOAD_OK, TestFile.LoadFile("LoadCheck-Load4.vcf")); + + std::map::iterator TestFileIter; + std::map::iterator TestFileIntIter; + + // Start with a general calendar request address. + + TestFileIter = TestFile.CalendarRequestList.find(0); + ASSERT_NE(TestFile.CalendarRequestList.end(), TestFileIter); + ASSERT_EQ("http://example.com/request", TestFileIter->second); + + // Check the TYPE section. + + TestFileIter = TestFile.CalendarRequestListType.find(0); + ASSERT_EQ(TestFile.CalendarRequestListType.end(), TestFileIter); + + // Check the ALTID section. + + TestFileIter = TestFile.CalendarRequestListAltID.find(0); + ASSERT_NE(TestFile.CalendarRequestListAltID.end(), TestFileIter); + ASSERT_EQ("14", TestFileIter->second); + + // Check the PID section. + + TestFileIter = TestFile.CalendarRequestListPID.find(0); + ASSERT_NE(TestFile.CalendarRequestListPID.end(), TestFileIter); + ASSERT_EQ("11", TestFileIter->second); + + // Check the MEDIATYPE section. + + TestFileIter = TestFile.CalendarRequestListMediatype.find(0); + ASSERT_NE(TestFile.CalendarRequestListMediatype.end(), TestFileIter); + ASSERT_EQ("text/plain", TestFileIter->second); + + // Check the PREF section. + + TestFileIntIter = TestFile.CalendarRequestListPref.find(0); + ASSERT_NE(TestFile.CalendarRequestListPref.end(), TestFileIntIter); + ASSERT_EQ(12, TestFileIntIter->second); + + // Check the extra tokens. + + TestFileIter = TestFile.CalendarRequestListTokens.find(0); + ASSERT_NE(TestFile.CalendarRequestListTokens.end(), TestFileIter); + ASSERT_EQ("REQUEST=YES", TestFileIter->second); + + // Start with a home calendar request address. + + TestFileIter = TestFile.CalendarRequestList.find(1); + ASSERT_NE(TestFile.CalendarRequestList.end(), TestFileIter); + ASSERT_EQ("http://example.com/home/request", TestFileIter->second); + + // Check the TYPE section. + + TestFileIter = TestFile.CalendarRequestListType.find(1); + ASSERT_NE(TestFile.CalendarRequestListType.end(), TestFileIter); + ASSERT_EQ("home", TestFileIter->second); + + // Check the ALTID section. + + TestFileIter = TestFile.CalendarRequestListAltID.find(1); + ASSERT_NE(TestFile.CalendarRequestListAltID.end(), TestFileIter); + ASSERT_EQ("24", TestFileIter->second); + + // Check the PID section. + + TestFileIter = TestFile.CalendarRequestListPID.find(1); + ASSERT_NE(TestFile.CalendarRequestListPID.end(), TestFileIter); + ASSERT_EQ("21", TestFileIter->second); + + // Check the MEDIATYPE section. + + TestFileIter = TestFile.CalendarRequestListMediatype.find(1); + ASSERT_NE(TestFile.CalendarRequestListMediatype.end(), TestFileIter); + ASSERT_EQ("text/dryplain", TestFileIter->second); + + // Check the PREF section. + + TestFileIntIter = TestFile.CalendarRequestListPref.find(1); + ASSERT_NE(TestFile.CalendarRequestListPref.end(), TestFileIntIter); + ASSERT_EQ(22, TestFileIntIter->second); + + // Check the extra tokens. + + TestFileIter = TestFile.CalendarRequestListTokens.find(1); + ASSERT_NE(TestFile.CalendarRequestListTokens.end(), TestFileIter); + ASSERT_EQ("REQUEST=MAYBE", TestFileIter->second); + + // Start with a business calendar request address. + + TestFileIter = TestFile.CalendarRequestList.find(2); + ASSERT_NE(TestFile.CalendarRequestList.end(), TestFileIter); + ASSERT_EQ("http://example.com/business/request", TestFileIter->second); + + // Check the TYPE section. + + TestFileIter = TestFile.CalendarRequestListType.find(2); + ASSERT_NE(TestFile.CalendarRequestListType.end(), TestFileIter); + ASSERT_EQ("work", TestFileIter->second); + + // Check the ALTID section. + + TestFileIter = TestFile.CalendarRequestListAltID.find(2); + ASSERT_NE(TestFile.CalendarRequestListAltID.end(), TestFileIter); + ASSERT_EQ("34", TestFileIter->second); + + // Check the PID section. + + TestFileIter = TestFile.CalendarRequestListPID.find(2); + ASSERT_NE(TestFile.CalendarRequestListPID.end(), TestFileIter); + ASSERT_EQ("31", TestFileIter->second); + + // Check the MEDIATYPE section. + + TestFileIter = TestFile.CalendarRequestListMediatype.find(2); + ASSERT_NE(TestFile.CalendarRequestListMediatype.end(), TestFileIter); + ASSERT_EQ("text/stillwetink", TestFileIter->second); + + // Check the PREF section. + + TestFileIntIter = TestFile.CalendarRequestListPref.find(2); + ASSERT_NE(TestFile.CalendarRequestListPref.end(), TestFileIntIter); + ASSERT_EQ(32, TestFileIntIter->second); + + // Check the extra tokens. + + TestFileIter = TestFile.CalendarRequestListTokens.find(2); + ASSERT_NE(TestFile.CalendarRequestListTokens.end(), TestFileIter); + ASSERT_EQ("REQUEST=NO", TestFileIter->second); + + +} + // TODO: Add tests for the Contact Loading process. \ No newline at end of file -- 2.39.2