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);
49 PageData.append(wxT("<html>"));
50 PageData.append(wxT("<head>"));
51 PageData.append(wxT("<title>Page Loading</title>"));
52 PageData.append(wxT("</head>"));
53 PageData.append(wxT("<body>"));
54 PageData.append(wxT("<h2>"));
55 PageData.append(_("Loading contact information..."));
56 PageData.append(wxT("</h2>"));
57 PageData.append(wxT("</body>"));
58 PageData.append(wxT("</html>"));
60 HTMLObj->SetPage(PageData);
64 // Delete the information from the old session.
66 if (!OldSID.IsEmpty()){
68 if (MemoryFSList->find(OldSID) == MemoryFSList->end()){
73 std::map<wxString, wxString>::iterator striter;
75 for (striter = MemoryFSList->begin(); striter != MemoryFSList->end(); striter++){
77 if (OldSID == striter->second){
79 // Delete the references from the wxMemoryFSHandler
80 // and the entry from the map.
82 wxMemoryFSHandler::RemoveFile(striter->first);
89 MemoryFSList->erase(striter);
95 // MAke sure new session ID doesn't conflict with existing
96 // data. If there is a match, generate a new one and check again.
100 for (std::map<wxString, wxString>::iterator striter = MemoryFSList->begin();
101 striter != MemoryFSList->end(); striter++){
103 SIDTemp = striter->second;
107 // Generate a new random number.
109 SID = wxString::Format(wxT("%i"), rand() % 32768);
111 // Rewind the seek process back to the start.
113 striter = MemoryFSList->begin();
121 // Setup the HTML document.
123 PageData.append(wxT("<html>"));
124 PageData.append(wxT("<head>"));
125 PageData.append(wxT("<title>Contact Information</title>"));
126 PageData.append(wxT("</head>"));
128 // Process the CSS section.
130 PageData.append(wxT("<body>"));
132 // Process the data in the vCard object.
136 ArrayvCardOutData FNList;
137 FNList = vCardObj->GetByPartial(wxT("FN"));
139 PageData.append(wxT("<table style=\"background: #cccccc; width: 100%\">"));
140 PageData.append(wxT("<tr>"));
141 PageData.append(wxT("<td style=\"width:100%\">"));
142 PageData.append(wxT("<h2>"));
144 if (FNList.PropCount > 0){
145 FNList.PropValues[0].Trim();
146 PageData.append(FNList.PropValues[0]);
149 PageData.append(wxT("</h2>"));
150 PageData.append(wxT("</td>"));
151 PageData.append(wxT("<td style=\"width: 200px;\">"));
153 // Define common variables for ADR.
155 std::map<int,int> SplitPoints;
156 std::map<int,int> SplitLength;
157 std::map<int,int>::iterator SLiter;
164 wxString AddressPOBox;
165 wxString AddressStreet;
166 wxString AddressLocality;
167 wxString AddressRegion;
168 wxString AddressPostalCode;
169 wxString AddressCountry;
170 wxString AddressExtended;
172 wxString FinalAddressLine;
173 bool AddressFirst = TRUE;
175 // Define common variables for PHOTO and LOGO.
177 std::string PhotoDataBin;
178 std::string PhotoDataIn;
179 wxString PhotoSplitData;
180 wxString PhotoMIMEType;
181 wxString PhotoEncType;
182 wxString PhotoEncData;
183 bool LoadPicture = FALSE;
184 bool DataDisplay = FALSE;
185 bool RectData = FALSE;
186 wxRect PhotoRectPoints;
187 wxString SIDFilename;
193 ArrayvCardOutData ContactData = vCardObj->GetByPartial(wxT("PHOTO"));
195 if (ContactData.PropCount > 0){
201 /*std::map<int,int> SplitPts;
202 std::map<int,int> SplitLen;
203 std::map<wxString,wxString> SplitData;
206 SplitPropertyData(&ContactData.PropData[0],
212 for (std::map<wxString, wxString>::iterator striter = SplitData.begin();
213 striter != SplitData.end(); striter++){
219 // Look for the X-ABCROP-RECTANGLE.
221 wxStringTokenizer PhotoSplit(ContactData.PropData[0], wxT(":"));
222 wxString PhotoPropertyDataString = PhotoSplit.GetNextToken();
223 wxStringTokenizer PhotoPropertyData(PhotoPropertyDataString, wxT(";"));
224 wxString PropertyLineData;
225 wxString PropertyName;
226 wxString PropertyValue;
228 wxStringTokenizer DataSplit(ContactData.PropValues[0], wxT(";"));
229 PhotoSplitData = DataSplit.GetNextToken();
230 wxStringTokenizer MIMESplit(PhotoSplitData, wxT(":"));
231 MIMESplit.GetNextToken();
232 PhotoMIMEType = MIMESplit.GetNextToken();
233 PhotoSplitData = DataSplit.GetNextToken();
234 wxStringTokenizer EncSplit(PhotoSplitData, wxT(","));
235 PhotoEncType = EncSplit.GetNextToken();
236 PhotoEncData = EncSplit.GetNextToken();
238 // Convert the picture data from base64 to binary.
240 PhotoDataIn = std::string(PhotoEncData.mb_str());
241 PhotoDataBin = base64_decode(PhotoDataIn);
242 wxMemoryInputStream istream(PhotoDataBin.c_str(), (size_t)PhotoDataBin.size());
245 if (!photo.LoadFile(istream, wxBITMAP_TYPE_ANY)){
247 // Photo failed to load so do nothing.
253 while (PhotoPropertyData.HasMoreTokens()){
255 PropertyLineData = PhotoPropertyData.GetNextToken();
257 wxStringTokenizer PhotoPropPair(PropertyLineData, wxT("="));
258 wxString PhotoPropName = PhotoPropPair.GetNextToken();
259 wxString PhotoPropValue = PhotoPropPair.GetNextToken();
261 if (PhotoPropName == wxT("X-ABCROP-RECTANGLE")){
263 wxStringTokenizer PhotoRectData(PhotoPropValue, wxT("&"));
265 PhotoRectData.GetNextToken();
267 //PhotoRectPoints.SetX(wxAtoi(PhotoRectData.GetNextToken()));
268 //PhotoRectPoints.SetY(wxAtoi(PhotoRectData.GetNextToken()) - 100);
270 int PointXBase = wxAtoi(PhotoRectData.GetNextToken());
271 int PointYBase = wxAtoi(PhotoRectData.GetNextToken());
272 int PointWBase = wxAtoi(PhotoRectData.GetNextToken());
273 int PointHBase = wxAtoi(PhotoRectData.GetNextToken());
275 int PointX = PointXBase;
276 int PointY = PointYBase;
277 int PointW = PointWBase;
278 int PointH = PointHBase;
282 if (PointYBase > PointHBase){
284 PointX = photo.GetWidth() - PointXBase - 140;
285 PointY = photo.GetHeight() - PointYBase - 140;
289 } else if (PointXBase > PointWBase){
291 PointX = photo.GetWidth() - PointXBase;
292 PointY = PointYBase - 50;
300 PhotoRectPoints.SetX(PointX);
301 PhotoRectPoints.SetY(PointY);
302 PhotoRectPoints.SetWidth(PointW);
303 PhotoRectPoints.SetHeight(PointH);
312 // Resize the picture to 125x125.
314 // Add to the wxMemnoryFSHandler.
316 SIDFilename = SID + wxT("-photo");
318 if (RectData == TRUE){
320 wxImage rectphoto = photo.GetSubImage(PhotoRectPoints);
321 rectphoto = rectphoto.Scale(75, 75, wxIMAGE_QUALITY_HIGH);
322 wxMemoryFSHandler::AddFile(SIDFilename, rectphoto, wxBITMAP_TYPE_PNG);
326 photo = photo.Scale(50, 50, wxIMAGE_QUALITY_HIGH);
327 wxMemoryFSHandler::AddFile(SIDFilename, photo, wxBITMAP_TYPE_PNG);
331 // Add the filename to the MemoryFSList map.
333 MemoryFSList->insert(std::make_pair(SIDFilename, SID));
339 if (LoadPicture == TRUE){
341 PageData.append(wxT("<img src=\"memory:") + SIDFilename + wxT("\">"));
349 ContactData = vCardObj->GetByPartial(wxT("LOGO"));
351 if (ContactData.PropCount > 0){
355 wxStringTokenizer DataSplit(ContactData.PropValues[0], wxT(";"));
356 PhotoSplitData = DataSplit.GetNextToken();
357 wxStringTokenizer MIMESplit(PhotoSplitData, wxT(":"));
358 MIMESplit.GetNextToken();
359 PhotoMIMEType = MIMESplit.GetNextToken();
360 PhotoSplitData = DataSplit.GetNextToken();
361 wxStringTokenizer EncSplit(PhotoSplitData, wxT(","));
362 PhotoEncType = EncSplit.GetNextToken();
363 PhotoEncData = EncSplit.GetNextToken();
365 // Convert the picture data from base64 to binary.
367 PhotoDataIn = std::string(PhotoEncData.mb_str());
368 PhotoDataBin = base64_decode(PhotoDataIn);
369 wxMemoryInputStream istream(PhotoDataBin.c_str(), (size_t)PhotoDataBin.size());
372 if (!photo.LoadFile(istream, wxBITMAP_TYPE_ANY)){
374 // Photo failed to load so do nothing.
382 photo = photo.Scale(50, 50, wxIMAGE_QUALITY_HIGH);
384 // Resize the picture to 125x125.
386 // Add to the wxMemnoryFSHandler.
388 SIDFilename = SID + wxT("-logo");
390 wxMemoryFSHandler::AddFile(SIDFilename, photo, wxBITMAP_TYPE_PNG);
392 // Add the filename to the MemoryFSList map.
394 MemoryFSList->insert(std::make_pair(SIDFilename, SID));
400 if (LoadPicture == TRUE){
402 PageData.append(wxT("<img src=\"memory:") + SIDFilename + wxT("\">"));
406 PageData.append(wxT("</td>"));
407 PageData.append(wxT("</tr>"));
408 PageData.append(wxT("</table>"));
410 // Process LOGO, PHOTO, SOUND, KEY, VND-* and X-*
411 // lines and display icons for each accordingly.
413 ContactData = vCardObj->GetByPartial(wxT("PHOTO"));
415 bool AddBreak = FALSE;
416 wxString TypePageData;
418 if (ContactData.PropCount > 1){
420 TypePageData.append(wxT("<img src=\"memory:cipto.png\" alt=\""));
421 TypePageData.append(_("This contact has multiple photos."));
422 TypePageData.append(wxT("\">"));
427 ContactData = vCardObj->GetByPartial(wxT("LOGO"));
429 if (ContactData.PropCount > 1){
431 TypePageData.append(wxT("<img src=\"memory:cilog.png\" alt=\""));
432 TypePageData.append(_("This contact has multiple logos."));
433 TypePageData.append(wxT("\">"));
438 ContactData = vCardObj->GetByPartial(wxT("SOUND"));
440 if (ContactData.PropCount >= 1){
442 TypePageData.append(wxT("<img src=\"memory:cisnd.png\" alt=\""));
443 TypePageData.append(_("This contact has audio information."));
444 TypePageData.append(wxT("\">"));
449 ContactData = vCardObj->GetByPartial(wxT("KEY"));
451 if (ContactData.PropCount >= 1){
453 TypePageData.append(wxT("<img src=\"memory:cikey.png\" alt=\""));
454 TypePageData.append(_("This contact has crytographic keys."));
455 TypePageData.append(wxT("\">"));
460 ContactData = vCardObj->GetByPartial(wxT("VND-"));
462 if (ContactData.PropCount >= 1){
464 TypePageData.append(wxT("<img src=\"memory:civen.png\" alt=\""));
465 TypePageData.append(_("This contact has vendor-specific information."));
466 TypePageData.append(wxT("\">"));
471 ContactData = vCardObj->GetByPartial(wxT("X-"));
473 if (ContactData.PropCount >= 1){
475 TypePageData.append(wxT("<img src=\"memory:ciext.png\" alt=\""));
476 TypePageData.append(_("This contact has extended information."));
477 TypePageData.append(wxT("\">"));
482 if (!TypePageData.IsEmpty()){
484 PageData.append("<table style=\"{background: #dddddd; width:100%}\"><tr><td>");
485 PageData.append(TypePageData);
486 PageData.append("</tr></td></table>");
490 if (AddBreak == TRUE){
492 PageData.append(wxT("<br><br>"));
498 ContactData = vCardObj->GetByPartial(wxT("BDAY"));
503 if (ContactData.PropCount > 0){
507 for (int i = 0; i < ContactData.PropCount; i++){
509 // Grab the first birthday only.
511 BDayLine = ContactData.PropValues[i];
514 CaptureString(&BDayLine, FALSE);
515 ConvertToHTML(&BDayLine);
517 DataLines.append(BDayLine);
527 PageData.append("<table CELLPADDING=4 style=\"{width: 100%;}\"><tr><td>");
529 if (DataDisplay == TRUE){
532 PageData.append(wxT("<b>"));
533 PageData.append(_("Birthday:"));
534 PageData.append(wxT("</b> "));
535 PageData.append(DataLines);
536 PageData.append(wxT("<br>"));
540 // Process Anniversary
542 ContactData = vCardObj->GetByPartial(wxT("ANNIVERSARY"));
547 if (ContactData.PropCount > 0){
551 for (int i = 0; i < ContactData.PropCount; i++){
553 // Grab the first anniversary only.
555 AnniLine = ContactData.PropValues[i];
558 CaptureString(&AnniLine, FALSE);
559 ConvertToHTML(&AnniLine);
561 DataLines.append(AnniLine);
571 if (DataDisplay == TRUE){
574 PageData.append(wxT("<b>"));
575 PageData.append(_("Anniversary:"));
576 PageData.append(wxT("</b> "));
577 PageData.append(DataLines);
578 PageData.append(wxT("<br>"));
584 ContactData = vCardObj->GetByPartial(wxT("NICKNAME"));
589 if (ContactData.PropCount > 0){
591 wxString NicknameLine;
593 for (int i = 0; i < ContactData.PropCount; i++){
595 NicknameLine = ContactData.PropValues[i];
598 CaptureString(&NicknameLine, FALSE);
599 ConvertToHTML(&NicknameLine);
601 DataLines.append(wxT("<tr><td><b>"));
602 DataLines.append(_("Nickname:"));
603 DataLines.append(wxT(" </b></td><td>"));
604 DataLines.append(NicknameLine);
605 DataLines.append(wxT("</td></tr>"));
613 if (DataDisplay == TRUE){
616 PageData.append(wxT("<h4>"));
617 PageData.append(_("Nicknames"));
618 PageData.append(wxT("</h4>"));
619 PageData.append(wxT("<br>"));
620 PageData.append(wxT("<table>"));
621 PageData.append(DataLines);
622 PageData.append(wxT("</table>"));
628 ContactData = vCardObj->GetByPartial(wxT("ADR"));
633 if (ContactData.PropCount > 0){
635 wxString AddressLine;
637 for (int i = 0; i < ContactData.PropCount; i++){
639 AddressLine = ContactData.PropValues[i];
641 intPropertyLen = AddressLine.Len();
648 AddressPOBox.clear();
649 AddressStreet.clear();
650 AddressLocality.clear();
651 AddressRegion.clear();
652 AddressPostalCode.clear();
653 AddressCountry.clear();
654 AddressExtended.clear();
655 FinalAddressLine.clear();
658 for (int i = 0; i <= intPropertyLen; i++){
662 if (AddressLine.Mid(i, 1) == wxT(";") && AddressLine.Mid((i - 1), 1) != wxT("\\")){
665 SplitPoints.insert(std::make_pair(intSplitsFound, (i + 1)));
667 if (intSplitsFound == 6){
669 SplitLength.insert(std::make_pair(intSplitsFound, (intSplitSize - 1)));
674 SplitLength.insert(std::make_pair(intSplitsFound, (intSplitSize - 1)));
684 // Split the data into several parts.
686 for (std::map<int, int>::iterator intiter = SplitPoints.begin();
687 intiter != SplitPoints.end(); ++intiter){
689 if (intiter->first == 1){
693 SLiter = SplitLength.find(1);
695 //txtSurname->SetValue(ContactData.Convert(wxSPropertySeg2.Mid(0, SLiter->second), TRUE));
696 AddressPOBox = AddressLine.Mid(0, SLiter->second);
697 intPrevValue = intiter->second;
699 } else if (intiter->first == 2){
701 // Deal with extended address.
703 SLiter = SplitLength.find(2);
705 AddressExtended = AddressLine.Mid(intPrevValue, SLiter->second);
706 //txtForename->SetValue(ContactData.Convert(wxSPropertySeg2.Mid(intPrevValue, SLiter->second), TRUE));
707 intPrevValue = intiter->second;
709 } else if (intiter->first == 3){
711 // Deal with street address.
713 SLiter = SplitLength.find(3);
715 AddressStreet = AddressLine.Mid(intPrevValue, SLiter->second);
716 //txtOtherNames->SetValue(ContactData.Convert(wxSPropertySeg2.Mid(intPrevValue, SLiter->second), TRUE));
717 intPrevValue = intiter->second;
719 } else if (intiter->first == 4){
721 // Deal with locality
723 SLiter = SplitLength.find(4);
725 AddressLocality = AddressLine.Mid(intPrevValue, SLiter->second);
726 //txtTitle->SetValue(ContactData.Convert(wxSPropertySeg2.Mid(intPrevValue, SLiter->second), TRUE));
727 intPrevValue = intiter->second;
729 //txtSuffix->SetValue(ContactData.Convert(wxSPropertySeg2.Mid(intPrevValue, wxSTRING_MAXLEN), TRUE));
731 } else if (intiter->first == 5){
735 SLiter = SplitLength.find(5);
737 AddressRegion = AddressLine.Mid(intPrevValue, SLiter->second);
738 //txtTitle->SetValue(ContactData.Convert(wxSPropertySeg2.Mid(intPrevValue, SLiter->second), TRUE));
739 intPrevValue = intiter->second;
741 //txtSuffix->SetValue(ContactData.Convert(wxSPropertySeg2.Mid(intPrevValue, wxSTRING_MAXLEN), TRUE));
743 } else if (intiter->first == 6){
745 // Deal with post code.
747 SLiter = SplitLength.find(6);
749 AddressPostalCode = AddressLine.Mid(intPrevValue, SLiter->second);
750 //txtTitle->SetValue(ContactData.Convert(wxSPropertySeg2.Mid(intPrevValue, SLiter->second), TRUE));
751 intPrevValue = intiter->second;
753 // Deal with country.
755 AddressCountry = AddressLine.Mid(intPrevValue);
756 //txtSuffix->SetValue(ContactData.Convert(wxSPropertySeg2.Mid(intPrevValue, wxSTRING_MAXLEN), TRUE));
762 if (!AddressStreet.IsEmpty()){
764 AddressStreet.Trim();
765 ConvertToHTML(&AddressStreet);
767 FinalAddressLine.append(AddressStreet);
768 AddressFirst = FALSE;
772 if (!AddressLocality.IsEmpty()){
774 AddressLocality.Trim();
775 ConvertToHTML(&AddressLocality);
777 if (AddressFirst == FALSE){
779 FinalAddressLine.append(wxT(",<br>"));
780 FinalAddressLine.append(AddressLocality);
784 FinalAddressLine.append(AddressLocality);
785 AddressFirst = FALSE;
791 if (!AddressRegion.IsEmpty()){
793 AddressRegion.Trim();
794 ConvertToHTML(&AddressRegion);
796 if (AddressFirst == FALSE){
798 FinalAddressLine.append(wxT(",<br>"));
799 FinalAddressLine.append(AddressRegion);
803 FinalAddressLine.append(AddressRegion);
804 AddressFirst = FALSE;
810 if (!AddressPostalCode.IsEmpty()){
812 AddressPostalCode.Trim();
813 ConvertToHTML(&AddressPostalCode);
815 if (AddressFirst == FALSE){
817 FinalAddressLine.append(wxT(",<br>"));
818 FinalAddressLine.append(AddressPostalCode);
822 FinalAddressLine.append(AddressPostalCode);
823 AddressFirst = FALSE;
829 if (!AddressCountry.IsEmpty()){
831 AddressCountry.Trim();
832 ConvertToHTML(&AddressCountry);
834 if (AddressFirst == FALSE){
836 FinalAddressLine.append(wxT(",<br>"));
837 FinalAddressLine.append(AddressCountry);
841 FinalAddressLine.append(AddressCountry);
842 AddressFirst = FALSE;
848 CaptureString(&FinalAddressLine, FALSE);
850 DataLines.append(wxT("<tr><td><b>"));
851 DataLines.append(_("Address:"));
852 DataLines.append(wxT(" </b></td><td>"));
853 DataLines.append(FinalAddressLine);
854 DataLines.append(wxT("</td></tr>"));
862 if (DataDisplay == TRUE){
865 PageData.append(wxT("<h4>"));
866 PageData.append(_("Addresses"));
867 PageData.append(wxT("</h4>"));
868 PageData.append(wxT("<br>"));
869 PageData.append(wxT("<table>"));
870 PageData.append(DataLines);
871 PageData.append(wxT("</table>"));
877 ContactData = vCardObj->GetByPartial(wxT("EMAIL"));
882 if (ContactData.PropCount > 0){
886 for (int i = 0; i < ContactData.PropCount; i++){
888 EmailLine = ContactData.PropValues[i];
891 CaptureString(&EmailLine, FALSE);
892 ConvertToHTML(&EmailLine);
894 DataLines.append(wxT("<tr><td><b>"));
895 DataLines.append(_("E-mail Address:"));
896 DataLines.append(wxT(" </b></td><td>"));
897 DataLines.append(EmailLine);
898 DataLines.append(wxT("</td></tr>"));
906 if (DataDisplay == TRUE){
909 PageData.append(wxT("<h4>"));
910 PageData.append(_("Email Addresses"));
911 PageData.append(wxT("</h4>"));
912 PageData.append(wxT("<br>"));
913 PageData.append(wxT("<table>"));
914 PageData.append(DataLines);
915 PageData.append(wxT("</table>"));
921 ContactData = vCardObj->GetByPartial(wxT("TEL"));
926 if (ContactData.PropCount > 0){
930 for (int i = 0; i < ContactData.PropCount; i++){
932 TelLine = ContactData.PropValues[i];
934 wxStringTokenizer TelSplit(TelLine, wxT(":"));
936 TelLine = TelSplit.GetNextToken();
938 if (TelSplit.HasMoreTokens()){
940 TelLine = TelSplit.GetNextToken();
945 CaptureString(&TelLine, FALSE);
946 ConvertToHTML(&TelLine);
948 DataLines.append(wxT("<tr><td><b>"));
949 DataLines.append(_("Telephone:"));
950 DataLines.append(wxT(" </b></td><td>"));
951 DataLines.append(TelLine);
952 DataLines.append(wxT("</td></tr>"));
960 if (DataDisplay == TRUE){
963 PageData.append(wxT("<h4>"));
964 PageData.append(_("Telephones"));
965 PageData.append(wxT("</h4>"));
966 PageData.append(wxT("<br>"));
967 PageData.append(wxT("<table>"));
968 PageData.append(DataLines);
969 PageData.append(wxT("</table>"));
975 ContactData = vCardObj->GetByPartial(wxT("IMPP"));
980 if (ContactData.PropCount > 0){
983 wxString IMTypeFriendly;
986 for (int i = 0; i < ContactData.PropCount; i++){
988 IMLine = ContactData.PropValues[i];
990 wxStringTokenizer IMSplit(IMLine, wxT(":"));
992 IMType = IMSplit.GetNextToken();
993 IMLine = IMSplit.GetNextToken();
995 // Process skype, gg, icq, yahoo etc into
996 // something meaningful.
998 if (IMType == wxT("aim")){
1002 IMTypeFriendly = _("AIM");
1004 } else if (IMType == wxT("xmpp")){
1008 IMTypeFriendly = _("XMPP");
1010 } else if (IMType == wxT("icq")){
1014 IMTypeFriendly = _("ICQ");
1016 } else if (IMType == wxT("skype")){
1020 IMTypeFriendly = _("Skype");
1022 } else if (IMType == wxT("gg")){
1026 IMTypeFriendly = _("Gadu-Gadu");
1028 } else if (IMType == wxT("yahoo")){
1032 IMTypeFriendly = _("Yahoo");
1036 // Other. Use IM type that was split.
1038 IMTypeFriendly = IMType;
1043 CaptureString(&IMLine, FALSE);
1044 ConvertToHTML(&IMLine);
1046 DataLines.append(wxT("<tr><td><b>"));
1047 DataLines.append(_("IM Address"));
1048 DataLines.append(_(" ("));
1049 DataLines.append(IMTypeFriendly);
1050 DataLines.append(_("):"));
1051 DataLines.append(wxT(" </b></td><td>"));
1052 DataLines.append(IMLine);
1053 DataLines.append(wxT("</td></tr>"));
1055 IMTypeFriendly.clear();
1065 if (DataDisplay == TRUE){
1068 PageData.append(wxT("<h4>"));
1069 PageData.append(_("Instant Messaging Addresses"));
1070 PageData.append(wxT("</h4>"));
1071 PageData.append(wxT("<br>"));
1072 PageData.append(wxT("<table>"));
1073 PageData.append(DataLines);
1074 PageData.append(wxT("</table>"));
1080 ContactData = vCardObj->GetByPartial(wxT("URL"));
1082 DataDisplay = FALSE;
1085 if (ContactData.PropCount > 0){
1089 for (int i = 0; i < ContactData.PropCount; i++){
1091 URLLine = ContactData.PropValues[i];
1094 CaptureString(&URLLine, FALSE);
1095 ConvertToHTML(&URLLine);
1097 DataLines.append(wxT("<tr><td><b>"));
1098 DataLines.append(_("Website:"));
1099 DataLines.append(wxT(" </b></td><td>"));
1100 DataLines.append(URLLine);
1101 DataLines.append(wxT("</td></tr>"));
1109 if (DataDisplay == TRUE){
1112 PageData.append(wxT("<h4>"));
1113 PageData.append(_("Website Addresses"));
1114 PageData.append(wxT("</h4>"));
1115 PageData.append(wxT("<br>"));
1116 PageData.append(wxT("<table>"));
1117 PageData.append(DataLines);
1118 PageData.append(wxT("</table>"));
1124 ContactData = vCardObj->GetByPartial(wxT("LANG"));
1126 DataDisplay = FALSE;
1129 if (ContactData.PropCount > 0){
1131 wxString NicknameLine;
1133 for (int i = 0; i < ContactData.PropCount; i++){
1135 NicknameLine = ContactData.PropValues[i];
1137 NicknameLine.Trim();
1138 CaptureString(&NicknameLine, FALSE);
1139 ConvertToHTML(&NicknameLine);
1141 DataLines.append(wxT("<tr><td><b>"));
1142 DataLines.append(_("Language:"));
1143 DataLines.append(wxT(" </b></td><td>"));
1144 DataLines.append(NicknameLine);
1145 DataLines.append(wxT("</td></tr>"));
1153 if (DataDisplay == TRUE){
1156 PageData.append(wxT("<h4>"));
1157 PageData.append(_("Languages"));
1158 PageData.append(wxT("</h4>"));
1159 PageData.append(wxT("<br>"));
1160 PageData.append(wxT("<table>"));
1161 PageData.append(DataLines);
1162 PageData.append(wxT("</table>"));
1168 ContactData = vCardObj->GetByPartial(wxT("TZ"));
1170 DataDisplay = FALSE;
1173 if (ContactData.PropCount > 0){
1175 wxString NicknameLine;
1177 for (int i = 0; i < ContactData.PropCount; i++){
1179 NicknameLine = ContactData.PropValues[i];
1181 NicknameLine.Trim();
1182 CaptureString(&NicknameLine, FALSE);
1183 ConvertToHTML(&NicknameLine);
1185 DataLines.append(wxT("<tr><td><b>"));
1186 DataLines.append(_("Timezone:"));
1187 DataLines.append(wxT(" </b></td><td>"));
1188 DataLines.append(NicknameLine);
1189 DataLines.append(wxT("</td></tr>"));
1197 if (DataDisplay == TRUE){
1200 PageData.append(wxT("<h4>"));
1201 PageData.append(_("Timezones"));
1202 PageData.append(wxT("</h4>"));
1203 PageData.append(wxT("<br>"));
1204 PageData.append(wxT("<table>"));
1205 PageData.append(DataLines);
1206 PageData.append(wxT("</table>"));
1212 ContactData = vCardObj->GetByPartial(wxT("GEO"));
1214 DataDisplay = FALSE;
1217 if (ContactData.PropCount > 0){
1221 for (int i = 0; i < ContactData.PropCount; i++){
1223 GeoLine = ContactData.PropValues[i];
1225 wxStringTokenizer GeoSplit(GeoLine, wxT(":"));
1227 GeoLine = GeoSplit.GetNextToken();
1229 if (GeoSplit.HasMoreTokens()){
1231 GeoLine = GeoSplit.GetNextToken();
1236 CaptureString(&GeoLine, FALSE);
1237 ConvertToHTML(&GeoLine);
1239 DataLines.append(wxT("<tr><td><b>"));
1240 DataLines.append(_("Geoposition:"));
1241 DataLines.append(wxT(" </b></td><td>"));
1242 DataLines.append(GeoLine);
1243 DataLines.append(wxT("</td></tr>"));
1251 if (DataDisplay == TRUE){
1254 PageData.append(wxT("<h4>"));
1255 PageData.append(_("Geopositioning"));
1256 PageData.append(wxT("</h4>"));
1257 PageData.append(wxT("<br>"));
1258 PageData.append(wxT("<table>"));
1259 PageData.append(DataLines);
1260 PageData.append(wxT("</table>"));
1266 ContactData = vCardObj->GetByPartial(wxT("TITLE"));
1268 DataDisplay = FALSE;
1271 if (ContactData.PropCount > 0){
1275 for (int i = 0; i < ContactData.PropCount; i++){
1277 TitleLine = ContactData.PropValues[i];
1280 CaptureString(&TitleLine, FALSE);
1281 ConvertToHTML(&TitleLine);
1283 DataLines.append(wxT("<tr><td><b>"));
1284 DataLines.append(_("Title:"));
1285 DataLines.append(wxT(" </b></td><td>"));
1286 DataLines.append(TitleLine);
1287 DataLines.append(wxT("</td></tr>"));
1295 if (DataDisplay == TRUE){
1298 PageData.append(wxT("<h4>"));
1299 PageData.append(_("Titles"));
1300 PageData.append(wxT("</h4>"));
1301 PageData.append(wxT("<br>"));
1302 PageData.append(wxT("<table>"));
1303 PageData.append(DataLines);
1304 PageData.append(wxT("</table>"));
1310 ContactData = vCardObj->GetByPartial(wxT("ROLE"));
1312 DataDisplay = FALSE;
1315 if (ContactData.PropCount > 0){
1319 for (int i = 0; i < ContactData.PropCount; i++){
1321 RoleLine = ContactData.PropValues[i];
1324 CaptureString(&RoleLine, FALSE);
1325 ConvertToHTML(&RoleLine);
1327 DataLines.append(wxT("<tr><td><b>"));
1328 DataLines.append(_("Role:"));
1329 DataLines.append(wxT(" </b></td><td>"));
1330 DataLines.append(RoleLine);
1331 DataLines.append(wxT("</td></tr>"));
1339 if (DataDisplay == TRUE){
1342 PageData.append(wxT("<h4>"));
1343 PageData.append(_("Roles"));
1344 PageData.append(wxT("</h4>"));
1345 PageData.append(wxT("<br>"));
1346 PageData.append(wxT("<table>"));
1347 PageData.append(DataLines);
1348 PageData.append(wxT("</table>"));
1354 ContactData = vCardObj->GetByPartial(wxT("ORG"));
1356 DataDisplay = FALSE;
1359 if (ContactData.PropCount > 0){
1363 for (int i = 0; i < ContactData.PropCount; i++){
1365 OrgLine = ContactData.PropValues[i];
1368 CaptureString(&OrgLine, FALSE);
1369 ConvertToHTML(&OrgLine);
1371 DataLines.append(wxT("<tr><td><b>"));
1372 DataLines.append(_("Organisation:"));
1373 DataLines.append(wxT(" </b></td><td>"));
1374 DataLines.append(OrgLine);
1375 DataLines.append(wxT("</td></tr>"));
1383 if (DataDisplay == TRUE){
1386 PageData.append(wxT("<h4>"));
1387 PageData.append(_("Organisations"));
1388 PageData.append(wxT("</h4>"));
1389 PageData.append(wxT("<br>"));
1390 PageData.append(wxT("<table>"));
1391 PageData.append(DataLines);
1392 PageData.append(wxT("</table>"));
1398 ContactData = vCardObj->GetByPartial(wxT("CATEGORIES"));
1400 DataDisplay = FALSE;
1403 if (ContactData.PropCount > 0){
1407 for (int i = 0; i < ContactData.PropCount; i++){
1409 CatLine = ContactData.PropValues[i];
1412 CaptureString(&CatLine, FALSE);
1413 ConvertToHTML(&CatLine);
1415 DataLines.append(wxT("<tr><td><b>"));
1416 DataLines.append(_("Category:"));
1417 DataLines.append(wxT(" </b></td><td>"));
1418 DataLines.append(CatLine);
1419 DataLines.append(wxT("</td></tr>"));
1427 if (DataDisplay == TRUE){
1430 PageData.append(wxT("<h4>"));
1431 PageData.append(_("Categories"));
1432 PageData.append(wxT("</h4>"));
1433 PageData.append(wxT("<br>"));
1434 PageData.append(wxT("<table>"));
1435 PageData.append(DataLines);
1436 PageData.append(wxT("</table>"));
1444 // Calendar Addresses
1446 ContactData = vCardObj->GetByPartial(wxT("CALURI"));
1448 DataDisplay = FALSE;
1451 if (ContactData.PropCount > 0){
1453 wxString CalURILine;
1455 for (int i = 0; i < ContactData.PropCount; i++){
1457 CalURILine = ContactData.PropValues[i];
1460 CaptureString(&CalURILine, FALSE);
1461 ConvertToHTML(&CalURILine);
1463 DataLines.append(wxT("<tr><td><b>"));
1464 DataLines.append(_("Calendar Address:"));
1465 DataLines.append(wxT(" </b></td><td>"));
1466 DataLines.append(CalURILine);
1467 DataLines.append(wxT("</td></tr>"));
1475 if (DataDisplay == TRUE){
1478 PageData.append(wxT("<h4>"));
1479 PageData.append(_("Calendar Addresses"));
1480 PageData.append(wxT("</h4>"));
1481 PageData.append(wxT("<br>"));
1482 PageData.append(wxT("<table>"));
1483 PageData.append(DataLines);
1484 PageData.append(wxT("</table>"));
1488 // Calendar Request Addresses
1490 ContactData = vCardObj->GetByPartial(wxT("CALADRURI"));
1492 DataDisplay = FALSE;
1495 if (ContactData.PropCount > 0){
1497 wxString CalAdrURILine;
1499 for (int i = 0; i < ContactData.PropCount; i++){
1501 CalAdrURILine = ContactData.PropValues[i];
1503 CalAdrURILine.Trim();
1504 CaptureString(&CalAdrURILine, FALSE);
1505 ConvertToHTML(&CalAdrURILine);
1507 DataLines.append(wxT("<tr><td><b>"));
1508 DataLines.append(_("Calendar Request Address:"));
1509 DataLines.append(wxT(" </b></td><td>"));
1510 DataLines.append(CalAdrURILine);
1511 DataLines.append(wxT("</td></tr>"));
1519 if (DataDisplay == TRUE){
1522 PageData.append(wxT("<h4>"));
1523 PageData.append(_("Calendar Request Addresses"));
1524 PageData.append(wxT("</h4>"));
1525 PageData.append(wxT("<br>"));
1526 PageData.append(wxT("<table>"));
1527 PageData.append(DataLines);
1528 PageData.append(wxT("</table>"));
1532 // Free/Busy Addresses
1534 ContactData = vCardObj->GetByPartial(wxT("FBURL"));
1536 DataDisplay = FALSE;
1539 if (ContactData.PropCount > 0){
1543 for (int i = 0; i < ContactData.PropCount; i++){
1545 FBURLLine = ContactData.PropValues[i];
1548 CaptureString(&FBURLLine, FALSE);
1549 ConvertToHTML(&FBURLLine);
1551 DataLines.append(wxT("<tr><td><b>"));
1552 DataLines.append(_("Free/Busy Address:"));
1553 DataLines.append(wxT(" </b></td><td>"));
1554 DataLines.append(FBURLLine);
1555 DataLines.append(wxT("</td></tr>"));
1563 if (DataDisplay == TRUE){
1566 PageData.append(wxT("<h4>"));
1567 PageData.append(_("Free/Busy Addresses"));
1568 PageData.append(wxT("</h4>"));
1569 PageData.append(wxT("<br>"));
1570 PageData.append(wxT("<table>"));
1571 PageData.append(DataLines);
1572 PageData.append(wxT("</table>"));
1578 ContactData = vCardObj->GetByPartial(wxT("NOTE"));
1580 DataDisplay = FALSE;
1583 if (ContactData.PropCount > 0){
1587 for (int i = 0; i < ContactData.PropCount; i++){
1589 NoteLine = ContactData.PropValues[i];
1592 CaptureString(&NoteLine, FALSE);
1593 ConvertToHTML(&NoteLine);
1595 DataLines.append(wxT("<tr><td><b>"));
1596 DataLines.append(_("Note:"));
1597 DataLines.append(wxT(" </b></td><td>"));
1598 DataLines.append(NoteLine);
1599 DataLines.append(wxT("</td></tr>"));
1607 if (DataDisplay == TRUE){
1609 PageData.append(wxT("<h4>"));
1610 PageData.append(_("Notes"));
1611 PageData.append(wxT("</h4>"));
1612 PageData.append(wxT("<br>"));
1613 PageData.append(wxT("<table>"));
1614 PageData.append(DataLines);
1615 PageData.append(wxT("</table>"));
1619 // Display the HTML document on the screen.
1621 PageData.append("</td></tr></table>");
1623 PageData.append(wxT("</body>"));
1624 PageData.append(wxT("</html>"));
1626 HTMLObj->SetPage(PageData);
1630 void SplitPropertyData(wxString *PropertyLine,
1631 std::map<int,int> *SplitPoints,
1632 std::map<int,int> *SplitLength,
1634 std::map<wxString,wxString> *SplitData){
1636 // Split the property data into SplitData.
1639 wxStringTokenizer PropertyElement;
1640 wxString PropertyName;
1641 wxString PropertyValue;
1642 int intPropertyLen = PropertyLine->Len();
1643 int intSplitsFound = 0;
1644 int intSplitSize = 0;
1645 int intSplitSeek = (intSize - 1);
1647 for (int i = intSize; i <= intPropertyLen; i++){
1651 if (PropertyLine->Mid(i, 1) == wxT(";") &&
1652 PropertyLine->Mid((i - 1), 1) != wxT("\\")){
1654 if (intSplitsFound == 0){
1656 DataStr = PropertyLine->Mid(intSplitSeek, (intSplitSize));
1657 SplitLength->insert(std::make_pair(intSplitsFound, (intSplitSize)));
1661 DataStr = PropertyLine->Mid(intSplitSeek, (intSplitSize - 1));
1662 SplitLength->insert(std::make_pair(intSplitsFound, (intSplitSize - 1)));
1666 SplitPoints->insert(std::make_pair(intSplitsFound, (i + 1)));
1669 intSplitSeek = (i + 1);
1672 if (!DataStr.IsEmpty()){
1674 PropertyElement.SetString(DataStr, wxT("="));
1675 PropertyName = PropertyElement.GetNextToken();
1676 PropertyValue = PropertyElement.GetNextToken();
1677 SplitData->insert(std::make_pair(PropertyName, PropertyValue));
1682 PropertyName.clear();
1683 PropertyValue.clear();
1689 if (intSplitsFound == 0){
1691 DataStr = PropertyLine->Mid(intSplitSeek, (intSplitSize));
1693 SplitPoints->insert(std::make_pair(intSplitsFound, (8 + 1)));
1694 SplitLength->insert(std::make_pair(intSplitsFound, intSplitSize));
1698 DataStr = PropertyLine->Mid(intSplitSeek, (intSplitSize - 1));
1700 SplitPoints->insert(std::make_pair(intSplitsFound, (intSplitSeek + 1)));
1701 SplitLength->insert(std::make_pair(intSplitsFound, intSplitSize));
1705 if (!DataStr.IsEmpty()){
1707 PropertyElement.SetString(DataStr, wxT("="));
1708 PropertyName = PropertyElement.GetNextToken();
1709 PropertyValue = PropertyElement.GetNextToken();
1710 SplitData->insert(std::make_pair(PropertyName, PropertyValue));