initial commit for improved deck list submission
This commit is contained in:
parent
34d2649f65
commit
fdf921e718
13 changed files with 499 additions and 71 deletions
|
@ -13,6 +13,7 @@ class QXmlStreamReader;
|
||||||
class QXmlStreamWriter;
|
class QXmlStreamWriter;
|
||||||
|
|
||||||
class ProtocolItem;
|
class ProtocolItem;
|
||||||
|
class ProtocolResponse;
|
||||||
class ChatEvent;
|
class ChatEvent;
|
||||||
class GameEvent;
|
class GameEvent;
|
||||||
class Event_ListGames;
|
class Event_ListGames;
|
||||||
|
|
|
@ -64,8 +64,11 @@ void ProtocolItem::initializeHash()
|
||||||
|
|
||||||
initializeHashAuto();
|
initializeHashAuto();
|
||||||
|
|
||||||
|
itemNameHash.insert("cmddeck_upload", Command_DeckUpload::newItem);
|
||||||
|
|
||||||
itemNameHash.insert("resp", ProtocolResponse::newItem);
|
itemNameHash.insert("resp", ProtocolResponse::newItem);
|
||||||
ProtocolResponse::initializeHash();
|
ProtocolResponse::initializeHash();
|
||||||
|
itemNameHash.insert("respdeck_list", Response_DeckList::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);
|
||||||
|
@ -92,13 +95,14 @@ void Command::extractParameters()
|
||||||
|
|
||||||
void Command::processResponse(ProtocolResponse *response)
|
void Command::processResponse(ProtocolResponse *response)
|
||||||
{
|
{
|
||||||
|
emit finished(response);
|
||||||
emit finished(response->getResponseCode());
|
emit finished(response->getResponseCode());
|
||||||
}
|
}
|
||||||
|
|
||||||
QHash<QString, ResponseCode> ProtocolResponse::responseHash;
|
QHash<QString, ResponseCode> ProtocolResponse::responseHash;
|
||||||
|
|
||||||
ProtocolResponse::ProtocolResponse(int _cmdId, ResponseCode _responseCode)
|
ProtocolResponse::ProtocolResponse(int _cmdId, ResponseCode _responseCode, const QString &_itemName)
|
||||||
: ProtocolItem(QString()), cmdId(_cmdId), responseCode(_responseCode)
|
: ProtocolItem(_itemName), cmdId(_cmdId), responseCode(_responseCode)
|
||||||
{
|
{
|
||||||
setParameter("cmd_id", cmdId);
|
setParameter("cmd_id", cmdId);
|
||||||
setParameter("response_code", responseHash.key(responseCode));
|
setParameter("response_code", responseHash.key(responseCode));
|
||||||
|
@ -125,6 +129,81 @@ void ProtocolResponse::initializeHash()
|
||||||
responseHash.insert("spectators_not_allowed", RespSpectatorsNotAllowed);
|
responseHash.insert("spectators_not_allowed", RespSpectatorsNotAllowed);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Response_DeckList::File::readElement(QXmlStreamReader *xml)
|
||||||
|
{
|
||||||
|
if (xml->isEndElement())
|
||||||
|
return true;
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Response_DeckList::File::writeElement(QXmlStreamWriter *xml)
|
||||||
|
{
|
||||||
|
xml->writeStartElement("file");
|
||||||
|
xml->writeAttribute("name", name);
|
||||||
|
xml->writeAttribute("id", QString::number(id));
|
||||||
|
xml->writeEndElement();
|
||||||
|
}
|
||||||
|
|
||||||
|
Response_DeckList::Directory::~Directory()
|
||||||
|
{
|
||||||
|
for (int i = 0; i < size(); ++i)
|
||||||
|
delete at(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Response_DeckList::Directory::readElement(QXmlStreamReader *xml)
|
||||||
|
{
|
||||||
|
if (currentItem) {
|
||||||
|
if (currentItem->readElement(xml))
|
||||||
|
currentItem = 0;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (xml->isStartElement() && (xml->name() == "directory")) {
|
||||||
|
currentItem = new Directory(xml->attributes().value("name").toString());
|
||||||
|
append(currentItem);
|
||||||
|
} else if (xml->isStartElement() && (xml->name() == "file")) {
|
||||||
|
currentItem = new File(xml->attributes().value("name").toString(), xml->attributes().value("id").toString().toInt());
|
||||||
|
append(currentItem);
|
||||||
|
} else
|
||||||
|
return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Response_DeckList::Directory::writeElement(QXmlStreamWriter *xml)
|
||||||
|
{
|
||||||
|
xml->writeStartElement("directory");
|
||||||
|
xml->writeAttribute("name", name);
|
||||||
|
for (int i = 0; i < size(); ++i)
|
||||||
|
at(i)->writeElement(xml);
|
||||||
|
xml->writeEndElement();
|
||||||
|
}
|
||||||
|
|
||||||
|
Response_DeckList::Response_DeckList(int _cmdId, ResponseCode _responseCode, Directory *_root)
|
||||||
|
: ProtocolResponse(_cmdId, _responseCode, "deck_list"), root(_root)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
Response_DeckList::~Response_DeckList()
|
||||||
|
{
|
||||||
|
delete root;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Response_DeckList::readElement(QXmlStreamReader *xml)
|
||||||
|
{
|
||||||
|
if (!root) {
|
||||||
|
if (xml->isStartElement() && (xml->name() == "directory"))
|
||||||
|
root = new Directory;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return root->readElement(xml);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Response_DeckList::writeElement(QXmlStreamWriter *xml)
|
||||||
|
{
|
||||||
|
root->writeElement(xml);
|
||||||
|
}
|
||||||
|
|
||||||
GenericEvent::GenericEvent(const QString &_eventName)
|
GenericEvent::GenericEvent(const QString &_eventName)
|
||||||
: ProtocolItem(_eventName)
|
: ProtocolItem(_eventName)
|
||||||
{
|
{
|
||||||
|
|
|
@ -16,9 +16,11 @@ class QXmlStreamAttributes;
|
||||||
class ProtocolResponse;
|
class ProtocolResponse;
|
||||||
|
|
||||||
enum ItemId {
|
enum ItemId {
|
||||||
ItemId_Event_ListChatChannels = ItemId_Other + 1,
|
ItemId_Command_DeckUpload = ItemId_Other + 1,
|
||||||
ItemId_Event_ChatListPlayers = ItemId_Other + 2,
|
ItemId_Event_ListChatChannels = ItemId_Other + 2,
|
||||||
ItemId_Event_ListGames = ItemId_Other + 3
|
ItemId_Event_ChatListPlayers = ItemId_Other + 3,
|
||||||
|
ItemId_Event_ListGames = ItemId_Other + 4,
|
||||||
|
ItemId_Response_DeckList = ItemId_Other + 5
|
||||||
};
|
};
|
||||||
|
|
||||||
class ProtocolItem : public QObject {
|
class ProtocolItem : public QObject {
|
||||||
|
@ -51,9 +53,14 @@ public:
|
||||||
void write(QXmlStreamWriter *xml);
|
void write(QXmlStreamWriter *xml);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// ----------------
|
||||||
|
// --- COMMANDS ---
|
||||||
|
// ----------------
|
||||||
|
|
||||||
class Command : public ProtocolItem {
|
class Command : public ProtocolItem {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
signals:
|
signals:
|
||||||
|
void finished(ProtocolResponse *response);
|
||||||
void finished(ResponseCode response);
|
void finished(ResponseCode response);
|
||||||
private:
|
private:
|
||||||
int cmdId;
|
int cmdId;
|
||||||
|
@ -114,6 +121,18 @@ public:
|
||||||
int getGameId() const { return gameId; }
|
int getGameId() const { return gameId; }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class Command_DeckUpload : public Command {
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
Command_DeckUpload(int _cmdId = -1) : Command("deck_upload", _cmdId) { }
|
||||||
|
static ProtocolItem *newItem() { return new Command_DeckUpload; }
|
||||||
|
int getItemId() const { return ItemId_Command_DeckUpload; }
|
||||||
|
};
|
||||||
|
|
||||||
|
// -----------------
|
||||||
|
// --- RESPONSES ---
|
||||||
|
// -----------------
|
||||||
|
|
||||||
class ProtocolResponse : public ProtocolItem {
|
class ProtocolResponse : public ProtocolItem {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
private:
|
private:
|
||||||
|
@ -124,7 +143,7 @@ protected:
|
||||||
QString getItemType() const { return "resp"; }
|
QString getItemType() const { return "resp"; }
|
||||||
void extractParameters();
|
void extractParameters();
|
||||||
public:
|
public:
|
||||||
ProtocolResponse(int _cmdId = -1, ResponseCode _responseCode = RespOk);
|
ProtocolResponse(int _cmdId = -1, ResponseCode _responseCode = RespOk, const QString &_itemName = QString());
|
||||||
int getItemId() const { return ItemId_Other; }
|
int getItemId() const { return ItemId_Other; }
|
||||||
static void initializeHash();
|
static void initializeHash();
|
||||||
static ProtocolItem *newItem() { return new ProtocolResponse; }
|
static ProtocolItem *newItem() { return new ProtocolResponse; }
|
||||||
|
@ -132,6 +151,52 @@ public:
|
||||||
ResponseCode getResponseCode() const { return responseCode; }
|
ResponseCode getResponseCode() const { return responseCode; }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class Response_DeckList : public ProtocolResponse {
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
class TreeItem {
|
||||||
|
protected:
|
||||||
|
QString name;
|
||||||
|
int id;
|
||||||
|
public:
|
||||||
|
TreeItem(const QString &_name, int _id) : name(_name), id(_id) { }
|
||||||
|
QString getName() const { return name; }
|
||||||
|
int getId() const { return id; }
|
||||||
|
virtual bool readElement(QXmlStreamReader *xml) = 0;
|
||||||
|
virtual void writeElement(QXmlStreamWriter *xml) = 0;
|
||||||
|
};
|
||||||
|
class File : public TreeItem {
|
||||||
|
public:
|
||||||
|
File(const QString &_name, int _id) : TreeItem(_name, _id) { }
|
||||||
|
bool readElement(QXmlStreamReader *xml);
|
||||||
|
void writeElement(QXmlStreamWriter *xml);
|
||||||
|
};
|
||||||
|
class Directory : public TreeItem, public QList<TreeItem *> {
|
||||||
|
private:
|
||||||
|
TreeItem *currentItem;
|
||||||
|
public:
|
||||||
|
Directory(const QString &_name = QString(), int _id = 0) : TreeItem(_name, _id), currentItem(0) { }
|
||||||
|
~Directory();
|
||||||
|
bool readElement(QXmlStreamReader *xml);
|
||||||
|
void writeElement(QXmlStreamWriter *xml);
|
||||||
|
};
|
||||||
|
private:
|
||||||
|
Directory *root;
|
||||||
|
protected:
|
||||||
|
bool readElement(QXmlStreamReader *xml);
|
||||||
|
void writeElement(QXmlStreamWriter *xml);
|
||||||
|
public:
|
||||||
|
Response_DeckList(int _cmdId = -1, ResponseCode _responseCode = RespOk, Directory *_root = 0);
|
||||||
|
~Response_DeckList();
|
||||||
|
int getItemId() const { return ItemId_Response_DeckList; }
|
||||||
|
static ProtocolItem *newItem() { return new Response_DeckList; }
|
||||||
|
Directory *getRoot() const { return root; }
|
||||||
|
};
|
||||||
|
|
||||||
|
// --------------
|
||||||
|
// --- EVENTS ---
|
||||||
|
// --------------
|
||||||
|
|
||||||
class GenericEvent : public ProtocolItem {
|
class GenericEvent : public ProtocolItem {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
protected:
|
protected:
|
||||||
|
|
|
@ -1,59 +1,65 @@
|
||||||
enum AutoItemId {
|
enum AutoItemId {
|
||||||
ItemId_Command_Ping = 1001,
|
ItemId_Command_Ping = 1001,
|
||||||
ItemId_Command_Login = 1002,
|
ItemId_Command_Login = 1002,
|
||||||
ItemId_Command_ListChatChannels = 1003,
|
ItemId_Command_DeckList = 1003,
|
||||||
ItemId_Command_ChatJoinChannel = 1004,
|
ItemId_Command_DeckNewDir = 1004,
|
||||||
ItemId_Command_ChatLeaveChannel = 1005,
|
ItemId_Command_DeckDelDir = 1005,
|
||||||
ItemId_Command_ChatSay = 1006,
|
ItemId_Command_DeckNew = 1006,
|
||||||
ItemId_Command_ListGames = 1007,
|
ItemId_Command_DeckDel = 1007,
|
||||||
ItemId_Command_CreateGame = 1008,
|
ItemId_Command_DeckDownload = 1008,
|
||||||
ItemId_Command_JoinGame = 1009,
|
ItemId_Command_ListChatChannels = 1009,
|
||||||
ItemId_Command_LeaveGame = 1010,
|
ItemId_Command_ChatJoinChannel = 1010,
|
||||||
ItemId_Command_Say = 1011,
|
ItemId_Command_ChatLeaveChannel = 1011,
|
||||||
ItemId_Command_Shuffle = 1012,
|
ItemId_Command_ChatSay = 1012,
|
||||||
ItemId_Command_RollDie = 1013,
|
ItemId_Command_ListGames = 1013,
|
||||||
ItemId_Command_DrawCards = 1014,
|
ItemId_Command_CreateGame = 1014,
|
||||||
ItemId_Command_MoveCard = 1015,
|
ItemId_Command_JoinGame = 1015,
|
||||||
ItemId_Command_CreateToken = 1016,
|
ItemId_Command_LeaveGame = 1016,
|
||||||
ItemId_Command_CreateArrow = 1017,
|
ItemId_Command_Say = 1017,
|
||||||
ItemId_Command_DeleteArrow = 1018,
|
ItemId_Command_Shuffle = 1018,
|
||||||
ItemId_Command_SetCardAttr = 1019,
|
ItemId_Command_RollDie = 1019,
|
||||||
ItemId_Command_ReadyStart = 1020,
|
ItemId_Command_DrawCards = 1020,
|
||||||
ItemId_Command_IncCounter = 1021,
|
ItemId_Command_MoveCard = 1021,
|
||||||
ItemId_Command_AddCounter = 1022,
|
ItemId_Command_CreateToken = 1022,
|
||||||
ItemId_Command_SetCounter = 1023,
|
ItemId_Command_CreateArrow = 1023,
|
||||||
ItemId_Command_DelCounter = 1024,
|
ItemId_Command_DeleteArrow = 1024,
|
||||||
ItemId_Command_NextTurn = 1025,
|
ItemId_Command_SetCardAttr = 1025,
|
||||||
ItemId_Command_SetActivePhase = 1026,
|
ItemId_Command_ReadyStart = 1026,
|
||||||
ItemId_Command_DumpZone = 1027,
|
ItemId_Command_IncCounter = 1027,
|
||||||
ItemId_Command_StopDumpZone = 1028,
|
ItemId_Command_AddCounter = 1028,
|
||||||
ItemId_Command_DumpAll = 1029,
|
ItemId_Command_SetCounter = 1029,
|
||||||
ItemId_Command_SubmitDeck = 1030,
|
ItemId_Command_DelCounter = 1030,
|
||||||
ItemId_Event_Say = 1031,
|
ItemId_Command_NextTurn = 1031,
|
||||||
ItemId_Event_Join = 1032,
|
ItemId_Command_SetActivePhase = 1032,
|
||||||
ItemId_Event_Leave = 1033,
|
ItemId_Command_DumpZone = 1033,
|
||||||
ItemId_Event_GameClosed = 1034,
|
ItemId_Command_StopDumpZone = 1034,
|
||||||
ItemId_Event_ReadyStart = 1035,
|
ItemId_Command_DumpAll = 1035,
|
||||||
ItemId_Event_SetupZones = 1036,
|
ItemId_Command_SubmitDeck = 1036,
|
||||||
ItemId_Event_GameStart = 1037,
|
ItemId_Event_Say = 1037,
|
||||||
ItemId_Event_Shuffle = 1038,
|
ItemId_Event_Join = 1038,
|
||||||
ItemId_Event_RollDie = 1039,
|
ItemId_Event_Leave = 1039,
|
||||||
ItemId_Event_MoveCard = 1040,
|
ItemId_Event_GameClosed = 1040,
|
||||||
ItemId_Event_CreateToken = 1041,
|
ItemId_Event_ReadyStart = 1041,
|
||||||
ItemId_Event_CreateArrow = 1042,
|
ItemId_Event_SetupZones = 1042,
|
||||||
ItemId_Event_DeleteArrow = 1043,
|
ItemId_Event_GameStart = 1043,
|
||||||
ItemId_Event_SetCardAttr = 1044,
|
ItemId_Event_Shuffle = 1044,
|
||||||
ItemId_Event_AddCounter = 1045,
|
ItemId_Event_RollDie = 1045,
|
||||||
ItemId_Event_SetCounter = 1046,
|
ItemId_Event_MoveCard = 1046,
|
||||||
ItemId_Event_DelCounter = 1047,
|
ItemId_Event_CreateToken = 1047,
|
||||||
ItemId_Event_SetActivePlayer = 1048,
|
ItemId_Event_CreateArrow = 1048,
|
||||||
ItemId_Event_SetActivePhase = 1049,
|
ItemId_Event_DeleteArrow = 1049,
|
||||||
ItemId_Event_DumpZone = 1050,
|
ItemId_Event_SetCardAttr = 1050,
|
||||||
ItemId_Event_StopDumpZone = 1051,
|
ItemId_Event_AddCounter = 1051,
|
||||||
ItemId_Event_ServerMessage = 1052,
|
ItemId_Event_SetCounter = 1052,
|
||||||
ItemId_Event_GameJoined = 1053,
|
ItemId_Event_DelCounter = 1053,
|
||||||
ItemId_Event_ChatJoinChannel = 1054,
|
ItemId_Event_SetActivePlayer = 1054,
|
||||||
ItemId_Event_ChatLeaveChannel = 1055,
|
ItemId_Event_SetActivePhase = 1055,
|
||||||
ItemId_Event_ChatSay = 1056,
|
ItemId_Event_DumpZone = 1056,
|
||||||
ItemId_Other = 1057
|
ItemId_Event_StopDumpZone = 1057,
|
||||||
|
ItemId_Event_ServerMessage = 1058,
|
||||||
|
ItemId_Event_GameJoined = 1059,
|
||||||
|
ItemId_Event_ChatJoinChannel = 1060,
|
||||||
|
ItemId_Event_ChatLeaveChannel = 1061,
|
||||||
|
ItemId_Event_ChatSay = 1062,
|
||||||
|
ItemId_Other = 1063
|
||||||
};
|
};
|
||||||
|
|
|
@ -17,6 +17,66 @@ void Command_Login::extractParameters()
|
||||||
username = parameters["username"];
|
username = parameters["username"];
|
||||||
password = parameters["password"];
|
password = parameters["password"];
|
||||||
}
|
}
|
||||||
|
Command_DeckList::Command_DeckList()
|
||||||
|
: Command("deck_list")
|
||||||
|
{
|
||||||
|
}
|
||||||
|
Command_DeckNewDir::Command_DeckNewDir(const QString &_path, const QString &_name)
|
||||||
|
: Command("deck_new_dir"), path(_path), name(_name)
|
||||||
|
{
|
||||||
|
setParameter("path", path);
|
||||||
|
setParameter("name", name);
|
||||||
|
}
|
||||||
|
void Command_DeckNewDir::extractParameters()
|
||||||
|
{
|
||||||
|
Command::extractParameters();
|
||||||
|
path = parameters["path"];
|
||||||
|
name = parameters["name"];
|
||||||
|
}
|
||||||
|
Command_DeckDelDir::Command_DeckDelDir(const QString &_path, const QString &_name)
|
||||||
|
: Command("deck_del_dir"), path(_path), name(_name)
|
||||||
|
{
|
||||||
|
setParameter("path", path);
|
||||||
|
setParameter("name", name);
|
||||||
|
}
|
||||||
|
void Command_DeckDelDir::extractParameters()
|
||||||
|
{
|
||||||
|
Command::extractParameters();
|
||||||
|
path = parameters["path"];
|
||||||
|
name = parameters["name"];
|
||||||
|
}
|
||||||
|
Command_DeckNew::Command_DeckNew(const QString &_path, int _id)
|
||||||
|
: Command("deck_new"), path(_path), id(_id)
|
||||||
|
{
|
||||||
|
setParameter("path", path);
|
||||||
|
setParameter("id", id);
|
||||||
|
}
|
||||||
|
void Command_DeckNew::extractParameters()
|
||||||
|
{
|
||||||
|
Command::extractParameters();
|
||||||
|
path = parameters["path"];
|
||||||
|
id = parameters["id"].toInt();
|
||||||
|
}
|
||||||
|
Command_DeckDel::Command_DeckDel(int _id)
|
||||||
|
: Command("deck_del"), id(_id)
|
||||||
|
{
|
||||||
|
setParameter("id", id);
|
||||||
|
}
|
||||||
|
void Command_DeckDel::extractParameters()
|
||||||
|
{
|
||||||
|
Command::extractParameters();
|
||||||
|
id = parameters["id"].toInt();
|
||||||
|
}
|
||||||
|
Command_DeckDownload::Command_DeckDownload(int _id)
|
||||||
|
: Command("deck_download"), id(_id)
|
||||||
|
{
|
||||||
|
setParameter("id", id);
|
||||||
|
}
|
||||||
|
void Command_DeckDownload::extractParameters()
|
||||||
|
{
|
||||||
|
Command::extractParameters();
|
||||||
|
id = parameters["id"].toInt();
|
||||||
|
}
|
||||||
Command_ListChatChannels::Command_ListChatChannels()
|
Command_ListChatChannels::Command_ListChatChannels()
|
||||||
: Command("list_chat_channels")
|
: Command("list_chat_channels")
|
||||||
{
|
{
|
||||||
|
@ -609,6 +669,12 @@ void ProtocolItem::initializeHashAuto()
|
||||||
{
|
{
|
||||||
itemNameHash.insert("cmdping", Command_Ping::newItem);
|
itemNameHash.insert("cmdping", Command_Ping::newItem);
|
||||||
itemNameHash.insert("cmdlogin", Command_Login::newItem);
|
itemNameHash.insert("cmdlogin", Command_Login::newItem);
|
||||||
|
itemNameHash.insert("cmddeck_list", Command_DeckList::newItem);
|
||||||
|
itemNameHash.insert("cmddeck_new_dir", Command_DeckNewDir::newItem);
|
||||||
|
itemNameHash.insert("cmddeck_del_dir", Command_DeckDelDir::newItem);
|
||||||
|
itemNameHash.insert("cmddeck_new", Command_DeckNew::newItem);
|
||||||
|
itemNameHash.insert("cmddeck_del", Command_DeckDel::newItem);
|
||||||
|
itemNameHash.insert("cmddeck_download", Command_DeckDownload::newItem);
|
||||||
itemNameHash.insert("cmdlist_chat_channels", Command_ListChatChannels::newItem);
|
itemNameHash.insert("cmdlist_chat_channels", Command_ListChatChannels::newItem);
|
||||||
itemNameHash.insert("cmdchat_join_channel", Command_ChatJoinChannel::newItem);
|
itemNameHash.insert("cmdchat_join_channel", Command_ChatJoinChannel::newItem);
|
||||||
itemNameHash.insert("cmdchat_leave_channel", Command_ChatLeaveChannel::newItem);
|
itemNameHash.insert("cmdchat_leave_channel", Command_ChatLeaveChannel::newItem);
|
||||||
|
|
|
@ -1,5 +1,11 @@
|
||||||
0:ping
|
0:ping
|
||||||
0:login:s,username:s,password
|
0:login:s,username:s,password
|
||||||
|
0:deck_list
|
||||||
|
0:deck_new_dir:s,path:s,name
|
||||||
|
0:deck_del_dir:s,path:s,name
|
||||||
|
0:deck_new:s,path:i,id
|
||||||
|
0:deck_del:i,id
|
||||||
|
0:deck_download:i,id
|
||||||
0:list_chat_channels
|
0:list_chat_channels
|
||||||
0:chat_join_channel:s,channel
|
0:chat_join_channel:s,channel
|
||||||
1:chat_leave_channel
|
1:chat_leave_channel
|
||||||
|
|
|
@ -25,6 +25,80 @@ public:
|
||||||
protected:
|
protected:
|
||||||
void extractParameters();
|
void extractParameters();
|
||||||
};
|
};
|
||||||
|
class Command_DeckList : public Command {
|
||||||
|
Q_OBJECT
|
||||||
|
private:
|
||||||
|
public:
|
||||||
|
Command_DeckList();
|
||||||
|
static ProtocolItem *newItem() { return new Command_DeckList; }
|
||||||
|
int getItemId() const { return ItemId_Command_DeckList; }
|
||||||
|
};
|
||||||
|
class Command_DeckNewDir : public Command {
|
||||||
|
Q_OBJECT
|
||||||
|
private:
|
||||||
|
QString path;
|
||||||
|
QString name;
|
||||||
|
public:
|
||||||
|
Command_DeckNewDir(const QString &_path = QString(), const QString &_name = QString());
|
||||||
|
QString getPath() const { return path; }
|
||||||
|
QString getName() const { return name; }
|
||||||
|
static ProtocolItem *newItem() { return new Command_DeckNewDir; }
|
||||||
|
int getItemId() const { return ItemId_Command_DeckNewDir; }
|
||||||
|
protected:
|
||||||
|
void extractParameters();
|
||||||
|
};
|
||||||
|
class Command_DeckDelDir : public Command {
|
||||||
|
Q_OBJECT
|
||||||
|
private:
|
||||||
|
QString path;
|
||||||
|
QString name;
|
||||||
|
public:
|
||||||
|
Command_DeckDelDir(const QString &_path = QString(), const QString &_name = QString());
|
||||||
|
QString getPath() const { return path; }
|
||||||
|
QString getName() const { return name; }
|
||||||
|
static ProtocolItem *newItem() { return new Command_DeckDelDir; }
|
||||||
|
int getItemId() const { return ItemId_Command_DeckDelDir; }
|
||||||
|
protected:
|
||||||
|
void extractParameters();
|
||||||
|
};
|
||||||
|
class Command_DeckNew : public Command {
|
||||||
|
Q_OBJECT
|
||||||
|
private:
|
||||||
|
QString path;
|
||||||
|
int id;
|
||||||
|
public:
|
||||||
|
Command_DeckNew(const QString &_path = QString(), int _id = -1);
|
||||||
|
QString getPath() const { return path; }
|
||||||
|
int getId() const { return id; }
|
||||||
|
static ProtocolItem *newItem() { return new Command_DeckNew; }
|
||||||
|
int getItemId() const { return ItemId_Command_DeckNew; }
|
||||||
|
protected:
|
||||||
|
void extractParameters();
|
||||||
|
};
|
||||||
|
class Command_DeckDel : public Command {
|
||||||
|
Q_OBJECT
|
||||||
|
private:
|
||||||
|
int id;
|
||||||
|
public:
|
||||||
|
Command_DeckDel(int _id = -1);
|
||||||
|
int getId() const { return id; }
|
||||||
|
static ProtocolItem *newItem() { return new Command_DeckDel; }
|
||||||
|
int getItemId() const { return ItemId_Command_DeckDel; }
|
||||||
|
protected:
|
||||||
|
void extractParameters();
|
||||||
|
};
|
||||||
|
class Command_DeckDownload : public Command {
|
||||||
|
Q_OBJECT
|
||||||
|
private:
|
||||||
|
int id;
|
||||||
|
public:
|
||||||
|
Command_DeckDownload(int _id = -1);
|
||||||
|
int getId() const { return id; }
|
||||||
|
static ProtocolItem *newItem() { return new Command_DeckDownload; }
|
||||||
|
int getItemId() const { return ItemId_Command_DeckDownload; }
|
||||||
|
protected:
|
||||||
|
void extractParameters();
|
||||||
|
};
|
||||||
class Command_ListChatChannels : public Command {
|
class Command_ListChatChannels : public Command {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
private:
|
private:
|
||||||
|
|
|
@ -84,6 +84,13 @@ void Server_ProtocolHandler::processCommand(Command *command)
|
||||||
switch (command->getItemId()) {
|
switch (command->getItemId()) {
|
||||||
case ItemId_Command_Ping: response = cmdPing(qobject_cast<Command_Ping *>(command)); break;
|
case ItemId_Command_Ping: response = cmdPing(qobject_cast<Command_Ping *>(command)); break;
|
||||||
case ItemId_Command_Login: response = cmdLogin(qobject_cast<Command_Login *>(command)); break;
|
case ItemId_Command_Login: response = cmdLogin(qobject_cast<Command_Login *>(command)); break;
|
||||||
|
case ItemId_Command_DeckList: response = cmdDeckList(qobject_cast<Command_DeckList *>(command)); break;
|
||||||
|
case ItemId_Command_DeckNewDir: response = cmdDeckNewDir(qobject_cast<Command_DeckNewDir *>(command)); break;
|
||||||
|
case ItemId_Command_DeckDelDir: response = cmdDeckDelDir(qobject_cast<Command_DeckDelDir *>(command)); break;
|
||||||
|
case ItemId_Command_DeckNew: response = cmdDeckNew(qobject_cast<Command_DeckNew *>(command)); break;
|
||||||
|
case ItemId_Command_DeckDel: response = cmdDeckDel(qobject_cast<Command_DeckDel *>(command)); break;
|
||||||
|
case ItemId_Command_DeckUpload: response = cmdDeckUpload(qobject_cast<Command_DeckUpload *>(command)); break;
|
||||||
|
case ItemId_Command_DeckDownload: response = cmdDeckDownload(qobject_cast<Command_DeckDownload *>(command)); break;
|
||||||
case ItemId_Command_ListChatChannels: response = cmdListChatChannels(qobject_cast<Command_ListChatChannels *>(command)); break;
|
case ItemId_Command_ListChatChannels: response = cmdListChatChannels(qobject_cast<Command_ListChatChannels *>(command)); break;
|
||||||
case ItemId_Command_ChatJoinChannel: response = cmdChatJoinChannel(qobject_cast<Command_ChatJoinChannel *>(command)); break;
|
case ItemId_Command_ChatJoinChannel: response = cmdChatJoinChannel(qobject_cast<Command_ChatJoinChannel *>(command)); break;
|
||||||
case ItemId_Command_ListGames: response = cmdListGames(qobject_cast<Command_ListGames *>(command)); break;
|
case ItemId_Command_ListGames: response = cmdListGames(qobject_cast<Command_ListGames *>(command)); break;
|
||||||
|
|
|
@ -11,7 +11,7 @@ class Server_Player;
|
||||||
|
|
||||||
class Server_ProtocolHandler : public QObject {
|
class Server_ProtocolHandler : public QObject {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
private:
|
protected:
|
||||||
Server *server;
|
Server *server;
|
||||||
QMap<int, QPair<Server_Game *, Server_Player *> > games;
|
QMap<int, QPair<Server_Game *, Server_Player *> > games;
|
||||||
QMap<QString, Server_ChatChannel *> chatChannels;
|
QMap<QString, Server_ChatChannel *> chatChannels;
|
||||||
|
@ -24,10 +24,18 @@ private:
|
||||||
bool acceptsGameListChanges;
|
bool acceptsGameListChanges;
|
||||||
bool acceptsChatChannelListChanges;
|
bool acceptsChatChannelListChanges;
|
||||||
|
|
||||||
|
private:
|
||||||
QList<ProtocolItem *> itemQueue;
|
QList<ProtocolItem *> itemQueue;
|
||||||
|
|
||||||
ResponseCode cmdPing(Command_Ping *cmd);
|
ResponseCode cmdPing(Command_Ping *cmd);
|
||||||
ResponseCode cmdLogin(Command_Login *cmd);
|
ResponseCode cmdLogin(Command_Login *cmd);
|
||||||
|
virtual ResponseCode cmdDeckList(Command_DeckList *cmd) = 0;
|
||||||
|
virtual ResponseCode cmdDeckNewDir(Command_DeckNewDir *cmd) = 0;
|
||||||
|
virtual ResponseCode cmdDeckDelDir(Command_DeckDelDir *cmd) = 0;
|
||||||
|
virtual ResponseCode cmdDeckNew(Command_DeckNew *cmd) = 0;
|
||||||
|
virtual ResponseCode cmdDeckDel(Command_DeckDel *cmd) = 0;
|
||||||
|
virtual ResponseCode cmdDeckUpload(Command_DeckUpload *cmd) = 0;
|
||||||
|
virtual ResponseCode cmdDeckDownload(Command_DeckDownload *cmd) = 0;
|
||||||
ResponseCode cmdListChatChannels(Command_ListChatChannels *cmd);
|
ResponseCode cmdListChatChannels(Command_ListChatChannels *cmd);
|
||||||
ResponseCode cmdChatJoinChannel(Command_ChatJoinChannel *cmd);
|
ResponseCode cmdChatJoinChannel(Command_ChatJoinChannel *cmd);
|
||||||
ResponseCode cmdChatLeaveChannel(Command_ChatLeaveChannel *cmd, Server_ChatChannel *channel);
|
ResponseCode cmdChatLeaveChannel(Command_ChatLeaveChannel *cmd, Server_ChatChannel *channel);
|
||||||
|
|
|
@ -87,6 +87,20 @@ bool Servatrice::openDatabase()
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Servatrice::checkSql()
|
||||||
|
{
|
||||||
|
if (!QSqlDatabase::database().exec("select 1").isActive())
|
||||||
|
openDatabase();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Servatrice::execSqlQuery(QSqlQuery &query)
|
||||||
|
{
|
||||||
|
if (query.exec())
|
||||||
|
return true;
|
||||||
|
qCritical(QString("Database error: %1").arg(query.lastError().text()).toLatin1());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
void Servatrice::newConnection()
|
void Servatrice::newConnection()
|
||||||
{
|
{
|
||||||
QTcpSocket *socket = tcpServer->nextPendingConnection();
|
QTcpSocket *socket = tcpServer->nextPendingConnection();
|
||||||
|
@ -100,16 +114,14 @@ AuthenticationResult Servatrice::checkUserPassword(const QString &user, const QS
|
||||||
if (method == "none")
|
if (method == "none")
|
||||||
return UnknownUser;
|
return UnknownUser;
|
||||||
else if (method == "sql") {
|
else if (method == "sql") {
|
||||||
if (!QSqlDatabase::database().exec("select 1").isActive())
|
checkSql();
|
||||||
openDatabase();
|
|
||||||
|
|
||||||
QSqlQuery query;
|
QSqlQuery query;
|
||||||
query.prepare("select password from players where name = :name");
|
query.prepare("select password from players where name = :name");
|
||||||
query.bindValue(":name", user);
|
query.bindValue(":name", user);
|
||||||
if (!query.exec()) {
|
if (!execSqlQuery(query))
|
||||||
qCritical(QString("Database error: %1").arg(query.lastError().text()).toLatin1());
|
|
||||||
return PasswordWrong;
|
return PasswordWrong;
|
||||||
}
|
|
||||||
if (query.next()) {
|
if (query.next()) {
|
||||||
if (query.value(0).toString() == password)
|
if (query.value(0).toString() == password)
|
||||||
return PasswordRight;
|
return PasswordRight;
|
||||||
|
|
|
@ -25,6 +25,7 @@
|
||||||
|
|
||||||
class QSqlDatabase;
|
class QSqlDatabase;
|
||||||
class QSettings;
|
class QSettings;
|
||||||
|
class QSqlQuery;
|
||||||
|
|
||||||
class Servatrice : public Server
|
class Servatrice : public Server
|
||||||
{
|
{
|
||||||
|
@ -36,6 +37,8 @@ public:
|
||||||
Servatrice(QObject *parent = 0);
|
Servatrice(QObject *parent = 0);
|
||||||
~Servatrice();
|
~Servatrice();
|
||||||
bool openDatabase();
|
bool openDatabase();
|
||||||
|
void checkSql();
|
||||||
|
bool execSqlQuery(QSqlQuery &query);
|
||||||
AuthenticationResult checkUserPassword(const QString &user, const QString &password);
|
AuthenticationResult checkUserPassword(const QString &user, const QString &password);
|
||||||
QString getLoginMessage() const { return loginMessage; }
|
QString getLoginMessage() const { return loginMessage; }
|
||||||
private:
|
private:
|
||||||
|
|
|
@ -20,13 +20,14 @@
|
||||||
|
|
||||||
#include <QXmlStreamReader>
|
#include <QXmlStreamReader>
|
||||||
#include <QXmlStreamWriter>
|
#include <QXmlStreamWriter>
|
||||||
|
#include <QtSql>
|
||||||
#include "serversocketinterface.h"
|
#include "serversocketinterface.h"
|
||||||
#include "servatrice.h"
|
#include "servatrice.h"
|
||||||
#include "protocol.h"
|
#include "protocol.h"
|
||||||
#include "protocol_items.h"
|
#include "protocol_items.h"
|
||||||
|
|
||||||
ServerSocketInterface::ServerSocketInterface(Server *_server, QTcpSocket *_socket, QObject *parent)
|
ServerSocketInterface::ServerSocketInterface(Servatrice *_server, QTcpSocket *_socket, QObject *parent)
|
||||||
: Server_ProtocolHandler(_server, parent), socket(_socket), currentItem(0)
|
: Server_ProtocolHandler(_server, parent), servatrice(_server), socket(_socket), currentItem(0)
|
||||||
{
|
{
|
||||||
xmlWriter = new QXmlStreamWriter;
|
xmlWriter = new QXmlStreamWriter;
|
||||||
xmlWriter->setDevice(socket);
|
xmlWriter->setDevice(socket);
|
||||||
|
@ -101,3 +102,92 @@ void ServerSocketInterface::sendProtocolItem(ProtocolItem *item, bool deleteItem
|
||||||
if (deleteItem)
|
if (deleteItem)
|
||||||
delete item;
|
delete item;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int ServerSocketInterface::getDeckPathId(int basePathId, QStringList path)
|
||||||
|
{
|
||||||
|
if (path.isEmpty())
|
||||||
|
return 0;
|
||||||
|
if (path[0].isEmpty())
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
servatrice->checkSql();
|
||||||
|
|
||||||
|
QSqlQuery query;
|
||||||
|
query.prepare("select id from decklist_folders where id_parent = :id_parent and name = :name");
|
||||||
|
query.bindValue(":id_parent", basePathId);
|
||||||
|
query.bindValue(":name", path.takeFirst());
|
||||||
|
if (!servatrice->execSqlQuery(query))
|
||||||
|
return -1;
|
||||||
|
if (!query.next())
|
||||||
|
return -1;
|
||||||
|
int id = query.value(0).toInt();
|
||||||
|
if (path.isEmpty())
|
||||||
|
return id;
|
||||||
|
else
|
||||||
|
return getDeckPathId(id, path);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ServerSocketInterface::deckListHelper(Response_DeckList::Directory *folder)
|
||||||
|
{
|
||||||
|
QSqlQuery query;
|
||||||
|
query.prepare("select id, name from decklist_folders where id_parent = :id_parent and user = :user");
|
||||||
|
query.bindValue(":id_parent", folder->getId());
|
||||||
|
query.bindValue(":user", playerName);
|
||||||
|
servatrice->execSqlQuery(query);
|
||||||
|
|
||||||
|
while (query.next()) {
|
||||||
|
Response_DeckList::Directory *newFolder = new Response_DeckList::Directory(query.value(1).toString(), query.value(0).toInt());
|
||||||
|
folder->append(newFolder);
|
||||||
|
deckListHelper(newFolder);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ResponseCode ServerSocketInterface::cmdDeckList(Command_DeckList *cmd)
|
||||||
|
{
|
||||||
|
Response_DeckList::Directory *root = new Response_DeckList::Directory(QString());
|
||||||
|
|
||||||
|
servatrice->checkSql();
|
||||||
|
QSqlQuery query;
|
||||||
|
deckListHelper(root);
|
||||||
|
|
||||||
|
sendProtocolItem(new Response_DeckList(cmd->getCmdId(), RespOk, root));
|
||||||
|
|
||||||
|
return RespNothing;
|
||||||
|
}
|
||||||
|
|
||||||
|
ResponseCode ServerSocketInterface::cmdDeckNewDir(Command_DeckNewDir *cmd)
|
||||||
|
{
|
||||||
|
int folderId = getDeckPathId(0, cmd->getPath().split("/"));
|
||||||
|
qDebug() << "folderId" << folderId;
|
||||||
|
if (folderId == -1)
|
||||||
|
return RespNameNotFound;
|
||||||
|
|
||||||
|
QSqlQuery query;
|
||||||
|
query.prepare("insert into decklist_folders (id_parent, user, name) values(:id_parent, :user, :name)");
|
||||||
|
query.bindValue(":id_parent", folderId);
|
||||||
|
query.bindValue(":user", playerName);
|
||||||
|
query.bindValue(":name", cmd->getName());
|
||||||
|
if (!servatrice->execSqlQuery(query))
|
||||||
|
return RespContextError;
|
||||||
|
return RespOk;
|
||||||
|
}
|
||||||
|
|
||||||
|
ResponseCode ServerSocketInterface::cmdDeckDelDir(Command_DeckDelDir *cmd)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
ResponseCode ServerSocketInterface::cmdDeckNew(Command_DeckNew *cmd)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
ResponseCode ServerSocketInterface::cmdDeckDel(Command_DeckDel *cmd)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
ResponseCode ServerSocketInterface::cmdDeckUpload(Command_DeckUpload *cmd)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
ResponseCode ServerSocketInterface::cmdDeckDownload(Command_DeckDownload *cmd)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
|
@ -24,7 +24,7 @@
|
||||||
#include "server_protocolhandler.h"
|
#include "server_protocolhandler.h"
|
||||||
|
|
||||||
class QTcpSocket;
|
class QTcpSocket;
|
||||||
class Server;
|
class Servatrice;
|
||||||
class QXmlStreamReader;
|
class QXmlStreamReader;
|
||||||
class QXmlStreamWriter;
|
class QXmlStreamWriter;
|
||||||
|
|
||||||
|
@ -35,12 +35,23 @@ private slots:
|
||||||
void readClient();
|
void readClient();
|
||||||
void catchSocketError(QAbstractSocket::SocketError socketError);
|
void catchSocketError(QAbstractSocket::SocketError socketError);
|
||||||
private:
|
private:
|
||||||
|
Servatrice *servatrice;
|
||||||
QTcpSocket *socket;
|
QTcpSocket *socket;
|
||||||
QXmlStreamWriter *xmlWriter;
|
QXmlStreamWriter *xmlWriter;
|
||||||
QXmlStreamReader *xmlReader;
|
QXmlStreamReader *xmlReader;
|
||||||
ProtocolItem *currentItem;
|
ProtocolItem *currentItem;
|
||||||
|
|
||||||
|
int getDeckPathId(int basePathId, QStringList path);
|
||||||
|
void deckListHelper(Response_DeckList::Directory *folder);
|
||||||
|
ResponseCode cmdDeckList(Command_DeckList *cmd);
|
||||||
|
ResponseCode cmdDeckNewDir(Command_DeckNewDir *cmd);
|
||||||
|
ResponseCode cmdDeckDelDir(Command_DeckDelDir *cmd);
|
||||||
|
ResponseCode cmdDeckNew(Command_DeckNew *cmd);
|
||||||
|
ResponseCode cmdDeckDel(Command_DeckDel *cmd);
|
||||||
|
ResponseCode cmdDeckUpload(Command_DeckUpload *cmd);
|
||||||
|
ResponseCode cmdDeckDownload(Command_DeckDownload *cmd);
|
||||||
public:
|
public:
|
||||||
ServerSocketInterface(Server *_server, QTcpSocket *_socket, QObject *parent = 0);
|
ServerSocketInterface(Servatrice *_server, QTcpSocket *_socket, QObject *parent = 0);
|
||||||
~ServerSocketInterface();
|
~ServerSocketInterface();
|
||||||
|
|
||||||
void sendProtocolItem(ProtocolItem *item, bool deleteItem = true);
|
void sendProtocolItem(ProtocolItem *item, bool deleteItem = true);
|
||||||
|
|
Loading…
Reference in a new issue