XDBMS: Replace objects properly
[dashstudio.git] / src / dashserver / project / project.cpp
blobc9aa332d8bcd0dad5f94f53311eb9e50238a5b55
1 /***************************************************************************
2 * Copyright (C) 2007 by David Cuadrado *
3 * krawek@gmail.com *
4 * *
5 * This program is free software; you can redistribute it and/or modify *
6 * it under the terms of the GNU General Public License as published by *
7 * the Free Software Foundation; either version 2 of the License, or *
8 * (at your option) any later version. *
9 * *
10 * This program is distributed in the hope that it will be useful, *
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13 * GNU General Public License for more details. *
14 * *
15 * You should have received a copy of the GNU General Public License *
16 * along with this program; if not, write to the *
17 * Free Software Foundation, Inc., *
18 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
19 ***************************************************************************/
22 #include "project.h"
24 #include <QSet>
26 #include <yamf/model/command/processor.h>
28 #include "dashserver/connection.h"
29 #include "dashserver/xdbms/manager.h"
31 #include "dash/projectsaver.h"
32 #include "dash/network/package/transfer.h"
34 #include "member.h"
35 #include "commandprocessor.h"
37 #include <dcore/debug.h>
39 namespace DashServer {
40 namespace Project {
42 struct Project::Private
44 Private(Project *q) : q(q), initialized(false) {}
46 Project *q;
47 bool initialized;
48 CommandProcessor *processor;
50 QSet<DashServer::Connection *> connections;
52 QHash<QString, Member *> members;
55 void loadMembers();
58 void Project::Private::loadMembers()
60 members.clear();
62 QList<XDBMS::Object *> objects = q->objects();
64 foreach(XDBMS::Object *obj, objects)
66 if( obj->klass() == "member" )
68 Member *member = static_cast<Member *>(obj);
69 members[member->id()] = member;
73 initialized = true;
76 Project::Project(QObject *parent) : Dash::Project(parent), XDBMS::Object(), d(new Private(this))
78 d->processor = new CommandProcessor(this);
80 setClass("project");
84 Project::~Project()
86 delete d->processor;
87 delete d;
90 void Project::execute(const QString &xml, DashServer::Connection *source)
92 if( d->connections.contains(source) )
94 d->processor->setCurrentMember( d->members.value(source->user()->login()) );
95 if( d->processor->execute(xml) )
97 QString tosend = source->signXml(xml);
99 foreach(DashServer::Connection *cnx, d->connections)
101 cnx->sendToClient( tosend, false );
104 else
106 source->sendToClient( "<command />", true ); // FIXME: create a package
109 else
111 qWarning("INVALID SOURCE");
115 void Project::addClient(DashServer::Connection *cnx)
117 d->connections << cnx;
120 void Project::removeClient(DashServer::Connection *client)
122 d->connections.remove(client);
124 if( d->connections.isEmpty() )
126 save();
130 void Project::sendToClient(DashServer::Connection *client)
132 // FIXME: Poner en un thread
134 QFile f(this->fileName());
135 Dash::Network::Package::Transfer transfer(f.size());
136 client->sendToClient(transfer.toString(), true);
138 if( f.open(QIODevice::ReadOnly) )
140 while(!f.atEnd())
142 client->sendBinaryData(f.read(1024));
148 void Project::sendToAll()
150 save();
153 QFile f(this->fileName());
155 foreach(DashServer::Connection *client, d->connections)
157 Dash::Network::Package::Transfer transfer(f.size());
158 client->sendToClient(transfer.toString(), true);
161 if( f.open(QIODevice::ReadOnly) )
163 while(!f.atEnd())
165 foreach(DashServer::Connection *client, d->connections)
167 client->sendBinaryData(f.read(1024));
174 QHash<QString, Member *> Project::members() const
176 return d->members;
179 QSet<DashServer::Connection *> Project::connections() const
181 return d->connections;
184 int Project::clientCount() const
186 return d->connections.size();
189 void Project::aboutToSave()
191 if( projectName().isEmpty() ) return;
193 setId(projectName());
195 add("description", description());
196 add("author", author());
198 if(!d->initialized) d->loadMembers();
201 void Project::afterLoad()
203 setProjectName(id());
204 setDescription(value("description"));
205 setAuthor(value("author"));
207 if(!d->initialized) d->loadMembers();
210 bool Project::save()
212 if(!d->initialized) d->loadMembers();
214 QString pname = projectName();
216 if( pname.isEmpty() ) return false;
218 return Dash::ProjectSaver::save(this, fileName());
221 bool Project::load()
223 if(!d->initialized) d->loadMembers();
225 QString pname = projectName();
227 if( pname.isEmpty() )
229 qWarning("Warning: Project name is empty");
230 return false;
233 clear();
235 return Dash::ProjectSaver::load(this, fileName());
238 QString Project::fileName() const
240 QString pname = projectName();
242 if( pname.isEmpty() )
243 return QString();
245 return XDBMS::Manager::self()->databaseDir().absoluteFilePath(pname+".dsh");
248 void Project::addMember(Member *member)
250 if( d->members.contains(member->id()) )
252 d->members.remove(member->id());
253 remove(member);
256 d->members[member->id()] = member;
257 add(member);
260 QString Project::partName(int part)
262 switch(part)
264 case All:
266 return "all";
268 break;
269 case Scene:
271 return "scene";
273 break;
274 case Layer:
276 return "layer";
278 break;
279 case Frame:
281 return "frame";
283 break;
284 case Object:
286 return "object";
288 break;
291 return QString();