- Support to get/send binary data in Network::Socket
[dashstudio.git] / src / shell / networkhandler.cpp
blobf93e4e502b32ce57a6cbc8e9d6df0cb5d4da0aa9
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 ***************************************************************************/
21 #include "networkhandler.h"
23 // Qt
24 #include <QXmlStreamReader>
25 #include <QXmlStreamWriter>
26 #include <QTemporaryFile>
28 // DCore
29 #include <dcore/debug.h>
31 // DGui
32 #include <dgui/osd.h>
34 // YAMF
35 #include <yamf/model/command/processor.h>
36 #include <yamf/model/command/base.h>
38 // Dash
39 #include "dash/network/socket.h"
41 #include "dash/network/package/newproject.h"
42 #include "dash/network/package/connect.h"
43 #include "dash/network/package/listprojects.h"
44 #include "dash/network/package/openproject.h"
46 #include "dash/network/parser/ackparser.h"
48 #include "dash/network/parser/projectlistparser.h"
49 #include "dash/network/parser/projectparser.h"
51 #include "projectmanager.h"
53 #include "ui_displayprojects.h"
55 NetworkHandler::NetworkHandler(ProjectManager *manager) : m_manager(manager), m_socket(new Dash::Network::Socket), m_dispatcher(new Dash::Network::Package::Dispatcher), m_waitingResponse(false)
57 m_processor = new YAMF::Command::Processor(manager->project());
58 m_socket->addObserver(this);
62 NetworkHandler::~NetworkHandler()
64 delete m_dispatcher;
65 delete m_socket;
68 void NetworkHandler::connectToHost(const QString &host, quint16 port, const QString &login, const QString &password)
70 m_commands.clear();
72 m_socket->connectToHost(host, port);
73 Dash::Network::Package::Connect cnx(login, password, 0);
74 m_socket->send(cnx.toString().toLocal8Bit());
77 void NetworkHandler::send(const QString &xml)
79 QString tosend;
80 if( !m_sign.isEmpty() )
82 QXmlStreamReader reader(xml);
83 QXmlStreamWriter writer(&tosend);
85 bool isRoot = false;
86 while( ! reader.atEnd() )
88 reader.readNext();
90 writer.writeCurrentToken(reader);
91 if( reader.tokenType() == QXmlStreamReader::StartElement && !isRoot )
93 dfDebug << "Writing sing on " << reader.name().toString();
94 writer.writeAttribute("sign", m_sign);
95 isRoot = true;
99 else
101 tosend = xml;
104 dfDebug << "SENDING: " << tosend << " SIGN IS : " << m_sign;
106 m_socket->send(tosend.toLocal8Bit());
109 void NetworkHandler::addObserver(Dash::Network::Package::Observer *observer)
111 m_dispatcher->addObserver(observer);
114 void NetworkHandler::removeObserver(Dash::Network::Package::Observer *observer)
116 m_dispatcher->removeObserver(observer);
119 void NetworkHandler::execute(YAMF::Command::Base *cmd)
121 bool isEmpty = m_commands.isEmpty();
123 dfDebug << "ENCOLANDO: " << cmd->toXml();
125 m_commands.enqueue(cmd);
126 if( !m_sign.isEmpty() && isEmpty && !m_waitingResponse )
128 m_waitingResponse = true;
129 send(cmd->toXml());
133 void NetworkHandler::newProject(const ProjectParams *params)
135 Dash::Network::Package::NewProject newProjectPackage(params->projectName, params->author, params->description);
136 this->send(newProjectPackage.toString());
139 void NetworkHandler::openProject()
141 Dash::Network::Package::ListProjects list;
142 this->send(list.toString());
145 void NetworkHandler::openProject(const QString &projectName)
147 Dash::Network::Package::OpenProject project(projectName);
148 this->send(project.toString());
151 bool NetworkHandler::isOpen() const
153 return m_socket->state() == QAbstractSocket::ConnectedState;
156 bool NetworkHandler::isValid() const
158 return this->isOpen() && !m_sign.isEmpty();
161 void NetworkHandler::readed(const QString &txt)
163 dfDebug << "READED: " << txt;
165 QString root;
168 QXmlStreamReader reader(txt);
169 while( !reader.atEnd() )
171 if( reader.readNext() == QXmlStreamReader::StartElement )
173 root = reader.name().toString();
174 break;
178 if( root.isEmpty() )
180 dWarning() << "Invalid package: " << txt;
181 dWarning() << "Error was: " << reader.errorString();
186 if( !root.isEmpty() )
188 if( root == "ack" )
190 Dash::Network::Parser::AckParser parser;
191 if( parser.parse(txt) )
193 m_sign = parser.sign();
194 DGui::Osd::self()->display(parser.motd(), DGui::Osd::Info);
196 if( !m_commands.isEmpty() )
198 m_waitingResponse = true;
199 send(m_commands.first()->toXml());
203 else if( root == "command" )
205 D_SHOW_VAR(m_commands.size());
206 bool executed = false;
208 if( m_waitingResponse && !m_commands.isEmpty() )
210 m_waitingResponse = false;
212 QXmlStreamReader reader(txt);
214 reader.readNext();
215 reader.readNext();
216 QString sign = reader.attributes().value("sign").toString();
218 if( sign == m_sign )
220 m_manager->setLocal(true);
221 m_commands.dequeue()->redo(); // FIXME: add to stack?
222 m_manager->setLocal(false);
224 executed = true;
226 if( ! m_commands.isEmpty() )
228 m_waitingResponse = true;
229 send(m_commands.first()->toXml());
235 if( !executed ) // External command
237 m_manager->setLocal(true);
238 m_processor->execute(txt);
239 m_manager->setLocal(false);
242 else if( root == "projectlist" )
244 Dash::Network::Parser::ProjectList projectList;
246 if( projectList.parse(txt) )
248 QDialog choose;
249 Ui::DisplayProjects ui;
250 ui.setupUi(&choose);
252 foreach( Dash::Network::Parser::ProjectList::Project p, projectList.projects())
254 QTreeWidgetItem *item = new QTreeWidgetItem(ui.projects);
255 item->setText(0, p.name);
256 item->setText(1, p.author);
257 item->setText(2, p.description);
260 if( choose.exec() == QDialog::Accepted )
262 if( QTreeWidgetItem *ci = ui.projects->currentItem() )
264 QString projectName = ci->text(0);
266 Dash::Network::Package::OpenProject op(projectName);
267 send(op.toString());
271 else
273 DGui::Osd::self()->display(QObject::tr("Error displaying the project list"), DGui::Osd::Error);
276 else if( root == "project" )
278 Dash::Network::Parser::Project projectParser;
280 QTemporaryFile file;
282 if( projectParser.parse(txt) && file.open() )
284 file.write(projectParser.projectData());
285 file.flush();
287 m_manager->setLocal(true);
288 m_manager->loadProject(file.fileName());
289 m_manager->setLocal(false);
291 else
293 DGui::Osd::self()->display(QObject::tr("Error loading project"), DGui::Osd::Error);
296 else
298 m_dispatcher->addSource(root, txt);
299 m_dispatcher->process();
304 void NetworkHandler::dataReaded(const QByteArray &data)
306 qFatal("SAVE THE FILE");