// getcontactinfo.cpp - Contact Information 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 #include #include #include #include "getcontactinfo.h" #include "base64.h" #include "textprocessing.h" #include "../vcard/vcard34conv.h" void LoadContactData(vCard *vCardObj, wxHtmlWindow *HTMLObj, wxString SID, wxString OldSID, std::map *MemoryFSList, wxColour backgroundColour){ // Load the vCard contact data into the wxHTMLWindow given. // Show message to user that the contact information is loading. HTMLObj->SetBorders(0); HTMLObj->SetBackgroundColour(wxColour(160,160,160,0)); wxString PageData; wxFileSystem::AddHandler(new wxMemoryFSHandler); PageData.append(wxT("")); PageData.append(wxT("")); PageData.append(wxT("Page Loading")); PageData.append(wxT("")); PageData.append(wxT("")); PageData.append(wxT("

")); PageData.append(_("Loading contact information...")); PageData.append(wxT("

")); PageData.append(wxT("")); PageData.append(wxT("")); HTMLObj->SetPage(PageData); PageData.clear(); // Delete the information from the old session. if (!OldSID.IsEmpty()){ if (MemoryFSList->find(OldSID) == MemoryFSList->end()){ } else { std::map::iterator striter; for (striter = MemoryFSList->begin(); striter != MemoryFSList->end(); striter++){ if (OldSID == striter->second){ // Delete the references from the wxMemoryFSHandler // and the entry from the map. wxMemoryFSHandler::RemoveFile(striter->first); break; } } MemoryFSList->erase(striter); } } // MAke sure new session ID doesn't conflict with existing // data. If there is a match, generate a new one and check again. wxString SIDTemp; for (std::map::iterator striter = MemoryFSList->begin(); striter != MemoryFSList->end(); striter++){ SIDTemp = striter->second; if (SID == SIDTemp){ // Generate a new random number. SID = wxString::Format(wxT("%i"), rand() % 32768); // Rewind the seek process back to the start. striter = MemoryFSList->begin(); } } SIDTemp.clear(); // Setup the HTML document. PageData.append(wxT("")); PageData.append(wxT("")); PageData.append(wxT("Contact Information")); PageData.append(wxT("")); // Process the CSS section. PageData.append(wxT("")); // Process the data in the vCard object. // Name (Display As) ArrayvCardOutData FNList; FNList = vCardObj->GetByPartial(wxT("FN")); PageData.append(wxT("")); PageData.append(wxT("")); PageData.append(wxT("")); PageData.append(wxT("")); PageData.append(wxT("")); PageData.append(wxT("
")); PageData.append(wxT("

")); if (FNList.PropCount > 0){ FNList.PropValues[0].Trim(); CaptureString(&FNList.PropValues[0], false); PageData.append(FNList.PropValues[0]); } PageData.append(wxT("

