summaryrefslogtreecommitdiffstats
path: root/src/libs/client/Store.cpp
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2007-07-26 16:19:58 +0000
committerDavid Robillard <d@drobilla.net>2007-07-26 16:19:58 +0000
commit6af49fb89facc67f369ede8cce6c315fd705d3cc (patch)
tree2ac10884581eccf828e8ad96f33d619bbff2b0ba /src/libs/client/Store.cpp
parentf7368e7850307de97b024238a4f520afe1150c8b (diff)
downloadingen-6af49fb89facc67f369ede8cce6c315fd705d3cc.tar.gz
ingen-6af49fb89facc67f369ede8cce6c315fd705d3cc.tar.bz2
ingen-6af49fb89facc67f369ede8cce6c315fd705d3cc.zip
Fix various Table bugs (and put some way too slow code in there, but hey, it works).
Use PathTable for models on the client side. Implement renaming on client side. git-svn-id: http://svn.drobilla.net/lad/ingen@636 a436a847-0d15-0410-975c-d299462d15a1
Diffstat (limited to 'src/libs/client/Store.cpp')
-rw-r--r--src/libs/client/Store.cpp55
1 files changed, 42 insertions, 13 deletions
diff --git a/src/libs/client/Store.cpp b/src/libs/client/Store.cpp
index a2c9bf6f..674fc24e 100644
--- a/src/libs/client/Store.cpp
+++ b/src/libs/client/Store.cpp
@@ -24,11 +24,13 @@
#include "PatchModel.hpp"
#include "SigClientInterface.hpp"
+using namespace std;
+using Raul::Path;
+
namespace Ingen {
namespace Client {
-
Store::Store(SharedPtr<EngineInterface> engine, SharedPtr<SigClientInterface> emitter)
: _engine(engine)
, _emitter(emitter)
@@ -146,7 +148,7 @@ Store::add_orphan(SharedPtr<ObjectModel> child)
{
cerr << "WARNING: Orphan object " << child->path() << " received." << endl;
- Raul::Table<Path, list<SharedPtr<ObjectModel> > >::iterator children
+ Raul::PathTable<list<SharedPtr<ObjectModel> > >::iterator children
= _orphans.find(child->path().parent());
_engine->request_object(child->path().parent());
@@ -164,7 +166,7 @@ Store::add_orphan(SharedPtr<ObjectModel> child)
void
Store::add_metadata_orphan(const Path& subject_path, const string& predicate, const Atom& value)
{
- Raul::Table<Path, list<std::pair<string, Atom> > >::iterator orphans
+ Raul::PathTable<list<std::pair<string, Atom> > >::iterator orphans
= _metadata_orphans.find(subject_path);
_engine->request_object(subject_path);
@@ -182,7 +184,7 @@ Store::add_metadata_orphan(const Path& subject_path, const string& predicate, co
void
Store::resolve_metadata_orphans(SharedPtr<ObjectModel> subject)
{
- Raul::Table<Path, list<std::pair<string, Atom> > >::iterator v
+ Raul::PathTable<list<std::pair<string, Atom> > >::iterator v
= _metadata_orphans.find(subject->path());
if (v != _metadata_orphans.end()) {
@@ -202,7 +204,7 @@ Store::resolve_metadata_orphans(SharedPtr<ObjectModel> subject)
void
Store::resolve_orphans(SharedPtr<ObjectModel> parent)
{
- Raul::Table<Path, list<SharedPtr<ObjectModel> > >::iterator c
+ Raul::PathTable<list<SharedPtr<ObjectModel> > >::iterator c
= _orphans.find(parent->path());
if (c != _orphans.end()) {
@@ -257,7 +259,7 @@ Store::add_object(SharedPtr<ObjectModel> object)
}
- //cout << "[Store] Added " << object->path() << endl;
+ cout << "[Store] Added " << object->path() << endl;
}
@@ -348,14 +350,41 @@ Store::destruction_event(const Path& path)
void
Store::rename_event(const Path& old_path, const Path& new_path)
{
- SharedPtr<ObjectModel> object = remove_object(old_path);
- if (object) {
- object->set_path(new_path);
- add_object(object);
- object->renamed_sig.emit();
- cerr << "[Store] Renamed " << old_path << " -> " << new_path << endl;
- } else {
+ Objects::iterator parent = _objects.find(old_path);
+ if (parent == _objects.end()) {
cerr << "[Store] Failed to find object " << old_path << " to rename." << endl;
+ return;
+ }
+
+ Objects::iterator descendants_end = _objects.find_descendants_end(parent);
+
+ vector<pair<Path, SharedPtr<ObjectModel> > > objs = _objects.yank(parent, descendants_end);
+
+ assert(objs.size() > 0);
+
+ for (vector<pair<Path, SharedPtr<ObjectModel> > >::iterator i = objs.begin(); i != objs.end(); ++i) {
+ const Path& child_old_path = i->first;
+ assert(Path::descendant_comparator(old_path, child_old_path));
+
+ Path child_new_path;
+ if (child_old_path == old_path)
+ child_new_path = new_path;
+ else
+ child_new_path = new_path.base() + child_old_path.substr(old_path.length()+1);
+
+ cerr << "[Store] Renamed " << child_old_path << " -> " << child_new_path << endl;
+ i->second->set_path(child_new_path);
+ i->first = child_new_path;
+ }
+
+ _objects.cram(objs);
+
+ cerr << "[Store] Table:" << endl;
+ //for (size_t i=0; i < objs.size(); ++i) {
+ // cerr << objs[i].first << "\t\t: " << objs[i].second << endl;
+ //}
+ for (Objects::iterator i = _objects.begin(); i != _objects.end(); ++i) {
+ cerr << i->first << "\t\t: " << i->second << endl;
}
}