9 #include "errorobject.h"
10 #include "prepareoptions.h"
11 #include "ilwisobject.h"
13 #include "mastercatalog.h"
17 typedef std::shared_ptr<IlwisObject> ESPIlwisObject;
47 _implementation = impl;
51 _implementation = std::dynamic_pointer_cast<T>(obj._implementation);
55 _implementation = obj._implementation;
61 if (_implementation.get()!= 0 )
62 if ( _implementation.use_count() == 2)
63 mastercatalog()->
unregister(_implementation.get()->id());
68 if ( data !=
nullptr) {
69 if (!mastercatalog()->isRegistered(data->id())) {
70 _implementation.reset(data);
74 _implementation = mastercatalog()->
get(data->id());
77 _implementation.reset();
82 if ( _implementation && obj->ilwisType() == _implementation->ilwisType())
83 set(static_cast<T *>(obj._implementation.get())) ;
85 set(
dynamic_cast<T *
>(obj._implementation.get())) ;
98 T* p =
static_cast<T *
>(_implementation.get());
104 T *operator->()
const{
105 T* p =
static_cast<T *
>(_implementation.get());
126 if (_implementation.get() == 0)
128 if ( hasType(_implementation->ilwisType(),itILWISOBJECT)) {
130 obj._implementation = std::static_pointer_cast<C>(_implementation);
142 auto type = kernel()->
demangle(
typeid(T).name());
148 tp = IlwisObject::name2ExtendedType(type);
149 if ( tp != itUNKNOWN)
151 QString name = QString(
"%1%2").arg(ANONYMOUS_PREFIX).arg(res.
id());
152 QUrl url(QString(
"ilwis://internalcatalog/%1").arg(name));
169 if ( name.left(11) == ANONYMOUS_PREFIX) {
170 QString sid = name.mid(11);
172 quint64
id = sid.toLongLong(&ok);
174 ESPIlwisObject data = mastercatalog()->
get(
id);
175 if ( data.get() != 0) {
177 _implementation = data;
182 return ERROR1(ERR_COULDNT_CREATE_OBJECT_FOR_1,name);
185 if ( name.indexOf(NAME_ALIAS) == 0) {
186 QString sid = name.mid(SZ_NAME_ALIAS);
188 quint64
id = sid.toLongLong(&ok);
190 ESPIlwisObject data = mastercatalog()->
get(
id);
191 if ( data.get() != 0) {
193 _implementation = data;
198 return ERROR1(ERR_COULDNT_CREATE_OBJECT_FOR_1,name);
202 auto type = kernel()->
demangle(
typeid(T).name());
206 if (resource.isValid()) {
208 T *data =
static_cast<T *
>(IlwisObject::create(resource, options));
210 _implementation.reset((T*)0);
212 return ERROR1(
"Couldnt create ilwisobject %1",name);
214 bool ok = data->prepare();
220 data->changed(
false);
222 _implementation = ESPIlwisObject(data);
225 _implementation = mastercatalog()->
get(resource.id());
232 return ERROR1(ERR_COULDNT_CREATE_OBJECT_FOR_1,name);
239 if ( mastercatalog()->usesContainers(resource1.
url()))
244 resource = resource1;
246 T *data =
static_cast<T *
>(IlwisObject::create(resource, options));
248 _implementation.reset((T*)0);
250 return ERROR1(
"Couldnt create ilwisobject %1",resource.
name());
252 bool ok = data->prepare();
257 data->changed(
false);
259 _implementation = ESPIlwisObject(data);
262 _implementation = mastercatalog()->
get(resource.
id());
266 ERROR1(ERR_COULDNT_CREATE_OBJECT_FOR_1,resource1.
name());
284 if (!mastercatalog()->isRegistered(iid)) {
285 T *data =
static_cast<T *
>(IlwisObject::create(resource, options));
289 _implementation.reset((T*)0);
291 return ERROR1(
"Couldnt create ilwisobject %1",resource.
name());
294 _implementation = ESPIlwisObject(data);
296 _implementation = mastercatalog()->
get(iid);
297 if ( _implementation.get() == 0) {
298 return ERROR0(
"Corrupted object registration");
312 return _implementation.get() != 0;
317 void removeCurrent() {
318 if ( _implementation && _implementation->id() != i64UNDEF) {
319 ESPIlwisObject obj= mastercatalog()->
get( _implementation->id() );
320 if(obj.use_count() <= 3) {
321 mastercatalog()->
unregister(_implementation->id());
326 ESPIlwisObject _implementation;
329 template<
class T>
bool operator==(
const IlwisData<T>& d1,
const IlwisData<T>& d2) {
330 return d1->id() == d2->id();
333 template<
class T>
bool operator!=(
const IlwisData<T>& d1,
const IlwisData<T>& d2) {
334 return d1->id() != d2->id();
343 template<class C> QDataStream & operator << ( QDataStream & s, const Ilwis::IlwisData<C> & obj ){
344 if ( obj.isValid() ==
false)
347 obj->store(s, obj->serializationOptions());
352 template<
class C> QDataStream & operator >> ( QDataStream & s,
Ilwis::IlwisData<C> & obj ){
361 #endif // ILWISDATA_H