")); PageData.append(wxT("
")); // Define common variables for ADR. std::map SplitPoints; std::map SplitLength; std::map::iterator SLiter; int intPropertyLen; int intSplitsFound; int intSplitSize; int intPrevValue; wxString AddressPOBox; wxString AddressStreet; wxString AddressLocality; wxString AddressRegion; wxString AddressPostalCode; wxString AddressCountry; wxString AddressExtended; wxString FinalAddressLine; bool AddressFirst = TRUE; // Define common variables for PHOTO and LOGO. std::string PhotoDataBin; std::string PhotoDataIn; wxString PhotoSplitData; wxString PhotoMIMEType; wxString PhotoEncType; wxString PhotoEncData; bool LoadPicture = FALSE; bool DataDisplay = FALSE; bool RectData = FALSE; wxRect PhotoRectPoints; wxString SIDFilename; wxString OutData; wxString DataLines; // Picture ArrayvCardOutData ContactData = vCardObj->GetByPartial(wxT("PHOTO")); if (ContactData.PropCount > 0){ // Look for the X-ABCROP-RECTANGLE. wxStringTokenizer PhotoSplit(ContactData.PropData[0], wxT(":")); wxString PhotoPropertyDataString = PhotoSplit.GetNextToken(); wxStringTokenizer PhotoPropertyData(PhotoPropertyDataString, wxT(";")); wxString PropertyLineData; wxString PropertyName; wxString PropertyValue; wxStringTokenizer DataSplit(ContactData.PropValues[0], wxT(";")); PhotoSplitData = DataSplit.GetNextToken(); wxStringTokenizer MIMESplit(PhotoSplitData, wxT(":")); MIMESplit.GetNextToken(); PhotoMIMEType = MIMESplit.GetNextToken(); PhotoSplitData = DataSplit.GetNextToken(); wxStringTokenizer EncSplit(PhotoSplitData, wxT(",")); PhotoEncType = EncSplit.GetNextToken(); PhotoEncData = EncSplit.GetNextToken(); // Convert the picture data from base64 to binary. PhotoDataIn = std::string(PhotoEncData.mb_str()); PhotoDataBin = base64_decode(PhotoDataIn); wxMemoryInputStream istream(PhotoDataBin.c_str(), (size_t)PhotoDataBin.size()); wxImage photo; if (!photo.LoadFile(istream, wxBITMAP_TYPE_ANY)){ // Photo failed to load so do nothing. LoadPicture = FALSE; } else { while (PhotoPropertyData.HasMoreTokens()){ PropertyLineData = PhotoPropertyData.GetNextToken(); wxStringTokenizer PhotoPropPair(PropertyLineData, wxT("=")); wxString PhotoPropName = PhotoPropPair.GetNextToken(); wxString PhotoPropValue = PhotoPropPair.GetNextToken(); if (PhotoPropName == wxT("X-ABCROP-RECTANGLE")){ wxStringTokenizer PhotoRectData(PhotoPropValue, wxT("&")); PhotoRectData.GetNextToken(); int PointXBase = wxAtoi(PhotoRectData.GetNextToken()); int PointYBase = wxAtoi(PhotoRectData.GetNextToken()); int PointWBase = wxAtoi(PhotoRectData.GetNextToken()); int PointHBase = wxAtoi(PhotoRectData.GetNextToken()); int PointX = PointXBase; int PointY = PointYBase; int PointW = PointWBase; int PointH = PointHBase; // Top Right Method if (PointYBase > PointHBase){ PointX = photo.GetWidth() - PointXBase - 140; PointY = photo.GetHeight() - PointYBase - 140; PointW = PointWBase; PointH = PointHBase; } else if (PointXBase > PointWBase){ PointX = photo.GetWidth() - PointXBase; PointY = PointYBase - 50; PointW = PointWBase; PointH = PointHBase; } else { } PhotoRectPoints.SetX(PointX); PhotoRectPoints.SetY(PointY); PhotoRectPoints.SetWidth(PointW); PhotoRectPoints.SetHeight(PointH); RectData = TRUE; } } LoadPicture = TRUE; // Resize the picture to 125x125. // Add to the wxMemnoryFSHandler. SIDFilename = SID + wxT("-photo"); if (RectData == TRUE){ wxImage rectphoto = photo.GetSubImage(PhotoRectPoints); rectphoto = rectphoto.Scale(75, 75, wxIMAGE_QUALITY_HIGH); wxMemoryFSHandler::AddFile(SIDFilename, rectphoto, wxBITMAP_TYPE_PNG); } else { photo = photo.Scale(50, 50, wxIMAGE_QUALITY_HIGH); wxMemoryFSHandler::AddFile(SIDFilename, photo, wxBITMAP_TYPE_PNG); } // Add the filename to the MemoryFSList map. MemoryFSList->insert(std::make_pair(SIDFilename, SID)); } } if (LoadPicture == TRUE){ PageData.append(wxT("")); } LoadPicture = FALSE; // Logo ContactData = vCardObj->GetByPartial(wxT("LOGO")); if (ContactData.PropCount > 0){ // Split the data. wxStringTokenizer DataSplit(ContactData.PropValues[0], wxT(";")); PhotoSplitData = DataSplit.GetNextToken(); wxStringTokenizer MIMESplit(PhotoSplitData, wxT(":")); MIMESplit.GetNextToken(); PhotoMIMEType = MIMESplit.GetNextToken(); PhotoSplitData = DataSplit.GetNextToken(); wxStringTokenizer EncSplit(PhotoSplitData, wxT(",")); PhotoEncType = EncSplit.GetNextToken(); PhotoEncData = EncSplit.GetNextToken(); // Convert the picture data from base64 to binary. PhotoDataIn = std::string(PhotoEncData.mb_str()); PhotoDataBin = base64_decode(PhotoDataIn); wxMemoryInputStream istream(PhotoDataBin.c_str(), (size_t)PhotoDataBin.size()); wxImage photo; if (!photo.LoadFile(istream, wxBITMAP_TYPE_ANY)){ // Photo failed to load so do nothing. LoadPicture = FALSE; } else { LoadPicture = TRUE; photo = photo.Scale(50, 50, wxIMAGE_QUALITY_HIGH); // Resize the picture to 125x125. // Add to the wxMemnoryFSHandler. SIDFilename = SID + wxT("-logo"); wxMemoryFSHandler::AddFile(SIDFilename, photo, wxBITMAP_TYPE_PNG); // Add the filename to the MemoryFSList map. MemoryFSList->insert(std::make_pair(SIDFilename, SID)); } } if (LoadPicture == TRUE){ PageData.append(wxT("")); } PageData.append(wxT("
")); // Process LOGO, PHOTO, SOUND, KEY, VND-* and X-* // lines and display icons for each accordingly. ContactData = vCardObj->GetByPartial(wxT("PHOTO")); bool AddBreak = FALSE; wxString TypePageData; if (ContactData.PropCount > 1){ TypePageData.append(wxT("\""));")); AddBreak = TRUE; } ContactData = vCardObj->GetByPartial(wxT("LOGO")); if (ContactData.PropCount > 1){ TypePageData.append(wxT("\""));")); AddBreak = TRUE; } ContactData = vCardObj->GetByPartial(wxT("SOUND")); if (ContactData.PropCount >= 1){ TypePageData.append(wxT("\""));")); AddBreak = TRUE; } ContactData = vCardObj->GetByPartial(wxT("KEY")); if (ContactData.PropCount >= 1){ TypePageData.append(wxT("\""));")); AddBreak = TRUE; } ContactData = vCardObj->GetByPartial(wxT("VND-")); if (ContactData.PropCount >= 1){ TypePageData.append(wxT("\""));")); AddBreak = TRUE; } ContactData = vCardObj->GetByPartial(wxT("X-")); if (ContactData.PropCount >= 1){ TypePageData.append(wxT("\""));")); AddBreak = TRUE; } if (!TypePageData.IsEmpty()){ PageData.append("
"); PageData.append(TypePageData); PageData.append("
"); } if (AddBreak == TRUE){ PageData.append(wxT("

