/*
    This convenience function should be called by derived types
    when they want to implement any form of network communication.

    If the request is created successfully, the state of the
    IdentifiableContentItem will change to Busy, and the function
    will return true.  The caller takes ownership of dd->reply()
    and must delete the reply via dd->deleteReply() when they are
    finished with it.
*/
bool IdentifiableContentItemInterface::request(
    IdentifiableContentItemInterface::RequestType t,
    const QString &objectIdentifier,
    const QString &extraPath,
    const QStringList &whichFields, // only valid for GET  requests
    const QVariantMap &postData,    // only valid for POST requests
    const QVariantMap &extraData)   // social-network-specific
{
    Q_D(IdentifiableContentItemInterface);
    // Caller takes ownership of dd->reply() and must dd->deleteReply()
    // If request created successfully, changes state to Busy and returns true.

    if (d->status == SocialNetworkInterface::Initializing
            || d->status == SocialNetworkInterface::Busy
            || d->status == SocialNetworkInterface::Invalid) {
        qWarning() << Q_FUNC_INFO << "Warning: cannot start request, because status is Initializing/Busy/Invalid";
        return false;
    }

    if (t != IdentifiableContentItemInterface::Get
            && t != IdentifiableContentItemInterface::Post
            && t != IdentifiableContentItemInterface::Delete) {
        qWarning() << Q_FUNC_INFO << "Warning: cannot start request, because request type is unknown";
        return false;
    }

    if (d->currentReply != 0) {
        qWarning() << Q_FUNC_INFO << "Error: not Busy and yet current reply is non-null!";
        return false;
    }

    SocialNetworkInterface *sni = socialNetwork();
    if (!sni) {
        qWarning() << Q_FUNC_INFO << "Error: social network is not valid!";
        return false;
    }

    QNetworkReply *sniReply = 0;
    switch (t) {
    case IdentifiableContentItemInterface::Get:
        sniReply = sni->getRequest(objectIdentifier, extraPath, whichFields, extraData);
        break;
    case IdentifiableContentItemInterface::Post:
        sniReply = sni->postRequest(objectIdentifier, extraPath, postData, extraData);
        break;
    default:
        sniReply = sni->deleteRequest(objectIdentifier, extraPath, extraData);
        break;
    }

    if (sniReply) {
        d->currentReply = sniReply;
        d->status = SocialNetworkInterface::Busy;
        emit statusChanged();
        return true;
    }

    qWarning() << "Warning: social network was unable to create request";
    return false;
}
/*! \reimp */
void FacebookAlbumInterface::emitPropertyChangeSignals(const QVariantMap &oldData, const QVariantMap &newData)
{
    Q_D(FacebookAlbumInterface);
    QVariantMap fromMap = newData.value(FACEBOOK_ONTOLOGY_ALBUM_FROM).toMap();
    QString fromIdStr = fromMap.value(FACEBOOK_ONTOLOGY_OBJECTREFERENCE_OBJECTIDENTIFIER).toString();
    QString fromNameStr = fromMap.value(FACEBOOK_ONTOLOGY_OBJECTREFERENCE_OBJECTNAME).toString();
    QString anStr = newData.value(FACEBOOK_ONTOLOGY_ALBUM_NAME).toString();
    QString descStr = newData.value(FACEBOOK_ONTOLOGY_ALBUM_DESCRIPTION).toString();
    QString linkStr = newData.value(FACEBOOK_ONTOLOGY_ALBUM_LINK).toString();
    QString cpStr = newData.value(FACEBOOK_ONTOLOGY_ALBUM_COVERPHOTO).toString();
    QString prvStr = newData.value(FACEBOOK_ONTOLOGY_ALBUM_PRIVACY).toString();
    QString countStr = newData.value(FACEBOOK_ONTOLOGY_ALBUM_COUNT).toString();
    QString typeStr = newData.value(FACEBOOK_ONTOLOGY_ALBUM_TYPE).toString();
    QString ctStr = newData.value(FACEBOOK_ONTOLOGY_ALBUM_CREATEDTIME).toString();
    QString utStr = newData.value(FACEBOOK_ONTOLOGY_ALBUM_UPDATEDTIME).toString();
    QString cuStr = newData.value(FACEBOOK_ONTOLOGY_ALBUM_CANUPLOAD).toString();

    QVariantMap oldFromMap = oldData.value(FACEBOOK_ONTOLOGY_ALBUM_FROM).toMap();
    QString oldFromIdStr = oldFromMap.value(FACEBOOK_ONTOLOGY_OBJECTREFERENCE_OBJECTIDENTIFIER).toString();
    QString oldFromNameStr = oldFromMap.value(FACEBOOK_ONTOLOGY_OBJECTREFERENCE_OBJECTNAME).toString();
    QString oldAnStr = oldData.value(FACEBOOK_ONTOLOGY_ALBUM_NAME).toString();
    QString oldDescStr = oldData.value(FACEBOOK_ONTOLOGY_ALBUM_DESCRIPTION).toString();
    QString oldLinkStr = oldData.value(FACEBOOK_ONTOLOGY_ALBUM_LINK).toString();
    QString oldCpStr = oldData.value(FACEBOOK_ONTOLOGY_ALBUM_COVERPHOTO).toString();
    QString oldPrvStr = oldData.value(FACEBOOK_ONTOLOGY_ALBUM_PRIVACY).toString();
    QString oldCountStr = oldData.value(FACEBOOK_ONTOLOGY_ALBUM_COUNT).toString();
    QString oldTypeStr = oldData.value(FACEBOOK_ONTOLOGY_ALBUM_TYPE).toString();
    QString oldCtStr = oldData.value(FACEBOOK_ONTOLOGY_ALBUM_CREATEDTIME).toString();
    QString oldUtStr = oldData.value(FACEBOOK_ONTOLOGY_ALBUM_UPDATEDTIME).toString();
    QString oldCuStr = oldData.value(FACEBOOK_ONTOLOGY_ALBUM_CANUPLOAD).toString();

    if (anStr != oldAnStr)
        emit nameChanged();
    if (descStr != oldDescStr)
        emit descriptionChanged();
    if (linkStr != oldLinkStr)
        emit linkChanged();
    if (cpStr != oldCpStr)
        emit coverPhotoChanged();
    if (prvStr != oldPrvStr)
        emit privacyChanged();
    if (countStr != oldCountStr)
        emit countChanged();
    if (typeStr != oldTypeStr)
        emit albumTypeChanged();
    if (ctStr != oldCtStr)
        emit createdTimeChanged();
    if (utStr != oldUtStr)
        emit updatedTimeChanged();
    if (cuStr != oldCuStr)
        emit canUploadChanged();

    // update the from object if required
    if (fromIdStr != oldFromIdStr || fromNameStr != oldFromNameStr) {
        QVariantMap newFromData;
        newFromData.insert(FACEBOOK_ONTOLOGY_OBJECTREFERENCE_OBJECTTYPE, FacebookInterface::User);
        newFromData.insert(FACEBOOK_ONTOLOGY_OBJECTREFERENCE_OBJECTIDENTIFIER, fromIdStr);
        newFromData.insert(FACEBOOK_ONTOLOGY_OBJECTREFERENCE_OBJECTNAME, fromNameStr);
        qobject_cast<FacebookInterface*>(socialNetwork())->setFacebookContentItemData(d->from, newFromData);
        emit fromChanged();
    }

    // call the super class implementation
    QVariantMap oldDataWithId = oldData; oldDataWithId.insert(NEMOQMLPLUGINS_SOCIAL_CONTENTITEMID, oldData.value(FACEBOOK_ONTOLOGY_ALBUM_ID));
    QVariantMap newDataWithId = newData; newDataWithId.insert(NEMOQMLPLUGINS_SOCIAL_CONTENTITEMID, newData.value(FACEBOOK_ONTOLOGY_ALBUM_ID));
    IdentifiableContentItemInterface::emitPropertyChangeSignals(oldDataWithId, newDataWithId);
}
/*! \reimp */
void FacebookUserInterface::emitPropertyChangeSignals(const QVariantMap &oldData, const QVariantMap &newData)
{
    Q_D(FacebookUserInterface);
    QString nameStr = newData.value(FACEBOOK_ONTOLOGY_USER_NAME).toString();
    QString fnStr = newData.value(FACEBOOK_ONTOLOGY_USER_FIRSTNAME).toString();
    QString mnStr = newData.value(FACEBOOK_ONTOLOGY_USER_MIDDLENAME).toString();
    QString lnStr = newData.value(FACEBOOK_ONTOLOGY_USER_LASTNAME).toString();
    QString gnStr = newData.value(FACEBOOK_ONTOLOGY_USER_GENDER).toString();
    QString locStr = newData.value(FACEBOOK_ONTOLOGY_USER_LOCALE).toString();
    QString linkStr = newData.value(FACEBOOK_ONTOLOGY_USER_LINK).toString();
    QString unStr = newData.value(FACEBOOK_ONTOLOGY_USER_USERNAME).toString();
    QString tpiStr = newData.value(FACEBOOK_ONTOLOGY_USER_THIRDPARTYIDENTIFIER).toString();
    QString insStr = newData.value(FACEBOOK_ONTOLOGY_USER_INSTALLED).toString();
    QString tzoStr = newData.value(FACEBOOK_ONTOLOGY_USER_TIMEZONEOFFSET).toString();
    QString verStr = newData.value(FACEBOOK_ONTOLOGY_USER_VERIFIED).toString();
    QString udtStr = newData.value(FACEBOOK_ONTOLOGY_USER_UPDATEDTIME).toString();
    QString bioStr = newData.value(FACEBOOK_ONTOLOGY_USER_BIO).toString();
    QString bdayStr = newData.value(FACEBOOK_ONTOLOGY_USER_BIRTHDAY).toString();
    QString emailStr = newData.value(FACEBOOK_ONTOLOGY_USER_EMAIL).toString();
    QStringList iinStr = newData.value(FACEBOOK_ONTOLOGY_USER_INTERESTEDIN).toStringList();
    QString polStr = newData.value(FACEBOOK_ONTOLOGY_USER_POLITICAL).toString();
    QString quoStr = newData.value(FACEBOOK_ONTOLOGY_USER_QUOTES).toString();
    QString rssStr = newData.value(FACEBOOK_ONTOLOGY_USER_RELATIONSHIPSTATUS).toString();
    QString relStr = newData.value(FACEBOOK_ONTOLOGY_USER_RELIGION).toString();
    QString webStr = newData.value(FACEBOOK_ONTOLOGY_USER_WEBSITE).toString();
    QVariantMap htMap = newData.value(FACEBOOK_ONTOLOGY_USER_HOMETOWN).toMap();
    QVariantMap locMap = newData.value(FACEBOOK_ONTOLOGY_USER_LOCATION).toMap();
    QVariantMap picMap = newData.value(FACEBOOK_ONTOLOGY_USER_PICTURE).toMap();
    QVariantMap sigMap = newData.value(FACEBOOK_ONTOLOGY_USER_SIGNIFICANTOTHER).toMap();

    QString oldNameStr = oldData.value(FACEBOOK_ONTOLOGY_USER_NAME).toString();
    QString oldFnStr = oldData.value(FACEBOOK_ONTOLOGY_USER_FIRSTNAME).toString();
    QString oldMnStr = oldData.value(FACEBOOK_ONTOLOGY_USER_MIDDLENAME).toString();
    QString oldLnStr = oldData.value(FACEBOOK_ONTOLOGY_USER_LASTNAME).toString();
    QString oldGnStr = oldData.value(FACEBOOK_ONTOLOGY_USER_GENDER).toString();
    QString oldLocStr = oldData.value(FACEBOOK_ONTOLOGY_USER_LOCALE).toString();
    QString oldLinkStr = oldData.value(FACEBOOK_ONTOLOGY_USER_LINK).toString();
    QString oldUnStr = oldData.value(FACEBOOK_ONTOLOGY_USER_USERNAME).toString();
    QString oldTpiStr = oldData.value(FACEBOOK_ONTOLOGY_USER_THIRDPARTYIDENTIFIER).toString();
    QString oldInsStr = oldData.value(FACEBOOK_ONTOLOGY_USER_INSTALLED).toString();
    QString oldTzoStr = newData.value(FACEBOOK_ONTOLOGY_USER_TIMEZONEOFFSET).toString();
    QString oldVerStr = newData.value(FACEBOOK_ONTOLOGY_USER_VERIFIED).toString();
    QString oldUdtStr = newData.value(FACEBOOK_ONTOLOGY_USER_UPDATEDTIME).toString();
    QString oldBioStr = oldData.value(FACEBOOK_ONTOLOGY_USER_BIO).toString();
    QString oldBdayStr = oldData.value(FACEBOOK_ONTOLOGY_USER_BIRTHDAY).toString();
    QString oldEmailStr = oldData.value(FACEBOOK_ONTOLOGY_USER_EMAIL).toString();
    QStringList oldIinStr = oldData.value(FACEBOOK_ONTOLOGY_USER_INTERESTEDIN).toStringList();
    QString oldPolStr = oldData.value(FACEBOOK_ONTOLOGY_USER_POLITICAL).toString();
    QString oldQuoStr = oldData.value(FACEBOOK_ONTOLOGY_USER_QUOTES).toString();
    QString oldRssStr = oldData.value(FACEBOOK_ONTOLOGY_USER_RELATIONSHIPSTATUS).toString();
    QString oldRelStr = oldData.value(FACEBOOK_ONTOLOGY_USER_RELIGION).toString();
    QString oldWebStr = oldData.value(FACEBOOK_ONTOLOGY_USER_WEBSITE).toString();
    QVariantMap oldHtMap = oldData.value(FACEBOOK_ONTOLOGY_USER_HOMETOWN).toMap();
    QVariantMap oldLocMap = oldData.value(FACEBOOK_ONTOLOGY_USER_LOCATION).toMap();
    QVariantMap oldPicMap = oldData.value(FACEBOOK_ONTOLOGY_USER_PICTURE).toMap();
    QVariantMap oldSigMap = oldData.value(FACEBOOK_ONTOLOGY_USER_SIGNIFICANTOTHER).toMap();

    // standard properties
    if (nameStr != oldNameStr)
        emit nameChanged();
    if (fnStr != oldFnStr)
        emit firstNameChanged();
    if (mnStr != oldMnStr)
        emit middleNameChanged();
    if (lnStr != oldLnStr)
        emit lastNameChanged();
    if (gnStr != oldGnStr)
        emit genderChanged();
    if (locStr != oldLocStr)
        emit locationChanged();
    if (linkStr != oldLinkStr)
        emit linkChanged();
    if (unStr != oldUnStr)
        emit userNameChanged();
    if (tpiStr != oldTpiStr)
        emit thirdPartyIdentifierChanged();
    if (insStr != oldInsStr)
        emit installedChanged();
    if (tzoStr != oldTzoStr)
        emit timezoneOffsetChanged();
    if (verStr != oldVerStr)
        emit verifiedChanged();
    if (udtStr != oldUdtStr)
        emit updatedTimeChanged();
    if (bioStr != oldBioStr)
        emit bioChanged();
    if (bdayStr != oldBdayStr)
        emit birthdayChanged();
    if (emailStr != oldEmailStr)
        emit emailChanged();
    if (iinStr != oldIinStr)
        emit interestedInChanged();
    if (polStr != oldPolStr)
        emit politicalChanged();
    if (quoStr != oldQuoStr)
        emit quotesChanged();
    if (rssStr != oldRssStr)
        emit relationshipStatusChanged();
    if (relStr != oldRelStr)
        emit religionChanged();
    if (webStr != oldWebStr)
        emit websiteChanged();

    // variantmap / object reference properties
    if (htMap != oldHtMap) {
        QVariantMap newHtData;
        newHtData.insert(FACEBOOK_ONTOLOGY_OBJECTREFERENCE_OBJECTTYPE, FacebookInterface::Location);
        newHtData.insert(FACEBOOK_ONTOLOGY_OBJECTREFERENCE_OBJECTIDENTIFIER, newHtData.value(FACEBOOK_ONTOLOGY_OBJECTREFERENCE_OBJECTIDENTIFIER));
        newHtData.insert(FACEBOOK_ONTOLOGY_OBJECTREFERENCE_OBJECTNAME, newHtData.value(FACEBOOK_ONTOLOGY_OBJECTREFERENCE_OBJECTNAME));
        qobject_cast<FacebookInterface*>(socialNetwork())->setFacebookContentItemData(d->hometown, newHtData);
        emit hometownChanged();
    }

    if (locMap != oldLocMap) {
        QVariantMap newLocData;
        newLocData.insert(FACEBOOK_ONTOLOGY_OBJECTREFERENCE_OBJECTTYPE, FacebookInterface::Location);
        newLocData.insert(FACEBOOK_ONTOLOGY_OBJECTREFERENCE_OBJECTIDENTIFIER, newLocData.value(FACEBOOK_ONTOLOGY_OBJECTREFERENCE_OBJECTIDENTIFIER));
        newLocData.insert(FACEBOOK_ONTOLOGY_OBJECTREFERENCE_OBJECTNAME, newLocData.value(FACEBOOK_ONTOLOGY_OBJECTREFERENCE_OBJECTNAME));
        qobject_cast<FacebookInterface*>(socialNetwork())->setFacebookContentItemData(d->location, newLocData);
        emit locationChanged();
    }

    if (picMap != oldPicMap) {
        qobject_cast<FacebookInterface*>(socialNetwork())->setFacebookContentItemData(d->picture, picMap);
        emit pictureChanged();
    }

    if (sigMap != oldSigMap) {
        QVariantMap newSigData;
        newSigData.insert(FACEBOOK_ONTOLOGY_OBJECTREFERENCE_OBJECTTYPE, FacebookInterface::User);
        newSigData.insert(FACEBOOK_ONTOLOGY_OBJECTREFERENCE_OBJECTIDENTIFIER, newSigData.value(FACEBOOK_ONTOLOGY_OBJECTREFERENCE_OBJECTIDENTIFIER));
        newSigData.insert(FACEBOOK_ONTOLOGY_OBJECTREFERENCE_OBJECTNAME, newSigData.value(FACEBOOK_ONTOLOGY_OBJECTREFERENCE_OBJECTNAME));
        qobject_cast<FacebookInterface*>(socialNetwork())->setFacebookContentItemData(d->significantOther, newSigData);
        emit significantOtherChanged();
    }

    // call the super class implementation
    QVariantMap oldDataWithId = oldData; oldDataWithId.insert(NEMOQMLPLUGINS_SOCIAL_CONTENTITEMID, oldData.value(FACEBOOK_ONTOLOGY_USER_ID));
    QVariantMap newDataWithId = newData; newDataWithId.insert(NEMOQMLPLUGINS_SOCIAL_CONTENTITEMID, newData.value(FACEBOOK_ONTOLOGY_USER_ID));
    IdentifiableContentItemInterface::emitPropertyChangeSignals(oldDataWithId, newDataWithId);
}
/*! \reimp */
void FacebookPhotoInterface::emitPropertyChangeSignals(const QVariantMap &oldData, const QVariantMap &newData)
{
    QString aidStr = newData.value(FACEBOOK_ONTOLOGY_PHOTO_ALBUMIDENTIFIER).toString();
    QVariantList tagsList = newData.value(FACEBOOK_ONTOLOGY_PHOTO_TAGS).toList();
    QVariantMap fromMap = newData.value(FACEBOOK_ONTOLOGY_PHOTO_FROM).toMap();
    QString nameStr = newData.value(FACEBOOK_ONTOLOGY_PHOTO_NAME).toString();
    QVariantMap ntMap = newData.value(FACEBOOK_ONTOLOGY_PHOTO_NAMETAGS).toMap();
    QString iconStr = newData.value(FACEBOOK_ONTOLOGY_PHOTO_ICON).toString();
    QString picStr = newData.value(FACEBOOK_ONTOLOGY_PHOTO_PICTURE).toString();
    QString srcStr = newData.value(FACEBOOK_ONTOLOGY_PHOTO_SOURCE).toString();
    QString heightInt = newData.value(FACEBOOK_ONTOLOGY_PHOTO_HEIGHT).toString();
    QString widthInt = newData.value(FACEBOOK_ONTOLOGY_PHOTO_WIDTH).toString();
    QVariantMap imgsMap = newData.value(FACEBOOK_ONTOLOGY_PHOTO_IMAGES).toMap();
    QString linkStr = newData.value(FACEBOOK_ONTOLOGY_PHOTO_LINK).toString();
    QVariantMap placeMap = newData.value(FACEBOOK_ONTOLOGY_PHOTO_PLACE).toMap();     // XXX TODO: Location/Place object reference
    QString ctStr = newData.value(FACEBOOK_ONTOLOGY_PHOTO_CREATEDTIME).toString();
    QString utStr = newData.value(FACEBOOK_ONTOLOGY_PHOTO_UPDATEDTIME).toString();
    QString posInt = newData.value(FACEBOOK_ONTOLOGY_PHOTO_POSITION).toString();
    QString likedBool = newData.value(FACEBOOK_ONTOLOGY_PHOTO_LIKED).toString();

    QString oldAidStr = oldData.value(FACEBOOK_ONTOLOGY_PHOTO_ALBUMIDENTIFIER).toString();
    QVariantList oldTagsList = oldData.value(FACEBOOK_ONTOLOGY_PHOTO_TAGS).toList();
    QVariantMap oldFromMap = oldData.value(FACEBOOK_ONTOLOGY_PHOTO_FROM).toMap();
    QString oldNameStr = oldData.value(FACEBOOK_ONTOLOGY_PHOTO_NAME).toString();
    QVariantMap oldNtMap = oldData.value(FACEBOOK_ONTOLOGY_PHOTO_NAMETAGS).toMap();
    QString oldIconStr = oldData.value(FACEBOOK_ONTOLOGY_PHOTO_ICON).toString();
    QString oldPicStr = oldData.value(FACEBOOK_ONTOLOGY_PHOTO_PICTURE).toString();
    QString oldSrcStr = oldData.value(FACEBOOK_ONTOLOGY_PHOTO_SOURCE).toString();
    QString oldHeightInt = oldData.value(FACEBOOK_ONTOLOGY_PHOTO_HEIGHT).toString();
    QString oldWidthInt = oldData.value(FACEBOOK_ONTOLOGY_PHOTO_WIDTH).toString();
    QVariantMap oldImgsMap = oldData.value(FACEBOOK_ONTOLOGY_PHOTO_IMAGES).toMap();
    QString oldLinkStr = oldData.value(FACEBOOK_ONTOLOGY_PHOTO_LINK).toString();
    QVariantMap oldPlaceMap = oldData.value(FACEBOOK_ONTOLOGY_PHOTO_PLACE).toMap();     // XXX TODO: Location/Place object reference
    QString oldCtStr = oldData.value(FACEBOOK_ONTOLOGY_PHOTO_CREATEDTIME).toString();
    QString oldUtStr = oldData.value(FACEBOOK_ONTOLOGY_PHOTO_UPDATEDTIME).toString();
    QString oldPosInt = oldData.value(FACEBOOK_ONTOLOGY_PHOTO_POSITION).toString();
    QString oldLikedBool = oldData.value(FACEBOOK_ONTOLOGY_PHOTO_LIKED).toString();

    if (aidStr != oldAidStr)
        emit albumIdentifierChanged();
    if (nameStr != oldNameStr)
        emit nameChanged();
    if (ntMap != oldNtMap)
        emit nameTagsChanged();
    if (iconStr != oldIconStr)
        emit iconChanged();
    if (picStr != oldPicStr)
        emit pictureChanged();
    if (srcStr != oldSrcStr)
        emit sourceChanged();
    if (heightInt != oldHeightInt)
        emit heightChanged();
    if (widthInt != oldWidthInt)
        emit widthChanged();
    if (imgsMap != oldImgsMap)
        emit imagesChanged();
    if (linkStr != oldLinkStr)
        emit linkChanged();
    if (placeMap != oldPlaceMap)
        emit placeChanged();
    if (ctStr != oldCtStr)
        emit createdTimeChanged();
    if (utStr != oldUtStr)
        emit updatedTimeChanged();
    if (posInt != oldPosInt)
        emit positionChanged();
    if (likedBool != oldLikedBool) {
        f->liked = likedBool == QLatin1String("true");
        emit likedChanged();
    }

    // update tags list
    if (tagsList != oldTagsList) {
        // clear the old tags
        foreach (FacebookTagInterface *doomedTag, f->tags)
            doomedTag->deleteLater();
        f->tags.clear();

        // update with the new tag data
        for (int i = 0; i < tagsList.size(); ++i) {
            QVariantMap currTagMap = tagsList.at(i).toMap();
            currTagMap.insert(FACEBOOK_ONTOLOGY_TAG_TARGETIDENTIFIER, identifier());
            FacebookTagInterface *currTag = new FacebookTagInterface(f);
            qobject_cast<FacebookInterface*>(socialNetwork())->setFacebookContentItemData(currTag, currTagMap);
            f->tags.append(currTag);
        }

        // emit change signal
        emit tagsChanged();
    }

    // update from reference
    if (fromMap != oldFromMap) {
        QVariantMap newFromData;
        newFromData.insert(FACEBOOK_ONTOLOGY_OBJECTREFERENCE_OBJECTTYPE, FacebookInterface::User); // could also be a Profile ...
        newFromData.insert(FACEBOOK_ONTOLOGY_OBJECTREFERENCE_OBJECTIDENTIFIER, fromMap.value(FACEBOOK_ONTOLOGY_OBJECTREFERENCE_OBJECTIDENTIFIER));
        newFromData.insert(FACEBOOK_ONTOLOGY_OBJECTREFERENCE_OBJECTNAME, fromMap.value(FACEBOOK_ONTOLOGY_OBJECTREFERENCE_OBJECTNAME));
        qobject_cast<FacebookInterface*>(socialNetwork())->setFacebookContentItemData(f->from, newFromData);
        emit fromChanged();
    }

    // call the super class implementation
    IdentifiableContentItemInterface::emitPropertyChangeSignals(oldData, newData);
}