From 16b19e18b4f9b416f0cc16f6b5b749bd38455b24 Mon Sep 17 00:00:00 2001 From: Markus Engel Date: Sat, 18 Aug 2012 01:27:53 +0200 Subject: Added "virtual pad" to SPObject. (bzr r11608.1.1) --- src/sp-object.cpp | 102 +++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 90 insertions(+), 12 deletions(-) (limited to 'src/sp-object.cpp') diff --git a/src/sp-object.cpp b/src/sp-object.cpp index 892c89a15..5c42e009c 100644 --- a/src/sp-object.cpp +++ b/src/sp-object.cpp @@ -145,10 +145,27 @@ void SPObjectClass::sp_object_class_init(SPObjectClass *klass) klass->write = SPObject::sp_object_private_write; } + +// CPPIFY: make pure virtual +void CObject::onReadContent() { + throw; +} + +void CObject::onUpdate(SPCtx* ctx, unsigned int flags) { + throw; +} + +void CObject::onModified(unsigned int flags) { + throw; +} + + void SPObject::sp_object_init(SPObject *object) { debug("id=%x, typename=%s",object, g_type_name_from_instance((GTypeInstance*)object)); + object->cobject = new CObject(object); + object->hrefcount = 0; object->_total_hrefcount = 0; object->document = NULL; @@ -182,6 +199,8 @@ void SPObject::sp_object_finalize(GObject *object) { SPObject *spobject = (SPObject *)object; + delete spobject->cobject; + g_free(spobject->_label); g_free(spobject->_default_label); spobject->_label = NULL; @@ -202,6 +221,16 @@ void SPObject::sp_object_finalize(GObject *object) } } + +// CPPIFY: remove +CObject::CObject(SPObject* object) { + this->spobject = object; +} + +CObject::~CObject() { +} + + namespace { namespace Debug = Inkscape::Debug; @@ -616,8 +645,9 @@ SPObject *SPObject::get_child_by_repr(Inkscape::XML::Node *repr) return result; } -void SPObject::sp_object_child_added(SPObject *object, Inkscape::XML::Node *child, Inkscape::XML::Node *ref) -{ +void CObject::onChildAdded(Inkscape::XML::Node *child, Inkscape::XML::Node *ref) { + SPObject* object = this->spobject; + GType type = sp_repr_type_lookup(child); if (!type) { return; @@ -630,16 +660,30 @@ void SPObject::sp_object_child_added(SPObject *object, Inkscape::XML::Node *chil ochild->invoke_build(object->document, child, object->cloned); } -void SPObject::sp_object_release(SPObject *object) +// CPPIFY: remove +void SPObject::sp_object_child_added(SPObject *object, Inkscape::XML::Node *child, Inkscape::XML::Node *ref) { + object->cobject->onChildAdded(child, ref); +} + +void CObject::onRelease() { + SPObject* object = this->spobject; + debug("id=%x, typename=%s", object, g_type_name_from_instance((GTypeInstance*)object)); while (object->children) { object->detach(object->children); } } -void SPObject::sp_object_remove_child(SPObject *object, Inkscape::XML::Node *child) +// CPPIFY: remove +void SPObject::sp_object_release(SPObject *object) { + object->cobject->onRelease(); +} + +void CObject::onRemoveChild(Inkscape::XML::Node* child) { + SPObject* object = this->spobject; + debug("id=%x, typename=%s", object, g_type_name_from_instance((GTypeInstance*)object)); SPObject *ochild = object->get_child_by_repr(child); g_return_if_fail (ochild != NULL || !strcmp("comment", child->name())); // comments have no objects @@ -648,9 +692,15 @@ void SPObject::sp_object_remove_child(SPObject *object, Inkscape::XML::Node *chi } } -void SPObject::sp_object_order_changed(SPObject *object, Inkscape::XML::Node *child, Inkscape::XML::Node */*old_ref*/, - Inkscape::XML::Node *new_ref) +// CPPIFY: remove +void SPObject::sp_object_remove_child(SPObject *object, Inkscape::XML::Node *child) { + object->cobject->onRemoveChild(child); +} + +void CObject::onOrderChanged(Inkscape::XML::Node *child, Inkscape::XML::Node * old_ref, Inkscape::XML::Node *new_ref) { + SPObject* object = this->spobject; + SPObject *ochild = object->get_child_by_repr(child); g_return_if_fail(ochild != NULL); SPObject *prev = new_ref ? object->get_child_by_repr(new_ref) : NULL; @@ -658,8 +708,16 @@ void SPObject::sp_object_order_changed(SPObject *object, Inkscape::XML::Node *ch ochild->_position_changed_signal.emit(ochild); } -void SPObject::sp_object_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr) +// CPPIFY: remove +void SPObject::sp_object_order_changed(SPObject *object, Inkscape::XML::Node *child, Inkscape::XML::Node *old_ref, + Inkscape::XML::Node *new_ref) { + object->cobject->onOrderChanged(child, old_ref, new_ref); +} + +void CObject::onBuild(SPDocument *document, Inkscape::XML::Node *repr) { + SPObject* object = this->spobject; + /* Nothing specific here */ debug("id=%x, typename=%s", object, g_type_name_from_instance((GTypeInstance*)object)); @@ -679,6 +737,12 @@ void SPObject::sp_object_build(SPObject *object, SPDocument *document, Inkscape: } } +// CPPIFY: remove +void SPObject::sp_object_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr) +{ + object->cobject->onBuild(document, repr); +} + void SPObject::invoke_build(SPDocument *document, Inkscape::XML::Node *repr, unsigned int cloned) { debug("id=%x, typename=%s", this, g_type_name_from_instance((GTypeInstance*)this)); @@ -847,10 +911,11 @@ void SPObject::sp_object_repr_order_changed(Inkscape::XML::Node */*repr*/, Inksc } } -void SPObject::sp_object_private_set(SPObject *object, unsigned int key, gchar const *value) -{ +void CObject::onSet(unsigned int key, gchar const* value) { g_assert(key != SP_ATTR_INVALID); + SPObject* object = this->spobject; + switch (key) { case SP_ATTR_ID: @@ -869,7 +934,7 @@ void SPObject::sp_object_private_set(SPObject *object, unsigned int key, gchar c if (!document->isSeeking()) { sp_object_ref(conflict, NULL); // give the conflicting object a new ID - gchar *new_conflict_id = sp_object_get_unique_id(conflict, NULL); + gchar *new_conflict_id = SPObject::sp_object_get_unique_id(conflict, NULL); conflict->getRepr()->setAttribute("id", new_conflict_id); g_free(new_conflict_id); sp_object_unref(conflict, NULL); @@ -932,6 +997,12 @@ void SPObject::sp_object_private_set(SPObject *object, unsigned int key, gchar c } } +// CPPIFY: remove +void SPObject::sp_object_private_set(SPObject *object, unsigned int key, gchar const *value) +{ + object->cobject->onSet(key, value); +} + void SPObject::setKeyValue(unsigned int key, gchar const *value) { //g_assert(object != NULL); @@ -997,8 +1068,9 @@ static gchar const *sp_xml_get_space_string(unsigned int space) } } -Inkscape::XML::Node * SPObject::sp_object_private_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags) -{ +Inkscape::XML::Node* CObject::onWrite(Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags) { + SPObject* object = this->spobject; + if (!repr && (flags & SP_OBJECT_WRITE_BUILD)) { repr = object->getRepr()->duplicate(doc); if (!( flags & SP_OBJECT_WRITE_EXT )) { @@ -1080,6 +1152,12 @@ Inkscape::XML::Node * SPObject::sp_object_private_write(SPObject *object, Inksca return repr; } +// CPPIFY: remove +Inkscape::XML::Node * SPObject::sp_object_private_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags) +{ + return object->cobject->onWrite(doc, repr, flags); +} + Inkscape::XML::Node * SPObject::updateRepr(unsigned int flags) { if ( !cloned ) { -- cgit v1.2.3 From 8849fb5e5edbeb212a3f5fa61dd2a55acfc561a6 Mon Sep 17 00:00:00 2001 From: Markus Engel Date: Sun, 7 Oct 2012 01:01:59 +0200 Subject: Added some virtual pad calls to SPObject. (bzr r11608.1.47) --- src/sp-object.cpp | 119 ++++++++++++++++++++++++++++++++---------------------- 1 file changed, 70 insertions(+), 49 deletions(-) (limited to 'src/sp-object.cpp') diff --git a/src/sp-object.cpp b/src/sp-object.cpp index 5c42e009c..dec99fcc0 100644 --- a/src/sp-object.cpp +++ b/src/sp-object.cpp @@ -148,15 +148,15 @@ void SPObjectClass::sp_object_class_init(SPObjectClass *klass) // CPPIFY: make pure virtual void CObject::onReadContent() { - throw; + //throw; } void CObject::onUpdate(SPCtx* ctx, unsigned int flags) { - throw; + //throw; } void CObject::onModified(unsigned int flags) { - throw; + //throw; } @@ -799,9 +799,10 @@ void SPObject::invoke_build(SPDocument *document, Inkscape::XML::Node *repr, uns } /* Invoke derived methods, if any */ - if (((SPObjectClass *) G_OBJECT_GET_CLASS(this))->build) { - (*((SPObjectClass *) G_OBJECT_GET_CLASS(this))->build)(this, document, repr); - } +// if (((SPObjectClass *) G_OBJECT_GET_CLASS(this))->build) { +// (*((SPObjectClass *) G_OBJECT_GET_CLASS(this))->build)(this, document, repr); +// } + this->cobject->onBuild(document, repr); /* Signalling (should be connected AFTER processing derived methods */ sp_repr_add_listener(repr, &object_event_vector, this); @@ -839,10 +840,12 @@ void SPObject::releaseReferences() { sp_repr_remove_listener_by_data(this->repr, this); this->_release_signal.emit(this); - SPObjectClass *klass=(SPObjectClass *)G_OBJECT_GET_CLASS(this); - if (klass->release) { - klass->release(this); - } + +// SPObjectClass *klass=(SPObjectClass *)G_OBJECT_GET_CLASS(this); +// if (klass->release) { +// klass->release(this); +// } + this->cobject->onRelease(); /* all hrefs should be released by the "release" handlers */ g_assert(this->hrefcount == 0); @@ -888,27 +891,30 @@ void SPObject::sp_object_repr_child_added(Inkscape::XML::Node */*repr*/, Inkscap { SPObject *object = SP_OBJECT(data); - if (((SPObjectClass *) G_OBJECT_GET_CLASS(object))->child_added) { - (*((SPObjectClass *)G_OBJECT_GET_CLASS(object))->child_added)(object, child, ref); - } +// if (((SPObjectClass *) G_OBJECT_GET_CLASS(object))->child_added) { +// (*((SPObjectClass *)G_OBJECT_GET_CLASS(object))->child_added)(object, child, ref); +// } + object->cobject->onChildAdded(child, ref); } void SPObject::sp_object_repr_child_removed(Inkscape::XML::Node */*repr*/, Inkscape::XML::Node *child, Inkscape::XML::Node */*ref*/, gpointer data) { SPObject *object = SP_OBJECT(data); - if (((SPObjectClass *) G_OBJECT_GET_CLASS(object))->remove_child) { - (* ((SPObjectClass *)G_OBJECT_GET_CLASS(object))->remove_child)(object, child); - } +// if (((SPObjectClass *) G_OBJECT_GET_CLASS(object))->remove_child) { +// (* ((SPObjectClass *)G_OBJECT_GET_CLASS(object))->remove_child)(object, child); +// } + object->cobject->onRemoveChild(child); } void SPObject::sp_object_repr_order_changed(Inkscape::XML::Node */*repr*/, Inkscape::XML::Node *child, Inkscape::XML::Node *old, Inkscape::XML::Node *newer, gpointer data) { SPObject *object = SP_OBJECT(data); - if (((SPObjectClass *) G_OBJECT_GET_CLASS(object))->order_changed) { - (* ((SPObjectClass *)G_OBJECT_GET_CLASS(object))->order_changed)(object, child, old, newer); - } +// if (((SPObjectClass *) G_OBJECT_GET_CLASS(object))->order_changed) { +// (* ((SPObjectClass *)G_OBJECT_GET_CLASS(object))->order_changed)(object, child, old, newer); +// } + object->cobject->onOrderChanged(child, old, newer); } void CObject::onSet(unsigned int key, gchar const* value) { @@ -1008,9 +1014,10 @@ void SPObject::setKeyValue(unsigned int key, gchar const *value) //g_assert(object != NULL); //g_assert(SP_IS_OBJECT(object)); - if (((SPObjectClass *) G_OBJECT_GET_CLASS(this))->set) { - ((SPObjectClass *) G_OBJECT_GET_CLASS(this))->set(this, key, value); - } +// if (((SPObjectClass *) G_OBJECT_GET_CLASS(this))->set) { +// ((SPObjectClass *) G_OBJECT_GET_CLASS(this))->set(this, key, value); +// } + this->cobject->onSet(key, value); } void SPObject::readAttr(gchar const *key) @@ -1048,9 +1055,10 @@ void SPObject::sp_object_repr_content_changed(Inkscape::XML::Node */*repr*/, gch { SPObject *object = SP_OBJECT(data); - if (((SPObjectClass *) G_OBJECT_GET_CLASS(object))->read_content) { - (*((SPObjectClass *) G_OBJECT_GET_CLASS(object))->read_content)(object); - } +// if (((SPObjectClass *) G_OBJECT_GET_CLASS(object))->read_content) { +// (*((SPObjectClass *) G_OBJECT_GET_CLASS(object))->read_content)(object); +// } + object->cobject->onReadContent(); } /** @@ -1182,23 +1190,32 @@ Inkscape::XML::Node * SPObject::updateRepr(Inkscape::XML::Document *doc, Inkscap /* cloned objects have no repr */ return NULL; } - if (((SPObjectClass *) G_OBJECT_GET_CLASS(this))->write) { - if (!(flags & SP_OBJECT_WRITE_BUILD) && !repr) { - repr = getRepr(); - } - return ((SPObjectClass *) G_OBJECT_GET_CLASS(this))->write(this, doc, repr, flags); - } else { - g_warning("Class %s does not implement ::write", G_OBJECT_TYPE_NAME(this)); - if (!repr) { - if (flags & SP_OBJECT_WRITE_BUILD) { - repr = getRepr()->duplicate(doc); - } - /// \todo FIXME: else probably error (Lauris) */ - } else { - repr->mergeFrom(getRepr(), "id"); - } - return repr; - } + + +// if (((SPObjectClass *) G_OBJECT_GET_CLASS(this))->write) { +// if (!(flags & SP_OBJECT_WRITE_BUILD) && !repr) { +// repr = getRepr(); +// } +// return ((SPObjectClass *) G_OBJECT_GET_CLASS(this))->write(this, doc, repr, flags); +// } else { +// g_warning("Class %s does not implement ::write", G_OBJECT_TYPE_NAME(this)); +// if (!repr) { +// if (flags & SP_OBJECT_WRITE_BUILD) { +// repr = getRepr()->duplicate(doc); +// } +// /// \todo FIXME: else probably error (Lauris) */ +// } else { +// repr->mergeFrom(getRepr(), "id"); +// } +// return repr; +// } + + if (!(flags & SP_OBJECT_WRITE_BUILD) && !repr) { + repr = getRepr(); + } + //return ((SPObjectClass *) G_OBJECT_GET_CLASS(this))->write(this, doc, repr, flags); + return this->cobject->onWrite(doc, repr, flags); + } /* Modification */ @@ -1264,9 +1281,10 @@ void SPObject::updateDisplay(SPCtx *ctx, unsigned int flags) try { - if (((SPObjectClass *) G_OBJECT_GET_CLASS(this))->update) { - ((SPObjectClass *) G_OBJECT_GET_CLASS(this))->update(this, ctx, flags); - } +// if (((SPObjectClass *) G_OBJECT_GET_CLASS(this))->update) { +// ((SPObjectClass *) G_OBJECT_GET_CLASS(this))->update(this, ctx, flags); +// } + this->cobject->onUpdate(ctx, flags); } catch(...) { @@ -1323,10 +1341,13 @@ void SPObject::emitModified(unsigned int flags) this->mflags = 0; g_object_ref(G_OBJECT(this)); - SPObjectClass *klass=(SPObjectClass *)G_OBJECT_GET_CLASS(this); - if (klass->modified) { - klass->modified(this, flags); - } + +// SPObjectClass *klass=(SPObjectClass *)G_OBJECT_GET_CLASS(this); +// if (klass->modified) { +// klass->modified(this, flags); +// } + this->cobject->onModified(flags); + _modified_signal.emit(this, flags); g_object_unref(G_OBJECT(this)); } -- cgit v1.2.3 From a0a8d020201e0e38a63d9aa3dce228d7d9e6fb35 Mon Sep 17 00:00:00 2001 From: Markus Engel Date: Thu, 14 Mar 2013 12:42:39 +0100 Subject: Various changes. (bzr r11608.1.48) --- src/sp-object.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/sp-object.cpp') diff --git a/src/sp-object.cpp b/src/sp-object.cpp index dec99fcc0..933bfceda 100644 --- a/src/sp-object.cpp +++ b/src/sp-object.cpp @@ -139,7 +139,7 @@ void SPObjectClass::sp_object_class_init(SPObjectClass *klass) klass->release = SPObject::sp_object_release; - klass->build = SPObject::sp_object_build; + //klass->build = SPObject::sp_object_build; klass->set = SPObject::sp_object_private_set; klass->write = SPObject::sp_object_private_write; -- cgit v1.2.3 From 957c3e4b7909d42c5a13f1b1dd583f877fc32259 Mon Sep 17 00:00:00 2001 From: Markus Engel Date: Sat, 30 Mar 2013 00:46:57 +0100 Subject: Removed function pointers from SPObject and subclasses. Added some missing virtual pads for classes that were hidden by preprocessor macros. (bzr r11608.1.55) --- src/sp-object.cpp | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) (limited to 'src/sp-object.cpp') diff --git a/src/sp-object.cpp b/src/sp-object.cpp index 933bfceda..f3da0e134 100644 --- a/src/sp-object.cpp +++ b/src/sp-object.cpp @@ -133,16 +133,16 @@ void SPObjectClass::sp_object_class_init(SPObjectClass *klass) object_class->finalize = SPObject::sp_object_finalize; - klass->child_added = SPObject::sp_object_child_added; - klass->remove_child = SPObject::sp_object_remove_child; - klass->order_changed = SPObject::sp_object_order_changed; - - klass->release = SPObject::sp_object_release; - - //klass->build = SPObject::sp_object_build; - - klass->set = SPObject::sp_object_private_set; - klass->write = SPObject::sp_object_private_write; +// klass->child_added = SPObject::sp_object_child_added; +// klass->remove_child = SPObject::sp_object_remove_child; +// klass->order_changed = SPObject::sp_object_order_changed; +// +// klass->release = SPObject::sp_object_release; +// +// //klass->build = SPObject::sp_object_build; +// +// klass->set = SPObject::sp_object_private_set; +// klass->write = SPObject::sp_object_private_write; } -- cgit v1.2.3 From 7df6616da5ea2debb86838366ddf746841549cdb Mon Sep 17 00:00:00 2001 From: Markus Engel Date: Sat, 30 Mar 2013 00:56:13 +0100 Subject: Renamed virtual function names. (bzr r11608.1.57) --- src/sp-object.cpp | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) (limited to 'src/sp-object.cpp') diff --git a/src/sp-object.cpp b/src/sp-object.cpp index 0b31d2835..65d37ef1d 100644 --- a/src/sp-object.cpp +++ b/src/sp-object.cpp @@ -190,15 +190,15 @@ sp_object_init(SPObject *object) } // CPPIFY: make pure virtual -void CObject::onReadContent() { +void CObject::read_content() { //throw; } -void CObject::onUpdate(SPCtx* ctx, unsigned int flags) { +void CObject::update(SPCtx* ctx, unsigned int flags) { //throw; } -void CObject::onModified(unsigned int flags) { +void CObject::modified(unsigned int flags) { //throw; } @@ -657,7 +657,7 @@ SPObject *SPObject::get_child_by_repr(Inkscape::XML::Node *repr) return result; } -void CObject::onChildAdded(Inkscape::XML::Node *child, Inkscape::XML::Node *ref) { +void CObject::child_added(Inkscape::XML::Node *child, Inkscape::XML::Node *ref) { SPObject* object = this->spobject; GType type = sp_repr_type_lookup(child); @@ -672,7 +672,7 @@ void CObject::onChildAdded(Inkscape::XML::Node *child, Inkscape::XML::Node *ref) ochild->invoke_build(object->document, child, object->cloned); } -void CObject::onRelease() { +void CObject::release() { SPObject* object = this->spobject; debug("id=%x, typename=%s", object, g_type_name_from_instance((GTypeInstance*)object)); @@ -681,7 +681,7 @@ void CObject::onRelease() { } } -void CObject::onRemoveChild(Inkscape::XML::Node* child) { +void CObject::remove_child(Inkscape::XML::Node* child) { SPObject* object = this->spobject; debug("id=%x, typename=%s", object, g_type_name_from_instance((GTypeInstance*)object)); @@ -692,7 +692,7 @@ void CObject::onRemoveChild(Inkscape::XML::Node* child) { } } -void CObject::onOrderChanged(Inkscape::XML::Node *child, Inkscape::XML::Node * old_ref, Inkscape::XML::Node *new_ref) { +void CObject::order_changed(Inkscape::XML::Node *child, Inkscape::XML::Node * old_ref, Inkscape::XML::Node *new_ref) { SPObject* object = this->spobject; SPObject *ochild = object->get_child_by_repr(child); @@ -702,7 +702,7 @@ void CObject::onOrderChanged(Inkscape::XML::Node *child, Inkscape::XML::Node * o ochild->_position_changed_signal.emit(ochild); } -void CObject::onBuild(SPDocument *document, Inkscape::XML::Node *repr) { +void CObject::build(SPDocument *document, Inkscape::XML::Node *repr) { SPObject* object = this->spobject; /* Nothing specific here */ @@ -780,7 +780,7 @@ void SPObject::invoke_build(SPDocument *document, Inkscape::XML::Node *repr, uns } /* Invoke derived methods, if any */ - this->cobject->onBuild(document, repr); + this->cobject->build(document, repr); /* Signalling (should be connected AFTER processing derived methods */ sp_repr_add_listener(repr, &object_event_vector, this); @@ -819,7 +819,7 @@ void SPObject::releaseReferences() { this->_release_signal.emit(this); - this->cobject->onRelease(); + this->cobject->release(); /* all hrefs should be released by the "release" handlers */ g_assert(this->hrefcount == 0); @@ -865,24 +865,24 @@ void SPObject::repr_child_added(Inkscape::XML::Node * /*repr*/, Inkscape::XML::N { SPObject *object = SP_OBJECT(data); - object->cobject->onChildAdded(child, ref); + object->cobject->child_added(child, ref); } void SPObject::repr_child_removed(Inkscape::XML::Node * /*repr*/, Inkscape::XML::Node *child, Inkscape::XML::Node * /*ref*/, gpointer data) { SPObject *object = SP_OBJECT(data); - object->cobject->onRemoveChild(child); + object->cobject->remove_child(child); } void SPObject::repr_order_changed(Inkscape::XML::Node * /*repr*/, Inkscape::XML::Node *child, Inkscape::XML::Node *old, Inkscape::XML::Node *newer, gpointer data) { SPObject *object = SP_OBJECT(data); - object->cobject->onOrderChanged(child, old, newer); + object->cobject->order_changed(child, old, newer); } -void CObject::onSet(unsigned int key, gchar const* value) { +void CObject::set(unsigned int key, gchar const* value) { g_assert(key != SP_ATTR_INVALID); SPObject* object = this->spobject; @@ -973,7 +973,7 @@ void SPObject::setKeyValue(unsigned int key, gchar const *value) //g_assert(object != NULL); //g_assert(SP_IS_OBJECT(object)); - this->cobject->onSet(key, value); + this->cobject->set(key, value); } void SPObject::readAttr(gchar const *key) @@ -1011,7 +1011,7 @@ void SPObject::repr_content_changed(Inkscape::XML::Node * /*repr*/, gchar const { SPObject *object = SP_OBJECT(data); - object->cobject->onReadContent(); + object->cobject->read_content(); } /** @@ -1029,7 +1029,7 @@ static gchar const *sp_xml_get_space_string(unsigned int space) } } -Inkscape::XML::Node* CObject::onWrite(Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags) { +Inkscape::XML::Node* CObject::write(Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags) { SPObject* object = this->spobject; if (!repr && (flags & SP_OBJECT_WRITE_BUILD)) { @@ -1135,7 +1135,7 @@ Inkscape::XML::Node * SPObject::updateRepr(Inkscape::XML::Document *doc, Inkscap if (!(flags & SP_OBJECT_WRITE_BUILD) && !repr) { repr = getRepr(); } - return this->cobject->onWrite(doc, repr, flags); + return this->cobject->write(doc, repr, flags); } @@ -1202,7 +1202,7 @@ void SPObject::updateDisplay(SPCtx *ctx, unsigned int flags) try { - this->cobject->onUpdate(ctx, flags); + this->cobject->update(ctx, flags); } catch(...) { @@ -1260,7 +1260,7 @@ void SPObject::emitModified(unsigned int flags) g_object_ref(G_OBJECT(this)); - this->cobject->onModified(flags); + this->cobject->modified(flags); _modified_signal.emit(this, flags); g_object_unref(G_OBJECT(this)); -- cgit v1.2.3 From bdca3d9c99706b4ac21c6fd3e115cbd5ef0f5ea4 Mon Sep 17 00:00:00 2001 From: Markus Engel Date: Sat, 30 Mar 2013 21:40:11 +0100 Subject: Removed unused function definitions (bzr r11608.1.59) --- src/sp-object.cpp | 32 -------------------------------- 1 file changed, 32 deletions(-) (limited to 'src/sp-object.cpp') diff --git a/src/sp-object.cpp b/src/sp-object.cpp index 65d37ef1d..3984617bb 100644 --- a/src/sp-object.cpp +++ b/src/sp-object.cpp @@ -101,34 +101,8 @@ public: } }; -static void sp_object_child_added(SPObject *object, - Inkscape::XML::Node *child, - Inkscape::XML::Node *ref); - static void sp_object_finalize(GObject *object); -static void sp_object_remove_child(SPObject *object, - Inkscape::XML::Node *child); - -static void sp_object_order_changed(SPObject *object, - Inkscape::XML::Node *child, - Inkscape::XML::Node *old_ref, - Inkscape::XML::Node *new_ref); - -static void sp_object_release(SPObject *object); -static void sp_object_build(SPObject *object, - SPDocument *document, - Inkscape::XML::Node *repr); - -static void sp_object_private_set(SPObject *object, - unsigned int key, - gchar const *value); - -static Inkscape::XML::Node *sp_object_private_write(SPObject *object, - Inkscape::XML::Document *doc, - Inkscape::XML::Node *repr, - guint flags); - static gchar *sp_object_get_unique_id(SPObject *object, gchar const *defid); @@ -141,9 +115,7 @@ static void sp_object_class_init(SPObjectClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS(klass); - object_class->finalize = sp_object_finalize; - } /** @@ -151,10 +123,6 @@ sp_object_class_init(SPObjectClass *klass) */ static void sp_object_init(SPObject *object) - - - - { debug("id=%x, typename=%s",object, g_type_name_from_instance((GTypeInstance*)object)); -- cgit v1.2.3 From a5d6e692d661f0bf7648e64e8fcb04588bb8f3ab Mon Sep 17 00:00:00 2001 From: Markus Engel Date: Mon, 1 Apr 2013 00:07:00 +0200 Subject: Prepared exchange of casting macros. (bzr r11608.1.63) --- src/sp-object.cpp | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'src/sp-object.cpp') diff --git a/src/sp-object.cpp b/src/sp-object.cpp index 3984617bb..82f3f1c81 100644 --- a/src/sp-object.cpp +++ b/src/sp-object.cpp @@ -128,6 +128,9 @@ sp_object_init(SPObject *object) object->cobject = new CObject(object); + new (&object->typeHierarchy) std::set(); + object->typeHierarchy.insert(typeid(SPObject)); + object->hrefcount = 0; object->_total_hrefcount = 0; object->document = NULL; @@ -179,6 +182,7 @@ sp_object_finalize(GObject *object) { SPObject *spobject = (SPObject *)object; + spobject->typeHierarchy.~set(); delete spobject->cobject; g_free(spobject->_label); -- cgit v1.2.3 From 7eb077e4097aed62c11e5b4e97ff4b16039e73fa Mon Sep 17 00:00:00 2001 From: Markus Engel Date: Mon, 1 Apr 2013 23:04:54 +0200 Subject: Replaced calls to g_object_(un)ref with sp_object_(un)ref. (bzr r11608.1.65) --- src/sp-object.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'src/sp-object.cpp') diff --git a/src/sp-object.cpp b/src/sp-object.cpp index 82f3f1c81..0ba74990e 100644 --- a/src/sp-object.cpp +++ b/src/sp-object.cpp @@ -416,7 +416,7 @@ GSList *SPObject::childList(bool add_ref, Action) { GSList *l = NULL; for ( SPObject *child = firstChild() ; child; child = child->getNext() ) { if (add_ref) { - g_object_ref (G_OBJECT (child)); + sp_object_ref (child); } l = g_slist_prepend (l, child); @@ -1230,12 +1230,12 @@ void SPObject::emitModified(unsigned int flags) * themselves. */ this->mflags = 0; - g_object_ref(G_OBJECT(this)); + sp_object_ref(this); this->cobject->modified(flags); _modified_signal.emit(this, flags); - g_object_unref(G_OBJECT(this)); + sp_object_unref(this); } gchar const *SPObject::getTagName(SPException *ex) const -- cgit v1.2.3 From 7504b21ce73f7f2d3787ab5f363b5e5acc721a23 Mon Sep 17 00:00:00 2001 From: Markus Engel Date: Mon, 1 Apr 2013 23:50:52 +0200 Subject: Added experimental constructor to SPRect. Memory leaks because of non-virtual destructor. (bzr r11608.1.66) --- src/sp-object.cpp | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) (limited to 'src/sp-object.cpp') diff --git a/src/sp-object.cpp b/src/sp-object.cpp index 0ba74990e..66f9b5ab8 100644 --- a/src/sp-object.cpp +++ b/src/sp-object.cpp @@ -118,12 +118,9 @@ sp_object_class_init(SPObjectClass *klass) object_class->finalize = sp_object_finalize; } -/** - * Callback to initialize the SPObject object. - */ -static void -sp_object_init(SPObject *object) -{ +SPObject::SPObject() { + SPObject* object = this; + debug("id=%x, typename=%s",object, g_type_name_from_instance((GTypeInstance*)object)); object->cobject = new CObject(object); @@ -131,6 +128,12 @@ sp_object_init(SPObject *object) new (&object->typeHierarchy) std::set(); object->typeHierarchy.insert(typeid(SPObject)); + object->repr = NULL; + object->mflags = 0; + object->id = NULL; + object->cloned = 0; + object->uflags = 0; + object->hrefcount = 0; object->_total_hrefcount = 0; object->document = NULL; @@ -160,6 +163,15 @@ sp_object_init(SPObject *object) object->_default_label = NULL; } +/** + * Callback to initialize the SPObject object. + */ +static void +sp_object_init(SPObject *object) +{ + new (object) SPObject(); +} + // CPPIFY: make pure virtual void CObject::read_content() { //throw; -- cgit v1.2.3 From 0a7e23844c3a43203de3f5207aecb278e84ee739 Mon Sep 17 00:00:00 2001 From: Markus Engel Date: Tue, 2 Apr 2013 20:45:20 +0200 Subject: Added virtual destructor to SPObject. Switched to new factory. Replaced some casts. Inkscape seems stable, car.svgz renders correctly to png. (bzr r11608.1.70) --- src/sp-object.cpp | 42 ++++++++++++++++++++++++++++++------------ 1 file changed, 30 insertions(+), 12 deletions(-) (limited to 'src/sp-object.cpp') diff --git a/src/sp-object.cpp b/src/sp-object.cpp index 66f9b5ab8..510b53177 100644 --- a/src/sp-object.cpp +++ b/src/sp-object.cpp @@ -41,6 +41,8 @@ #include "util/format.h" #include "util/longest-common-suffix.h" +#include "sp-factory.h" + using std::memcpy; using std::strchr; using std::strcmp; @@ -163,6 +165,10 @@ SPObject::SPObject() { object->_default_label = NULL; } +SPObject::~SPObject() { + +} + /** * Callback to initialize the SPObject object. */ @@ -281,7 +287,7 @@ SPObject *sp_object_ref(SPObject *object, SPObject *owner) g_return_val_if_fail(!owner || SP_IS_OBJECT(owner), NULL); Inkscape::Debug::EventTracker tracker(object); - g_object_ref(G_OBJECT(object)); + //g_object_ref(G_OBJECT(object)); return object; } @@ -292,7 +298,7 @@ SPObject *sp_object_unref(SPObject *object, SPObject *owner) g_return_val_if_fail(!owner || SP_IS_OBJECT(owner), NULL); Inkscape::Debug::EventTracker tracker(object); - g_object_unref(G_OBJECT(object)); + //g_object_unref(G_OBJECT(object)); return NULL; } @@ -644,11 +650,17 @@ SPObject *SPObject::get_child_by_repr(Inkscape::XML::Node *repr) void CObject::child_added(Inkscape::XML::Node *child, Inkscape::XML::Node *ref) { SPObject* object = this->spobject; - GType type = sp_repr_type_lookup(child); - if (!type) { - return; - } - SPObject *ochild = SP_OBJECT(g_object_new(type, 0)); +// GType type = sp_repr_type_lookup(child); +// if (!type) { +// return; +// } +// SPObject *ochild = SP_OBJECT(g_object_new(type, 0)); + + SPObject* ochild = SPFactory::instance().createObject(*child); + if (!ochild) { + return; + } + SPObject *prev = ref ? object->get_child_by_repr(ref) : NULL; object->attach(ochild, prev); sp_object_unref(ochild, NULL); @@ -697,11 +709,17 @@ void CObject::build(SPDocument *document, Inkscape::XML::Node *repr) { object->readAttr("inkscape:collect"); for (Inkscape::XML::Node *rchild = repr->firstChild() ; rchild != NULL; rchild = rchild->next()) { - GType type = sp_repr_type_lookup(rchild); - if (!type) { - continue; - } - SPObject *child = SP_OBJECT(g_object_new(type, 0)); +// GType type = sp_repr_type_lookup(rchild); +// if (!type) { +// continue; +// } +// SPObject *child = SP_OBJECT(g_object_new(type, 0)); + + SPObject* child = SPFactory::instance().createObject(*rchild); + if (!child) { + continue; + } + object->attach(child, object->lastChild()); sp_object_unref(child, NULL); child->invoke_build(document, rchild, object->cloned); -- cgit v1.2.3 From 27e2102f96a5554bcd5310ec11435d155773b279 Mon Sep 17 00:00:00 2001 From: Markus Engel Date: Sun, 7 Apr 2013 18:28:22 +0200 Subject: Merge Object and subclasses. Merging of SP- and C-classes complete. (bzr r11608.1.86) --- src/sp-object.cpp | 182 +++++++++++++++++++----------------------------------- 1 file changed, 62 insertions(+), 120 deletions(-) (limited to 'src/sp-object.cpp') diff --git a/src/sp-object.cpp b/src/sp-object.cpp index 510b53177..7d42efebe 100644 --- a/src/sp-object.cpp +++ b/src/sp-object.cpp @@ -103,136 +103,78 @@ public: } }; -static void sp_object_finalize(GObject *object); - static gchar *sp_object_get_unique_id(SPObject *object, gchar const *defid); -G_DEFINE_TYPE(SPObject, sp_object, G_TYPE_OBJECT); - -/** - * Initializes the SPObject vtable. - */ -static void -sp_object_class_init(SPObjectClass *klass) -{ - GObjectClass *object_class = G_OBJECT_CLASS(klass); - object_class->finalize = sp_object_finalize; -} - SPObject::SPObject() { - SPObject* object = this; - - debug("id=%x, typename=%s",object, g_type_name_from_instance((GTypeInstance*)object)); + debug("id=%x, typename=%s",this, g_type_name_from_instance((GTypeInstance*)object)); - object->cobject = new CObject(object); - - new (&object->typeHierarchy) std::set(); - object->typeHierarchy.insert(typeid(SPObject)); - - object->repr = NULL; - object->mflags = 0; - object->id = NULL; - object->cloned = 0; - object->uflags = 0; + this->repr = NULL; + this->mflags = 0; + this->id = NULL; + this->cloned = 0; + this->uflags = 0; - object->hrefcount = 0; - object->_total_hrefcount = 0; - object->document = NULL; - object->children = object->_last_child = NULL; - object->parent = object->next = NULL; + this->hrefcount = 0; + this->_total_hrefcount = 0; + this->document = NULL; + this->children = this->_last_child = NULL; + this->parent = this->next = NULL; //used XML Tree here. - object->getRepr(); // TODO check why this call is made + this->getRepr(); // TODO check why this call is made - SPObjectImpl::setIdNull(object); + SPObjectImpl::setIdNull(this); - object->_collection_policy = SPObject::COLLECT_WITH_PARENT; + this->_collection_policy = SPObject::COLLECT_WITH_PARENT; - new (&object->_release_signal) sigc::signal(); - new (&object->_modified_signal) sigc::signal(); - new (&object->_delete_signal) sigc::signal(); - new (&object->_position_changed_signal) sigc::signal(); - object->_successor = NULL; + new (&this->_release_signal) sigc::signal(); + new (&this->_modified_signal) sigc::signal(); + new (&this->_delete_signal) sigc::signal(); + new (&this->_position_changed_signal) sigc::signal(); + this->_successor = NULL; // FIXME: now we create style for all objects, but per SVG, only the following can have style attribute: // vg, g, defs, desc, title, symbol, use, image, switch, path, rect, circle, ellipse, line, polyline, // polygon, text, tspan, tref, textPath, altGlyph, glyphRef, marker, linearGradient, radialGradient, // stop, pattern, clipPath, mask, filter, feImage, a, font, glyph, missing-glyph, foreignObject - object->style = sp_style_new_from_object(object); + this->style = sp_style_new_from_object(this); - object->_label = NULL; - object->_default_label = NULL; + this->_label = NULL; + this->_default_label = NULL; } SPObject::~SPObject() { + g_free(this->_label); + g_free(this->_default_label); -} + this->_label = NULL; + this->_default_label = NULL; -/** - * Callback to initialize the SPObject object. - */ -static void -sp_object_init(SPObject *object) -{ - new (object) SPObject(); + if (this->_successor) { + sp_object_unref(this->_successor, NULL); + this->_successor = NULL; + } + + this->_release_signal.~signal(); + this->_modified_signal.~signal(); + this->_delete_signal.~signal(); + this->_position_changed_signal.~signal(); } // CPPIFY: make pure virtual -void CObject::read_content() { +void SPObject::read_content() { //throw; } -void CObject::update(SPCtx* ctx, unsigned int flags) { +void SPObject::update(SPCtx* ctx, unsigned int flags) { //throw; } -void CObject::modified(unsigned int flags) { +void SPObject::modified(unsigned int flags) { //throw; } - -/** - * Callback to destroy all members and connections of object and itself. - */ -static void -sp_object_finalize(GObject *object) -{ - SPObject *spobject = (SPObject *)object; - - spobject->typeHierarchy.~set(); - delete spobject->cobject; - - g_free(spobject->_label); - g_free(spobject->_default_label); - spobject->_label = NULL; - spobject->_default_label = NULL; - - if (spobject->_successor) { - sp_object_unref(spobject->_successor, NULL); - spobject->_successor = NULL; - } - - spobject->_release_signal.~signal(); - spobject->_modified_signal.~signal(); - spobject->_delete_signal.~signal(); - spobject->_position_changed_signal.~signal(); - - if (((GObjectClass *) (sp_object_parent_class))->finalize) { - (* ((GObjectClass *) (sp_object_parent_class))->finalize)(object); - } -} - - -// CPPIFY: remove -CObject::CObject(SPObject* object) { - this->spobject = object; -} - -CObject::~CObject() { -} - - namespace { namespace Debug = Inkscape::Debug; @@ -647,8 +589,8 @@ SPObject *SPObject::get_child_by_repr(Inkscape::XML::Node *repr) return result; } -void CObject::child_added(Inkscape::XML::Node *child, Inkscape::XML::Node *ref) { - SPObject* object = this->spobject; +void SPObject::child_added(Inkscape::XML::Node *child, Inkscape::XML::Node *ref) { + SPObject* object = this; // GType type = sp_repr_type_lookup(child); // if (!type) { @@ -668,8 +610,8 @@ void CObject::child_added(Inkscape::XML::Node *child, Inkscape::XML::Node *ref) ochild->invoke_build(object->document, child, object->cloned); } -void CObject::release() { - SPObject* object = this->spobject; +void SPObject::release() { + SPObject* object = this; debug("id=%x, typename=%s", object, g_type_name_from_instance((GTypeInstance*)object)); while (object->children) { @@ -677,8 +619,8 @@ void CObject::release() { } } -void CObject::remove_child(Inkscape::XML::Node* child) { - SPObject* object = this->spobject; +void SPObject::remove_child(Inkscape::XML::Node* child) { + SPObject* object = this; debug("id=%x, typename=%s", object, g_type_name_from_instance((GTypeInstance*)object)); SPObject *ochild = object->get_child_by_repr(child); @@ -688,8 +630,8 @@ void CObject::remove_child(Inkscape::XML::Node* child) { } } -void CObject::order_changed(Inkscape::XML::Node *child, Inkscape::XML::Node * old_ref, Inkscape::XML::Node *new_ref) { - SPObject* object = this->spobject; +void SPObject::order_changed(Inkscape::XML::Node *child, Inkscape::XML::Node * old_ref, Inkscape::XML::Node *new_ref) { + SPObject* object = this; SPObject *ochild = object->get_child_by_repr(child); g_return_if_fail(ochild != NULL); @@ -698,8 +640,8 @@ void CObject::order_changed(Inkscape::XML::Node *child, Inkscape::XML::Node * ol ochild->_position_changed_signal.emit(ochild); } -void CObject::build(SPDocument *document, Inkscape::XML::Node *repr) { - SPObject* object = this->spobject; +void SPObject::build(SPDocument *document, Inkscape::XML::Node *repr) { + SPObject* object = this; /* Nothing specific here */ debug("id=%x, typename=%s", object, g_type_name_from_instance((GTypeInstance*)object)); @@ -782,7 +724,7 @@ void SPObject::invoke_build(SPDocument *document, Inkscape::XML::Node *repr, uns } /* Invoke derived methods, if any */ - this->cobject->build(document, repr); + this->build(document, repr); /* Signalling (should be connected AFTER processing derived methods */ sp_repr_add_listener(repr, &object_event_vector, this); @@ -821,7 +763,7 @@ void SPObject::releaseReferences() { this->_release_signal.emit(this); - this->cobject->release(); + this->release(); /* all hrefs should be released by the "release" handlers */ g_assert(this->hrefcount == 0); @@ -867,27 +809,27 @@ void SPObject::repr_child_added(Inkscape::XML::Node * /*repr*/, Inkscape::XML::N { SPObject *object = SP_OBJECT(data); - object->cobject->child_added(child, ref); + object->child_added(child, ref); } void SPObject::repr_child_removed(Inkscape::XML::Node * /*repr*/, Inkscape::XML::Node *child, Inkscape::XML::Node * /*ref*/, gpointer data) { SPObject *object = SP_OBJECT(data); - object->cobject->remove_child(child); + object->remove_child(child); } void SPObject::repr_order_changed(Inkscape::XML::Node * /*repr*/, Inkscape::XML::Node *child, Inkscape::XML::Node *old, Inkscape::XML::Node *newer, gpointer data) { SPObject *object = SP_OBJECT(data); - object->cobject->order_changed(child, old, newer); + object->order_changed(child, old, newer); } -void CObject::set(unsigned int key, gchar const* value) { +void SPObject::set(unsigned int key, gchar const* value) { g_assert(key != SP_ATTR_INVALID); - SPObject* object = this->spobject; + SPObject* object = this; switch (key) { case SP_ATTR_ID: @@ -975,7 +917,7 @@ void SPObject::setKeyValue(unsigned int key, gchar const *value) //g_assert(object != NULL); //g_assert(SP_IS_OBJECT(object)); - this->cobject->set(key, value); + this->set(key, value); } void SPObject::readAttr(gchar const *key) @@ -1013,7 +955,7 @@ void SPObject::repr_content_changed(Inkscape::XML::Node * /*repr*/, gchar const { SPObject *object = SP_OBJECT(data); - object->cobject->read_content(); + object->read_content(); } /** @@ -1031,8 +973,8 @@ static gchar const *sp_xml_get_space_string(unsigned int space) } } -Inkscape::XML::Node* CObject::write(Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags) { - SPObject* object = this->spobject; +Inkscape::XML::Node* SPObject::write(Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags) { + SPObject* object = this; if (!repr && (flags & SP_OBJECT_WRITE_BUILD)) { repr = object->getRepr()->duplicate(doc); @@ -1137,7 +1079,7 @@ Inkscape::XML::Node * SPObject::updateRepr(Inkscape::XML::Document *doc, Inkscap if (!(flags & SP_OBJECT_WRITE_BUILD) && !repr) { repr = getRepr(); } - return this->cobject->write(doc, repr, flags); + return this->write(doc, repr, flags); } @@ -1204,7 +1146,7 @@ void SPObject::updateDisplay(SPCtx *ctx, unsigned int flags) try { - this->cobject->update(ctx, flags); + this->update(ctx, flags); } catch(...) { @@ -1262,7 +1204,7 @@ void SPObject::emitModified(unsigned int flags) sp_object_ref(this); - this->cobject->modified(flags); + this->modified(flags); _modified_signal.emit(this, flags); sp_object_unref(this); -- cgit v1.2.3 From e9d86314ef5d8aafc2ec7677fe4825a346276ce4 Mon Sep 17 00:00:00 2001 From: Markus Engel Date: Mon, 8 Apr 2013 01:31:41 +0200 Subject: Added exception to SPFactory / basic handling to SPObject. (bzr r11608.1.87) --- src/sp-object.cpp | 71 +++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 50 insertions(+), 21 deletions(-) (limited to 'src/sp-object.cpp') diff --git a/src/sp-object.cpp b/src/sp-object.cpp index 7d42efebe..ff5426282 100644 --- a/src/sp-object.cpp +++ b/src/sp-object.cpp @@ -209,6 +209,34 @@ public: } + + + + + +#include +#include + +void log_exception(std::exception_ptr exception) { + try { + std::rethrow_exception(exception); + } catch (const std::exception& e) { + std::cerr << "Caught Exception of type " << std::string(typeid(e).name()) << '\n'; + std::cerr << "Message: " << std::string(e.what()) << '\n'; + + try { + std::rethrow_if_nested(e); + } catch (...) { + std::cerr << "Inner Exception: \n"; + log_exception(std::current_exception()); + } + } +} + + + + + gchar const* SPObject::getId() const { return id; } @@ -592,22 +620,17 @@ SPObject *SPObject::get_child_by_repr(Inkscape::XML::Node *repr) void SPObject::child_added(Inkscape::XML::Node *child, Inkscape::XML::Node *ref) { SPObject* object = this; -// GType type = sp_repr_type_lookup(child); -// if (!type) { -// return; -// } -// SPObject *ochild = SP_OBJECT(g_object_new(type, 0)); - - SPObject* ochild = SPFactory::instance().createObject(*child); - if (!ochild) { - return; - } + try { + SPObject* ochild = SPFactory::instance().createObject(*child); - SPObject *prev = ref ? object->get_child_by_repr(ref) : NULL; - object->attach(ochild, prev); - sp_object_unref(ochild, NULL); + SPObject *prev = ref ? object->get_child_by_repr(ref) : NULL; + object->attach(ochild, prev); + sp_object_unref(ochild, NULL); - ochild->invoke_build(object->document, child, object->cloned); + ochild->invoke_build(object->document, child, object->cloned); + } catch (const SPFactory::TypeNotRegistered& e) { + log_exception(std::current_exception()); + } } void SPObject::release() { @@ -657,14 +680,20 @@ void SPObject::build(SPDocument *document, Inkscape::XML::Node *repr) { // } // SPObject *child = SP_OBJECT(g_object_new(type, 0)); - SPObject* child = SPFactory::instance().createObject(*rchild); - if (!child) { - continue; - } +// SPObject* child = SPFactory::instance().createObject(*rchild); +// if (!child) { +// continue; +// } - object->attach(child, object->lastChild()); - sp_object_unref(child, NULL); - child->invoke_build(document, rchild, object->cloned); + try { + SPObject* child = SPFactory::instance().createObject(*rchild); + + object->attach(child, object->lastChild()); + sp_object_unref(child, NULL); + child->invoke_build(document, rchild, object->cloned); + } catch (const SPFactory::TypeNotRegistered& e) { + log_exception(std::current_exception()); + } } } -- cgit v1.2.3 From 9fd15efa4ab3302f3f9d7c7473a5377af314021c Mon Sep 17 00:00:00 2001 From: Markus Engel Date: Mon, 8 Apr 2013 21:01:11 +0200 Subject: Reactivated independent reference counting in the SPObject tree. (bzr r11608.1.88) --- src/sp-object.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) (limited to 'src/sp-object.cpp') diff --git a/src/sp-object.cpp b/src/sp-object.cpp index ff5426282..c2979b609 100644 --- a/src/sp-object.cpp +++ b/src/sp-object.cpp @@ -109,6 +109,8 @@ static gchar *sp_object_get_unique_id(SPObject *object, SPObject::SPObject() { debug("id=%x, typename=%s",this, g_type_name_from_instance((GTypeInstance*)object)); + this->refCount = 1; + this->repr = NULL; this->mflags = 0; this->id = NULL; @@ -258,6 +260,7 @@ SPObject *sp_object_ref(SPObject *object, SPObject *owner) Inkscape::Debug::EventTracker tracker(object); //g_object_ref(G_OBJECT(object)); + object->refCount++; return object; } @@ -269,6 +272,12 @@ SPObject *sp_object_unref(SPObject *object, SPObject *owner) Inkscape::Debug::EventTracker tracker(object); //g_object_unref(G_OBJECT(object)); + object->refCount--; + + if (object->refCount < 0) { + delete object; + } + return NULL; } -- cgit v1.2.3 From 8de8047c5e30af8598646d7a66c62dbf290f7c51 Mon Sep 17 00:00:00 2001 From: Markus Engel Date: Wed, 10 Apr 2013 16:10:04 +0200 Subject: Removed old SPObject factory. (bzr r11608.1.91) --- src/sp-object.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) (limited to 'src/sp-object.cpp') diff --git a/src/sp-object.cpp b/src/sp-object.cpp index c2979b609..dc9b1a2e5 100644 --- a/src/sp-object.cpp +++ b/src/sp-object.cpp @@ -25,7 +25,7 @@ #include "document.h" #include "preferences.h" #include "style.h" -#include "sp-object-repr.h" +#include "sp-factory.h" #include "sp-paint-server.h" #include "sp-root.h" #include "sp-style-elem.h" @@ -41,8 +41,6 @@ #include "util/format.h" #include "util/longest-common-suffix.h" -#include "sp-factory.h" - using std::memcpy; using std::strchr; using std::strcmp; -- cgit v1.2.3 From fbb85064cfaaf03cc09bacedb16a8561f61f2b3d Mon Sep 17 00:00:00 2001 From: Markus Engel Date: Sat, 13 Apr 2013 00:37:18 +0200 Subject: Added prefPaths to contexts; modified SPFactory (bzr r11608.1.94) --- src/sp-object.cpp | 50 ++++++++++++++++++++++++++++---------------------- 1 file changed, 28 insertions(+), 22 deletions(-) (limited to 'src/sp-object.cpp') diff --git a/src/sp-object.cpp b/src/sp-object.cpp index dc9b1a2e5..363a05579 100644 --- a/src/sp-object.cpp +++ b/src/sp-object.cpp @@ -214,24 +214,24 @@ public: -#include -#include - -void log_exception(std::exception_ptr exception) { - try { - std::rethrow_exception(exception); - } catch (const std::exception& e) { - std::cerr << "Caught Exception of type " << std::string(typeid(e).name()) << '\n'; - std::cerr << "Message: " << std::string(e.what()) << '\n'; - - try { - std::rethrow_if_nested(e); - } catch (...) { - std::cerr << "Inner Exception: \n"; - log_exception(std::current_exception()); - } - } -} +//#include +//#include +// +//void log_exception(std::exception_ptr exception) { +// try { +// std::rethrow_exception(exception); +// } catch (const std::exception& e) { +// std::cerr << "Caught Exception of type " << std::string(typeid(e).name()) << '\n'; +// std::cerr << "Message: " << std::string(e.what()) << '\n'; +// +// try { +// std::rethrow_if_nested(e); +// } catch (...) { +// std::cerr << "Inner Exception: \n"; +// log_exception(std::current_exception()); +// } +// } +//} @@ -628,7 +628,9 @@ void SPObject::child_added(Inkscape::XML::Node *child, Inkscape::XML::Node *ref) SPObject* object = this; try { - SPObject* ochild = SPFactory::instance().createObject(*child); + const std::string typeString = NodeTraits::getTypeString(*child); + + SPObject* ochild = SPFactory::instance().createObject(typeString); SPObject *prev = ref ? object->get_child_by_repr(ref) : NULL; object->attach(ochild, prev); @@ -636,7 +638,8 @@ void SPObject::child_added(Inkscape::XML::Node *child, Inkscape::XML::Node *ref) ochild->invoke_build(object->document, child, object->cloned); } catch (const SPFactory::TypeNotRegistered& e) { - log_exception(std::current_exception()); + //log_exception(std::current_exception()); + g_warning("TypeNotRegistered exception: %s", e.what()); } } @@ -693,13 +696,16 @@ void SPObject::build(SPDocument *document, Inkscape::XML::Node *repr) { // } try { - SPObject* child = SPFactory::instance().createObject(*rchild); + const std::string typeString = NodeTraits::getTypeString(*rchild); + + SPObject* child = SPFactory::instance().createObject(typeString); object->attach(child, object->lastChild()); sp_object_unref(child, NULL); child->invoke_build(document, rchild, object->cloned); } catch (const SPFactory::TypeNotRegistered& e) { - log_exception(std::current_exception()); + //log_exception(std::current_exception()); + g_warning("TypeNotRegistered exception: %s", e.what()); } } } -- cgit v1.2.3 From fbdc8b84ff670c684dafc7d7d403ed01e7077e70 Mon Sep 17 00:00:00 2001 From: Markus Engel Date: Sat, 13 Apr 2013 18:13:17 +0200 Subject: Replaced casting macros for EventContext tree; added contructors. (bzr r11608.1.96) --- src/sp-object.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/sp-object.cpp') diff --git a/src/sp-object.cpp b/src/sp-object.cpp index 363a05579..79c83e38d 100644 --- a/src/sp-object.cpp +++ b/src/sp-object.cpp @@ -637,7 +637,7 @@ void SPObject::child_added(Inkscape::XML::Node *child, Inkscape::XML::Node *ref) sp_object_unref(ochild, NULL); ochild->invoke_build(object->document, child, object->cloned); - } catch (const SPFactory::TypeNotRegistered& e) { + } catch (const FactoryExceptions::TypeNotRegistered& e) { //log_exception(std::current_exception()); g_warning("TypeNotRegistered exception: %s", e.what()); } @@ -703,7 +703,7 @@ void SPObject::build(SPDocument *document, Inkscape::XML::Node *repr) { object->attach(child, object->lastChild()); sp_object_unref(child, NULL); child->invoke_build(document, rchild, object->cloned); - } catch (const SPFactory::TypeNotRegistered& e) { + } catch (const FactoryExceptions::TypeNotRegistered& e) { //log_exception(std::current_exception()); g_warning("TypeNotRegistered exception: %s", e.what()); } -- cgit v1.2.3 From 989abbac025a8b3349748d19a613a08586c5fdcd Mon Sep 17 00:00:00 2001 From: Markus Engel Date: Wed, 31 Jul 2013 21:11:20 +0200 Subject: Fixed SPObject ctor and dtor; removed singleton.h; some smaller changes. (bzr r11608.1.110) --- src/sp-object.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) (limited to 'src/sp-object.cpp') diff --git a/src/sp-object.cpp b/src/sp-object.cpp index 167d8a331..08ed9fc8d 100644 --- a/src/sp-object.cpp +++ b/src/sp-object.cpp @@ -128,10 +128,10 @@ SPObject::SPObject() { this->_collection_policy = SPObject::COLLECT_WITH_PARENT; - new (&this->_release_signal) sigc::signal(); - new (&this->_modified_signal) sigc::signal(); - new (&this->_delete_signal) sigc::signal(); - new (&this->_position_changed_signal) sigc::signal(); + //new (&this->_release_signal) sigc::signal(); + //new (&this->_modified_signal) sigc::signal(); + //new (&this->_delete_signal) sigc::signal(); + //new (&this->_position_changed_signal) sigc::signal(); this->_successor = NULL; // FIXME: now we create style for all objects, but per SVG, only the following can have style attribute: @@ -156,10 +156,10 @@ SPObject::~SPObject() { this->_successor = NULL; } - this->_release_signal.~signal(); - this->_modified_signal.~signal(); - this->_delete_signal.~signal(); - this->_position_changed_signal.~signal(); + //this->_release_signal.~signal(); + //this->_modified_signal.~signal(); + //this->_delete_signal.~signal(); + //this->_position_changed_signal.~signal(); } // CPPIFY: make pure virtual -- cgit v1.2.3 From beecbea1b415d5b9536f2309c4f30fc258e346f5 Mon Sep 17 00:00:00 2001 From: Markus Engel Date: Wed, 31 Jul 2013 22:51:23 +0200 Subject: Cleaned up a bit; fixed struct vs. class forward declarations. (bzr r11608.1.111) --- src/sp-object.cpp | 66 ++++++------------------------------------------------- 1 file changed, 7 insertions(+), 59 deletions(-) (limited to 'src/sp-object.cpp') diff --git a/src/sp-object.cpp b/src/sp-object.cpp index 08ed9fc8d..95a28dd7b 100644 --- a/src/sp-object.cpp +++ b/src/sp-object.cpp @@ -104,44 +104,25 @@ public: static gchar *sp_object_get_unique_id(SPObject *object, gchar const *defid); -SPObject::SPObject() { +SPObject::SPObject() + : cloned(0), uflags(0), mflags(0), hrefcount(0), _total_hrefcount(0), + document(NULL), parent(NULL), children(NULL), _last_child(NULL), + next(NULL), id(NULL), repr(NULL), refCount(1), + _successor(NULL), _collection_policy(SPObject::COLLECT_WITH_PARENT), + _label(NULL), _default_label(NULL) +{ debug("id=%x, typename=%s",this, g_type_name_from_instance((GTypeInstance*)object)); - this->refCount = 1; - - this->repr = NULL; - this->mflags = 0; - this->id = NULL; - this->cloned = 0; - this->uflags = 0; - - this->hrefcount = 0; - this->_total_hrefcount = 0; - this->document = NULL; - this->children = this->_last_child = NULL; - this->parent = this->next = NULL; - //used XML Tree here. this->getRepr(); // TODO check why this call is made SPObjectImpl::setIdNull(this); - this->_collection_policy = SPObject::COLLECT_WITH_PARENT; - - //new (&this->_release_signal) sigc::signal(); - //new (&this->_modified_signal) sigc::signal(); - //new (&this->_delete_signal) sigc::signal(); - //new (&this->_position_changed_signal) sigc::signal(); - this->_successor = NULL; - // FIXME: now we create style for all objects, but per SVG, only the following can have style attribute: // vg, g, defs, desc, title, symbol, use, image, switch, path, rect, circle, ellipse, line, polyline, // polygon, text, tspan, tref, textPath, altGlyph, glyphRef, marker, linearGradient, radialGradient, // stop, pattern, clipPath, mask, filter, feImage, a, font, glyph, missing-glyph, foreignObject this->style = sp_style_new_from_object(this); - - this->_label = NULL; - this->_default_label = NULL; } SPObject::~SPObject() { @@ -155,11 +136,6 @@ SPObject::~SPObject() { sp_object_unref(this->_successor, NULL); this->_successor = NULL; } - - //this->_release_signal.~signal(); - //this->_modified_signal.~signal(); - //this->_delete_signal.~signal(); - //this->_position_changed_signal.~signal(); } // CPPIFY: make pure virtual @@ -209,34 +185,6 @@ public: } - - - - - -//#include -//#include -// -//void log_exception(std::exception_ptr exception) { -// try { -// std::rethrow_exception(exception); -// } catch (const std::exception& e) { -// std::cerr << "Caught Exception of type " << std::string(typeid(e).name()) << '\n'; -// std::cerr << "Message: " << std::string(e.what()) << '\n'; -// -// try { -// std::rethrow_if_nested(e); -// } catch (...) { -// std::cerr << "Inner Exception: \n"; -// log_exception(std::current_exception()); -// } -// } -//} - - - - - gchar const* SPObject::getId() const { return id; } -- cgit v1.2.3 From 5488905e7f4659c0fed7c1841b768cbaf26e3cb1 Mon Sep 17 00:00:00 2001 From: Markus Engel Date: Fri, 2 Aug 2013 22:25:14 +0200 Subject: reordered SPDesktop::set_event_context2; fixed last mismatched-tags (bzr r11608.1.116) --- src/sp-object.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) (limited to 'src/sp-object.cpp') diff --git a/src/sp-object.cpp b/src/sp-object.cpp index 95a28dd7b..3dacc8b70 100644 --- a/src/sp-object.cpp +++ b/src/sp-object.cpp @@ -588,7 +588,6 @@ void SPObject::child_added(Inkscape::XML::Node *child, Inkscape::XML::Node *ref) ochild->invoke_build(object->document, child, object->cloned); } catch (const FactoryExceptions::TypeNotRegistered& e) { - //log_exception(std::current_exception()); g_warning("TypeNotRegistered exception: %s", e.what()); } } @@ -654,8 +653,7 @@ void SPObject::build(SPDocument *document, Inkscape::XML::Node *repr) { sp_object_unref(child, NULL); child->invoke_build(document, rchild, object->cloned); } catch (const FactoryExceptions::TypeNotRegistered& e) { - //log_exception(std::current_exception()); - g_warning("TypeNotRegistered exception: %s", e.what()); + //g_warning("TypeNotRegistered exception: %s", e.what()); } } } -- cgit v1.2.3 From abde5067bcfbb4c0e3ba61c6f69db7925f80600a Mon Sep 17 00:00:00 2001 From: Markus Engel Date: Mon, 16 Sep 2013 19:32:58 +0200 Subject: Removed TypeInfo; adjusted Factory to meet code style conventions. (bzr r11608.1.124) --- src/sp-object.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/sp-object.cpp') diff --git a/src/sp-object.cpp b/src/sp-object.cpp index 3dacc8b70..b622d14e9 100644 --- a/src/sp-object.cpp +++ b/src/sp-object.cpp @@ -578,7 +578,7 @@ void SPObject::child_added(Inkscape::XML::Node *child, Inkscape::XML::Node *ref) SPObject* object = this; try { - const std::string typeString = NodeTraits::getTypeString(*child); + const std::string typeString = NodeTraits::get_type_string(*child); SPObject* ochild = SPFactory::instance().createObject(typeString); @@ -645,7 +645,7 @@ void SPObject::build(SPDocument *document, Inkscape::XML::Node *repr) { // } try { - const std::string typeString = NodeTraits::getTypeString(*rchild); + const std::string typeString = NodeTraits::get_type_string(*rchild); SPObject* child = SPFactory::instance().createObject(typeString); -- cgit v1.2.3