")); } // TODO: Setup the second table. // Process Birthday ContactData = vCardObj->GetByPartial(wxT("BDAY")); DataDisplay = FALSE; DataLines.clear(); wxDateTime DateFormat; long MonthValue = 0; long DayValue = 0; long YearValue = 0; if (ContactData.PropCount > 0){ wxString BDayLine; for (int i = 0; i < ContactData.PropCount; i++){ // Grab the first birthday only. BDayLine = ContactData.PropValues[i]; BDayLine.Trim(); if (BDayLine.Mid(0,4) == wxT("1604")){ BDayLine = BDayLine.Mid(4,4); BDayLine.Mid(0,2).ToLong(&MonthValue); BDayLine.Mid(2,2).ToLong(&DayValue); MonthValue--; DateFormat.Set((wxDateTime::wxDateTime_t)(int)DayValue, (wxDateTime::Month)(MonthValue), 0, 0, 0, 0, 0); } else if (BDayLine.Mid(0,2) == wxT("--")){ BDayLine = BDayLine.Mid(2,4); BDayLine.Mid(0,2).ToLong(&MonthValue); BDayLine.Mid(2,2).ToLong(&DayValue); MonthValue--; DateFormat.Set((wxDateTime::wxDateTime_t)(int)DayValue, (wxDateTime::Month)(MonthValue), 0, 0, 0, 0, 0); } else { BDayLine.Mid(0,4).ToLong(&YearValue); BDayLine.Mid(4,2).ToLong(&MonthValue); BDayLine.Mid(6,2).ToLong(&DayValue); MonthValue--; DateFormat.Set((wxDateTime::wxDateTime_t)(int)DayValue, (wxDateTime::Month)(MonthValue), YearValue, 0, 0, 0, 0); } wxString BDayOutput; BDayOutput.append(wxString::Format(wxT("%02i"), (int)DayValue)); BDayOutput.append(wxT("/")); BDayOutput.append(wxString::Format(wxT("%02i"), (int)(MonthValue + 1))); if (DateFormat.GetYear() != 0){ BDayOutput.append(wxT("/")); BDayOutput.append(wxString::Format(wxT("%04i"), (int)YearValue)); } CaptureString(&BDayOutput, FALSE); ConvertToHTML(&BDayOutput); DataLines.append(BDayOutput); break; } DataDisplay = TRUE; } if (backgroundColour != wxTransparentColour){ PageData.append("")); } DataDisplay = TRUE; } if (DataDisplay == TRUE){ DataLines.Trim(); PageData.append(wxT("

")); PageData.append(_("Addresses")); PageData.append(wxT("

")); PageData.append(wxT("
")); PageData.append(wxT("
"); } else { PageData.append("")); } DataDisplay = TRUE; } if (DataDisplay == TRUE){ DataLines.Trim(); PageData.append(wxT("

")); PageData.append(_("Nicknames")); PageData.append(wxT("

