decklist transfer code

This commit is contained in:
Max-Wilhelm Bruker 2009-11-18 19:59:03 +01:00
parent c5bf72b1bf
commit d3114fafbf
9 changed files with 248 additions and 36 deletions

View file

@ -33,7 +33,6 @@ HEADERS += src/counter.h \
src/zoneviewlayout.h \ src/zoneviewlayout.h \
src/carddatabasemodel.h \ src/carddatabasemodel.h \
src/window_deckeditor.h \ src/window_deckeditor.h \
src/decklist.h \
src/setsmodel.h \ src/setsmodel.h \
src/window_sets.h \ src/window_sets.h \
src/abstractgraphicsitem.h \ src/abstractgraphicsitem.h \
@ -45,6 +44,7 @@ HEADERS += src/counter.h \
src/tab_chatchannel.h \ src/tab_chatchannel.h \
src/tab_game.h \ src/tab_game.h \
src/tab_supervisor.h \ src/tab_supervisor.h \
../common/decklist.h \
../common/protocol.h \ ../common/protocol.h \
../common/protocol_items.h \ ../common/protocol_items.h \
../common/protocol_datastructures.h ../common/protocol_datastructures.h
@ -76,7 +76,6 @@ SOURCES += src/counter.cpp \
src/zoneviewlayout.cpp \ src/zoneviewlayout.cpp \
src/carddatabasemodel.cpp \ src/carddatabasemodel.cpp \
src/window_deckeditor.cpp \ src/window_deckeditor.cpp \
src/decklist.cpp \
src/setsmodel.cpp \ src/setsmodel.cpp \
src/window_sets.cpp \ src/window_sets.cpp \
src/abstractgraphicsitem.cpp \ src/abstractgraphicsitem.cpp \
@ -88,6 +87,7 @@ SOURCES += src/counter.cpp \
src/tab_chatchannel.cpp \ src/tab_chatchannel.cpp \
src/tab_game.cpp \ src/tab_game.cpp \
src/tab_supervisor.cpp \ src/tab_supervisor.cpp \
../common/decklist.cpp \
../common/protocol.cpp \ ../common/protocol.cpp \
../common/protocol_items.cpp ../common/protocol_items.cpp

View file

