Beispiel #1
0
VObject* VObject::StaticAllocateObject(const VClass* InClass, FName InName)
{
	if( !InClass )
	{
		debugf(TEXT("Invalid class for object %s"), InName.toString().c_str());
		return NULL;
	}

	VObject* Obj = NULL;
	if( InName == NAME_None )
	{
		InName = MakeUniqueObjectName(InClass);
	}
	else
	{
		Obj = StaticFindObject(InClass, InName);
	}

	if( Obj == NULL )
	{
		(*InClass->_ClassStaticConstructor)(&Obj);

		Obj->_Index = INDEX_NONE;
		Obj->_HashNext = NULL;
		Obj->_Name = InName;

		Obj->AddObject(INDEX_NONE);
	}

	return Obj;
}
Beispiel #2
0
VObject* VObject::StaticFindObject(const VClass* InClass, FName ObjectName, UBOOL bExactClass)
{
	INT iHash = GetObjectHash(ObjectName);
	for(VObject* Hash = _GObjHash[iHash]; Hash; Hash = Hash->_HashNext)
	{
		if( Hash->GetFName() == ObjectName 
			&& (InClass == NULL || bExactClass ? Hash->GetClass() == InClass : Hash->IsKindOf(InClass)) )
		{
			return Hash;
		}
	}

	return NULL;
}
Beispiel #3
0
QObject* VFactory::createObjectByDefaultDoc(const QString& path)
{
  VXmlDoc& doc = VXmlDoc::instance();
  VXml xml = doc.root().findChilds(path);
  if (xml.isNull()) return NULL;

  QString className = xml.getStr("_class", "");
  if (className == "")
  {
    return NULL;
  }
  VObject* obj = dynamic_cast<VObject*>(VFactory::instance().createObjectByClassName(className));
  if (obj == NULL)
  {
    return NULL;
  }
  obj->load(xml);
  return obj;
}
Beispiel #4
0
// This would be called recursively by DoAction Tag
/////////////////////////////////////////////////////////////////
//// Call the real action handler function according to the ActionCode
////////////////////////////////////////////////////////////////
int ActionHandler::parse(Action *action, SWFParser *parser, VObject &actionObject)
{
	unsigned int ActionCode, Length;
	
	ActionCode	= action->ActionCode;
	Length      = action->Length;
    
    //parser->dump(16);
    
	if (ActionCode > ACTIONCODE_MAX) {
		DEBUGMSG("Obfuscated ActionCode = %d\n", ActionCode);
        actionObject.setTypeInfo("Unknown ActionCode");
        parser->skip(Length);
        return FALSE;
	}
    
    actionObject.setTypeInfo(actionHandlerInfo[ActionCode].name);
    
    DEBUGMSG("ActionCode : %d, /* %s */\nLength : %d%c\n", ActionCode, actionHandlerInfo[ActionCode].name  ,Length, Length ? ',' : ' ');	
	
    
	if(actionHandlerInfo[ActionCode].handler) {
		actionHandlerInfo[ActionCode].handler(action, parser, actionObject);
		DEBUGMSG("\n");
        if (parser->getStreamPos() != action->NextActionPos) {
#ifdef DEBUG
            DEBUGMSG("ActionHeaderOffset = %d, parser pos = %d, NextActionPos = %d\n", action->ActionHeaderOffset, parser->getStreamPos(), action->NextActionPos);
            parser->seek(action->ActionHeaderOffset);
            parser->dump(action->ActionHeaderLength + action->Length);
            ASSERT (1);
#else
            parser->seek(action->NextActionPos);
#endif
        }
		return TRUE;	// Action is handled.
	}
	
    if (Length)
        ASSERT(1);

	parser->skip(Length);
	return FALSE; // Action is not handled.
}
Beispiel #5
0
USE_NAMESPACE