")); PageData.append(wxT("
")); PageData.append(wxT("
"); } if (DataDisplay == TRUE){ DataLines.Trim(); PageData.append(wxT("")); PageData.append(_("Birthday:")); PageData.append(wxT(" ")); PageData.append(DataLines); PageData.append(wxT("
")); } // Process Anniversary ContactData = vCardObj->GetByPartial(wxT("ANNIVERSARY")); DataDisplay = FALSE; DataLines.clear(); if (ContactData.PropCount > 0){ wxString AnniLine; for (int i = 0; i < ContactData.PropCount; i++){ // Grab the first anniversary only. AnniLine = ContactData.PropValues[i]; AnniLine.Trim(); if (AnniLine.Mid(0,4) == wxT("1604")){ AnniLine = AnniLine.Mid(4,4); AnniLine.Mid(0,2).ToLong(&MonthValue); AnniLine.Mid(2,2).ToLong(&DayValue); MonthValue--; DateFormat.Set((wxDateTime::wxDateTime_t)(int)DayValue, (wxDateTime::Month)(MonthValue), 0, 0, 0, 0, 0); } else if (AnniLine.Mid(0,2) == wxT("--")){ AnniLine = AnniLine.Mid(2,4); AnniLine.Mid(0,2).ToLong(&MonthValue); AnniLine.Mid(2,2).ToLong(&DayValue); MonthValue--; DateFormat.Set((wxDateTime::wxDateTime_t)(int)DayValue, (wxDateTime::Month)(MonthValue), 0, 0, 0, 0, 0); } else { AnniLine.Mid(0,4).ToLong(&YearValue); AnniLine.Mid(4,2).ToLong(&MonthValue); AnniLine.Mid(6,2).ToLong(&DayValue); MonthValue--; DateFormat.Set((wxDateTime::wxDateTime_t)(int)DayValue, (wxDateTime::Month)(MonthValue), YearValue, 0, 0, 0, 0); } wxString AnniDayOutput; AnniDayOutput.append(wxString::Format(wxT("%02i"), (int)DayValue)); AnniDayOutput.append(wxT("/")); AnniDayOutput.append(wxString::Format(wxT("%02i"), (int)(MonthValue + 1))); if (DateFormat.GetYear() != 0){ AnniDayOutput.append(wxT("/")); AnniDayOutput.append(wxString::Format(wxT("%04i"), (int)YearValue)); } CaptureString(&AnniDayOutput, FALSE); ConvertToHTML(&AnniDayOutput); DataLines.append(AnniDayOutput); break; } DataDisplay = TRUE; } if (DataDisplay == TRUE){ DataLines.Trim(); PageData.append(wxT("")); PageData.append(_("Anniversary:")); PageData.append(wxT(" ")); PageData.append(DataLines); PageData.append(wxT("
")); } // Nickname ContactData = vCardObj->GetByPartial(wxT("NICKNAME")); DataDisplay = FALSE; DataLines.clear(); if (ContactData.PropCount > 0){ wxString NicknameLine; for (int i = 0; i < ContactData.PropCount; i++){ NicknameLine = ContactData.PropValues[i]; NicknameLine.Trim(); CaptureString(&NicknameLine, FALSE); ConvertToHTML(&NicknameLine); DataLines.append(wxT("
")); DataLines.append(_("Nickname:")); DataLines.append(wxT(" ")); DataLines.append(NicknameLine); DataLines.append(wxT("
")); PageData.append(DataLines); PageData.append(wxT("
")); } // Address ContactData = vCardObj->GetByPartial(wxT("ADR")); DataDisplay = FALSE; DataLines.clear(); if (ContactData.PropCount > 0){ wxString AddressLine; for (int i = 0; i < ContactData.PropCount; i++){ AddressLine = ContactData.PropValues[i]; intPropertyLen = AddressLine.Len(); SplitPoints.clear(); SplitLength.clear(); intSplitsFound = 0; intSplitSize = 0; intPrevValue = 0; AddressPOBox.clear(); AddressStreet.clear(); AddressLocality.clear(); AddressRegion.clear(); AddressPostalCode.clear(); AddressCountry.clear(); AddressExtended.clear(); FinalAddressLine.clear(); AddressFirst = TRUE; for (int i = 0; i <= intPropertyLen; i++){ intSplitSize++; if (AddressLine.Mid(i, 1) == wxT(";") && AddressLine.Mid((i - 1), 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; } } // Split the data into several parts. for (std::map::iterator intiter = SplitPoints.begin(); intiter != SplitPoints.end(); ++intiter){ if (intiter->first == 1){ // Deal with PO Box. SLiter = SplitLength.find(1); AddressPOBox = AddressLine.Mid(0, SLiter->second); intPrevValue = intiter->second; } else if (intiter->first == 2){ // Deal with extended address. SLiter = SplitLength.find(2); AddressExtended = AddressLine.Mid(intPrevValue, SLiter->second); intPrevValue = intiter->second; } else if (intiter->first == 3){ // Deal with street address. SLiter = SplitLength.find(3); AddressStreet = AddressLine.Mid(intPrevValue, SLiter->second); intPrevValue = intiter->second; } else if (intiter->first == 4){ // Deal with locality SLiter = SplitLength.find(4); AddressLocality = AddressLine.Mid(intPrevValue, SLiter->second); intPrevValue = intiter->second; } else if (intiter->first == 5){ // Deal with region. SLiter = SplitLength.find(5); AddressRegion = AddressLine.Mid(intPrevValue, SLiter->second); intPrevValue = intiter->second; } else if (intiter->first == 6){ // Deal with post code. SLiter = SplitLength.find(6); AddressPostalCode = AddressLine.Mid(intPrevValue, SLiter->second); intPrevValue = intiter->second; // Deal with country. AddressCountry = AddressLine.Mid(intPrevValue); } } if (!AddressStreet.IsEmpty()){ AddressStreet.Trim(); ConvertToHTML(&AddressStreet); FinalAddressLine.append(AddressStreet); AddressFirst = FALSE; } if (!AddressLocality.IsEmpty()){ AddressLocality.Trim(); ConvertToHTML(&AddressLocality); if (AddressFirst == FALSE){ FinalAddressLine.append(wxT(",
")); FinalAddressLine.append(AddressLocality); } else { FinalAddressLine.append(AddressLocality); AddressFirst = FALSE; } } if (!AddressRegion.IsEmpty()){ AddressRegion.Trim(); ConvertToHTML(&AddressRegion); if (AddressFirst == FALSE){ FinalAddressLine.append(wxT(",
")); FinalAddressLine.append(AddressRegion); } else { FinalAddressLine.append(AddressRegion); AddressFirst = FALSE; } } if (!AddressPostalCode.IsEmpty()){ AddressPostalCode.Trim(); ConvertToHTML(&AddressPostalCode); if (AddressFirst == FALSE){ FinalAddressLine.append(wxT(",
")); FinalAddressLine.append(AddressPostalCode); } else { FinalAddressLine.append(AddressPostalCode); AddressFirst = FALSE; } } if (!AddressCountry.IsEmpty()){ AddressCountry.Trim(); ConvertToHTML(&AddressCountry); if (AddressFirst == FALSE){ FinalAddressLine.append(wxT(",
")); FinalAddressLine.append(AddressCountry); } else { FinalAddressLine.append(AddressCountry); AddressFirst = FALSE; } } CaptureString(&FinalAddressLine, FALSE); DataLines.append(wxT("
")); DataLines.append(_("Address:")); DataLines.append(wxT(" ")); DataLines.append(FinalAddressLine); DataLines.append(wxT("
")); PageData.append(DataLines); PageData.append(wxT("
")); } // Email ContactData = vCardObj->GetByPartial(wxT("EMAIL")); DataDisplay = FALSE; DataLines.clear(); if (ContactData.PropCount > 0){ wxString EmailLine; for (int i = 0; i < ContactData.PropCount; i++){ EmailLine = ContactData.PropValues[i]; EmailLine.Trim(); CaptureString(&EmailLine, FALSE); ConvertToHTML(&EmailLine); DataLines.append(wxT("")); DataLines.append(_("E-mail Address:")); DataLines.append(wxT(" ")); DataLines.append(EmailLine); DataLines.append(wxT("")); } DataDisplay = TRUE; } if (DataDisplay == TRUE){ DataLines.Trim(); PageData.append(wxT("