@ -4,8 +4,8 @@
#include <QXmlStreamReader> #include <QXmlStreamReader>
#include <QXmlStreamWriter> #include <QXmlStreamWriter>
#include <QVariant> #include <QVariant>
#include <QDebug>
#include "decklist.h" #include "decklist.h"
#include "carddatabase.h"
AbstractDecklistNode::AbstractDecklistNode(InnerDecklistNode *_parent) AbstractDecklistNode::AbstractDecklistNode(InnerDecklistNode *_parent)
: parent(_parent), currentItem(0) : parent(_parent), currentItem(0)
@ -185,7 +185,7 @@ bool DeckList::readElement(QXmlStreamReader *xml)
if (currentZone) { if (currentZone) {
if (currentZone->readElement(xml)) if (currentZone->readElement(xml))
currentZone = 0; currentZone = 0;
return true; return false;
} }
if (xml->isEndElement()) { if (xml->isEndElement()) {
@ -193,17 +193,17 @@ bool DeckList::readElement(QXmlStreamReader *xml)
name = currentElementText; name = currentElementText;
else if (xml->name() == "comments") else if (xml->name() == "comments")
comments = currentElementText; comments = currentElementText;
else else if (xml->name() == "cockatrice_deck") {
return false; qDebug() << "deck finished!";
return true;
}
currentElementText.clear(); currentElementText.clear();
} else if (xml->isStartElement() && (xml->name() == "zone")) } else if (xml->isStartElement() && (xml->name() == "zone"))
currentZone = new InnerDecklistNode(xml->attributes().value("name").toString(), root); currentZone = new InnerDecklistNode(xml->attributes().value("name").toString(), root);
else if (xml->isCharacters() && !xml->isWhitespace()) else if (xml->isCharacters() && !xml->isWhitespace())
currentElementText = xml->text().toString(); currentElementText = xml->text().toString();
else
return false;
return true; return false;
} }
void DeckList::writeElement(QXmlStreamWriter *xml) void DeckList::writeElement(QXmlStreamWriter *xml)
@ -219,25 +219,29 @@ void DeckList::writeElement(QXmlStreamWriter *xml)
xml->writeEndElement(); // cockatrice_deck xml->writeEndElement(); // cockatrice_deck
} }
bool DeckList::loadFromFile_Native(QIODevice *device) bool DeckList::loadFromXml(QXmlStreamReader *xml)
{ {
QXmlStreamReader xml(device); while (!xml->atEnd()) {
while (!xml.atEnd()) { xml->readNext();
xml.readNext(); if (xml->isStartElement()) {
if (xml.isStartElement()) { if (xml->name() != "cockatrice_deck")
if (xml.name() != "cockatrice_deck")
return false; return false;
while (!xml.atEnd()) { while (!xml->atEnd()) {
xml.readNext(); xml->readNext();
if (!readElement(&xml)) if (readElement(xml))
if (xml.isEndElement() && (xml.name() == "cockatrice_deck")) return true;
return true;
} }
} }
} }
return false; return false;
} }
bool DeckList::loadFromFile_Native(QIODevice *device)
{
QXmlStreamReader xml(device);
return loadFromXml(&xml);
}
bool DeckList::saveToFile_Native(QIODevice *device) bool DeckList::saveToFile_Native(QIODevice *device)
{ {
QXmlStreamWriter xml(device); QXmlStreamWriter xml(device);

View file

@ -103,6 +103,7 @@ public:
bool readElement(QXmlStreamReader *xml); bool readElement(QXmlStreamReader *xml);
void writeElement(QXmlStreamWriter *xml); void writeElement(QXmlStreamWriter *xml);
bool loadFromXml(QXmlStreamReader *xml);
bool loadFromFile_Native(QIODevice *device); bool loadFromFile_Native(QIODevice *device);
bool saveToFile_Native(QIODevice *device); bool saveToFile_Native(QIODevice *device);

View file

@ -3,6 +3,7 @@
#include <QDebug> #include <QDebug>
#include "protocol.h" #include "protocol.h"
#include "protocol_items.h" #include "protocol_items.h"
#include "decklist.h"
QHash<QString, ProtocolItem::NewItemFunction> ProtocolItem::itemNameHash; QHash<QString, ProtocolItem::NewItemFunction> ProtocolItem::itemNameHash;
@ -69,6 +70,7 @@ void ProtocolItem::initializeHash()
itemNameHash.insert("resp", ProtocolResponse::newItem); itemNameHash.insert("resp", ProtocolResponse::newItem);
ProtocolResponse::initializeHash(); ProtocolResponse::initializeHash();
itemNameHash.insert("respdeck_list", Response_DeckList::newItem); itemNameHash.insert("respdeck_list", Response_DeckList::newItem);
itemNameHash.insert("respdeck_download", Response_DeckDownload::newItem);
itemNameHash.insert("generic_eventlist_games", Event_ListGames::newItem); itemNameHash.insert("generic_eventlist_games", Event_ListGames::newItem);
itemNameHash.insert("generic_eventlist_chat_channels", Event_ListChatChannels::newItem); itemNameHash.insert("generic_eventlist_chat_channels", Event_ListChatChannels::newItem);
@ -99,6 +101,49 @@ void Command::processResponse(ProtocolResponse *response)
emit finished(response->getResponseCode()); emit finished(response->getResponseCode());
} }
Command_DeckUpload::Command_DeckUpload(int _cmdId, DeckList *_deck, const QString &_path)
: Command("deck_upload", _cmdId), deck(_deck), path(_path), readFinished(false)
{
setParameter("path", path);
}
Command_DeckUpload::~Command_DeckUpload()
{
delete deck;
}
void Command_DeckUpload::extractParameters()
{
Command::extractParameters();
path = parameters["path"];
}
bool Command_DeckUpload::readElement(QXmlStreamReader *xml)
{
if (readFinished)
return false;
if (!deck) {
if (xml->isStartElement() && (xml->name() == "cockatrice_deck")) {
deck = new DeckList;
return true;
}
return false;
}
if (deck->readElement(xml))
readFinished = true;
return true;
}
void Command_DeckUpload::writeElement(QXmlStreamWriter *xml)
{
if (deck)
deck->writeElement(xml);
}
QHash<QString, ResponseCode> ProtocolResponse::responseHash; QHash<QString, ResponseCode> ProtocolResponse::responseHash;
ProtocolResponse::ProtocolResponse(int _cmdId, ResponseCode _responseCode, const QString &_itemName) ProtocolResponse::ProtocolResponse(int _cmdId, ResponseCode _responseCode, const QString &_itemName)
@ -180,7 +225,7 @@ void Response_DeckList::Directory::writeElement(QXmlStreamWriter *xml)
} }
Response_DeckList::Response_DeckList(int _cmdId, ResponseCode _responseCode, Directory *_root) Response_DeckList::Response_DeckList(int _cmdId, ResponseCode _responseCode, Directory *_root)
: ProtocolResponse(_cmdId, _responseCode, "deck_list"), root(_root) : ProtocolResponse(_cmdId, _responseCode, "deck_list"), root(_root), readFinished(false)
{ {
} }
@ -191,13 +236,20 @@ Response_DeckList::~Response_DeckList()
bool Response_DeckList::readElement(QXmlStreamReader *xml) bool Response_DeckList::readElement(QXmlStreamReader *xml)
{ {
if (readFinished)
return false;
if (!root) { if (!root) {
if (xml->isStartElement() && (xml->name() == "directory")) if (xml->isStartElement() && (xml->name() == "directory")) {
root = new Directory; root = new Directory;
return true;
}
return false; return false;
} }
return !root->readElement(xml); if (root->readElement(xml))
readFinished = true;
return true;
} }
void Response_DeckList::writeElement(QXmlStreamWriter *xml) void Response_DeckList::writeElement(QXmlStreamWriter *xml)
@ -205,6 +257,56 @@ void Response_DeckList::writeElement(QXmlStreamWriter *xml)
root->writeElement(xml); root->writeElement(xml);
} }
Response_DeckDownload::Response_DeckDownload(int _cmdId, ResponseCode _responseCode, DeckList *_deck)
: ProtocolResponse(_cmdId, _responseCode, "deck_download"), deck(_deck), readFinished(false)
{
}
Response_DeckDownload::~Response_DeckDownload()
{
delete deck;
}
bool Response_DeckDownload::readElement(QXmlStreamReader *xml)
{
if (readFinished)
return false;
if (!deck) {
if (xml->isStartElement() && (xml->name() == "cockatrice_deck")) {
deck = new DeckList;
return true;
}
return false;
}
if (deck->readElement(xml))
readFinished = true;
return true;
}
void Response_DeckDownload::writeElement(QXmlStreamWriter *xml)
{
if (deck)
deck->writeElement(xml);
}
Response_DeckUpload::Response_DeckUpload(int _cmdId, ResponseCode _responseCode, int _deckId)
: ProtocolResponse(_cmdId, _responseCode, "deck_upload"), deckId(_deckId)
{
setParameter("deck_id", deckId);
}
void Response_DeckUpload::extractParameters()
{
ProtocolResponse::extractParameters();
bool ok;
deckId = parameters["deck_id"].toInt(&ok);
if (!ok)
deckId = -1;
}
GenericEvent::GenericEvent(const QString &_eventName) GenericEvent::GenericEvent(const QString &_eventName)
: ProtocolItem(_eventName) : ProtocolItem(_eventName)
{ {

View file

@ -14,13 +14,16 @@ class QXmlStreamWriter;
class QXmlStreamAttributes; class QXmlStreamAttributes;
class ProtocolResponse; class ProtocolResponse;
class DeckList;
enum ItemId { enum ItemId {
ItemId_Command_DeckUpload = ItemId_Other + 1, ItemId_Command_DeckUpload = ItemId_Other + 1,
ItemId_Event_ListChatChannels = ItemId_Other + 2, ItemId_Event_ListChatChannels = ItemId_Other + 2,
ItemId_Event_ChatListPlayers = ItemId_Other + 3, ItemId_Event_ChatListPlayers = ItemId_Other + 3,
ItemId_Event_ListGames = ItemId_Other + 4, ItemId_Event_ListGames = ItemId_Other + 4,
ItemId_Response_DeckList = ItemId_Other + 5 ItemId_Response_DeckList = ItemId_Other + 5,
ItemId_Response_DeckDownload = ItemId_Other + 6,
ItemId_Response_DeckUpload = ItemId_Other + 7
}; };
class ProtocolItem : public QObject { class ProtocolItem : public QObject {
@ -123,10 +126,21 @@ public:
class Command_DeckUpload : public Command { class Command_DeckUpload : public Command {
Q_OBJECT Q_OBJECT
private:
DeckList *deck;
QString path;
bool readFinished;
protected:
void extractParameters();
bool readElement(QXmlStreamReader *xml);
void writeElement(QXmlStreamWriter *xml);
public: public:
Command_DeckUpload(int _cmdId = -1) : Command("deck_upload", _cmdId) { } Command_DeckUpload(int _cmdId = -1, DeckList *_deck = 0, const QString &_path = QString());
~Command_DeckUpload();
static ProtocolItem *newItem() { return new Command_DeckUpload; } static ProtocolItem *newItem() { return new Command_DeckUpload; }
int getItemId() const { return ItemId_Command_DeckUpload; } int getItemId() const { return ItemId_Command_DeckUpload; }
DeckList *getDeck() const { return deck; }
QString getPath() const { return path; }
}; };
// ----------------- // -----------------
@ -182,6 +196,7 @@ public:
}; };
private: private:
Directory *root; Directory *root;
bool readFinished;
protected: protected:
bool readElement(QXmlStreamReader *xml); bool readElement(QXmlStreamReader *xml);
void writeElement(QXmlStreamWriter *xml); void writeElement(QXmlStreamWriter *xml);
@ -193,6 +208,35 @@ public:
Directory *getRoot() const { return root; } Directory *getRoot() const { return root; }
}; };
class Response_DeckDownload : public ProtocolResponse {
Q_OBJECT
private:
DeckList *deck;
bool readFinished;
protected:
bool readElement(QXmlStreamReader *xml);
void writeElement(QXmlStreamWriter *xml);
public:
Response_DeckDownload(int _cmdId = -1, ResponseCode _responseCode = RespOk, DeckList *_deck = 0);
~Response_DeckDownload();
int getItemId() const { return ItemId_Response_DeckDownload; }
static ProtocolItem *newItem() { return new Response_DeckDownload; }
DeckList *getDeck() const { return deck; }
};
class Response_DeckUpload : public ProtocolResponse {
Q_OBJECT
private:
int deckId;
protected:
void extractParameters();
public:
Response_DeckUpload(int _cmdId = -1, ResponseCode _responseCode = RespOk, int _deckId = -1);
int getItemId() const { return ItemId_Response_DeckUpload; }
static ProtocolItem *newItem() { return new Response_DeckUpload; }
int getDeckId() const { return deckId; }
};
// -------------- // --------------
// --- EVENTS --- // --- EVENTS ---
// -------------- // --------------

