From: Steve Brokenshire Date: Wed, 23 Dec 2015 18:32:57 +0000 (+0000) Subject: Added extra unit tests for CATEGORIES and begun work on the PHOTO vCard property. X-Git-Tag: release-0.09~219 X-Git-Url: http://Server1/repobrowser/?p=xestiaab%2F.git;a=commitdiff_plain;h=e156db40eb817b3dbe13737edc3f625a2db30fa3 Added extra unit tests for CATEGORIES and begun work on the PHOTO vCard property. --- diff --git a/source/contacteditor/ContactDataObject.cpp b/source/contacteditor/ContactDataObject.cpp index e6c82a1..0b70e28 100644 --- a/source/contacteditor/ContactDataObject.cpp +++ b/source/contacteditor/ContactDataObject.cpp @@ -97,6 +97,7 @@ ContactLoadStatus ContactDataObject::LoadFile(wxString Filename){ int OrganisationCount = 0; int NoteCount = 0; int CategoryCount = 0; + int PhotoCount = 0; wxString ContactLine; wxString PropertyLine; wxString PropertySeg1; @@ -322,6 +323,13 @@ ContactLoadStatus ContactDataObject::LoadFile(wxString Filename){ ProcessCategory(PropertySeg1, PropertySeg2, &CategoryCount); CategoryCount++; + } else if (Property == wxT("PHOTO")) { + + // See frmContactEditor-LoadPhoto.cpp + + ProcessPhoto(PropertySeg1, PropertySeg2, &PhotoCount); + PhotoCount++; + } } @@ -4036,6 +4044,227 @@ void ContactDataObject::ProcessCategory(wxString PropertySeg1, wxString Property } +void ContactDataObject::ProcessPhoto(wxString PropertySeg1, wxString PropertySeg2, int *PhotoCount){ + + 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 = 7; + int intPref = 0; + int intType = 0; + long ListCtrlIndex; + + SplitValues(&PropertySeg1, &SplitPoints, &SplitLength, intPrevValue); + + intPrevValue = 6; + + PropertyType PropType = PROPERTY_NONE; + + // Look for type before continuing. + + CheckType(&PropertySeg1, &SplitPoints, &SplitLength, &intPrevValue, &PropType); + + intPrevValue = 6; + + 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")){ + + PicturesListAltID.erase(*PhotoCount); + PicturesListAltID.insert(std::make_pair(*PhotoCount, PropertyValue)); + + } else if (PropertyName == wxT("PID")){ + + PicturesListPID.erase(*PhotoCount); + PicturesListPID.insert(std::make_pair(*PhotoCount, 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){ + + PicturesListPref.erase(*PhotoCount); + PicturesListPref.insert(std::make_pair(*PhotoCount, PriorityNumber)); + + } + + } else if (PropertyName == wxT("MEDIATYPE")){ + + PicturesListMediatype.erase(*PhotoCount); + PicturesListMediatype.insert(std::make_pair(*PhotoCount, 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); + + for (int i = 0; i <= intPropertyLen; i++){ + + intSplitSize++; + + if (PropertySeg2.Mid(i, 1) == wxT(";")){ + + intSplitsFound++; + SplitPoints.insert(std::make_pair(intSplitsFound, (i + 1))); + + if (intSplitsFound == 6){ + + SplitLength.insert(std::make_pair(intSplitsFound, (intSplitSize - 1))); + break; + + } else { + + SplitLength.insert(std::make_pair(intSplitsFound, (intSplitSize - 1))); + + } + + intSplitSize = 0; + + } + + } + + wxString wxSPhotoURI; + wxString wxSPhotoMIME; + wxString wxSPhotoEncoding; + wxString wxSPhotoData; + std::string base64enc; + + if (intSplitsFound == 0){ + + } else { + + std::map::iterator striter; + + striter = SplitLength.find(1); + + wxStringTokenizer wSTDataType(PropertySeg2.Mid(0, striter->second), wxT(":")); + + while (wSTDataType.HasMoreTokens() == TRUE){ + + wxSPhotoURI = wSTDataType.GetNextToken(); + wxSPhotoMIME = wSTDataType.GetNextToken(); + break; + + } + + wxStringTokenizer wSTDataInfo(PropertySeg2.Mid((striter->second + 1)), wxT(",")); + + while (wSTDataInfo.HasMoreTokens() == TRUE){ + + wxSPhotoEncoding = wSTDataInfo.GetNextToken(); + wxSPhotoData = wSTDataInfo.GetNextToken(); + base64enc = wxSPhotoData.mb_str(); + break; + + } + + } + + // Add the data to the General/Home/Work address variables. + + PicturesList.insert(std::make_pair(*PhotoCount, base64enc)); + PicturesListPictureType.insert(std::make_pair(*PhotoCount, wxSPhotoMIME)); + PicturesListPicEncType.insert(std::make_pair(*PhotoCount, wxSPhotoEncoding)); + + switch(PropType){ + case PROPERTY_NONE: + break; + case PROPERTY_HOME: + PicturesListType.insert(std::make_pair(*PhotoCount, "home")); + break; + case PROPERTY_WORK: + PicturesListType.insert(std::make_pair(*PhotoCount, "work")); + break; + } + + if (!PropertyTokens.IsEmpty()){ + + PicturesListTokens.insert(std::make_pair(*PhotoCount, PropertyTokens)); + + } + + + PhotoCount++; + +} + void SplitValues(wxString *PropertyLine, std::map *SplitPoints, std::map *SplitLength, diff --git a/source/contacteditor/ContactDataObject.h b/source/contacteditor/ContactDataObject.h index e18bf70..48c7182 100644 --- a/source/contacteditor/ContactDataObject.h +++ b/source/contacteditor/ContactDataObject.h @@ -76,6 +76,7 @@ class ContactDataObject{ void ProcessOrganisation(wxString PropertySeg1, wxString PropertySeg2, int *OrganisationCount); void ProcessNote(wxString PropertySeg1, wxString PropertySeg2, int *NoteCount); void ProcessCategory(wxString PropertySeg1, wxString PropertySeg2, int *CategoryCount); + void ProcessPhoto(wxString PropertySeg1, wxString PropertySeg2, int *PhotoCount); public: diff --git a/source/tests/LoadCheck-Load4.vcf b/source/tests/LoadCheck-Load4.vcf index 4942c05..a5cfde5 100644 --- a/source/tests/LoadCheck-Load4.vcf +++ b/source/tests/LoadCheck-Load4.vcf @@ -85,5 +85,6 @@ NOTE;TYPE=work;ALTID=70;PID=71;LANGUAGE=fr;PREF=72;BOING=BOOP:Note\n\n\n\nLi CATEGORIES;ALTID=40;PID=41;LANGUAGE=en;PREF=42;CAT=TAC:Category One CATEGORIES;TYPE=home;ALTID=44;PID=46;LANGUAGE=kw;PREF=48;TAC=CAT:Category Tw o,Category Three -CATEGORIES:Category Four,Category Five,Category Six +CATEGORIES;TYPE=work;ALTID=84;PID=86;LANGUAGE=kw;PREF=88;AAA=BBB:Category Fo + ur,Category Five,Category Six END:VCARD diff --git a/source/tests/xestiaab_contactload.h b/source/tests/xestiaab_contactload.h index bc22008..1bfc52b 100644 --- a/source/tests/xestiaab_contactload.h +++ b/source/tests/xestiaab_contactload.h @@ -2220,63 +2220,87 @@ TEST(ContactLoad, CategoryTests){ // Check the TYPE section. - /*TestFileIter = TestFile.CategoriesListType.find(1); + TestFileIter = TestFile.CategoriesListType.find(3); ASSERT_NE(TestFile.CategoriesListType.end(), TestFileIter); - ASSERT_EQ("home", TestFileIter->second); + ASSERT_EQ("work", TestFileIter->second); - TestFileIter = TestFile.CategoriesListType.find(2); + TestFileIter = TestFile.CategoriesListType.find(4); ASSERT_NE(TestFile.CategoriesListType.end(), TestFileIter); - ASSERT_EQ("home", TestFileIter->second); + ASSERT_EQ("work", TestFileIter->second); + + TestFileIter = TestFile.CategoriesListType.find(5); + ASSERT_NE(TestFile.CategoriesListType.end(), TestFileIter); + ASSERT_EQ("work", TestFileIter->second); // Check the ALTID section. - TestFileIter = TestFile.CategoriesListAltID.find(1); + TestFileIter = TestFile.CategoriesListAltID.find(3); ASSERT_NE(TestFile.CategoriesListAltID.end(), TestFileIter); - ASSERT_EQ("44", TestFileIter->second); + ASSERT_EQ("84", TestFileIter->second); - TestFileIter = TestFile.CategoriesListAltID.find(2); + TestFileIter = TestFile.CategoriesListAltID.find(4); ASSERT_NE(TestFile.CategoriesListAltID.end(), TestFileIter); - ASSERT_EQ("44", TestFileIter->second); + ASSERT_EQ("84", TestFileIter->second); + + TestFileIter = TestFile.CategoriesListAltID.find(5); + ASSERT_NE(TestFile.CategoriesListAltID.end(), TestFileIter); + ASSERT_EQ("84", TestFileIter->second); // Check the PID section. - TestFileIter = TestFile.CategoriesListPID.find(1); + TestFileIter = TestFile.CategoriesListPID.find(3); ASSERT_NE(TestFile.CategoriesListPID.end(), TestFileIter); - ASSERT_EQ("46", TestFileIter->second); + ASSERT_EQ("86", TestFileIter->second); - TestFileIter = TestFile.CategoriesListPID.find(2); + TestFileIter = TestFile.CategoriesListPID.find(4); ASSERT_NE(TestFile.CategoriesListPID.end(), TestFileIter); - ASSERT_EQ("46", TestFileIter->second); + ASSERT_EQ("86", TestFileIter->second); + + TestFileIter = TestFile.CategoriesListPID.find(5); + ASSERT_NE(TestFile.CategoriesListPID.end(), TestFileIter); + ASSERT_EQ("86", TestFileIter->second); // Check the LANGUAGE section. - TestFileIter = TestFile.CategoriesListLanguage.find(1); + TestFileIter = TestFile.CategoriesListLanguage.find(3); ASSERT_NE(TestFile.CategoriesListLanguage.end(), TestFileIter); ASSERT_EQ("kw", TestFileIter->second); - TestFileIter = TestFile.CategoriesListLanguage.find(2); + TestFileIter = TestFile.CategoriesListLanguage.find(4); + ASSERT_NE(TestFile.CategoriesListLanguage.end(), TestFileIter); + ASSERT_EQ("kw", TestFileIter->second); + + TestFileIter = TestFile.CategoriesListLanguage.find(5); ASSERT_NE(TestFile.CategoriesListLanguage.end(), TestFileIter); ASSERT_EQ("kw", TestFileIter->second); // Check the PREF section. - TestFileIntIter = TestFile.CategoriesListPref.find(1); + TestFileIntIter = TestFile.CategoriesListPref.find(3); ASSERT_NE(TestFile.CategoriesListPref.end(), TestFileIntIter); - ASSERT_EQ(48, TestFileIntIter->second); + ASSERT_EQ(88, TestFileIntIter->second); - TestFileIntIter = TestFile.CategoriesListPref.find(2); + TestFileIntIter = TestFile.CategoriesListPref.find(4); + ASSERT_NE(TestFile.CategoriesListPref.end(), TestFileIntIter); + ASSERT_EQ(88, TestFileIntIter->second); + + TestFileIntIter = TestFile.CategoriesListPref.find(5); ASSERT_NE(TestFile.CategoriesListPref.end(), TestFileIntIter); - ASSERT_EQ(48, TestFileIntIter->second);*/ + ASSERT_EQ(88, TestFileIntIter->second); // Check the extra tokens. - TestFileIter = TestFile.CategoriesListTokens.find(1); + TestFileIter = TestFile.CategoriesListTokens.find(3); ASSERT_NE(TestFile.CategoriesListTokens.end(), TestFileIter); - ASSERT_EQ("TAC=CAT", TestFileIter->second); + ASSERT_EQ("AAA=BBB", TestFileIter->second); - TestFileIter = TestFile.CategoriesListTokens.find(2); + TestFileIter = TestFile.CategoriesListTokens.find(4); ASSERT_NE(TestFile.CategoriesListTokens.end(), TestFileIter); - ASSERT_EQ("TAC=CAT", TestFileIter->second); + ASSERT_EQ("AAA=BBB", TestFileIter->second); + + TestFileIter = TestFile.CategoriesListTokens.find(4); + ASSERT_NE(TestFile.CategoriesListTokens.end(), TestFileIter); + ASSERT_EQ("AAA=BBB", TestFileIter->second); }