VObject* VConverter::parse(const WCHAR* buffer) {

    if(!buffer) {
        return NULL;
    }

    WCHAR *objType = extractObjectType(buffer);
    WCHAR *objVersion = extractObjectVersion(buffer);
    if(!objType)
        return NULL;

    VObject* vo = VObjectFactory::createInstance(objType, objVersion);
    VProperty *prop;

    // Unfolding
    WCHAR* buffCopy = unfolding(buffer);

    while ( true ) {
        prop = readFieldHeader(buffCopy);
        if (!prop) {
            break;
        }
        if ( readFieldBody(buffCopy, prop )) {
            vo->addProperty(prop);
        }
        delete prop;
    }

    if(objType)    { delete [] objType;    objType    = NULL; }
    if(objVersion) { delete [] objVersion; objVersion = NULL; }
    if (buffCopy)  { delete [] buffCopy;   buffCopy   = NULL; }

    return vo;
}
Beispiel #6
0
// Format and return a vNote string from the propertyMap.
wstring& WinNote::toString() {

    vNote = L"";

    //
    // Conversion: WinNote -> vObject.
    // -------------------------------
    //
    VObject* vo = new VObject();
    VProperty* vp  = NULL;
    wstring element;

    vp = new VProperty(TEXT("BEGIN"), TEXT("VNOTE"));
    vo->addProperty(vp);
    delete vp; vp = NULL;

    vp = new VProperty(TEXT("VERSION"), VNOTE_VERSION);
    vo->addProperty(vp);
    delete vp; vp = NULL;


    // Folder path.
    if (getProperty(L"Folder", element)) {
        vp = new VProperty(L"X-FUNAMBOL-FOLDER");
        vp->addValue(element.c_str());
        vo->addProperty(vp);
        delete vp; vp = NULL;
    }

    if (getProperty(L"Subject", element)) {
        vp = new VProperty(TEXT("SUMMARY"), element.c_str());
        vo->addProperty(vp);
        delete vp; vp = NULL;
    }
    if (getProperty(L"Body", element)) {
        vp = new VProperty(TEXT("BODY"), element.c_str());
        vo->addProperty(vp);
        delete vp; vp = NULL;
    }
    if (getProperty(L"Categories", element)) {
        vp = new VProperty(TEXT("CATEGORIES"), element.c_str());
        vo->addProperty(vp);
        delete vp; vp = NULL;
    }


    //
    // ---- Other Funambol defined properties ----
    // Support for other fields that don't have a
    // specific correspondence in vCalendar.
    if (getProperty(L"Color", element)) {
        long color = _wtoi(element.c_str());
        vp = new VProperty(TEXT("X-FUNAMBOL-COLOR"));

        if (color < 0 || color >= NUM_NOTE_COLOR) {
            color = 1;  // Default = yellow.
        }
        vp->addValue(colorName[color]);

        vo->addProperty(vp);
        delete vp; vp = NULL;
    }


    bool found = false;
    vp = new VProperty(TEXT("X-FUNAMBOL-POSITION"));
    if (getProperty(L"Top", element)) {
        found = true;
        vp->addValue(element.c_str());
    }
    if (getProperty(L"Left", element)) {
        found = true;
        vp->addValue(element.c_str());
    }
    if (getProperty(L"Height", element)) {
        found = true;
        vp->addValue(element.c_str());
    }
    if (getProperty(L"Width", element)) {
        found = true;
        vp->addValue(element.c_str());
    }
    if (found) {
        vo->addProperty(vp);
    }
    delete vp; vp = NULL;


    vp = new VProperty(TEXT("END"), TEXT("VNOTE"));
    vo->addProperty(vp);
    delete vp; vp = NULL;


    //
    // Format the vNote.
    // -----------------
    //
    WCHAR* tmp = vo->toString();
    if (tmp) {
        vNote = tmp;
        delete [] tmp;
    }
    return vNote;
}
Beispiel #7
0
//
// Parse a vNote string and fills the propertyMap.
//
int WinNote::parse(const wstring dataString) {

    WCHAR* element = NULL;

    //
    // Parse the vNote and fill the VObject.
    // -----------------------------------------
    //
    VObject* vo = VConverter::parse(dataString.c_str());
    if (!vo) {
        setError(1, ERR_ITEM_VOBJ_PARSE);
        LOG.error("%s", getLastErrorMsg());
        return 1;
    }
    // Check if VObject type and version are the correct ones.
    if (!checkVNoteTypeAndVersion(vo)) {
        if (vo) delete vo;
        return 1;
    }


    //
    // Conversion: vObject -> WinNote.
    // -------------------------------
    // Note: properties found are added to the propertyMap, so that the 
    //       map will contain only parsed properties after this process.
    //
    if (element = getVObjectPropertyValue(vo, L"SUMMARY")) {
        setProperty(L"Subject", element);
    }
    if (element = getVObjectPropertyValue(vo, L"BODY")) {
        setProperty(L"Body", element);
    }
    if (element = getVObjectPropertyValue(vo, L"CATEGORIES")) {
        setProperty(L"Categories", element);
    }
    if (element = getVObjectPropertyValue(vo, L"X-FUNAMBOL-FOLDER")) {
        setProperty(L"Folder", element);
    }


    //
    // ---- Other Funambol defined properties ----
    // Support for other fields that don't have a
    // specific correspondence in vNote.
    if (element = getVObjectPropertyValue(vo, L"X-FUNAMBOL-COLOR")) {
        WCHAR tmp[10];
        int i=0;
        for (i=0; i<NUM_NOTE_COLOR; i++) {
            if (!wcscmp(colorName[i], element)) { break; }
        }
        if (i == NUM_NOTE_COLOR) { 
            i = 1;      // Default = yellow
        }
        wsprintf(tmp, TEXT("%i"), i);
        setProperty(L"Color", tmp);
    }

    if (element = getVObjectPropertyValue(vo, L"X-FUNAMBOL-POSITION")) {
        VProperty* vp = vo->getProperty(TEXT("X-FUNAMBOL-POSITION"));
        element = vp->getPropComponent(1);  
        if (element && wcslen(element)>0)  { setProperty(L"Top", element);    }
        element = vp->getPropComponent(2);  
        if (element && wcslen(element)>0)  { setProperty(L"Left", element);   }
        element = vp->getPropComponent(3);  
        if (element && wcslen(element)>0)  { setProperty(L"Height", element); }
        element = vp->getPropComponent(4);  
        if (element && wcslen(element)>0)  { setProperty(L"Width", element);  }
    }

    return 0;
}
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;
}
//
// Format and return a vCard string from the propertyMap.
//
wstring& WinContact::toString() {

    vCard = L"";

    //
    // Conversion: WinContact -> vObject.
    // ----------------------------------
    //
    VObject* vo = new VObject();
    wstring element;
    VProperty* vp = NULL;
    bool found = false;


    vp = new VProperty(L"BEGIN", L"VCARD");
    vo->addProperty(vp);
    delete vp; vp = NULL;

    vp = new VProperty(L"VERSION", VCARD_VERSION);
    vo->addProperty(vp);
    delete vp; vp = NULL;
        
    // ------- Name -------
    // Add only if at least 1 property is supported, but include 
    // all elements in the right order.
    found = false;
    vp = new VProperty(L"N");
    if (getProperty(L"LastName",   element))  found = true;
    vp->addValue(element.c_str());
    if (getProperty(L"FirstName",  element))  found = true;
    vp->addValue(element.c_str());
    if (getProperty(L"MiddleName", element))  found = true;  
    vp->addValue(element.c_str());
    if (getProperty(L"Title",      element))  found = true;  
    vp->addValue(element.c_str());
    if (getProperty(L"Suffix",     element))  found = true;  
    vp->addValue(element.c_str());
    if (found) {
        vo->addProperty(vp);
    }
    delete vp; vp = NULL;


    if (getProperty(L"Birthday", element)) {
        vp = new VProperty(L"BDAY", element.c_str());
        vo->addProperty(vp);
        delete vp; vp = NULL;
    }
    if (getProperty(L"Body", element)) {
        vp = new VProperty(L"NOTE", element.c_str());
        vo->addProperty(vp);
        delete vp; vp = NULL;
    }
    if (getProperty(L"BusinessFaxNumber", element)) {
        vp = new VProperty(L"TEL", element.c_str());
        vp->addParameter(L"WORK", NULL);
        vp->addParameter(L"FAX", NULL);
        vo->addProperty(vp);
        delete vp; vp = NULL;
    }
    if (getProperty(L"BusinessTelephoneNumber", element)) {
        vp = new VProperty(L"TEL", element.c_str());
        vp->addParameter(L"VOICE", NULL);
        vp->addParameter(L"WORK",  NULL);
        vo->addProperty(vp);
        delete vp; vp = NULL;
    }
    if (getProperty(L"Business2TelephoneNumber", element)) {
        vp = new VProperty(L"TEL", element.c_str());
        vp->addParameter(L"VOICE", NULL);
        vp->addParameter(L"WORK",  NULL);
        vo->addProperty(vp);
        delete vp; vp = NULL;
    }
    if (getProperty(L"BusinessWebPage", element)) {
        vp = new VProperty(L"URL", element.c_str());
        vp->addParameter(L"WORK",  NULL);
        vo->addProperty(vp);
        delete vp; vp = NULL;
    }
    if (getProperty(L"CarTelephoneNumber", element)) {
        vp = new VProperty(L"TEL", element.c_str());
        vp->addParameter(L"CAR",   NULL);
        vp->addParameter(L"VOICE", NULL);
        vo->addProperty(vp);
        delete vp; vp = NULL;
    }
    if (getProperty(L"Categories", element)) {
        vp = new VProperty(L"CATEGORIES", element.c_str());
        vo->addProperty(vp);
        delete vp; vp = NULL;
    }
    if (getProperty(L"CompanyMainTelephoneNumber", element)) {
        vp = new VProperty(L"TEL", element.c_str());
        vp->addParameter(L"WORK",  NULL);
        vp->addParameter(L"PREF",  NULL);
        vo->addProperty(vp);
        delete vp; vp = NULL;
    }
    if (getProperty(L"FileAs", element)) {
        vp = new VProperty(L"FN", element.c_str());
        vo->addProperty(vp);
        delete vp; vp = NULL;
    }

    // Mapping is:
    // Email1Address <-> EMAIL;INTERNET:
    // Email2Address <-> EMAIL;INTERNET;HOME:
    // Email3Address <-> EMAIL;INTERNET;WORK:
    if (getProperty(L"Email1Address", element)) {
        vp = new VProperty(L"EMAIL", element.c_str());
        vp->addParameter(L"INTERNET", NULL);
        vo->addProperty(vp);
        delete vp; vp = NULL;
    }
    if (getProperty(L"Email2Address", element)) {
        vp = new VProperty(L"EMAIL", element.c_str());
        vp->addParameter(L"INTERNET", NULL);
        vp->addParameter(L"HOME",     NULL);
        vo->addProperty(vp);
        delete vp; vp = NULL;
    }
    if (getProperty(L"Email3Address", element)) {
        vp = new VProperty(L"EMAIL", element.c_str());
        vp->addParameter(L"INTERNET", NULL);
        vp->addParameter(L"WORK",     NULL);
        vo->addProperty(vp);
        delete vp; vp = NULL;
    }

    if (getProperty(L"JobTitle", element)) {
        vp = new VProperty(L"TITLE", element.c_str());
        vo->addProperty(vp);
        delete vp; vp = NULL;
    }
    if (getProperty(L"HomeTelephoneNumber", element)) {
        vp = new VProperty(L"TEL", element.c_str());
        vp->addParameter(L"VOICE", NULL);
        vp->addParameter(L"HOME",  NULL);
        vo->addProperty(vp);
        delete vp; vp = NULL;
    }
    if (getProperty(L"Home2TelephoneNumber", element)) {
        vp = new VProperty(L"TEL", element.c_str());
        vp->addParameter(L"VOICE", NULL);
        vp->addParameter(L"HOME",  NULL);
        vo->addProperty(vp);
        delete vp; vp = NULL;
    }
    if (getProperty(L"HomeFaxNumber", element)) {
        vp = new VProperty(L"TEL", element.c_str());
        vp->addParameter(L"HOME", NULL);
        vp->addParameter(L"FAX", NULL);
        vo->addProperty(vp);
        delete vp; vp = NULL;
    }
    if (getProperty(L"HomeWebPage", element)) {
        vp = new VProperty(L"URL", element.c_str());
        vp->addParameter(L"HOME", NULL);
        vo->addProperty(vp);
        delete vp; vp = NULL;
    }
    if (getProperty(L"Importance", element)) {
        vp = new VProperty(L"PRIORITY", element.c_str());
        vo->addProperty(vp);
        delete vp; vp = NULL;
    }
    if (getProperty(L"MobileTelephoneNumber", element)) {
        vp = new VProperty(L"TEL", element.c_str());
        vp->addParameter(L"CELL", NULL);
        vo->addProperty(vp);
        delete vp; vp = NULL;
    }
    if (getProperty(L"NickName", element)) {
        vp = new VProperty(L"NICKNAME", element.c_str());
        vo->addProperty(vp);
        delete vp; vp = NULL;
    }
    if (getProperty(L"OtherFaxNumber", element)) {
        vp = new VProperty(L"TEL", element.c_str());
        vp->addParameter(L"FAX", NULL);
        vo->addProperty(vp);
        delete vp; vp = NULL;
    }
    if (getProperty(L"OtherTelephoneNumber", element)) {
        vp = new VProperty(L"TEL", element.c_str());
        vp->addParameter(L"VOICE", NULL);
        vo->addProperty(vp);
        delete vp; vp = NULL;
    }
    if (getProperty(L"PagerNumber", element)) {
        vp = new VProperty(L"TEL", element.c_str());
        vp->addParameter(L"PAGER", NULL);
        vo->addProperty(vp);
        delete vp; vp = NULL;
    }
    if (getProperty(L"PrimaryTelephoneNumber", element)) {
        vp = new VProperty(L"TEL", element.c_str());
        vp->addParameter(L"PREF",  NULL);
        vp->addParameter(L"VOICE", NULL);
        vo->addProperty(vp);
        delete vp; vp = NULL;
    }
    if (getProperty(L"Profession", element)) {
        vp = new VProperty(L"ROLE", element.c_str());
        vo->addProperty(vp);
        delete vp; vp = NULL;
    }
    if (getProperty(L"Sensitivity", element)) {
        long sensitivity = _wtoi(element.c_str());
        vp = new VProperty(TEXT("CLASS"));
        if(sensitivity == winPrivate) {
            vp->addValue(TEXT("PRIVATE"));
        }
        else if (sensitivity == winConfidential) {
            vp->addValue(TEXT("CONFIDENTIAL"));
        }
        else {  // default value
            vp->addValue(TEXT("PUBLIC"));
        }
        vo->addProperty(vp);
        delete vp; vp = NULL;
    }
    if (getProperty(L"WebPage", element)) {
        vp = new VProperty(L"URL", element.c_str());
        vo->addProperty(vp);
        delete vp; vp = NULL;
    }


    // ----- ORG -----
    // Add only if at least 1 property is supported, but include 
    // all elements in the right order.
    found = false;
    vp = new VProperty(L"ORG");
    if (getProperty(L"CompanyName",    element))   found = true;
    vp->addValue(element.c_str());
    if (getProperty(L"Department",     element))   found = true;
    vp->addValue(element.c_str());
    if (getProperty(L"OfficeLocation", element))   found = true;
    vp->addValue(element.c_str());
    if (found) {
        vo->addProperty(vp);
    }
    delete vp; vp = NULL;


    // ----- Address HOME -----
    // Add only if at least 1 property is supported, but include 
    // all elements in the right order.
    // "AddressPostOfficeBox" is not supported by WM.
    // "AddressExtended" is not supported by Outlook/WM.
    found = false;
    vp = new VProperty(L"ADR");
    vp->addParameter(L"HOME", NULL);
    if (getProperty(L"HomeAddressPostOfficeBox", element))   found = true;
    vp->addValue(element.c_str());
    if (getProperty(L"HomeAddressExtended",      element))   found = true;
    vp->addValue(element.c_str());
    if (getProperty(L"HomeAddressStreet",        element))   found = true;
    vp->addValue(element.c_str());
    if (getProperty(L"HomeAddressCity",          element))   found = true;
    vp->addValue(element.c_str());
    if (getProperty(L"HomeAddressState",         element))   found = true;
    vp->addValue(element.c_str());
    if (getProperty(L"HomeAddressPostalCode",    element))   found = true;
    vp->addValue(element.c_str());
    if (getProperty(L"HomeAddressCountry",       element))   found = true;
    vp->addValue(element.c_str());
    if (found) {
        vo->addProperty(vp);
    }
    delete vp; vp = NULL;


    // ----- Address -----
    // Add only if at least 1 property is supported, but include 
    // all elements in the right order.
    // "AddressPostOfficeBox" is not supported by WM.
    // "AddressExtended" is not supported by Outlook/WM.
    found = false;
    vp = new VProperty(L"ADR");
    if (getProperty(L"OtherAddressPostOfficeBox", element))   found = true;
    vp->addValue(element.c_str());
    if (getProperty(L"OtherAddressExtended",      element))   found = true;
    vp->addValue(element.c_str());
    if (getProperty(L"OtherAddressStreet",        element))   found = true;
    vp->addValue(element.c_str());
    if (getProperty(L"OtherAddressCity",          element))   found = true;
    vp->addValue(element.c_str());
    if (getProperty(L"OtherAddressState",         element))   found = true;
    vp->addValue(element.c_str());
    if (getProperty(L"OtherAddressPostalCode",    element))   found = true;
    vp->addValue(element.c_str());
    if (getProperty(L"OtherAddressCountry",       element))   found = true;
    vp->addValue(element.c_str());
    if (found) {
        vo->addProperty(vp);
    }
    delete vp; vp = NULL;


    // ----- Address WORK -----
    // Add only if at least 1 property is supported, but include 
    // all elements in the right order.
    // "AddressPostOfficeBox" is not supported by WM.
    // "AddressExtended" is not supported by Outlook/WM.
    found = false;
    vp = new VProperty(L"ADR");
    vp->addParameter(L"WORK", NULL);
    if (getProperty(L"BusinessAddressPostOfficeBox", element))   found = true;
    vp->addValue(element.c_str());
    if (getProperty(L"BusinessAddressExtended",      element))   found = true;
    vp->addValue(element.c_str());
    if (getProperty(L"BusinessAddressStreet",        element))   found = true;
    vp->addValue(element.c_str());
    if (getProperty(L"BusinessAddressCity",          element))   found = true;
    vp->addValue(element.c_str());
    if (getProperty(L"BusinessAddressState",         element))   found = true;
    vp->addValue(element.c_str());
    if (getProperty(L"BusinessAddressPostalCode",    element))   found = true;
    vp->addValue(element.c_str());
    if (getProperty(L"BusinessAddressCountry",       element))   found = true;
    vp->addValue(element.c_str());
    if (found) {
        vo->addProperty(vp);
    }
    delete vp; vp = NULL;
    
     //PHOTO
    if (getProperty(L"Photo", element)) {
        vp = new VProperty(L"PHOTO", element.c_str());
        if (element != L"") {
            vp->addParameter(L"CONTENT-VALUE", L"UNCHANGED");        
            vp->addParameter(L"ENCODING", L"b");
            if (photoType.length() > 0) {
                vp->addParameter(L"TYPE", photoType.c_str());
            }
        }
        vo->addProperty(vp);
        delete vp; vp = NULL;
    }    

    //
    // ---- Funambol defined properties ----
    // Support for other fields that don't have a
    // specific correspondence in vCard.
    if (getProperty(L"Anniversary", element)) {
        vp = new VProperty(L"X-ANNIVERSARY");
        vp->addValue(element.c_str());
        vo->addProperty(vp);
        delete vp; vp = NULL;
    }
    if (getProperty(TEXT("BillingInformation"), element)) {
        vp = new VProperty(TEXT("X-FUNAMBOL-BILLINGINFO"), element.c_str());
        vo->addProperty(vp);
        delete vp; vp = NULL;
    }
    if (getProperty(L"CallbackTelephoneNumber", element)) {
        vp = new VProperty(L"TEL", element.c_str());
        vp->addParameter(L"X-FUNAMBOL-CALLBACK",  NULL);
        vo->addProperty(vp);
        delete vp; vp = NULL;
    }
    if (getProperty(L"Children", element)) {
        vp = new VProperty(L"X-FUNAMBOL-CHILDREN", element.c_str());
        vo->addProperty(vp);
        delete vp; vp = NULL;
    }
    if (getProperty(L"Companies", element)) {
        vp = new VProperty(L"X-FUNAMBOL-COMPANIES", element.c_str());
        vo->addProperty(vp);
        delete vp; vp = NULL;
    }
    if (getProperty(L"CustomerID", element)) {
        vp = new VProperty(L"X-FUNAMBOL-CUSTOMERID", element.c_str());
        vo->addProperty(vp);
        delete vp; vp = NULL;
    }
    if (getProperty(L"Folder", element)) {
        vp = new VProperty(L"X-FUNAMBOL-FOLDER");
        vp->addValue(element.c_str());
        vo->addProperty(vp);
        delete vp; vp = NULL;
    }
    if (getProperty(L"Gender", element)) {
        vp = new VProperty(L"X-FUNAMBOL-GENDER", element.c_str());
        vo->addProperty(vp);
        delete vp; vp = NULL;
    }
    if (getProperty(L"GovernmentIDNumber", element)) {
        vp = new VProperty(L"X-FUNAMBOL-GOVERNMENTID", element.c_str());
        vo->addProperty(vp);
        delete vp; vp = NULL;
    }
    if (getProperty(L"Hobby", element)) {
        vp = new VProperty(L"X-FUNAMBOL-HOBBIES", element.c_str());
        vo->addProperty(vp);
        delete vp; vp = NULL;
    }
    if (getProperty(L"IMAddress", element)) {
        vp = new VProperty(L"EMAIL", element.c_str());
        vp->addParameter(L"INTERNET", NULL);
        vp->addParameter(L"HOME",     NULL);
        vp->addParameter(L"X-FUNAMBOL-INSTANTMESSENGER", NULL);
        vo->addProperty(vp);
        delete vp; vp = NULL;
    }
    if (getProperty(L"IM2Address", element)) {
        vp = new VProperty(L"EMAIL", element.c_str());
        vp->addParameter(L"INTERNET", NULL);
        vp->addParameter(L"HOME",     NULL);
        vp->addParameter(L"X-FUNAMBOL-INSTANTMESSENGER", NULL);
        vo->addProperty(vp);
        delete vp; vp = NULL;
    }
    if (getProperty(L"IM3Address", element)) {
        vp = new VProperty(L"EMAIL", element.c_str());
        vp->addParameter(L"INTERNET", NULL);
        vp->addParameter(L"HOME",     NULL);
        vp->addParameter(L"X-FUNAMBOL-INSTANTMESSENGER", NULL);
        vo->addProperty(vp);
        delete vp; vp = NULL;
    }
    if (getProperty(L"Initials", element)) {
        vp = new VProperty(L"X-FUNAMBOL-INITIALS", element.c_str());
        vo->addProperty(vp);
        delete vp; vp = NULL;
    }

    if (getProperty(L"Language", element)) {
        vp = new VProperty(L"X-FUNAMBOL-LANGUAGES", element.c_str());
        vo->addProperty(vp);
        delete vp; vp = NULL;
    }
    if (getProperty(L"ManagerName", element)) {
        vp = new VProperty(L"X-MANAGER", element.c_str());
        vo->addProperty(vp);
        delete vp; vp = NULL;
    }
    if (getProperty(L"Mileage", element)) {
        vp = new VProperty(L"X-FUNAMBOL-MILEAGE", element.c_str());
        vo->addProperty(vp);
        delete vp; vp = NULL;
    }
    if (getProperty(L"OrganizationalIDNumber", element)) {
        vp = new VProperty(L"X-FUNAMBOL-ORGANIZATIONALID", element.c_str());
        vo->addProperty(vp);
        delete vp; vp = NULL;
    }
    if (getProperty(L"RadioTelephoneNumber", element)) {
        vp = new VProperty(L"TEL", element.c_str());
        vp->addParameter(L"X-FUNAMBOL-RADIO", NULL);
        vo->addProperty(vp);
        delete vp; vp = NULL;
    }
    if (getProperty(L"Spouse", element)) {
        vp = new VProperty(L"X-SPOUSE", element.c_str());
        vo->addProperty(vp);
        delete vp; vp = NULL;
    }
    if (getProperty(L"Subject", element)) {
        vp = new VProperty(L"X-FUNAMBOL-SUBJECT", element.c_str());
        vo->addProperty(vp);
        delete vp; vp = NULL;
    }
    if (getProperty(L"TelexNumber", element)) {
        vp = new VProperty(L"TEL", element.c_str());
        vp->addParameter(L"X-FUNAMBOL-TELEX", NULL);
        vo->addProperty(vp);
        delete vp; vp = NULL;
    }
    if (getProperty(L"YomiCompanyName", element)) {
        vp = new VProperty(L"X-FUNAMBOL-YOMICOMPANYNAME", element.c_str());
        vo->addProperty(vp);
        delete vp; vp = NULL;
    }
    if (getProperty(L"YomiFirstName", element)) {
        vp = new VProperty(L"X-FUNAMBOL-YOMIFIRSTNAME", element.c_str());
        vo->addProperty(vp);
        delete vp; vp = NULL;
    }
    if (getProperty(L"YomiLastName", element)) {
        vp = new VProperty(L"X-FUNAMBOL-YOMILASTNAME", element.c_str());
        vo->addProperty(vp);
        delete vp; vp = NULL;
    }


    vp = new VProperty(L"END", L"VCARD");
    vo->addProperty(vp);
    delete vp; vp = NULL;


    //
    // Format the vCard.
    // -----------------
    //
    WCHAR* tmp = vo->toString();
    if (tmp) {
        vCard = tmp;
        delete [] tmp;
    }
    if (vo) { delete vo; vo = NULL; }
    return vCard;
}
//
// 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;
}