View file

@ -4,7 +4,7 @@
#include <QString> #include <QString>
#include <QColor> #include <QColor>
enum ResponseCode { RespNothing, RespOk, RespInvalidCommand, RespNameNotFound, RespLoginNeeded, RespContextError, RespWrongPassword, RespSpectatorsNotAllowed }; enum ResponseCode { RespNothing, RespOk, RespInvalidCommand, RespInvalidData, RespNameNotFound, RespLoginNeeded, RespContextError, RespWrongPassword, RespSpectatorsNotAllowed };
class ServerChatChannelInfo { class ServerChatChannelInfo {
private: private:

View file

@ -14,6 +14,7 @@ QT += network sql
HEADERS += src/servatrice.h \ HEADERS += src/servatrice.h \
src/serversocketinterface.h \ src/serversocketinterface.h \
../common/decklist.h \
../common/protocol.h \ ../common/protocol.h \
../common/protocol_items.h \ ../common/protocol_items.h \
../common/protocol_datastructures.h \ ../common/protocol_datastructures.h \
@ -32,6 +33,7 @@ HEADERS += src/servatrice.h \
SOURCES += src/main.cpp \ SOURCES += src/main.cpp \
src/servatrice.cpp \ src/servatrice.cpp \
src/serversocketinterface.cpp \ src/serversocketinterface.cpp \
../common/decklist.cpp \
../common/protocol.cpp \ ../common/protocol.cpp \
../common/protocol_items.cpp \ ../common/protocol_items.cpp \
../common/rng_abstract.cpp \ ../common/rng_abstract.cpp \

View file

@ -25,6 +25,7 @@
#include "servatrice.h" #include "servatrice.h"
#include "protocol.h" #include "protocol.h"
#include "protocol_items.h" #include "protocol_items.h"
#include "decklist.h"
ServerSocketInterface::ServerSocketInterface(Servatrice *_server, QTcpSocket *_socket, QObject *parent) ServerSocketInterface::ServerSocketInterface(Servatrice *_server, QTcpSocket *_socket, QObject *parent)
: Server_ProtocolHandler(_server, parent), servatrice(_server), socket(_socket), currentItem(0) : Server_ProtocolHandler(_server, parent), servatrice(_server), socket(_socket), currentItem(0)
@ -113,8 +114,6 @@ int ServerSocketInterface::getDeckPathId(int basePathId, QStringList path)
if (path[0].isEmpty()) if (path[0].isEmpty())
return 0; return 0;
servatrice->checkSql();
QSqlQuery query; QSqlQuery query;
query.prepare("select id from decklist_folders where id_parent = :id_parent and name = :name and user = :user"); query.prepare("select id from decklist_folders where id_parent = :id_parent and name = :name and user = :user");
query.bindValue(":id_parent", basePathId); query.bindValue(":id_parent", basePathId);
@ -136,28 +135,33 @@ int ServerSocketInterface::getDeckPathId(const QString &path)
return getDeckPathId(0, path.split("/")); return getDeckPathId(0, path.split("/"));
} }
void ServerSocketInterface::deckListHelper(Response_DeckList::Directory *folder) bool ServerSocketInterface::deckListHelper(Response_DeckList::Directory *folder)
{ {
QSqlQuery query; QSqlQuery query;
query.prepare("select id, name from decklist_folders where id_parent = :id_parent and user = :user"); query.prepare("select id, name from decklist_folders where id_parent = :id_parent and user = :user");
query.bindValue(":id_parent", folder->getId()); query.bindValue(":id_parent", folder->getId());
query.bindValue(":user", playerName); query.bindValue(":user", playerName);
servatrice->execSqlQuery(query); if (!servatrice->execSqlQuery(query))
return false;
while (query.next()) { while (query.next()) {
Response_DeckList::Directory *newFolder = new Response_DeckList::Directory(query.value(1).toString(), query.value(0).toInt()); Response_DeckList::Directory *newFolder = new Response_DeckList::Directory(query.value(1).toString(), query.value(0).toInt());
folder->append(newFolder); folder->append(newFolder);
deckListHelper(newFolder); if (!deckListHelper(newFolder))
return false;
} }
query.prepare("select id, name from decklist_files where id_folder = :id_folder"); query.prepare("select id, name from decklist_files where id_folder = :id_folder");
query.bindValue(":id_folder", folder->getId()); query.bindValue(":id_folder", folder->getId());
servatrice->execSqlQuery(query); if (!servatrice->execSqlQuery(query))
return false;
while (query.next()) { while (query.next()) {
Response_DeckList::File *newFile = new Response_DeckList::File(query.value(1).toString(), query.value(0).toInt()); Response_DeckList::File *newFile = new Response_DeckList::File(query.value(1).toString(), query.value(0).toInt());
folder->append(newFile); folder->append(newFile);
} }
return true;
} }
// CHECK AUTHENTICATION! // CHECK AUTHENTICATION!
@ -165,11 +169,12 @@ void ServerSocketInterface::deckListHelper(Response_DeckList::Directory *folder)
ResponseCode ServerSocketInterface::cmdDeckList(Command_DeckList *cmd) ResponseCode ServerSocketInterface::cmdDeckList(Command_DeckList *cmd)
{ {
Response_DeckList::Directory *root = new Response_DeckList::Directory(QString());
servatrice->checkSql(); servatrice->checkSql();
Response_DeckList::Directory *root = new Response_DeckList::Directory(QString());
QSqlQuery query; QSqlQuery query;
deckListHelper(root); if (!deckListHelper(root))
return RespContextError;
sendProtocolItem(new Response_DeckList(cmd->getCmdId(), RespOk, root)); sendProtocolItem(new Response_DeckList(cmd->getCmdId(), RespOk, root));
@ -178,6 +183,8 @@ ResponseCode ServerSocketInterface::cmdDeckList(Command_DeckList *cmd)
ResponseCode ServerSocketInterface::cmdDeckNewDir(Command_DeckNewDir *cmd) ResponseCode ServerSocketInterface::cmdDeckNewDir(Command_DeckNewDir *cmd)
{ {
servatrice->checkSql();
int folderId = getDeckPathId(cmd->getPath()); int folderId = getDeckPathId(cmd->getPath());
if (folderId == -1) if (folderId == -1)
return RespNameNotFound; return RespNameNotFound;
@ -194,6 +201,8 @@ ResponseCode ServerSocketInterface::cmdDeckNewDir(Command_DeckNewDir *cmd)
void ServerSocketInterface::deckDelDirHelper(int basePathId) void ServerSocketInterface::deckDelDirHelper(int basePathId)
{ {
servatrice->checkSql();
QSqlQuery query; QSqlQuery query;
query.prepare("select id from decklist_folders where id_parent = :id_parent"); query.prepare("select id from decklist_folders where id_parent = :id_parent");
@ -213,14 +222,19 @@ void ServerSocketInterface::deckDelDirHelper(int basePathId)
ResponseCode ServerSocketInterface::cmdDeckDelDir(Command_DeckDelDir *cmd) ResponseCode ServerSocketInterface::cmdDeckDelDir(Command_DeckDelDir *cmd)
{ {
servatrice->checkSql();
int basePathId = getDeckPathId(cmd->getPath()); int basePathId = getDeckPathId(cmd->getPath());
if (basePathId == -1) if (basePathId == -1)
return RespNameNotFound; return RespNameNotFound;
deckDelDirHelper(basePathId); deckDelDirHelper(basePathId);
return RespOk;
} }
ResponseCode ServerSocketInterface::cmdDeckDel(Command_DeckDel *cmd) ResponseCode ServerSocketInterface::cmdDeckDel(Command_DeckDel *cmd)
{ {
servatrice->checkSql();
QSqlQuery query; QSqlQuery query;
query.prepare("select id from decklist_files where id = :id and user = :user"); query.prepare("select id from decklist_files where id = :id and user = :user");
@ -239,8 +253,53 @@ ResponseCode ServerSocketInterface::cmdDeckDel(Command_DeckDel *cmd)
ResponseCode ServerSocketInterface::cmdDeckUpload(Command_DeckUpload *cmd) ResponseCode ServerSocketInterface::cmdDeckUpload(Command_DeckUpload *cmd)
{ {
servatrice->checkSql();
if (!cmd->getDeck())
return RespInvalidData;
int folderId = getDeckPathId(cmd->getPath());
if (folderId == -1)
return RespNameNotFound;
QString deckContents;
QXmlStreamWriter deckWriter(&deckContents);
deckWriter.writeStartDocument();
cmd->getDeck()->writeElement(&deckWriter);
deckWriter.writeEndDocument();
QSqlQuery query;
query.prepare("insert into decklist_files (id_folder, user, name, content) value(:id_folder, :user, :name, :content)");
query.bindValue(":id_folder", folderId);
query.bindValue(":user", playerName);
query.bindValue(":name", cmd->getDeck()->getName());
query.bindValue(":content", deckContents);
servatrice->execSqlQuery(query);
sendProtocolItem(new Response_DeckUpload(cmd->getCmdId(), RespOk, query.lastInsertId().toInt()));
return RespNothing;
} }
ResponseCode ServerSocketInterface::cmdDeckDownload(Command_DeckDownload *cmd) ResponseCode ServerSocketInterface::cmdDeckDownload(Command_DeckDownload *cmd)
{ {
servatrice->checkSql();
QSqlQuery query;
query.prepare("select content from decklist_files where id = :id and user = :user");
query.bindValue(":id", cmd->getDeckId());
query.bindValue(":user", playerName);
servatrice->execSqlQuery(query);
if (!query.next())
return RespNameNotFound;
QXmlStreamReader deckReader(query.value(0).toString());
DeckList *deck = new DeckList;
if (!deck->loadFromXml(&deckReader)) {
delete deck;
deck = 0;
return RespInvalidData;
}
sendProtocolItem(new Response_DeckDownload(cmd->getCmdId(), RespOk, deck));
return RespNothing;
} }

View file

@ -43,7 +43,7 @@ private:
int getDeckPathId(int basePathId, QStringList path); int getDeckPathId(int basePathId, QStringList path);
int getDeckPathId(const QString &path); int getDeckPathId(const QString &path);
void deckListHelper(Response_DeckList::Directory *folder); bool deckListHelper(Response_DeckList::Directory *folder);
ResponseCode cmdDeckList(Command_DeckList *cmd); ResponseCode cmdDeckList(Command_DeckList *cmd);
ResponseCode cmdDeckNewDir(Command_DeckNewDir *cmd); ResponseCode cmdDeckNewDir(Command_DeckNewDir *cmd);
void deckDelDirHelper(int basePathId); void deckDelDirHelper(int basePathId);