X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Furi-references.cpp;h=7fc1f483801e9713edd791366fd9d75d4f37ab93;hb=dc9e07d7ab84affb6b7d7d47f5a9d3247dc58089;hp=fff985139b1f6c9071ec54d07d5fc843b65c6a8d;hpb=6b15695578f07a3f72c4c9475c1a261a3021472a;p=inkscape.git diff --git a/src/uri-references.cpp b/src/uri-references.cpp index fff985139..7fc1f4838 100644 --- a/src/uri-references.cpp +++ b/src/uri-references.cpp @@ -16,25 +16,39 @@ #include "sp-object.h" #include "uri.h" #include "uri-references.h" +#include "extract-uri.h" -static gchar *uri_to_id(SPDocument *document, const gchar *uri); +#include namespace Inkscape { URIReference::URIReference(SPObject *owner) -: _owner(owner), _obj(NULL), _uri(NULL) + : _owner(owner), _owner_document(NULL), _obj(NULL), _uri(NULL) { g_assert(_owner != NULL); /* FIXME !!! attach to owner's destroy signal to clean up in case */ } +URIReference::URIReference(SPDocument *owner_document) + : _owner(NULL), _owner_document(owner_document), _obj(NULL), _uri(NULL) +{ + g_assert(_owner_document != NULL); +} + URIReference::~URIReference() { detach(); } void URIReference::attach(const URI &uri) throw(BadURIException) { - SPDocument *document = SP_OBJECT_DOCUMENT(_owner); + SPDocument *document; + if (_owner) { + document = SP_OBJECT_DOCUMENT(_owner); + } else if (_owner_document) { + document = _owner_document; + } else { + g_assert_not_reached(); + } gchar const *fragment = uri.getFragment(); if ( !uri.isRelative() || uri.getQuery() || !fragment ) { throw UnsupportedURIException(); @@ -95,14 +109,14 @@ void URIReference::_setObject(SPObject *obj) { SPObject *old_obj=_obj; _obj = obj; + _release_connection.disconnect(); if (_obj) { sp_object_href(_obj, _owner); - g_signal_connect(G_OBJECT(_obj), "release", G_CALLBACK(&URIReference::_release), reinterpret_cast(this)); + _release_connection = _obj->connectRelease(sigc::mem_fun(*this, &URIReference::_release)); } _changed_signal.emit(old_obj, _obj); if (old_obj) { /* release the old object _after_ the signal emission */ - g_signal_handlers_disconnect_by_func(G_OBJECT(old_obj), (void *)&URIReference::_release, reinterpret_cast(this)); sp_object_hunref(old_obj, _owner); } } @@ -111,55 +125,36 @@ void URIReference::_setObject(SPObject *obj) { * it on its "release" signal, rather than later, when its ID is actually * unregistered from the document. */ -void URIReference::_release(SPObject *obj, URIReference *reference) { - g_assert( reference->_obj == obj ); - reference->_setObject(NULL); +void URIReference::_release(SPObject *obj) { + g_assert( _obj == obj ); + _setObject(NULL); } } /* namespace Inkscape */ -static gchar * -uri_to_id(SPDocument *document, const gchar *uri) +SPObject* sp_css_uri_reference_resolve( SPDocument *document, const gchar *uri ) { - const gchar *e; - gchar *id; - gint len; - - g_return_val_if_fail (document != NULL, NULL); + SPObject* ref = 0; - if (!uri) return NULL; - /* fixme: xpointer, everything */ - if (strncmp (uri, "url(#", 5)) return NULL; + if ( document && uri && ( strncmp(uri, "url(", 4) == 0 )) { + gchar *trimmed = extract_uri( uri ); + if ( trimmed ) { + ref = sp_uri_reference_resolve( document, trimmed ); + g_free( trimmed ); + } + } - e = uri + 5; - while (*e) { - if (*e == ')') break; - if (!isalnum (*e) && (*e != '_') && (*e != '-') && (*e != ':') && (*e != '.')) return NULL; - e += 1; - if (!*e) return NULL; - } - - len = e - uri - 5; - if (len < 1) return NULL; - - id = (gchar*)g_new(gchar, len + 1); - memcpy (id, uri + 5, len); - id[len] = '\0'; - - return id; + return ref; } SPObject * sp_uri_reference_resolve (SPDocument *document, const gchar *uri) { - gchar *id; + SPObject* ref = 0; - id = uri_to_id(document, uri); - if (!id) return NULL; + if ( uri && (*uri == '#') ) { + ref = document->getObjectById( uri + 1 ); + } - SPObject *ref; - ref = document->getObjectById(id); - g_free(id); - return ref; + return ref; } -