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 ***************************************************************************/
27 #include <dcore/debug.h>
28 #include <dcore/algorithm.h>
30 #include "dash/projectsaver.h"
35 #include "dashserver/connection.h"
36 #include "dashserver/users/user.h"
37 #include "dashserver/xdbms/manager.h"
38 #include "dashserver/xdbms/table.h"
40 #include "dash/network/package/transfer.h"
41 #include "dash/network/package/connected.h"
42 #include "dash/network/package/disconnected.h"
43 #include "dash/network/package/error.h"
45 namespace DashServer
{
50 QHash
<QString
, Project
*> projects
;
54 Store::Store() : d(new Private
)
61 qDeleteAll(d
->projects
);
65 QStringList
Store::projects() const
67 XDBMS::Table
*table
= XDBMS::Manager::self()->table("projects");
69 return table
->objects();
72 Project
*Store::project(const QString
& name
)
74 XDBMS::Table
*table
= XDBMS::Manager::self()->table("projects");
76 Project
*project
= new Project
;
78 if(table
->load(project
))
81 project
->setProjectName(name
);
87 QList
<Project
*> Store::allProjects() const
89 QList
<Project
*> projects
;
91 XDBMS::Table
*table
= XDBMS::Manager::self()->table("projects");
92 foreach(QString projectName
, table
->objects())
94 Project
*project
= new Project
;
95 project
->setId(projectName
);
99 project
->setProjectName(projectName
);
108 bool Store::createProject(const QString
&name
, const QString
&author
, const QString
&description
, const QString
& owner
, const QList
<Member
*> &members
)
110 if( !d
->projects
.contains(name
) )
112 Project
*project
= new Project
;
113 project
->setProjectName(name
);
114 project
->setAuthor(author
);
115 project
->setDescription(description
);
117 if(members
.isEmpty())
119 Member
*director
= new Member
;
120 director
->setJob(QObject::tr("Director"));
121 director
->setUser(owner
);
122 director
->addPermission(Project::All
, Users::Permission::Read
| Users::Permission::Write
);
123 director
->addPermission(Project::Scene
, Users::Permission::Read
| Users::Permission::Write
);
124 director
->addPermission(Project::Layer
, Users::Permission::Read
| Users::Permission::Write
);
125 director
->addPermission(Project::Frame
, Users::Permission::Read
| Users::Permission::Write
);
126 director
->addPermission(Project::Object
, Users::Permission::Read
| Users::Permission::Write
);
128 project
->addMember(director
);
131 foreach(Member
*memeber
, members
)
133 project
->addMember(memeber
);
136 project
->setOpen(true);
138 d
->projects
[name
] = project
;
140 project
->aboutToSave();
141 XDBMS::Manager::self()->addObject("projects", project
);
143 return project
->save();
149 void Store::addToProject(const QString
&projectName
, DashServer::Connection
*cnx
)
151 if( d
->projects
.contains(projectName
) )
153 Project
*project
= d
->projects
.value(projectName
);
155 cnx
->setData(ProjectName
, projectName
);
157 QStringList connections
;
158 foreach(DashServer::Connection
*connection
, project
->connections())
160 Dash::Network::Package::Connected
pkg(cnx
->user()->login());
161 connection
->sendToClient(pkg
.toString(), false);
163 connections
<< connection
->user()->login();
166 project
->addClient(cnx
);
168 if( !connections
.isEmpty() )
170 Dash::Network::Package::Connected
pkg(connections
);
171 dfDebug
<< pkg
.toString();
172 cnx
->sendToClient(pkg
.toString(), true);
177 bool Store::contains(const QString
&projectName
) const
179 return d
->projects
.contains(projectName
);
182 bool Store::execute(const QString
&xml
, DashServer::Connection
*source
)
184 QString projectName
= source
->data(ProjectName
).toString();
186 if( d
->projects
.contains(projectName
) )
188 Project
*project
= d
->projects
.value(projectName
);
189 project
->execute(xml
, source
);
197 bool Store::openProject(const QString
&projectName
, DashServer::Connection
*source
)
199 if( !d
->projects
.contains(projectName
) )
201 Project
*project
= new Project
;
202 project
->setId(projectName
);
204 if( ! XDBMS::Manager::self()->load("projects", project
) ) return false;
206 if( ! project
->load() )
208 qWarning("Cannot load project");
212 d
->projects
[projectName
] = project
;
216 Project
*project
= d
->projects
.value(projectName
);
218 if( project
->save() )
220 addToProject(projectName
, source
);
221 project
->sendToClient(source
);
230 QList
<Project
*> Store::activeProjects() const
232 return d
->projects
.values();
235 void Store::removeClient(DashServer::Connection
*client
)
237 QString projectName
= client
->data(ProjectName
).toString();
239 if( d
->projects
.contains(projectName
) )
241 Dash::Network::Package::Disconnected
pkg(client
->user()->login());
242 sendToMembers(projectName
, pkg
.toString());
244 Project
*project
= d
->projects
.value(projectName
);
245 project
->removeClient(client
);
247 if( project
->clientCount() == 0 )
249 d
->projects
.remove(projectName
);
255 void Store::sendToMembers(const QString
&projectName
, const QString
&pkg
)
257 if( d
->projects
.contains(projectName
) )
259 Project
*project
= d
->projects
.value(projectName
);
260 foreach(DashServer::Connection
*cnx
, project
->connections())
262 cnx
->sendToClient(pkg
, false);
267 void Store::resendProject(const QString
&projectName
)
269 if( d
->projects
.contains(projectName
) )
271 Project
*project
= d
->projects
.value(projectName
);
272 project
->sendToAll();
276 bool Store::removeProject(const QString
&projectName
)
278 if( d
->projects
.contains(projectName
))
280 Project
*project
= d
->projects
.value(projectName
);
281 if(XDBMS::Manager::self()->remove("projects", project
))
283 d
->projects
.remove(projectName
);
284 foreach(DashServer::Connection
*connection
, project
->connections() )
286 connection
->sendError(QObject::tr("Project removed"), Dash::Network::Package::Error::Info
);
297 void Store::importProject(DashServer::Connection
*cnx
, const QString
&fileName
)
299 if( QFile::exists(fileName
) )
301 Project::Project
*project
= new Project::Project
;
302 if( !Dash::ProjectSaver::load(project
, fileName
) )
304 cnx
->sendError( QObject::tr("Cannot import the project"), Dash::Network::Package::Error::Err
);
309 QString projectName
= project
->projectName();
311 if( !d
->projects
.contains(projectName
) && !projectName
.isEmpty() )
313 QString owner
= cnx
->user()->login();
315 Member
*director
= new Member
;
316 director
->setJob(QObject::tr("Director"));
317 director
->setUser(owner
);
318 director
->addPermission(Project::All
, Users::Permission::Read
| Users::Permission::Write
);
319 director
->addPermission(Project::Scene
, Users::Permission::Read
| Users::Permission::Write
);
320 director
->addPermission(Project::Layer
, Users::Permission::Read
| Users::Permission::Write
);
321 director
->addPermission(Project::Frame
, Users::Permission::Read
| Users::Permission::Write
);
322 director
->addPermission(Project::Object
, Users::Permission::Read
| Users::Permission::Write
);
324 project
->addMember(director
);
327 project
->setOpen(true);
328 d
->projects
[projectName
] = project
;
330 project
->aboutToSave();
331 XDBMS::Manager::self()->addObject("projects", project
);
333 if( project
->save() )
335 cnx
->sendError( QObject::tr("Project imported successfully"), Dash::Network::Package::Error::Info
);
340 cnx
->sendError( QObject::tr("Cannot import the project"), Dash::Network::Package::Error::Err
);