")); PageData.append(_("Email Addresses")); PageData.append(wxT("

")); PageData.append(wxT("
")); PageData.append(wxT("")); PageData.append(DataLines); PageData.append(wxT("
")); } // Telephone ContactData = vCardObj->GetByPartial(wxT("TEL")); DataDisplay = FALSE; DataLines.clear(); if (ContactData.PropCount > 0){ wxString TelLine; for (int i = 0; i < ContactData.PropCount; i++){ TelLine = ContactData.PropValues[i]; wxStringTokenizer TelSplit(TelLine, wxT(":")); TelLine = TelSplit.GetNextToken(); if (TelSplit.HasMoreTokens()){ TelLine = TelSplit.GetNextToken(); } TelLine.Trim(); CaptureString(&TelLine, FALSE); ConvertToHTML(&TelLine); DataLines.append(wxT("")); DataLines.append(_("Telephone:")); DataLines.append(wxT(" ")); DataLines.append(TelLine); DataLines.append(wxT("")); } DataDisplay = TRUE; } if (DataDisplay == TRUE){ DataLines.Trim(); PageData.append(wxT("

")); PageData.append(_("Telephones")); PageData.append(wxT("

")); PageData.append(wxT("
")); PageData.append(wxT("")); PageData.append(DataLines); PageData.append(wxT("
")); } // Instant Messaging ContactData = vCardObj->GetByPartial(wxT("IMPP")); DataDisplay = FALSE; DataLines.clear(); if (ContactData.PropCount > 0){ wxString IMLine; wxString IMTypeFriendly; wxString IMType; for (int i = 0; i < ContactData.PropCount; i++){ IMLine = ContactData.PropValues[i]; wxStringTokenizer IMSplit(IMLine, wxT(":")); IMType = IMSplit.GetNextToken(); IMLine = IMSplit.GetNextToken(); // Process skype, gg, icq, yahoo etc into // something meaningful. if (IMType == wxT("aim")){ // AIM IMTypeFriendly = _("AIM"); } else if (IMType == wxT("xmpp")){ // XMPP IMTypeFriendly = _("XMPP"); } else if (IMType == wxT("icq")){ // ICQ IMTypeFriendly = _("ICQ"); } else if (IMType == wxT("skype")){ // Skype IMTypeFriendly = _("Skype"); } else if (IMType == wxT("gg")){ // Gadu-Gadu IMTypeFriendly = _("Gadu-Gadu"); } else if (IMType == wxT("yahoo")){ // Yahoo IMTypeFriendly = _("Yahoo"); } else { // Other. Use IM type that was split. IMTypeFriendly = IMType; } IMLine.Trim(); CaptureString(&IMLine, FALSE); ConvertToHTML(&IMLine); DataLines.append(wxT("")); DataLines.append(_("IM Address")); DataLines.append(_(" (")); DataLines.append(IMTypeFriendly); DataLines.append(_("):")); DataLines.append(wxT(" ")); DataLines.append(IMLine); DataLines.append(wxT("")); IMTypeFriendly.clear(); IMType.clear(); IMLine.clear(); } DataDisplay = TRUE; } if (DataDisplay == TRUE){ DataLines.Trim(); PageData.append(wxT("

