00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00012
00013 #include "serializer.h"
00014
00015 #include <QMetaObject>
00016 #include <QMetaProperty>
00017
00019
00021
00022 void Serializer::AddHeaders( QStringMap &headers )
00023 {
00024 headers[ "Cache-Control" ] = "no-cache=\"Ext\", "
00025 "max-age = 5000";
00026
00027 headers[ "ETag" ] = "\"" + m_hash.result().toHex() + "\"";
00028
00029 }
00030
00032
00034
00035 void Serializer::Serialize( const QObject *pObject, const QString &_sName )
00036 {
00037 QString sName = _sName;
00038
00039 if (sName.isEmpty())
00040 sName = pObject->objectName();
00041
00042 if (sName.isEmpty())
00043 {
00044 sName = pObject->metaObject()->className();
00045
00046 sName = sName.section( ":", -1 );
00047
00048 if (sName.at(0) == 'Q')
00049 sName = sName.mid( 1 );
00050 }
00051
00052
00053
00054 m_hash.reset();
00055
00056 BeginSerialize( sName );
00057
00058 SerializeObject( pObject, sName );
00059
00060 EndSerialize();
00061
00062 }
00063
00065
00067
00068 void Serializer::Serialize( const QVariant &vValue, const QString &_sName )
00069 {
00070 QString sName( _sName );
00071
00072 if (sName.at(0) == 'Q')
00073 sName = sName.mid( 1 );
00074
00075 m_hash.reset();
00076
00077 BeginSerialize( sName );
00078
00079 AddProperty( sName, vValue, NULL, NULL );
00080
00081 EndSerialize();
00082 }
00083
00085
00087
00088 void Serializer::SerializeObject( const QObject *pObject, const QString &sName )
00089 {
00090 m_hash.addData( sName.toUtf8() );
00091
00092 BeginObject( sName, pObject );
00093
00094 SerializeObjectProperties( pObject );
00095
00096 EndObject( sName, pObject );
00097 }
00098
00100
00102
00103 void Serializer::SerializeObjectProperties( const QObject *pObject )
00104 {
00105 if (pObject != NULL)
00106 {
00107 const QMetaObject *pMetaObject = pObject->metaObject();
00108
00109 int nCount = pMetaObject->propertyCount();
00110
00111 for (int nIdx=0; nIdx < nCount; ++nIdx )
00112 {
00113 QMetaProperty metaProperty = pMetaObject->property( nIdx );
00114
00115 if (metaProperty.isDesignable( pObject ))
00116 {
00117 const char *pszPropName = metaProperty.name();
00118 QString sPropName( pszPropName );
00119
00120 if ( sPropName.compare( "objectName" ) == 0)
00121 continue;
00122
00123 bool bHash = false;
00124
00125 if (ReadPropertyMetadata( pObject,
00126 sPropName,
00127 "transient").toLower() != "true" )
00128 {
00129 bHash = true;
00130 m_hash.addData( sPropName.toUtf8() );
00131 }
00132
00133 QVariant value( pObject->property( pszPropName ) );
00134
00135 if (bHash && !value.canConvert< QObject* >())
00136 {
00137 m_hash.addData( value.toString().toUtf8() );
00138 }
00139
00140 AddProperty( sPropName, value, pMetaObject, &metaProperty );
00141 }
00142 }
00143 }
00144 }
00145
00147
00149
00150 QString Serializer::ReadPropertyMetadata( const QObject *pObject,
00151 QString sPropName,
00152 QString sKey )
00153 {
00154 const QMetaObject *pMeta = pObject->metaObject();
00155
00156 int nIdx = pMeta->indexOfClassInfo( sPropName.toUtf8() );
00157
00158 if (nIdx >=0)
00159 {
00160 QString sMetadata = pMeta->classInfo( nIdx ).value();
00161 QStringList sOptions = sMetadata.split( ';' );
00162
00163 QString sFullKey = sKey + "=";
00164
00165 for (int nIdx = 0; nIdx < sOptions.size(); ++nIdx)
00166 {
00167 if (sOptions.at( nIdx ).startsWith( sFullKey ))
00168 return sOptions.at( nIdx ).mid( sFullKey.length() );
00169 }
00170 }
00171
00172 return QString();
00173 }
00174
00175