bool iCalConverter::convert(WString& errorDescription, long* errorCode) { errorDescription = TEXT(""); *errorCode = ERROR_SUCCESS; if(!calendar && !iCalendar) return false; if(calendar && iCalendar) return true; if(calendar) { iCalendar = calendar->toString(); if(!calendar->getProdID() || !calendar->getProdID()->getValue()) { *errorCode = ERROR_KEY_PROPERTY_MISSING; errorDescription = TEXT("'PRODID' property is missing"); delete [] iCalendar; iCalendar = NULL; return false; } if(!calendar->getVersion() || !calendar->getVersion()->getValue()) { *errorCode = ERROR_KEY_PROPERTY_MISSING; errorDescription = TEXT("'VERSION' property is missing"); delete [] iCalendar; iCalendar = NULL; return false; } if(calendar->getEvents()) for(int i=0; i<calendar->getEvents()->size(); i++) if(!validateEvent(((Event*)calendar->getEvents()->get(i)), errorDescription, errorCode)) { delete [] iCalendar; iCalendar = NULL; return false; } if(calendar->getToDos()) for(int i=0; i<calendar->getToDos()->size(); i++) if(!validateTodo(((ToDo*)calendar->getToDos()->get(i)), errorDescription, errorCode)) { delete [] iCalendar; iCalendar = NULL; return false; } return true; } if (iCalendar) { calendar = new Calendar(); VObject* vo = VConverter::parse(iCalendar); if(!vo) { *errorCode = ERROR_PARSING_ERROR; errorDescription = TEXT("Invalid VObject returned"); return false; } int n = vo->propertiesCount(); if(wcscmp(vo->getProperty(0)->getName(), TEXT("BEGIN")) || !vo->getProperty(0)->getValue() || wcscmp(vo->getProperty(0)->getValue(), TEXT("VCALENDAR"))) { *errorCode = ERROR_KEY_PROPERTY_MISSING; errorDescription = TEXT("'BEGIN:VCALENDAR' property is missing"); return false; } if(wcscmp(vo->getProperty(n-1)->getName(), TEXT("END")) || !vo->getProperty(n-1)->getValue() || wcscmp(vo->getProperty(n-1)->getValue(), TEXT("VCALENDAR"))) { *errorCode = ERROR_KEY_PROPERTY_MISSING; errorDescription = TEXT("'END:VCALENDAR' property is missing"); return false; } if(!vo->containsProperty(TEXT("VERSION"))) { *errorCode = ERROR_KEY_PROPERTY_MISSING; errorDescription = TEXT("'VERSION' property is missing"); return false; } if(vo->containsProperty(TEXT("VERSION")) && (!vo->getProperty(TEXT("VERSION")) || wcscmp(vo->getProperty(TEXT("VERSION"))->getValue(), TEXT("2.0")))) { *errorCode = ERROR_ILLEGAL_VERSION_NUMBER; if(vo->getProperty(TEXT("VERSION"))) { errorDescription = TEXT("Illegal version number : "); errorDescription += vo->getProperty(TEXT("VERSION"))->getValue(); } else { errorDescription = TEXT("Illegal version number"); } return false; } else { iCalProperty* prop = new iCalProperty(vo->getProperty(TEXT("VERSION"))->getValue()); calendar->setVersion(*prop); vo->removeProperty(TEXT("VERSION")); delete prop; } if(!vo->containsProperty(TEXT("PRODID")) || !vo->getProperty(TEXT("PRODID"))) { *errorCode = ERROR_KEY_PROPERTY_MISSING; errorDescription = TEXT("'PRODID' property is missing"); return false; } else { iCalProperty* prop = new iCalProperty(vo->getProperty(TEXT("PRODID"))->getValue()); calendar->setProdID(*prop); vo->removeProperty(TEXT("PRODID")); delete prop; } if(vo->containsProperty(TEXT("CALSCALE")) || vo->getProperty(TEXT("CALSCALE"))) { iCalProperty* prop = new iCalProperty(vo->getProperty(TEXT("CALSCALE"))->getValue()); calendar->setCalScale(*prop); vo->removeProperty(TEXT("CALSCALE")); delete prop; } if(vo->containsProperty(TEXT("METHOD")) || vo->getProperty(TEXT("METHOD"))) { iCalProperty* prop = new iCalProperty(vo->getProperty(TEXT("METHOD"))->getValue()); calendar->setMethod(*prop); vo->removeProperty(TEXT("METHOD")); delete prop; } //extract VEVENTs from vo Event* ev; while((ev = extractEvent(vo, errorDescription, errorCode))) { if (!validateEvent(ev, errorDescription, errorCode)) { delete ev; ev = NULL; return false; } calendar->addEvent(ev); delete ev; ev = NULL; } //extract VTODOs from vo ToDo* task; while((task = extractTask(vo, errorDescription, errorCode))) { if (!validateTodo(task, errorDescription, errorCode)) { delete task; task = NULL; return false; } calendar->addToDo(task); delete task; task = NULL; } } return true; }
// // Parse a vCard string and fills the propertyMap. // int WinContact::parse(const wstring dataString) { int businessTel = 0; int homeTel = 0; int imAddress = 0; WCHAR* name = NULL; WCHAR* element = NULL; // // Parse the vCard and fill the VObject. // ------------------------------------- // VObject* vo = VConverter::parse(dataString.c_str()); if (!vo) { //sprintf(lastErrorMsg, ERR_ITEM_VOBJ_PARSE); setError(1, ERR_ITEM_VOBJ_PARSE); LOG.error("%s", getLastErrorMsg()); return 1; } // Check if VObject type and version are the correct ones. if (!checkVCardTypeAndVersion(vo)) { if (vo) delete vo; return 1; } // // Conversion: vObject -> WinContact. // ---------------------------------- // Note: only properties found are added to the propertyMap, so that the // map will contain only properties effectively received. // propertyMap.clear(); for(int i=0; i < vo->propertiesCount(); i++) { VProperty* vp = vo->getProperty(i); name = vp->getName(); element = vp->getValue(0); // the first value of the property. if(!wcscmp(name, L"N")) { if(element = vp->getPropComponent(1)) setProperty(L"LastName", element); if(element = vp->getPropComponent(2)) setProperty(L"FirstName", element); if(element = vp->getPropComponent(3)) setProperty(L"MiddleName", element); if(element = vp->getPropComponent(4)) setProperty(L"Title", element); if(element = vp->getPropComponent(5)) setProperty(L"Suffix", element); } else if(!wcscmp(name, L"BDAY")) { setProperty(L"Birthday", element); } else if(!wcscmp(name, L"NOTE")) { setProperty(L"Body", element); } else if(!wcscmp(name, L"CLASS")) { WCHAR tmp[10]; if( !wcscmp(element, TEXT("PRIVATE" )) || !wcscmp(element, TEXT("CONFIDENTIAL")) ) { wsprintf(tmp, TEXT("%i"), winPrivate); // Private = 2 } else { wsprintf(tmp, TEXT("%i"), winNormal); // Normal = 0 } setProperty(L"Sensitivity", tmp); } else if(!wcscmp(name, L"CATEGORIES")) { setProperty(L"Categories", element); } else if(!wcscmp(name, L"EMAIL")) { // Mapping is: // Email1Address <-> EMAIL;INTERNET: // Email2Address <-> EMAIL;INTERNET;HOME: // Email3Address <-> EMAIL;INTERNET;WORK: if (vp->containsParameter(L"HOME")) { if (vp->containsParameter(L"X-FUNAMBOL-INSTANTMESSENGER")) { if (imAddress == 0) { setProperty(L"IMAddress", element); imAddress ++; } else if (imAddress == 1) { setProperty(L"IM2Address", element); imAddress ++; } else { setProperty(L"IM3Address", element); } } else { setProperty(L"Email2Address", element); // TODO: check the parameter value (not used now, always SMTP) if (wcslen(element) > 0) { setProperty(L"Email2AddressType", L"SMTP"); } else { setProperty(L"Email2AddressType", L""); } } } else if (vp->containsParameter(L"WORK")) { setProperty(L"Email3Address", element); // TODO: check the parameter value (not used now, always SMTP) if (wcslen(element) > 0) { setProperty(L"Email3AddressType", L"SMTP"); } else { setProperty(L"Email3AddressType", L""); } } else { setProperty(L"Email1Address", element); // TODO: check the parameter value (not used now, always SMTP) if (wcslen(element) > 0) { setProperty(L"Email1AddressType", L"SMTP"); } else { setProperty(L"Email1AddressType", L""); } } } else if(!wcscmp(name, L"FN")) { setProperty(L"FileAs", element); } else if(!wcscmp(name, L"NICKNAME")) { setProperty(L"NickName", element); } else if(!wcscmp(name, L"PRIORITY")) { setProperty(L"Importance", element); } else if(!wcscmp(name, L"ORG")) { if(element = vp->getPropComponent(1)) setProperty(L"CompanyName", element); if(element = vp->getPropComponent(2)) setProperty(L"Department", element); if(element = vp->getPropComponent(3)) setProperty(L"OfficeLocation", element); } else if(!wcscmp(name, L"ROLE")) { setProperty(L"Profession", element); } // // ---- Telephone fields ---- // else if(!wcscmp(name, L"TEL")) { if(vp->containsParameter(L"WORK")) { if (vp->containsParameter(L"FAX")) { setProperty(L"BusinessFaxNumber", element); } else if (vp->containsParameter(L"PREF")) { setProperty(L"CompanyMainTelephoneNumber", element); } else { // default, would be "else if (vp->containsParameter(L"VOICE"))" if(businessTel == 0) { setProperty(L"BusinessTelephoneNumber", element); businessTel++; } else{ setProperty(L"Business2TelephoneNumber", element); } } } else if (vp->containsParameter(L"CAR")) { setProperty(L"CarTelephoneNumber", element); } else if(vp->containsParameter(L"HOME")) { if(vp->containsParameter(L"FAX")) { setProperty(L"HomeFaxNumber", element); } else { // default, would be "else if (vp->containsParameter(L"VOICE"))" if(homeTel == 0) { setProperty(L"HomeTelephoneNumber", element); homeTel++; } else { setProperty(L"Home2TelephoneNumber", element); } } } else if (vp->containsParameter(L"CELL")) { setProperty(L"MobileTelephoneNumber", element); } else if (vp->containsParameter(L"FAX")) { setProperty(L"OtherFaxNumber", element); } else if(vp->containsParameter(L"PAGER")) { setProperty(L"PagerNumber", element); } else if (vp->containsParameter(L"PREF")) { setProperty(L"PrimaryTelephoneNumber", element); } else if(vp->containsParameter(L"X-FUNAMBOL-CALLBACK")) { setProperty(L"CallbackTelephoneNumber", element); } else if(vp->containsParameter(L"X-FUNAMBOL-RADIO")) { setProperty(L"RadioTelephoneNumber", element); } else if(vp->containsParameter(L"X-FUNAMBOL-TELEX")) { setProperty(L"TelexNumber", element); } else { // default, would be "else if (vp->containsParameter(L"VOICE"))" setProperty(L"OtherTelephoneNumber", element); } } else if(!wcscmp(name, L"TITLE")) { setProperty(L"JobTitle", element); } else if(!wcscmp(name, L"PHOTO")) { setProperty(L"Photo", element); // Photo type is ignored } // // ---- URL fields ---- // else if(!wcscmp(name, L"URL")) { if (vp->containsParameter(L"WORK")) { setProperty(L"BusinessWebPage", element); } else if(vp->containsParameter(L"HOME")) { setProperty(L"HomeWebPage", element); } else { setProperty(L"WebPage", element); } } // // ---- ADR fields ---- // else if(!wcscmp(name, L"ADR")) { if(vp->containsParameter(L"HOME")) { if(element = vp->getPropComponent(1)) setProperty(L"HomeAddressPostOfficeBox", element); if(element = vp->getPropComponent(2)) setProperty(L"HomeAddressExtended", element); if(element = vp->getPropComponent(3)) setProperty(L"HomeAddressStreet", element); if(element = vp->getPropComponent(4)) setProperty(L"HomeAddressCity", element); if(element = vp->getPropComponent(5)) setProperty(L"HomeAddressState", element); if(element = vp->getPropComponent(6)) setProperty(L"HomeAddressPostalCode", element); if(element = vp->getPropComponent(7)) setProperty(L"HomeAddressCountry", element); } else if(vp->containsParameter(L"WORK")) { if(element = vp->getPropComponent(1)) setProperty(L"BusinessAddressPostOfficeBox", element); if(element = vp->getPropComponent(2)) setProperty(L"BusinessAddressExtended", element); if(element = vp->getPropComponent(3)) setProperty(L"BusinessAddressStreet", element); if(element = vp->getPropComponent(4)) setProperty(L"BusinessAddressCity", element); if(element = vp->getPropComponent(5)) setProperty(L"BusinessAddressState", element); if(element = vp->getPropComponent(6)) setProperty(L"BusinessAddressPostalCode", element); if(element = vp->getPropComponent(7)) setProperty(L"BusinessAddressCountry", element); } else { if(element = vp->getPropComponent(1)) setProperty(L"OtherAddressPostOfficeBox", element); if(element = vp->getPropComponent(2)) setProperty(L"OtherAddressExtended", element); if(element = vp->getPropComponent(3)) setProperty(L"OtherAddressStreet", element); if(element = vp->getPropComponent(4)) setProperty(L"OtherAddressCity", element); if(element = vp->getPropComponent(5)) setProperty(L"OtherAddressState", element); if(element = vp->getPropComponent(6)) setProperty(L"OtherAddressPostalCode", element); if(element = vp->getPropComponent(7)) setProperty(L"OtherAddressCountry", element); } } // // ---- Funambol defined properties ---- // else if(!wcscmp(name, L"X-ANNIVERSARY")) { setProperty(L"Anniversary", element); } else if(!wcscmp(name, L"X-FUNAMBOL-BILLINGINFO")) { setProperty(L"BillingInformation", element); } else if(!wcscmp(name, L"X-FUNAMBOL-CHILDREN")) { setProperty(L"Children", element); } else if(!wcscmp(name, L"X-FUNAMBOL-COMPANIES")) { setProperty(L"Companies", element); } else if(!wcscmp(name, L"X-FUNAMBOL-CUSTOMERID")) { setProperty(L"CustomerID", element); } else if(!wcscmp(name, L"X-FUNAMBOL-FOLDER")) { setProperty(L"Folder", element); } else if(!wcscmp(name, L"X-FUNAMBOL-GENDER")) { setProperty(L"Gender", element); } else if(!wcscmp(name, L"X-FUNAMBOL-GOVERNMENTID")) { setProperty(L"GovernmentIDNumber", element); } else if(!wcscmp(name, L"X-FUNAMBOL-HOBBIES")) { setProperty(L"Hobby", element); } else if(!wcscmp(name, L"X-FUNAMBOL-INITIALS")) { setProperty(L"Initials", element); } else if(!wcscmp(name, L"X-FUNAMBOL-LANGUAGES")) { setProperty(L"Language", element); } else if(!wcscmp(name, L"X-MANAGER")) { setProperty(L"ManagerName", element); } else if(!wcscmp(name, L"X-FUNAMBOL-MILEAGE")) { setProperty(L"Mileage", element); } else if(!wcscmp(name, L"X-FUNAMBOL-ORGANIZATIONALID")) { setProperty(L"OrganizationalIDNumber", element); } else if(!wcscmp(name, L"X-SPOUSE")) { setProperty(L"Spouse", element); } else if(!wcscmp(name, L"X-FUNAMBOL-SUBJECT")) { setProperty(L"Subject", element); } else if(!wcscmp(name, L"X-FUNAMBOL-TELEX")) { setProperty(L"TelexNumber", element); } else if(!wcscmp(name, L"X-FUNAMBOL-YOMICOMPANYNAME")) { setProperty(L"YomiCompanyName", element); } else if(!wcscmp(name, L"X-FUNAMBOL-YOMIFIRSTNAME")) { setProperty(L"YomiFirstName", element); } else if(!wcscmp(name, L"X-FUNAMBOL-YOMILASTNAME")) { setProperty(L"YomiLastName", element); } else { // Property not supported: log a warning? } } if (vo) { delete vo; vo = NULL; } return 0; }