")); PageData.append(_("Instant Messaging Addresses")); PageData.append(wxT("

")); PageData.append(wxT("
")); PageData.append(wxT("")); PageData.append(DataLines); PageData.append(wxT("
")); } // URL ContactData = vCardObj->GetByPartial(wxT("URL")); DataDisplay = FALSE; DataLines.clear(); if (ContactData.PropCount > 0){ wxString URLLine; for (int i = 0; i < ContactData.PropCount; i++){ URLLine = ContactData.PropValues[i]; URLLine.Trim(); CaptureString(&URLLine, FALSE); ConvertToHTML(&URLLine); DataLines.append(wxT("")); DataLines.append(_("Website:")); DataLines.append(wxT(" ")); DataLines.append(URLLine); DataLines.append(wxT("")); } DataDisplay = TRUE; } if (DataDisplay == TRUE){ DataLines.Trim(); PageData.append(wxT("

")); PageData.append(_("Website Addresses")); PageData.append(wxT("

")); PageData.append(wxT("
")); PageData.append(wxT("")); PageData.append(DataLines); PageData.append(wxT("
")); } // Languages ContactData = vCardObj->GetByPartial(wxT("LANG")); DataDisplay = FALSE; DataLines.clear(); if (ContactData.PropCount > 0){ wxString NicknameLine; for (int i = 0; i < ContactData.PropCount; i++){ NicknameLine = ContactData.PropValues[i]; NicknameLine.Trim(); CaptureString(&NicknameLine, FALSE); ConvertToHTML(&NicknameLine); DataLines.append(wxT("")); DataLines.append(_("Language:")); DataLines.append(wxT(" ")); DataLines.append(NicknameLine); DataLines.append(wxT("")); } DataDisplay = TRUE; } if (DataDisplay == TRUE){ DataLines.Trim(); PageData.append(wxT("

")); PageData.append(_("Languages")); PageData.append(wxT("

")); PageData.append(wxT("
")); PageData.append(wxT("")); PageData.append(DataLines); PageData.append(wxT("
")); } // Timezones ContactData = vCardObj->GetByPartial(wxT("TZ")); DataDisplay = FALSE; DataLines.clear(); if (ContactData.PropCount > 0){ wxString NicknameLine; for (int i = 0; i < ContactData.PropCount; i++){ NicknameLine = ContactData.PropValues[i]; NicknameLine.Trim(); CaptureString(&NicknameLine, FALSE); ConvertToHTML(&NicknameLine); DataLines.append(wxT("")); DataLines.append(_("Timezone:")); DataLines.append(wxT(" ")); DataLines.append(NicknameLine); DataLines.append(wxT("")); } DataDisplay = TRUE; } if (DataDisplay == TRUE){ DataLines.Trim(); PageData.append(wxT("

")); PageData.append(_("Timezones")); PageData.append(wxT("

")); PageData.append(wxT("
")); PageData.append(wxT("")); PageData.append(DataLines); PageData.append(wxT("
")); } // Geopositioning ContactData = vCardObj->GetByPartial(wxT("GEO")); DataDisplay = FALSE; DataLines.clear(); if (ContactData.PropCount > 0){ wxString GeoLine; for (int i = 0; i < ContactData.PropCount; i++){ GeoLine = ContactData.PropValues[i]; wxStringTokenizer GeoSplit(GeoLine, wxT(":")); GeoLine = GeoSplit.GetNextToken(); if (GeoSplit.HasMoreTokens()){ GeoLine = GeoSplit.GetNextToken(); } GeoLine.Trim(); CaptureString(&GeoLine, FALSE); ConvertToHTML(&GeoLine); DataLines.append(wxT("")); DataLines.append(_("Geoposition:")); DataLines.append(wxT(" ")); DataLines.append(GeoLine); DataLines.append(wxT("")); } DataDisplay = TRUE; } if (DataDisplay == TRUE){ DataLines.Trim(); PageData.append(wxT("

")); PageData.append(_("Geopositioning")); PageData.append(wxT("

