1 // getcontactinfo.cpp - Contact Information subroutines.
3 // (c) 2012-2015 Xestia Software Development.
5 // This file is part of Xestia Address Book.
7 // Xestia Address Book is free software: you can redistribute it and/or modify
8 // it under the terms of the GNU General Public License as published by the
9 // Free Software Foundation, version 3 of the license.
11 // Xestia Address Book is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 // GNU General Public License for more details.
16 // You should have received a copy of the GNU General Public License along
17 // with Xestia Address Book. If not, see <http://www.gnu.org/licenses/>
23 #include <wx/tokenzr.h>
24 #include <wx/fs_mem.h>
25 #include <wx/mstream.h>
26 #include <wx/filesys.h>
27 #include <wx/datetime.h>
28 //#include <b64/decode.h>
31 #include "getcontactinfo.h"
33 #include "textprocessing.h"
34 #include "../vcard/vcard34conv.h"
36 void LoadContactData(vCard *vCardObj, wxHtmlWindow *HTMLObj, wxString SID,
37 wxString OldSID, std::map<wxString, wxString> *MemoryFSList){
39 // Load the vCard contact data into the wxHTMLWindow given.
41 // Show message to user that the contact information is loading.
43 HTMLObj->SetBorders(0);
47 wxFileSystem::AddHandler(new wxMemoryFSHandler);
48 //wxMemoryFSHandler::AddFile();
50 PageData.append(wxT("<html>"));
51 PageData.append(wxT("<head>"));
52 PageData.append(wxT("<title>Page Loading</title>"));
53 PageData.append(wxT("</head>"));
54 PageData.append(wxT("<body>"));
55 PageData.append(wxT("<h2>"));
56 PageData.append(_("Loading contact information..."));
57 PageData.append(wxT("</h2>"));
58 PageData.append(wxT("</body>"));
59 PageData.append(wxT("</html>"));
61 HTMLObj->SetPage(PageData);
65 // Delete the information from the old session.
67 if (!OldSID.IsEmpty()){
69 if (MemoryFSList->find(OldSID) == MemoryFSList->end()){
74 std::map<wxString, wxString>::iterator striter;
76 for (striter = MemoryFSList->begin(); striter != MemoryFSList->end(); striter++){
78 if (OldSID == striter->second){
80 // Delete the references from the wxMemoryFSHandler
81 // and the entry from the map.
83 wxMemoryFSHandler::RemoveFile(striter->first);
90 MemoryFSList->erase(striter);
96 // MAke sure new session ID doesn't conflict with existing
97 // data. If there is a match, generate a new one and check again.
99 bool SIDMatch = FALSE;
102 for (std::map<wxString, wxString>::iterator striter = MemoryFSList->begin();
103 striter != MemoryFSList->end(); striter++){
105 SIDTemp = striter->second;
109 // Generate a new random number.
111 SID = wxString::Format(wxT("%i"), rand() % 32768);
113 // Rewind the seek process back to the start.
115 striter = MemoryFSList->begin();
123 // Setup the HTML document.
125 PageData.append(wxT("<html>"));
126 PageData.append(wxT("<head>"));
127 PageData.append(wxT("<title>Contact Information</title>"));
128 PageData.append(wxT("</head>"));
130 // Process the CSS section.
132 PageData.append(wxT("<body>"));
134 // Process the data in the vCard object.
138 ArrayvCardOutData FNList;
139 FNList = vCardObj->GetByPartial(wxT("FN"));
141 PageData.append(wxT("<table style=\"background: #cccccc; width: 100%\">"));
142 PageData.append(wxT("<tr>"));
143 PageData.append(wxT("<td style=\"width:100%\">"));
144 PageData.append(wxT("<h2>"));
146 if (FNList.PropCount > 0){
147 FNList.PropValues[0].Trim();
148 PageData.append(FNList.PropValues[0]);
151 PageData.append(wxT("</h2>"));
152 PageData.append(wxT("</td>"));
153 PageData.append(wxT("<td style=\"width: 200px;\">"));
155 // Define common variables for ADR.
157 std::map<int,int> SplitPoints;
158 std::map<int,int> SplitLength;
159 std::map<int,int>::iterator SLiter;
166 wxString AddressPOBox;
167 wxString AddressStreet;
168 wxString AddressLocality;
169 wxString AddressRegion;
170 wxString AddressPostalCode;
171 wxString AddressCountry;
172 wxString AddressExtended;
174 wxString FinalAddressLine;
175 bool AddressFirst = TRUE;
177 // Define common variables for PHOTO and LOGO.
179 std::string PhotoDataBin;
180 std::string PhotoDataIn;
181 wxString PhotoSplitData;
182 wxString PhotoMIMEType;
183 wxString PhotoEncType;
184 wxString PhotoEncData;
185 bool LoadPicture = FALSE;
186 bool DataDisplay = FALSE;
187 bool RectData = FALSE;
188 wxRect PhotoRectPoints;
189 wxString SIDFilename;
195 ArrayvCardOutData ContactData = vCardObj->GetByPartial(wxT("PHOTO"));
197 if (ContactData.PropCount > 0){
203 /*std::map<int,int> SplitPts;
204 std::map<int,int> SplitLen;
205 std::map<wxString,wxString> SplitData;
208 SplitPropertyData(&ContactData.PropData[0],
214 for (std::map<wxString, wxString>::iterator striter = SplitData.begin();
215 striter != SplitData.end(); striter++){
221 // Look for the X-ABCROP-RECTANGLE.
223 wxStringTokenizer PhotoSplit(ContactData.PropData[0], wxT(":"));
224 wxString PhotoPropertyDataString = PhotoSplit.GetNextToken();
225 wxStringTokenizer PhotoPropertyData(PhotoPropertyDataString, wxT(";"));
226 wxString PropertyLineData;
227 wxString PropertyName;
228 wxString PropertyValue;
230 wxStringTokenizer DataSplit(ContactData.PropValues[0], wxT(";"));
231 PhotoSplitData = DataSplit.GetNextToken();
232 wxStringTokenizer MIMESplit(PhotoSplitData, wxT(":"));
233 MIMESplit.GetNextToken();
234 PhotoMIMEType = MIMESplit.GetNextToken();
235 PhotoSplitData = DataSplit.GetNextToken();
236 wxStringTokenizer EncSplit(PhotoSplitData, wxT(","));
237 PhotoEncType = EncSplit.GetNextToken();
238 PhotoEncData = EncSplit.GetNextToken();
240 // Convert the picture data from base64 to binary.
242 PhotoDataIn = std::string(PhotoEncData.mb_str());
243 PhotoDataBin = base64_decode(PhotoDataIn);
244 wxMemoryInputStream istream(PhotoDataBin.c_str(), (size_t)PhotoDataBin.size());
247 if (!photo.LoadFile(istream, wxBITMAP_TYPE_ANY)){
249 // Photo failed to load so do nothing.
255 while (PhotoPropertyData.HasMoreTokens()){
257 PropertyLineData = PhotoPropertyData.GetNextToken();
259 wxStringTokenizer PhotoPropPair(PropertyLineData, wxT("="));
260 wxString PhotoPropName = PhotoPropPair.GetNextToken();
261 wxString PhotoPropValue = PhotoPropPair.GetNextToken();
263 if (PhotoPropName == wxT("X-ABCROP-RECTANGLE")){
265 wxStringTokenizer PhotoRectData(PhotoPropValue, wxT("&"));
267 PhotoRectData.GetNextToken();
269 //PhotoRectPoints.SetX(wxAtoi(PhotoRectData.GetNextToken()));
270 //PhotoRectPoints.SetY(wxAtoi(PhotoRectData.GetNextToken()) - 100);
272 int PointXBase = wxAtoi(PhotoRectData.GetNextToken());
273 int PointYBase = wxAtoi(PhotoRectData.GetNextToken());
274 int PointWBase = wxAtoi(PhotoRectData.GetNextToken());
275 int PointHBase = wxAtoi(PhotoRectData.GetNextToken());
277 int PointX = PointXBase;
278 int PointY = PointYBase;
279 int PointW = PointWBase;
280 int PointH = PointHBase;
284 if (PointYBase > PointHBase){
286 PointX = photo.GetWidth() - PointXBase - 140;
287 PointY = photo.GetHeight() - PointYBase - 140;
291 } else if (PointXBase > PointWBase){
293 PointX = photo.GetWidth() - PointXBase;
294 PointY = PointYBase - 50;
302 /*int PointX = PointXBase;
303 int PointY = PointYBase;
304 int PointW = PointWBase;
305 int PointH = PointHBase;*/
307 // Bottom Left Method
309 /*int PointX = wxAtoi(PhotoRectData.GetNextToken());
310 int PointY = photo.GetHeight() - wxAtoi(PhotoRectData.GetNextToken()) - 340;
311 int PointW = wxAtoi(PhotoRectData.GetNextToken());
312 int PointH = wxAtoi(PhotoRectData.GetNextToken());*/
314 // Bottom Right Method
316 /*int PointXRemain = photo.GetWidth() - PointX - 140;
317 int PointYRemain = photo.GetHeight() - PointY - 140;*/
319 PhotoRectPoints.SetX(PointX);
320 PhotoRectPoints.SetY(PointY);
321 PhotoRectPoints.SetWidth(PointW);
322 PhotoRectPoints.SetHeight(PointH);
331 // Resize the picture to 125x125.
333 // Add to the wxMemnoryFSHandler.
335 SIDFilename = SID + wxT("-photo");
337 if (RectData == TRUE){
339 wxImage rectphoto = photo.GetSubImage(PhotoRectPoints);
340 rectphoto = rectphoto.Scale(75, 75, wxIMAGE_QUALITY_HIGH);
341 wxMemoryFSHandler::AddFile(SIDFilename, rectphoto, wxBITMAP_TYPE_PNG);
345 photo = photo.Scale(50, 50, wxIMAGE_QUALITY_HIGH);
346 wxMemoryFSHandler::AddFile(SIDFilename, photo, wxBITMAP_TYPE_PNG);
350 // Add the filename to the MemoryFSList map.
352 MemoryFSList->insert(std::make_pair(SIDFilename, SID));
358 if (LoadPicture == TRUE){
360 PageData.append(wxT("<img src=\"memory:") + SIDFilename + wxT("\">"));
368 ContactData = vCardObj->GetByPartial(wxT("LOGO"));
370 if (ContactData.PropCount > 0){
374 wxStringTokenizer DataSplit(ContactData.PropValues[0], wxT(";"));
375 PhotoSplitData = DataSplit.GetNextToken();
376 wxStringTokenizer MIMESplit(PhotoSplitData, wxT(":"));
377 MIMESplit.GetNextToken();
378 PhotoMIMEType = MIMESplit.GetNextToken();
379 PhotoSplitData = DataSplit.GetNextToken();
380 wxStringTokenizer EncSplit(PhotoSplitData, wxT(","));
381 PhotoEncType = EncSplit.GetNextToken();
382 PhotoEncData = EncSplit.GetNextToken();
384 // Convert the picture data from base64 to binary.
386 PhotoDataIn = std::string(PhotoEncData.mb_str());
387 PhotoDataBin = base64_decode(PhotoDataIn);
388 wxMemoryInputStream istream(PhotoDataBin.c_str(), (size_t)PhotoDataBin.size());
391 if (!photo.LoadFile(istream, wxBITMAP_TYPE_ANY)){
393 // Photo failed to load so do nothing.
401 photo = photo.Scale(50, 50, wxIMAGE_QUALITY_HIGH);
403 // Resize the picture to 125x125.
405 // Add to the wxMemnoryFSHandler.
407 SIDFilename = SID + wxT("-logo");
409 wxMemoryFSHandler::AddFile(SIDFilename, photo, wxBITMAP_TYPE_PNG);
411 // Add the filename to the MemoryFSList map.
413 MemoryFSList->insert(std::make_pair(SIDFilename, SID));
419 if (LoadPicture == TRUE){
421 PageData.append(wxT("<img src=\"memory:") + SIDFilename + wxT("\">"));
425 PageData.append(wxT("</td>"));
426 PageData.append(wxT("</tr>"));
427 PageData.append(wxT("</table>"));
429 // Process LOGO, PHOTO, SOUND, KEY, VND-* and X-*
430 // lines and display icons for each accordingly.
432 ContactData = vCardObj->GetByPartial(wxT("PHOTO"));
434 bool AddBreak = FALSE;
435 wxString TypePageData;
437 if (ContactData.PropCount > 1){
439 TypePageData.append(wxT("<img src=\"memory:cipto.png\" alt=\""));
440 TypePageData.append(_("This contact has multiple photos."));
441 TypePageData.append(wxT("\">"));
446 ContactData = vCardObj->GetByPartial(wxT("LOGO"));
448 if (ContactData.PropCount > 1){
450 TypePageData.append(wxT("<img src=\"memory:cilog.png\" alt=\""));
451 TypePageData.append(_("This contact has multiple logos."));
452 TypePageData.append(wxT("\">"));
457 ContactData = vCardObj->GetByPartial(wxT("SOUND"));
459 if (ContactData.PropCount >= 1){
461 TypePageData.append(wxT("<img src=\"memory:cisnd.png\" alt=\""));
462 TypePageData.append(_("This contact has audio information."));
463 TypePageData.append(wxT("\">"));
468 ContactData = vCardObj->GetByPartial(wxT("KEY"));
470 if (ContactData.PropCount >= 1){
472 TypePageData.append(wxT("<img src=\"memory:cikey.png\" alt=\""));
473 TypePageData.append(_("This contact has crytographic keys."));
474 TypePageData.append(wxT("\">"));
479 ContactData = vCardObj->GetByPartial(wxT("VND-"));
481 if (ContactData.PropCount >= 1){
483 TypePageData.append(wxT("<img src=\"memory:civen.png\" alt=\""));
484 TypePageData.append(_("This contact has vendor-specific information."));
485 TypePageData.append(wxT("\">"));
490 ContactData = vCardObj->GetByPartial(wxT("X-"));
492 if (ContactData.PropCount >= 1){
494 TypePageData.append(wxT("<img src=\"memory:ciext.png\" alt=\""));
495 TypePageData.append(_("This contact has extended information."));
496 TypePageData.append(wxT("\">"));
501 if (!TypePageData.IsEmpty()){
503 PageData.append("<table style=\"{background: #dddddd; width:100%}\"><tr><td>");
504 PageData.append(TypePageData);
505 PageData.append("</tr></td></table>");
509 if (AddBreak == TRUE){
511 PageData.append(wxT("<br><br>"));
515 bool MultiLogoIcon = FALSE;
516 bool MultiPhotoIcon = FALSE;
517 bool SoundIcon = FALSE;
518 bool KeyIcon = FALSE;
519 bool VendorIcon = FALSE;
520 bool XTokenIcon = FALSE;
524 ContactData = vCardObj->GetByPartial(wxT("BDAY"));
529 if (ContactData.PropCount > 0){
533 for (int i = 0; i < ContactData.PropCount; i++){
535 // Grab the first birthday only.
537 BDayLine = ContactData.PropValues[i];
540 CaptureString(&BDayLine, FALSE);
541 ConvertToHTML(&BDayLine);
543 DataLines.append(BDayLine);
553 PageData.append("<table CELLPADDING=4 style=\"{width: 100%;}\"><tr><td>");
555 if (DataDisplay == TRUE){
558 PageData.append(wxT("<b>"));
559 PageData.append(_("Birthday:"));
560 PageData.append(wxT("</b> "));
561 PageData.append(DataLines);
562 PageData.append(wxT("<br>"));
566 // Process Anniversary
568 ContactData = vCardObj->GetByPartial(wxT("ANNIVERSARY"));
573 if (ContactData.PropCount > 0){
577 for (int i = 0; i < ContactData.PropCount; i++){
579 // Grab the first anniversary only.
581 AnniLine = ContactData.PropValues[i];
584 CaptureString(&AnniLine, FALSE);
585 ConvertToHTML(&AnniLine);
587 DataLines.append(AnniLine);
597 if (DataDisplay == TRUE){
600 PageData.append(wxT("<b>"));
601 PageData.append(_("Anniversary:"));
602 PageData.append(wxT("</b> "));
603 PageData.append(DataLines);
604 PageData.append(wxT("<br>"));
610 ContactData = vCardObj->GetByPartial(wxT("NICKNAME"));
615 if (ContactData.PropCount > 0){
617 wxString NicknameLine;
619 for (int i = 0; i < ContactData.PropCount; i++){
621 NicknameLine = ContactData.PropValues[i];
624 CaptureString(&NicknameLine, FALSE);
625 ConvertToHTML(&NicknameLine);
627 DataLines.append(wxT("<tr><td><b>"));
628 DataLines.append(_("Nickname:"));
629 DataLines.append(wxT(" </b></td><td>"));
630 DataLines.append(NicknameLine);
631 DataLines.append(wxT("</td></tr>"));
639 if (DataDisplay == TRUE){
642 PageData.append(wxT("<h4>"));
643 PageData.append(_("Nicknames"));
644 PageData.append(wxT("</h4>"));
645 PageData.append(wxT("<br>"));
646 PageData.append(wxT("<table>"));
647 PageData.append(DataLines);
648 PageData.append(wxT("</table>"));
654 ContactData = vCardObj->GetByPartial(wxT("ADR"));
659 if (ContactData.PropCount > 0){
661 wxString AddressLine;
663 for (int i = 0; i < ContactData.PropCount; i++){
665 AddressLine = ContactData.PropValues[i];
667 intPropertyLen = AddressLine.Len();
674 AddressPOBox.clear();
675 AddressStreet.clear();
676 AddressLocality.clear();
677 AddressRegion.clear();
678 AddressPostalCode.clear();
679 AddressCountry.clear();
680 AddressExtended.clear();
681 FinalAddressLine.clear();
684 for (int i = 0; i <= intPropertyLen; i++){
688 if (AddressLine.Mid(i, 1) == wxT(";") && AddressLine.Mid((i - 1), 1) != wxT("\\")){
691 SplitPoints.insert(std::make_pair(intSplitsFound, (i + 1)));
693 if (intSplitsFound == 6){
695 SplitLength.insert(std::make_pair(intSplitsFound, (intSplitSize - 1)));
700 SplitLength.insert(std::make_pair(intSplitsFound, (intSplitSize - 1)));
710 // Split the data into several parts.
712 for (std::map<int, int>::iterator intiter = SplitPoints.begin();
713 intiter != SplitPoints.end(); ++intiter){
715 if (intiter->first == 1){
719 SLiter = SplitLength.find(1);
721 //txtSurname->SetValue(ContactData.Convert(wxSPropertySeg2.Mid(0, SLiter->second), TRUE));
722 AddressPOBox = AddressLine.Mid(0, SLiter->second);
723 intPrevValue = intiter->second;
725 } else if (intiter->first == 2){
727 // Deal with extended address.
729 SLiter = SplitLength.find(2);
731 AddressExtended = AddressLine.Mid(intPrevValue, SLiter->second);
732 //txtForename->SetValue(ContactData.Convert(wxSPropertySeg2.Mid(intPrevValue, SLiter->second), TRUE));
733 intPrevValue = intiter->second;
735 } else if (intiter->first == 3){
737 // Deal with street address.
739 SLiter = SplitLength.find(3);
741 AddressStreet = AddressLine.Mid(intPrevValue, SLiter->second);
742 //txtOtherNames->SetValue(ContactData.Convert(wxSPropertySeg2.Mid(intPrevValue, SLiter->second), TRUE));
743 intPrevValue = intiter->second;
745 } else if (intiter->first == 4){
747 // Deal with locality
749 SLiter = SplitLength.find(4);
751 AddressLocality = AddressLine.Mid(intPrevValue, SLiter->second);
752 //txtTitle->SetValue(ContactData.Convert(wxSPropertySeg2.Mid(intPrevValue, SLiter->second), TRUE));
753 intPrevValue = intiter->second;
755 //txtSuffix->SetValue(ContactData.Convert(wxSPropertySeg2.Mid(intPrevValue, wxSTRING_MAXLEN), TRUE));
757 } else if (intiter->first == 5){
761 SLiter = SplitLength.find(5);
763 AddressRegion = AddressLine.Mid(intPrevValue, SLiter->second);
764 //txtTitle->SetValue(ContactData.Convert(wxSPropertySeg2.Mid(intPrevValue, SLiter->second), TRUE));
765 intPrevValue = intiter->second;
767 //txtSuffix->SetValue(ContactData.Convert(wxSPropertySeg2.Mid(intPrevValue, wxSTRING_MAXLEN), TRUE));
769 } else if (intiter->first == 6){
771 // Deal with post code.
773 SLiter = SplitLength.find(6);
775 AddressPostalCode = AddressLine.Mid(intPrevValue, SLiter->second);
776 //txtTitle->SetValue(ContactData.Convert(wxSPropertySeg2.Mid(intPrevValue, SLiter->second), TRUE));
777 intPrevValue = intiter->second;
779 // Deal with country.
781 AddressCountry = AddressLine.Mid(intPrevValue);
782 //txtSuffix->SetValue(ContactData.Convert(wxSPropertySeg2.Mid(intPrevValue, wxSTRING_MAXLEN), TRUE));
788 if (!AddressStreet.IsEmpty()){
790 AddressStreet.Trim();
791 ConvertToHTML(&AddressStreet);
793 FinalAddressLine.append(AddressStreet);
794 AddressFirst = FALSE;
798 if (!AddressLocality.IsEmpty()){
800 AddressLocality.Trim();
801 ConvertToHTML(&AddressLocality);
803 if (AddressFirst == FALSE){
805 FinalAddressLine.append(wxT(",<br>"));
806 FinalAddressLine.append(AddressLocality);
810 FinalAddressLine.append(AddressLocality);
811 AddressFirst = FALSE;
817 if (!AddressRegion.IsEmpty()){
819 AddressRegion.Trim();
820 ConvertToHTML(&AddressRegion);
822 if (AddressFirst == FALSE){
824 FinalAddressLine.append(wxT(",<br>"));
825 FinalAddressLine.append(AddressRegion);
829 FinalAddressLine.append(AddressRegion);
830 AddressFirst = FALSE;
836 if (!AddressPostalCode.IsEmpty()){
838 AddressPostalCode.Trim();
839 ConvertToHTML(&AddressPostalCode);
841 if (AddressFirst == FALSE){
843 FinalAddressLine.append(wxT(",<br>"));
844 FinalAddressLine.append(AddressPostalCode);
848 FinalAddressLine.append(AddressPostalCode);
849 AddressFirst = FALSE;
855 if (!AddressCountry.IsEmpty()){
857 AddressCountry.Trim();
858 ConvertToHTML(&AddressCountry);
860 if (AddressFirst == FALSE){
862 FinalAddressLine.append(wxT(",<br>"));
863 FinalAddressLine.append(AddressCountry);
867 FinalAddressLine.append(AddressCountry);
868 AddressFirst = FALSE;
874 CaptureString(&FinalAddressLine, FALSE);
876 DataLines.append(wxT("<tr><td><b>"));
877 DataLines.append(_("Address:"));
878 DataLines.append(wxT(" </b></td><td>"));
879 DataLines.append(FinalAddressLine);
880 DataLines.append(wxT("</td></tr>"));
888 if (DataDisplay == TRUE){
891 PageData.append(wxT("<h4>"));
892 PageData.append(_("Addresses"));
893 PageData.append(wxT("</h4>"));
894 PageData.append(wxT("<br>"));
895 PageData.append(wxT("<table>"));
896 PageData.append(DataLines);
897 PageData.append(wxT("</table>"));
903 ContactData = vCardObj->GetByPartial(wxT("EMAIL"));
908 if (ContactData.PropCount > 0){
912 for (int i = 0; i < ContactData.PropCount; i++){
914 EmailLine = ContactData.PropValues[i];
917 CaptureString(&EmailLine, FALSE);
918 ConvertToHTML(&EmailLine);
920 DataLines.append(wxT("<tr><td><b>"));
921 DataLines.append(_("E-mail Address:"));
922 DataLines.append(wxT(" </b></td><td>"));
923 DataLines.append(EmailLine);
924 DataLines.append(wxT("</td></tr>"));
932 if (DataDisplay == TRUE){
935 PageData.append(wxT("<h4>"));
936 PageData.append(_("Email Addresses"));
937 PageData.append(wxT("</h4>"));
938 PageData.append(wxT("<br>"));
939 PageData.append(wxT("<table>"));
940 PageData.append(DataLines);
941 PageData.append(wxT("</table>"));
947 ContactData = vCardObj->GetByPartial(wxT("TEL"));
952 if (ContactData.PropCount > 0){
956 for (int i = 0; i < ContactData.PropCount; i++){
958 TelLine = ContactData.PropValues[i];
960 wxStringTokenizer TelSplit(TelLine, wxT(":"));
962 TelLine = TelSplit.GetNextToken();
964 if (TelSplit.HasMoreTokens()){
966 TelLine = TelSplit.GetNextToken();
971 CaptureString(&TelLine, FALSE);
972 ConvertToHTML(&TelLine);
974 DataLines.append(wxT("<tr><td><b>"));
975 DataLines.append(_("Telephone:"));
976 DataLines.append(wxT(" </b></td><td>"));
977 DataLines.append(TelLine);
978 DataLines.append(wxT("</td></tr>"));
986 if (DataDisplay == TRUE){
989 PageData.append(wxT("<h4>"));
990 PageData.append(_("Telephones"));
991 PageData.append(wxT("</h4>"));
992 PageData.append(wxT("<br>"));
993 PageData.append(wxT("<table>"));
994 PageData.append(DataLines);
995 PageData.append(wxT("</table>"));
1001 ContactData = vCardObj->GetByPartial(wxT("IMPP"));
1003 DataDisplay = FALSE;
1006 if (ContactData.PropCount > 0){
1009 wxString IMTypeFriendly;
1012 for (int i = 0; i < ContactData.PropCount; i++){
1014 IMLine = ContactData.PropValues[i];
1016 wxStringTokenizer IMSplit(IMLine, wxT(":"));
1018 IMType = IMSplit.GetNextToken();
1019 IMLine = IMSplit.GetNextToken();
1021 // Process skype, gg, icq, yahoo etc into
1022 // something meaningful.
1024 if (IMType == wxT("aim")){
1028 IMTypeFriendly = _("AIM");
1030 } else if (IMType == wxT("xmpp")){
1034 IMTypeFriendly = _("XMPP");
1036 } else if (IMType == wxT("icq")){
1040 IMTypeFriendly = _("ICQ");
1042 } else if (IMType == wxT("skype")){
1046 IMTypeFriendly = _("Skype");
1048 } else if (IMType == wxT("gg")){
1052 IMTypeFriendly = _("Gadu-Gadu");
1054 } else if (IMType == wxT("yahoo")){
1058 IMTypeFriendly = _("Yahoo");
1062 // Other. Use IM type that was split.
1064 IMTypeFriendly = IMType;
1069 CaptureString(&IMLine, FALSE);
1070 ConvertToHTML(&IMLine);
1072 DataLines.append(wxT("<tr><td><b>"));
1073 DataLines.append(_("IM Address"));
1074 DataLines.append(_(" ("));
1075 DataLines.append(IMTypeFriendly);
1076 DataLines.append(_("):"));
1077 DataLines.append(wxT(" </b></td><td>"));
1078 DataLines.append(IMLine);
1079 DataLines.append(wxT("</td></tr>"));
1081 IMTypeFriendly.clear();
1091 if (DataDisplay == TRUE){
1094 PageData.append(wxT("<h4>"));
1095 PageData.append(_("Instant Messaging Addresses"));
1096 PageData.append(wxT("</h4>"));
1097 PageData.append(wxT("<br>"));
1098 PageData.append(wxT("<table>"));
1099 PageData.append(DataLines);
1100 PageData.append(wxT("</table>"));
1106 ContactData = vCardObj->GetByPartial(wxT("URL"));
1108 DataDisplay = FALSE;
1111 if (ContactData.PropCount > 0){
1115 for (int i = 0; i < ContactData.PropCount; i++){
1117 URLLine = ContactData.PropValues[i];
1120 CaptureString(&URLLine, FALSE);
1121 ConvertToHTML(&URLLine);
1123 DataLines.append(wxT("<tr><td><b>"));
1124 DataLines.append(_("Website:"));
1125 DataLines.append(wxT(" </b></td><td>"));
1126 DataLines.append(URLLine);
1127 DataLines.append(wxT("</td></tr>"));
1135 if (DataDisplay == TRUE){
1138 PageData.append(wxT("<h4>"));
1139 PageData.append(_("Website Addresses"));
1140 PageData.append(wxT("</h4>"));
1141 PageData.append(wxT("<br>"));
1142 PageData.append(wxT("<table>"));
1143 PageData.append(DataLines);
1144 PageData.append(wxT("</table>"));
1150 ContactData = vCardObj->GetByPartial(wxT("LANG"));
1152 DataDisplay = FALSE;
1155 if (ContactData.PropCount > 0){
1157 wxString NicknameLine;
1159 for (int i = 0; i < ContactData.PropCount; i++){
1161 NicknameLine = ContactData.PropValues[i];
1163 NicknameLine.Trim();
1164 CaptureString(&NicknameLine, FALSE);
1165 ConvertToHTML(&NicknameLine);
1167 DataLines.append(wxT("<tr><td><b>"));
1168 DataLines.append(_("Language:"));
1169 DataLines.append(wxT(" </b></td><td>"));
1170 DataLines.append(NicknameLine);
1171 DataLines.append(wxT("</td></tr>"));
1179 if (DataDisplay == TRUE){
1182 PageData.append(wxT("<h4>"));
1183 PageData.append(_("Languages"));
1184 PageData.append(wxT("</h4>"));
1185 PageData.append(wxT("<br>"));
1186 PageData.append(wxT("<table>"));
1187 PageData.append(DataLines);
1188 PageData.append(wxT("</table>"));
1194 ContactData = vCardObj->GetByPartial(wxT("TZ"));
1196 DataDisplay = FALSE;
1199 if (ContactData.PropCount > 0){
1201 wxString NicknameLine;
1203 for (int i = 0; i < ContactData.PropCount; i++){
1205 NicknameLine = ContactData.PropValues[i];
1207 NicknameLine.Trim();
1208 CaptureString(&NicknameLine, FALSE);
1209 ConvertToHTML(&NicknameLine);
1211 DataLines.append(wxT("<tr><td><b>"));
1212 DataLines.append(_("Timezone:"));
1213 DataLines.append(wxT(" </b></td><td>"));
1214 DataLines.append(NicknameLine);
1215 DataLines.append(wxT("</td></tr>"));
1223 if (DataDisplay == TRUE){
1226 PageData.append(wxT("<h4>"));
1227 PageData.append(_("Timezones"));
1228 PageData.append(wxT("</h4>"));
1229 PageData.append(wxT("<br>"));
1230 PageData.append(wxT("<table>"));
1231 PageData.append(DataLines);
1232 PageData.append(wxT("</table>"));
1238 ContactData = vCardObj->GetByPartial(wxT("GEO"));
1240 DataDisplay = FALSE;
1243 if (ContactData.PropCount > 0){
1247 for (int i = 0; i < ContactData.PropCount; i++){
1249 GeoLine = ContactData.PropValues[i];
1251 wxStringTokenizer GeoSplit(GeoLine, wxT(":"));
1253 GeoLine = GeoSplit.GetNextToken();
1255 if (GeoSplit.HasMoreTokens()){
1257 GeoLine = GeoSplit.GetNextToken();
1262 CaptureString(&GeoLine, FALSE);
1263 ConvertToHTML(&GeoLine);
1265 DataLines.append(wxT("<tr><td><b>"));
1266 DataLines.append(_("Geoposition:"));
1267 DataLines.append(wxT(" </b></td><td>"));
1268 DataLines.append(GeoLine);
1269 DataLines.append(wxT("</td></tr>"));
1277 if (DataDisplay == TRUE){
1280 PageData.append(wxT("<h4>"));
1281 PageData.append(_("Geopositioning"));
1282 PageData.append(wxT("</h4>"));
1283 PageData.append(wxT("<br>"));
1284 PageData.append(wxT("<table>"));
1285 PageData.append(DataLines);
1286 PageData.append(wxT("</table>"));
1292 ContactData = vCardObj->GetByPartial(wxT("TITLE"));
1294 DataDisplay = FALSE;
1297 if (ContactData.PropCount > 0){
1301 for (int i = 0; i < ContactData.PropCount; i++){
1303 TitleLine = ContactData.PropValues[i];
1306 CaptureString(&TitleLine, FALSE);
1307 ConvertToHTML(&TitleLine);
1309 DataLines.append(wxT("<tr><td><b>"));
1310 DataLines.append(_("Title:"));
1311 DataLines.append(wxT(" </b></td><td>"));
1312 DataLines.append(TitleLine);
1313 DataLines.append(wxT("</td></tr>"));
1321 if (DataDisplay == TRUE){
1324 PageData.append(wxT("<h4>"));
1325 PageData.append(_("Titles"));
1326 PageData.append(wxT("</h4>"));
1327 PageData.append(wxT("<br>"));
1328 PageData.append(wxT("<table>"));
1329 PageData.append(DataLines);
1330 PageData.append(wxT("</table>"));
1336 ContactData = vCardObj->GetByPartial(wxT("ROLE"));
1338 DataDisplay = FALSE;
1341 if (ContactData.PropCount > 0){
1345 for (int i = 0; i < ContactData.PropCount; i++){
1347 RoleLine = ContactData.PropValues[i];
1350 CaptureString(&RoleLine, FALSE);
1351 ConvertToHTML(&RoleLine);
1353 DataLines.append(wxT("<tr><td><b>"));
1354 DataLines.append(_("Role:"));
1355 DataLines.append(wxT(" </b></td><td>"));
1356 DataLines.append(RoleLine);
1357 DataLines.append(wxT("</td></tr>"));
1365 if (DataDisplay == TRUE){
1368 PageData.append(wxT("<h4>"));
1369 PageData.append(_("Roles"));
1370 PageData.append(wxT("</h4>"));
1371 PageData.append(wxT("<br>"));
1372 PageData.append(wxT("<table>"));
1373 PageData.append(DataLines);
1374 PageData.append(wxT("</table>"));
1380 ContactData = vCardObj->GetByPartial(wxT("ORG"));
1382 DataDisplay = FALSE;
1385 if (ContactData.PropCount > 0){
1389 for (int i = 0; i < ContactData.PropCount; i++){
1391 OrgLine = ContactData.PropValues[i];
1394 CaptureString(&OrgLine, FALSE);
1395 ConvertToHTML(&OrgLine);
1397 DataLines.append(wxT("<tr><td><b>"));
1398 DataLines.append(_("Organisation:"));
1399 DataLines.append(wxT(" </b></td><td>"));
1400 DataLines.append(OrgLine);
1401 DataLines.append(wxT("</td></tr>"));
1409 if (DataDisplay == TRUE){
1412 PageData.append(wxT("<h4>"));
1413 PageData.append(_("Organisations"));
1414 PageData.append(wxT("</h4>"));
1415 PageData.append(wxT("<br>"));
1416 PageData.append(wxT("<table>"));
1417 PageData.append(DataLines);
1418 PageData.append(wxT("</table>"));
1424 ContactData = vCardObj->GetByPartial(wxT("CATEGORIES"));
1426 DataDisplay = FALSE;
1429 if (ContactData.PropCount > 0){
1433 for (int i = 0; i < ContactData.PropCount; i++){
1435 CatLine = ContactData.PropValues[i];
1438 CaptureString(&CatLine, FALSE);
1439 ConvertToHTML(&CatLine);
1441 DataLines.append(wxT("<tr><td><b>"));
1442 DataLines.append(_("Category:"));
1443 DataLines.append(wxT(" </b></td><td>"));
1444 DataLines.append(CatLine);
1445 DataLines.append(wxT("</td></tr>"));
1453 if (DataDisplay == TRUE){
1456 PageData.append(wxT("<h4>"));
1457 PageData.append(_("Categories"));
1458 PageData.append(wxT("</h4>"));
1459 PageData.append(wxT("<br>"));
1460 PageData.append(wxT("<table>"));
1461 PageData.append(DataLines);
1462 PageData.append(wxT("</table>"));
1470 // Calendar Addresses
1472 ContactData = vCardObj->GetByPartial(wxT("CALURI"));
1474 DataDisplay = FALSE;
1477 if (ContactData.PropCount > 0){
1479 wxString CalURILine;
1481 for (int i = 0; i < ContactData.PropCount; i++){
1483 CalURILine = ContactData.PropValues[i];
1486 CaptureString(&CalURILine, FALSE);
1487 ConvertToHTML(&CalURILine);
1489 DataLines.append(wxT("<tr><td><b>"));
1490 DataLines.append(_("Calendar Address:"));
1491 DataLines.append(wxT(" </b></td><td>"));
1492 DataLines.append(CalURILine);
1493 DataLines.append(wxT("</td></tr>"));
1501 if (DataDisplay == TRUE){
1504 PageData.append(wxT("<h4>"));
1505 PageData.append(_("Calendar Addresses"));
1506 PageData.append(wxT("</h4>"));
1507 PageData.append(wxT("<br>"));
1508 PageData.append(wxT("<table>"));
1509 PageData.append(DataLines);
1510 PageData.append(wxT("</table>"));
1514 // Calendar Request Addresses
1516 ContactData = vCardObj->GetByPartial(wxT("CALADRURI"));
1518 DataDisplay = FALSE;
1521 if (ContactData.PropCount > 0){
1523 wxString CalAdrURILine;
1525 for (int i = 0; i < ContactData.PropCount; i++){
1527 CalAdrURILine = ContactData.PropValues[i];
1529 CalAdrURILine.Trim();
1530 CaptureString(&CalAdrURILine, FALSE);
1531 ConvertToHTML(&CalAdrURILine);
1533 DataLines.append(wxT("<tr><td><b>"));
1534 DataLines.append(_("Calendar Request Address:"));
1535 DataLines.append(wxT(" </b></td><td>"));
1536 DataLines.append(CalAdrURILine);
1537 DataLines.append(wxT("</td></tr>"));
1545 if (DataDisplay == TRUE){
1548 PageData.append(wxT("<h4>"));
1549 PageData.append(_("Calendar Request Addresses"));
1550 PageData.append(wxT("</h4>"));
1551 PageData.append(wxT("<br>"));
1552 PageData.append(wxT("<table>"));
1553 PageData.append(DataLines);
1554 PageData.append(wxT("</table>"));
1558 // Free/Busy Addresses
1560 ContactData = vCardObj->GetByPartial(wxT("FBURL"));
1562 DataDisplay = FALSE;
1565 if (ContactData.PropCount > 0){
1569 for (int i = 0; i < ContactData.PropCount; i++){
1571 FBURLLine = ContactData.PropValues[i];
1574 CaptureString(&FBURLLine, FALSE);
1575 ConvertToHTML(&FBURLLine);
1577 DataLines.append(wxT("<tr><td><b>"));
1578 DataLines.append(_("Free/Busy Address:"));
1579 DataLines.append(wxT(" </b></td><td>"));
1580 DataLines.append(FBURLLine);
1581 DataLines.append(wxT("</td></tr>"));
1589 if (DataDisplay == TRUE){
1592 PageData.append(wxT("<h4>"));
1593 PageData.append(_("Free/Busy Addresses"));
1594 PageData.append(wxT("</h4>"));
1595 PageData.append(wxT("<br>"));
1596 PageData.append(wxT("<table>"));
1597 PageData.append(DataLines);
1598 PageData.append(wxT("</table>"));
1604 ContactData = vCardObj->GetByPartial(wxT("NOTE"));
1606 DataDisplay = FALSE;
1609 if (ContactData.PropCount > 0){
1613 for (int i = 0; i < ContactData.PropCount; i++){
1615 NoteLine = ContactData.PropValues[i];
1618 CaptureString(&NoteLine, FALSE);
1619 ConvertToHTML(&NoteLine);
1621 DataLines.append(wxT("<tr><td><b>"));
1622 DataLines.append(_("Note:"));
1623 DataLines.append(wxT(" </b></td><td>"));
1624 DataLines.append(NoteLine);
1625 DataLines.append(wxT("</td></tr>"));
1633 if (DataDisplay == TRUE){
1635 PageData.append(wxT("<h4>"));
1636 PageData.append(_("Notes"));
1637 PageData.append(wxT("</h4>"));
1638 PageData.append(wxT("<br>"));
1639 PageData.append(wxT("<table>"));
1640 PageData.append(DataLines);
1641 PageData.append(wxT("</table>"));
1645 // Display the HTML document on the screen.
1647 PageData.append("</td></tr></table>");
1649 PageData.append(wxT("</body>"));
1650 PageData.append(wxT("</html>"));
1652 HTMLObj->SetPage(PageData);
1656 void SplitPropertyData(wxString *PropertyLine,
1657 std::map<int,int> *SplitPoints,
1658 std::map<int,int> *SplitLength,
1660 std::map<wxString,wxString> *SplitData){
1662 // Split the property data into SplitData.
1665 wxStringTokenizer PropertyElement;
1666 wxString PropertyName;
1667 wxString PropertyValue;
1668 int intPropertyLen = PropertyLine->Len();
1669 int intSplitsFound = 0;
1670 int intSplitSize = 0;
1671 int intSplitSeek = (intSize - 1);
1673 for (int i = intSize; i <= intPropertyLen; i++){
1677 if (PropertyLine->Mid(i, 1) == wxT(";") &&
1678 PropertyLine->Mid((i - 1), 1) != wxT("\\")){
1680 if (intSplitsFound == 0){
1682 DataStr = PropertyLine->Mid(intSplitSeek, (intSplitSize));
1683 SplitLength->insert(std::make_pair(intSplitsFound, (intSplitSize)));
1687 DataStr = PropertyLine->Mid(intSplitSeek, (intSplitSize - 1));
1688 SplitLength->insert(std::make_pair(intSplitsFound, (intSplitSize - 1)));
1692 SplitPoints->insert(std::make_pair(intSplitsFound, (i + 1)));
1695 intSplitSeek = (i + 1);
1698 if (!DataStr.IsEmpty()){
1700 PropertyElement.SetString(DataStr, wxT("="));
1701 PropertyName = PropertyElement.GetNextToken();
1702 PropertyValue = PropertyElement.GetNextToken();
1703 SplitData->insert(std::make_pair(PropertyName, PropertyValue));
1708 PropertyName.clear();
1709 PropertyValue.clear();
1715 if (intSplitsFound == 0){
1717 DataStr = PropertyLine->Mid(intSplitSeek, (intSplitSize));
1719 SplitPoints->insert(std::make_pair(intSplitsFound, (8 + 1)));
1720 SplitLength->insert(std::make_pair(intSplitsFound, intSplitSize));
1724 DataStr = PropertyLine->Mid(intSplitSeek, (intSplitSize - 1));
1726 SplitPoints->insert(std::make_pair(intSplitsFound, (intSplitSeek + 1)));
1727 SplitLength->insert(std::make_pair(intSplitsFound, intSplitSize));
1731 if (!DataStr.IsEmpty()){
1733 PropertyElement.SetString(DataStr, wxT("="));
1734 PropertyName = PropertyElement.GetNextToken();
1735 PropertyValue = PropertyElement.GetNextToken();
1736 SplitData->insert(std::make_pair(PropertyName, PropertyValue));