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 ***************************************************************************/
22 #include "projectmanager.h"
25 #include <QXmlStreamReader>
26 #include <QXmlStreamWriter>
28 #include <dashserver/server.h>
29 #include <dashserver/package.h>
30 #include <dashserver/connection.h>
32 #include <dash/network/package/error.h>
33 #include <dash/network/package/projectlist.h>
34 #include <dash/network/parser/projectactionparser.h>
36 #include <dcore/debug.h>
42 #include "dashserver/users/user.h"
43 #include "dashserver/xdbms/manager.h"
44 #include "dashserver/xdbms/table.h"
47 namespace DashServer
{
50 struct Manager::Private
56 : DashServer::Observer(), d(new Private
)
68 void Manager::handlePackage(DashServer::Package
* const pkg
)
70 DashServer::TcpServer
*server
= pkg
->source()->server();
72 if( pkg
->root() == "command" )
74 if( !d
->store
->execute(pkg
->xml(), pkg
->source() ) )
76 pkg
->source()->sendError(QObject::tr("Cannot execute command"), Dash::Network::Package::Error::Err
);
80 else if( pkg
->root() == "listprojects" )
82 QList
<Project
*> projects
= d
->store
->allProjects();
84 Dash::Network::Package::ProjectList plist
;
86 foreach(Project
*p
, projects
)
88 plist
.addProject(p
->projectName(), p
->author(), p
->description());
91 pkg
->source()->sendToClient(plist
.toString(), true);
97 else if( pkg
->root() == "openproject" )
101 QXmlStreamReader
reader(pkg
->xml());
102 while(!reader
.atEnd())
106 if( reader
.tokenType() == QXmlStreamReader::StartElement
)
108 if( reader
.name().toString() == "project" )
110 project
= reader
.attributes().value("name").toString();
117 if( !project
.isEmpty() )
119 d
->store
->openProject(project
, pkg
->source());
124 // TODO: Enviar mensaje de error.
127 else if( pkg
->root() == "newproject" )
129 QString projectName
, author
, description
;
131 QXmlStreamReader
reader(pkg
->xml());
132 while(!reader
.atEnd())
136 if( reader
.tokenType() == QXmlStreamReader::StartElement
)
138 if( reader
.name().toString() == "name" )
140 projectName
= reader
.readElementText();
142 else if( reader
.name().toString() == "author" )
144 author
= reader
.readElementText();
146 else if( reader
.name().toString() == "description" )
148 description
= reader
.readElementText();
153 if( !d
->store
->contains(projectName
) )
155 if( d
->store
->createProject(projectName
, author
, description
, pkg
->source()->user()->login()) )
157 dfDebug
<< "Created project: " << projectName
;
158 d
->store
->addToProject(projectName
, pkg
->source());
163 // TODO: enviar mensaje de error
168 else if(pkg
->root() == "updateproject" )
170 Dash::Network::Parser::ProjectAction parser
;
172 if(parser
.parse(pkg
->xml()))
174 QString projectName
= parser
.name();
175 QString newDescription
= parser
.description();
176 QString newAuthor
= parser
.author();
178 if(Project::Project
*project
= d
->store
->project(projectName
))
180 if(!newDescription
.isEmpty())
182 project
->setDescription(newDescription
);
184 if(!newAuthor
.isEmpty())
186 project
->setAuthor(newAuthor
);
190 QList
<Dash::Network::Parser::ProjectAction::Member
> members
= parser
.members();
192 foreach(Dash::Network::Parser::ProjectAction::Member member
, members
)
194 Member
*mem
= new Member();
195 mem
->setUser(member
.login
);
196 mem
->setJob(member
.job
);
197 D_SHOW_VAR(member
.login
);
198 QList
<Dash::Network::Permission
> permissions
= member
.profile
.permissions();
201 foreach(Dash::Network::Permission permission
, permissions
)
203 Users::Permission
*perm
= new Users::Permission();
205 perm
->setId(permission
.name());
206 perm
->setName(permission
.name());
207 perm
->setRead(permission
.read());
208 perm
->setWrite(permission
.write());
210 mem
->addPermission(perm
);
213 D_SHOW_VAR(mem
->objects().size());
214 project
->addMember(mem
);
217 project
->aboutToSave();
219 if( XDBMS::Manager::self()->update("projects", project
) )
221 server
->sendToAdmins(pkg
->xml());
228 pkg
->source()->sendError(QObject::tr("Project not exist"), Dash::Network::Package::Error::Err
);
234 else if(pkg
->root() == "queryproject" )
237 QXmlStreamReader
reader(pkg
->xml());
238 while(!reader
.atEnd())
242 if( reader
.tokenType() == QXmlStreamReader::StartElement
)
244 if( reader
.name().toString() == "name" )
246 projectName
= reader
.readElementText();
251 if(!projectName
.isEmpty())
253 if(Project::Project
*project
= d
->store
->project(projectName
))
257 QXmlStreamWriter
writer(&xml
);
258 writer
.writeStartElement("projectquery");
260 writer
.writeStartElement("name");
261 writer
.writeCharacters(project
->projectName());
262 writer
.writeEndElement();
264 writer
.writeStartElement("description");
265 writer
.writeCharacters(project
->description());
266 writer
.writeEndElement();
268 writer
.writeStartElement("author");
269 writer
.writeCharacters(project
->author());
270 writer
.writeEndElement();
272 writer
.writeStartElement("members");
274 QHash
<QString
, Member
*> members
= project
->members();
275 foreach(Member
*member
, members
)
277 writer
.writeStartElement("user");
278 writer
.writeAttribute("login", member
->user().login());
279 writer
.writeAttribute("job", member
->job());
281 QHash
<QString
, Users::Permission
*> permissions
= member
->permissions();
282 QHash
<QString
, Users::Permission
*>::iterator it
= permissions
.begin();
284 writer
.writeStartElement("permissions");
286 while(it
!= permissions
.end())
288 writer
.writeStartElement("module");
289 writer
.writeAttribute("name", it
.key());
290 writer
.writeAttribute("read", QString::number(it
.value()->read()));
291 writer
.writeAttribute("write", QString::number(it
.value()->write()));
292 writer
.writeEndElement();
297 writer
.writeEndElement();
298 writer
.writeEndElement();
300 writer
.writeEndElement();
301 writer
.writeEndElement();
303 DashServer::Connection
*cnn
= pkg
->source();
304 cnn
->sendToClient(xml
, true);
311 pkg
->source()->sendError(QObject::tr("Project not exist"), Dash::Network::Package::Error::Err
);
317 dfDebug
<< "Unhandled package: " << pkg
->root();
321 void Manager::connectionClosed(DashServer::Connection
*cnx
)
323 d
->store
->removeClient(cnx
);
326 void Manager::sendToMembers(const QString
&projectName
, const QString
&pkg
)
328 d
->store
->sendToMembers(projectName
, pkg
);
331 void Manager::resendProject(const QString
&projectName
)
333 d
->store
->resendProject(projectName
);