")); PageData.append(wxT("
")); PageData.append(wxT("")); PageData.append(DataLines); PageData.append(wxT("
")); } // Titles ContactData = vCardObj->GetByPartial(wxT("TITLE")); DataDisplay = FALSE; DataLines.clear(); if (ContactData.PropCount > 0){ wxString TitleLine; for (int i = 0; i < ContactData.PropCount; i++){ TitleLine = ContactData.PropValues[i]; TitleLine.Trim(); CaptureString(&TitleLine, FALSE); ConvertToHTML(&TitleLine); DataLines.append(wxT("")); DataLines.append(_("Title:")); DataLines.append(wxT(" ")); DataLines.append(TitleLine); DataLines.append(wxT("")); } DataDisplay = TRUE; } if (DataDisplay == TRUE){ DataLines.Trim(); PageData.append(wxT("

")); PageData.append(_("Titles")); PageData.append(wxT("

")); PageData.append(wxT("
")); PageData.append(wxT("")); PageData.append(DataLines); PageData.append(wxT("
")); } // Roles ContactData = vCardObj->GetByPartial(wxT("ROLE")); DataDisplay = FALSE; DataLines.clear(); if (ContactData.PropCount > 0){ wxString RoleLine; for (int i = 0; i < ContactData.PropCount; i++){ RoleLine = ContactData.PropValues[i]; RoleLine.Trim(); CaptureString(&RoleLine, FALSE); ConvertToHTML(&RoleLine); DataLines.append(wxT("")); DataLines.append(_("Role:")); DataLines.append(wxT(" ")); DataLines.append(RoleLine); DataLines.append(wxT("")); } DataDisplay = TRUE; } if (DataDisplay == TRUE){ DataLines.Trim(); PageData.append(wxT("

")); PageData.append(_("Roles")); PageData.append(wxT("

")); PageData.append(wxT("
")); PageData.append(wxT("")); PageData.append(DataLines); PageData.append(wxT("
")); } // Organisations ContactData = vCardObj->GetByPartial(wxT("ORG")); DataDisplay = FALSE; DataLines.clear(); if (ContactData.PropCount > 0){ wxString OrgLine; for (int i = 0; i < ContactData.PropCount; i++){ OrgLine = ContactData.PropValues[i]; OrgLine.Trim(); CaptureString(&OrgLine, FALSE); ConvertToHTML(&OrgLine); DataLines.append(wxT("")); DataLines.append(_("Organisation:")); DataLines.append(wxT(" ")); DataLines.append(OrgLine); DataLines.append(wxT("")); } DataDisplay = TRUE; } if (DataDisplay == TRUE){ DataLines.Trim(); PageData.append(wxT("

")); PageData.append(_("Organisations")); PageData.append(wxT("

")); PageData.append(wxT("
")); PageData.append(wxT("")); PageData.append(DataLines); PageData.append(wxT("
")); } // Categories ContactData = vCardObj->GetByPartial(wxT("CATEGORIES")); DataDisplay = FALSE; DataLines.clear(); if (ContactData.PropCount > 0){ wxString CatLine; for (int i = 0; i < ContactData.PropCount; i++){ CatLine = ContactData.PropValues[i]; CatLine.Trim(); CaptureString(&CatLine, FALSE); ConvertToHTML(&CatLine); DataLines.append(wxT("")); DataLines.append(_("Category:")); DataLines.append(wxT(" ")); DataLines.append(CatLine); DataLines.append(wxT("")); } DataDisplay = TRUE; } if (DataDisplay == TRUE){ DataLines.Trim(); PageData.append(wxT("

")); PageData.append(_("Categories")); PageData.append(wxT("

")); PageData.append(wxT("
")); PageData.append(wxT("")); PageData.append(DataLines); PageData.append(wxT("
")); } // Groups // Calendar Addresses ContactData = vCardObj->GetByPartial(wxT("CALURI")); DataDisplay = FALSE; DataLines.clear(); if (ContactData.PropCount > 0){ wxString CalURILine; for (int i = 0; i < ContactData.PropCount; i++){ CalURILine = ContactData.PropValues[i]; CalURILine.Trim(); CaptureString(&CalURILine, FALSE); ConvertToHTML(&CalURILine); DataLines.append(wxT("")); DataLines.append(_("Calendar Address:")); DataLines.append(wxT(" ")); DataLines.append(CalURILine); DataLines.append(wxT("")); } DataDisplay = TRUE; } if (DataDisplay == TRUE){ DataLines.Trim(); PageData.append(wxT("

")); PageData.append(_("Calendar Addresses")); PageData.append(wxT("

")); PageData.append(wxT("
")); PageData.append(wxT("")); PageData.append(DataLines); PageData.append(wxT("
")); } // Calendar Request Addresses ContactData = vCardObj->GetByPartial(wxT("CALADRURI")); DataDisplay = FALSE; DataLines.clear(); if (ContactData.PropCount > 0){ wxString CalAdrURILine; for (int i = 0; i < ContactData.PropCount; i++){ CalAdrURILine = ContactData.PropValues[i]; CalAdrURILine.Trim(); CaptureString(&CalAdrURILine, FALSE); ConvertToHTML(&CalAdrURILine); DataLines.append(wxT("")); DataLines.append(_("Calendar Request Address:")); DataLines.append(wxT(" ")); DataLines.append(CalAdrURILine); DataLines.append(wxT("")); } DataDisplay = TRUE; } if (DataDisplay == TRUE){ DataLines.Trim(); PageData.append(wxT("

