00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #ifndef METADATA_H
00029 #define METADATA_H
00030
00031 #include <QGpCoreTools.h>
00032
00033 #include "GeopsyCoreDLLExport.h"
00034
00035 class QScriptEngine;
00036 class QScriptValue;
00037
00038 namespace GeopsyCore {
00039
00040 class SignalHeaderObject;
00041 class Signal;
00042
00043 class GEOPSYCORE_EXPORT MetaData: public XMLClass, public SharedObject
00044 {
00045 public:
00046 MetaData() {}
00047 MetaData(const MetaData&) : XMLClass(), SharedObject() {}
00048 virtual ~MetaData() {}
00049
00050 virtual MetaData * clone() const=0;
00051 virtual const MetaData * defaultValue() const=0;
00052
00053 virtual QStringList subNames() const {return QStringList();}
00054 virtual QStringList indexList(int subId) const {Q_UNUSED(subId); return QStringList();}
00055 virtual void setId(int id) const=0;
00056 virtual int id() const=0;
00057 int key() const {return id();}
00058
00059 virtual int count(int subId) const {Q_UNUSED(subId); return 1;}
00060 virtual bool hasIndex(int subId) const {Q_UNUSED(subId); return false;}
00061 virtual bool hasIndex(int subId, const QString& index) const {Q_UNUSED(subId); return index.isEmpty();}
00062 virtual QString name(int subId, const QString& index) const {Q_UNUSED(subId); Q_UNUSED(index); return QString::null;}
00063 virtual QString baseName(int subId) const {Q_UNUSED(subId); return QString::null;}
00064 virtual QString title(int subId, const QString& index) const {Q_UNUSED(subId); Q_UNUSED(index); return QString::null;}
00065 virtual Number::Type numberType(int subId) const {Q_UNUSED(subId); return Number::Fixed;}
00066 virtual bool isReadOnly(int subId) const {Q_UNUSED(subId); return false;}
00067 virtual QVariant data(int subId, const QString& index) const {Q_UNUSED(subId); Q_UNUSED(index); return QVariant();}
00068 virtual bool setData(int subId, const QString& index, const QVariant& val) {Q_UNUSED(subId); Q_UNUSED(index); Q_UNUSED(val); return true;}
00069 virtual int compare(int subId, const QString& index, const MetaData * o) const {Q_UNUSED(subId); Q_UNUSED(index); Q_UNUSED(o); return 0;}
00070
00071 virtual QString toString(const QString& index) const {Q_UNUSED(index); return QString::null;}
00072 virtual bool fromString(const QString& index, QString string) {Q_UNUSED(index); Q_UNUSED(string);return true;}
00073
00074 virtual bool isStored() const {return true;}
00075 virtual bool storeAsXML() const {return false;}
00076 virtual void writeProperties(XMLStream& s) const;
00077 virtual void writeProperties(XMLStream& s, const XMLSaveAttributes& attributes) const;
00078 void setSharedId(int id) {_sharedId=id;}
00079 void xml_writeLink(XMLStream& s) const;
00080
00081 virtual void registerScriptTypes(QScriptEngine * engine) {Q_UNUSED(engine);}
00082 virtual void addScriptProperties(SignalHeaderObject * sig) {Q_UNUSED(sig);}
00083 private:
00084 int _sharedId;
00085 };
00086
00087 class GEOPSYCORE_EXPORT MetaInteger: public MetaData
00088 {
00089 public:
00090 MetaInteger() {_value=0;}
00091 MetaInteger(int val) : MetaData() {_value=val;}
00092 MetaInteger(const MetaInteger& o) : MetaData(o) {_value=o._value;}
00093
00094 int value() const {return _value;}
00095 void setValue(int v) {_value=v;}
00096
00097 virtual QVariant data(int subId, const QString& index) const {Q_UNUSED(subId); Q_UNUSED(index); return _value;}
00098 virtual bool setData(int subId, const QString& index, const QVariant& val);
00099 virtual int compare(int subId, const QString& index, const MetaData * o) const;
00100
00101 virtual QString toString(const QString&) const {return QString::number(_value);}
00102 virtual bool fromString(const QString& , QString string) {bool ok; setValue(string.toInt(&ok)); return ok;}
00103 private:
00104 int _value;
00105 };
00106
00107 class GEOPSYCORE_EXPORT MetaDouble: public MetaData
00108 {
00109 public:
00110 MetaDouble() {_value=0;}
00111 MetaDouble(double val) : MetaData() {_value=val;}
00112 MetaDouble(const MetaDouble& o) : MetaData(o) {_value=o._value;}
00113
00114 double value() const {return _value;}
00115 void setValue(double v) {_value=v;}
00116
00117 virtual QVariant data(int subId, const QString& index) const {Q_UNUSED(subId); Q_UNUSED(index); return _value;}
00118 virtual bool setData(int subId, const QString& index, const QVariant& val);
00119 virtual int compare(int subId, const QString& index, const MetaData * o) const;
00120
00121 virtual QString toString(const QString&) const {return QString::number(_value, 'g', 20);}
00122 virtual bool fromString(const QString& , QString string) {bool ok; setValue(string.toDouble(&ok)); return ok;}
00123 private:
00124 double _value;
00125 };
00126
00127 template <class valueType> class GEOPSYCORE_EXPORT MetaArray: public MetaData
00128 {
00129 public:
00130 MetaArray() {_count=0;_values=0;}
00131 MetaArray(const MetaArray& o);
00132 ~MetaArray() {delete [] _values;}
00133
00134 valueType value(int index) const {return index<_count ? _values[index] : 0;}
00135 void setValue(int index, valueType v) {if(index>=_count) enlarge(index); _values[index]=v;}
00136
00137 virtual int count(int subId) const {Q_UNUSED(subId); return _count;}
00138 virtual bool hasIndex(int subId, const QString& index) const;
00139 virtual QVariant data(int subId, const QString& index) const;
00140
00141 virtual void writeProperties(XMLStream& s) const;
00142 virtual void writeProperties(XMLStream& s, const XMLSaveAttributes& attributes) const;
00143 private:
00144 int _count;
00145 valueType * _values;
00146
00147 void enlarge(int index);
00148 };
00149
00150 template <class valueType>
00151 bool MetaArray<valueType>::hasIndex(int subId, const QString& index) const
00152 {
00153 Q_UNUSED(subId);
00154 bool ok;
00155 int i=index.toInt(&ok);
00156 return ok && i<_count && _values[i]!=0;
00157 }
00158
00159 template <class valueType>
00160 QVariant MetaArray<valueType>::data(int subId, const QString& index) const
00161 {
00162 Q_UNUSED(subId);
00163 bool ok;
00164 int i=index.toInt(&ok);
00165 if(ok && i<_count) {
00166 return _values[i];
00167 } else {
00168 return QVariant();
00169 }
00170 }
00171
00172 template <class valueType>
00173 void MetaArray<valueType>::enlarge(int index)
00174 {
00175 TRACE;
00176 int newSize=_count>0 ? _count : 1;
00177 while(newSize<=index) newSize=newSize << 1;
00178 valueType * tmp=new valueType[newSize];
00179 if(_values) {
00180 memcpy(tmp, _values, sizeof(valueType)*_count);
00181 delete [] _values;
00182 }
00183 memset(tmp+_count, 0, sizeof(valueType)*(newSize-_count));
00184 _values=tmp;
00185 _count=newSize;
00186 }
00187
00188 template <class valueType>
00189 MetaArray<valueType>::MetaArray(const MetaArray& o) : MetaData(o)
00190 {
00191 _count=o._count;
00192 if(o._values) {
00193 _values=new valueType[_count];
00194 memcpy(_values, o._values, sizeof(valueType)*_count);
00195 } else {
00196 _values=0;
00197 }
00198 }
00199
00200 template <class valueType>
00201 void MetaArray<valueType>::writeProperties(XMLStream& s) const
00202 {
00203 TRACE;
00204 if(!storeAsXML()) {
00205 static const QString key("index");
00206 XMLSaveAttributes att;
00207 QString& value=att.add(key);
00208 for(int i=0;i<_count;i++) {
00209 value=QString::number(i);
00210 if(hasIndex(0, value)) writeProperty(s, xml_tagName(), att, toString(value));
00211 }
00212 }
00213 }
00214
00215 template <class valueType>
00216 void MetaArray<valueType>::writeProperties(XMLStream& s, const XMLSaveAttributes& attributes) const
00217 {
00218 TRACE;
00219 if(!storeAsXML()) {
00220 static const QString key("index");
00221 XMLSaveAttributes att(attributes);
00222 QString& value=att.add(key);
00223 for(int i=0;i<_count;i++) {
00224 value=QString::number(i);
00225 if(hasIndex(0, value)) writeProperty(s, xml_tagName(), att, toString(value));
00226 }
00227 }
00228 }
00229
00230 class GEOPSYCORE_EXPORT MetaArrayInteger: public MetaArray<int>
00231 {
00232 public:
00233 MetaArrayInteger() : MetaArray<int>() {}
00234 MetaArrayInteger(const MetaArrayInteger& o) : MetaArray<int>(o) {}
00235
00236 virtual bool setData(int subId, const QString& index, const QVariant& val);
00237 virtual int compare(int subId, const QString& index, const MetaData * o) const;
00238
00239 virtual QString toString(const QString& index) const;
00240 virtual bool fromString(const QString& index, QString string);
00241 };
00242
00243
00244 class GEOPSYCORE_EXPORT MetaArrayDouble: public MetaArray<double>
00245 {
00246 public:
00247 MetaArrayDouble() : MetaArray<double>() {}
00248 MetaArrayDouble(const MetaArrayDouble& o) : MetaArray<double>(o) {}
00249
00250 virtual bool setData(int subId, const QString& index, const QVariant& val);
00251 virtual int compare(int subId, const QString& index, const MetaData * o) const;
00252
00253 virtual QString toString(const QString& index) const;
00254 virtual bool fromString(const QString& index, QString string);
00255 };
00256
00257 class GEOPSYCORE_EXPORT MetaString: public MetaData
00258 {
00259 public:
00260 MetaString() {}
00261 MetaString(const QString& str) : MetaData() {setValue(str);}
00262 MetaString(const MetaString& o) : MetaData(o) {}
00263
00264 virtual QVariant data(int subId, const QString& index) const {Q_UNUSED(subId); Q_UNUSED(index); return _value;}
00265 virtual bool setData(int subId, const QString& index, const QVariant& val);
00266 virtual int compare(int subId, const QString& index, const MetaData * o) const;
00267
00268 const QString& value() const {return _value;}
00269 void setValue(const QString& v) {_value=v;}
00270
00271 virtual QString toString(const QString& ) const {return value();}
00272 virtual bool fromString(const QString& , QString string) {setValue(string); return true;}
00273 private:
00274 QString _value;
00275 };
00276
00277 }
00278
00279 #endif // METADATA_H