1 /***************************************************************************
2 * Copyright (C) 2007 by David Cuadrado *
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. *
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. *
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 ***************************************************************************/
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"
35 #include "commandprocessor.h"
37 #include <dcore/debug.h>
39 namespace DashServer
{
42 struct Project::Private
44 Private(Project
*q
) : q(q
), initialized(false) {}
48 CommandProcessor
*processor
;
50 QSet
<DashServer::Connection
*> connections
;
52 QHash
<QString
, Member
*> members
;
58 void Project::Private::loadMembers()
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
;
76 Project::Project(QObject
*parent
) : Dash::Project(parent
), XDBMS::Object(), d(new Private(this))
78 d
->processor
= new CommandProcessor(this);
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 );
106 source
->sendToClient( "<command />", true ); // FIXME: create a package
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() )
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
) )
142 client
->sendBinaryData(f
.read(1024));
148 void Project::sendToAll()
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
) )
165 foreach(DashServer::Connection
*client
, d
->connections
)
167 client
->sendBinaryData(f
.read(1024));
174 QHash
<QString
, Member
*> Project::members() const
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();
212 if(!d
->initialized
) d
->loadMembers();
214 QString pname
= projectName();
216 if( pname
.isEmpty() ) return false;
218 return Dash::ProjectSaver::save(this, fileName());
223 if(!d
->initialized
) d
->loadMembers();
225 QString pname
= projectName();
227 if( pname
.isEmpty() )
229 qWarning("Warning: Project name is empty");
235 return Dash::ProjectSaver::load(this, fileName());
238 QString
Project::fileName() const
240 QString pname
= projectName();
242 if( pname
.isEmpty() )
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());
256 d
->members
[member
->id()] = member
;
260 QString
Project::partName(int part
)