")); PageData.append(_("Calendar Request Addresses")); PageData.append(wxT("

")); PageData.append(wxT("
")); PageData.append(wxT("")); PageData.append(DataLines); PageData.append(wxT("
")); } // Free/Busy Addresses ContactData = vCardObj->GetByPartial(wxT("FBURL")); DataDisplay = FALSE; DataLines.clear(); if (ContactData.PropCount > 0){ wxString FBURLLine; for (int i = 0; i < ContactData.PropCount; i++){ FBURLLine = ContactData.PropValues[i]; FBURLLine.Trim(); CaptureString(&FBURLLine, FALSE); ConvertToHTML(&FBURLLine); DataLines.append(wxT("")); DataLines.append(_("Free/Busy Address:")); DataLines.append(wxT(" ")); DataLines.append(FBURLLine); DataLines.append(wxT("")); } DataDisplay = TRUE; } if (DataDisplay == TRUE){ DataLines.Trim(); PageData.append(wxT("

")); PageData.append(_("Free/Busy Addresses")); PageData.append(wxT("

")); PageData.append(wxT("
")); PageData.append(wxT("")); PageData.append(DataLines); PageData.append(wxT("
")); } // Notes ContactData = vCardObj->GetByPartial(wxT("NOTE")); DataDisplay = FALSE; DataLines.clear(); if (ContactData.PropCount > 0){ wxString NoteLine; for (int i = 0; i < ContactData.PropCount; i++){ NoteLine = ContactData.PropValues[i]; NoteLine.Trim(); CaptureString(&NoteLine, FALSE); ConvertToHTML(&NoteLine); DataLines.append(wxT("")); DataLines.append(_("Note:")); DataLines.append(wxT(" ")); DataLines.append(NoteLine); DataLines.append(wxT("")); } DataDisplay = TRUE; } if (DataDisplay == TRUE){ PageData.append(wxT("

")); PageData.append(_("Notes")); PageData.append(wxT("

")); PageData.append(wxT("
")); PageData.append(wxT("")); PageData.append(DataLines); PageData.append(wxT("
")); } // Display the HTML document on the screen. PageData.append(""); PageData.append(wxT("")); PageData.append(wxT("")); HTMLObj->SetPage(PageData); } void SplitPropertyData(wxString *PropertyLine, std::map *SplitPoints, std::map *SplitLength, int intSize, std::map *SplitData){ // Split the property data into SplitData. wxString DataStr; wxStringTokenizer PropertyElement; wxString PropertyName; wxString PropertyValue; int intPropertyLen = PropertyLine->Len(); int intSplitsFound = 0; int intSplitSize = 0; int intSplitSeek = (intSize - 1); for (int i = intSize; i <= intPropertyLen; i++){ intSplitSize++; if (PropertyLine->Mid(i, 1) == wxT(";") && PropertyLine->Mid((i - 1), 1) != wxT("\\")){ if (intSplitsFound == 0){ DataStr = PropertyLine->Mid(intSplitSeek, (intSplitSize)); SplitLength->insert(std::make_pair(intSplitsFound, (intSplitSize))); } else { DataStr = PropertyLine->Mid(intSplitSeek, (intSplitSize - 1)); SplitLength->insert(std::make_pair(intSplitsFound, (intSplitSize - 1))); } SplitPoints->insert(std::make_pair(intSplitsFound, (i + 1))); intSplitsFound++; intSplitSeek = (i + 1); intSplitSize = 0; if (!DataStr.IsEmpty()){ PropertyElement.SetString(DataStr, wxT("=")); PropertyName = PropertyElement.GetNextToken(); PropertyValue = PropertyElement.GetNextToken(); SplitData->insert(std::make_pair(PropertyName, PropertyValue)); } DataStr.clear(); PropertyName.clear(); PropertyValue.clear(); } } if (intSplitsFound == 0){ DataStr = PropertyLine->Mid(intSplitSeek, (intSplitSize)); SplitPoints->insert(std::make_pair(intSplitsFound, (8 + 1))); SplitLength->insert(std::make_pair(intSplitsFound, intSplitSize)); } else { DataStr = PropertyLine->Mid(intSplitSeek, (intSplitSize - 1)); SplitPoints->insert(std::make_pair(intSplitsFound, (intSplitSeek + 1))); SplitLength->insert(std::make_pair(intSplitsFound, intSplitSize)); } if (!DataStr.IsEmpty()){ PropertyElement.SetString(DataStr, wxT("=")); PropertyName = PropertyElement.GetNextToken(); PropertyValue = PropertyElement.GetNextToken(); SplitData->insert(std::make_pair(PropertyName, PropertyValue)); } }