From ab374324626f93ad032f9b0b7e988123b2774845 Mon Sep 17 00:00:00 2001 From: maddinat0r Date: Sat, 13 Dec 2014 11:56:01 +0100 Subject: [PATCH] add error callback fixes #8 --- TSConnector.inc | 9 +++++++++ src/CCallback.cpp | 7 +++++-- src/CCallback.h | 16 +++++++++++++++- src/CNetwork.cpp | 29 +++++++++++++++++++---------- 4 files changed, 48 insertions(+), 13 deletions(-) diff --git a/TSConnector.inc b/TSConnector.inc index 6643412..f3ade70 100644 --- a/TSConnector.inc +++ b/TSConnector.inc @@ -78,6 +78,14 @@ enum /*teamspeak channel codecs*/ CODEC_OPUS_MUSIC //5: opus music }; +enum TSC_ERROR_TYPE +{ + INVALID, + CONNECTION_ERROR, + TEAMSPEAK_ERROR, + CALLBACK_ERROR +}; + //server functions native TSC_Connect(user[], pass[], hostname[], port = 9987, serverquery_port = 10011); @@ -141,6 +149,7 @@ native TSC_SendClientMessage(clientid, msg[]); //server callbacks forward TSC_OnConnect(); +forward TSC_OnError(TSC_ERROR_TYPE:error_type, error_id, const error_msg[]); //channel callbacks forward TSC_OnChannelCreated(channelid); diff --git a/src/CCallback.cpp b/src/CCallback.cpp index a1b5d48..597f131 100644 --- a/src/CCallback.cpp +++ b/src/CCallback.cpp @@ -1,5 +1,7 @@ #include "CCallback.h" +#include "format.h" + void CCallbackHandler::Process() { @@ -80,8 +82,9 @@ CCallback *CCallbackHandler::Create(string name, string format, param_list.push(amx_GetCppString(amx, params[param_offset + param_idx])); break; default: - logprintf(">> plugin.TSConnector: Error while creating callback structure: \ - (#1) Unrecognized format specifier '%c'", c); + CCallbackHandler::Get()->ForwardError( + EErrorType::CALLBACK_ERROR, 1, + fmt::format("unrecognized format specifier '{}' in callback \"{}({})\"", c, name, format)); return nullptr; } param_idx++; diff --git a/src/CCallback.h b/src/CCallback.h index bdd9dcd..f2ae7b1 100644 --- a/src/CCallback.h +++ b/src/CCallback.h @@ -23,6 +23,14 @@ using boost::unordered_set; #include "CSingleton.h" +enum class EErrorType +{ + INVALID, + CONNECTION_ERROR, + TEAMSPEAK_ERROR, + CALLBACK_ERROR +}; + class CCallback { friend class CCallbackHandler; @@ -98,11 +106,17 @@ class CCallbackHandler : public CSingleton m_Queue.push(callback); } template - inline void Call(const char *name, Args&&... args) + inline void Call(const string &name, Args&&... args) { Call(new CCallback(name, std::forward(args)...)); } + inline void ForwardError(EErrorType error_type, + const unsigned int error_id, const string &error_msg) + { + Call("TSC_OnError", + static_cast(error_type), error_id, error_msg); + } inline void AddAmx(AMX *amx) { diff --git a/src/CNetwork.cpp b/src/CNetwork.cpp index 61c1380..a26418c 100644 --- a/src/CNetwork.cpp +++ b/src/CNetwork.cpp @@ -2,6 +2,7 @@ #include "CNetwork.h" #include "CServer.h" #include "CUtils.h" +#include "CCallback.h" #include #include @@ -36,8 +37,9 @@ bool CNetwork::Connect(string hostname, unsigned short port, unsigned short quer if (error) { - logprintf(">> plugin.TSConnector: Error while resolving hostname \"%s\": (#%d) %s", - hostname.c_str(), error.value(), error.message().c_str()); + CCallbackHandler::Get()->ForwardError( + EErrorType::CONNECTION_ERROR, error.value(), + fmt::format("error while resolving hostname \"{}\": {}", hostname, error.message())); return false; } @@ -107,8 +109,9 @@ void CNetwork::OnConnect(const boost::system::error_code &error_code) } else { - logprintf(">> plugin.TSConnector: Error while connecting to server: (#%d) %s", - error_code.value(), error_code.message().c_str()); + CCallbackHandler::Get()->ForwardError( + EErrorType::CONNECTION_ERROR, error_code.value(), + fmt::format("error while connecting to server: {}", error_code.message())); Disconnect(); } } @@ -189,10 +192,14 @@ void CNetwork::OnRead(const boost::system::error_code &error_code) else { string error_str(error_rx_result[2].str()); + unsigned int error_id = 0; + CUtils::Get()->UnEscapeString(error_str); + CUtils::Get()->ConvertStringToInt(error_rx_result[1].str(), error_id); - logprintf(">> plugin.TSConnector: Error while executing \"%s\": (#%s) %s", - m_CmdQueue.front().get<0>().c_str(), error_str.c_str(), error_rx_result[1].str().c_str()); + CCallbackHandler::Get()->ForwardError( + EErrorType::TEAMSPEAK_ERROR, error_id, + fmt::format("error while executing \"{}\": {}", m_CmdQueue.front().get<0>(), error_str)); m_CmdQueue.pop(); } @@ -250,8 +257,9 @@ void CNetwork::OnRead(const boost::system::error_code &error_code) } else { - logprintf(">> plugin.TSConnector: Error while reading: (#%d) %s", - error_code.message().c_str(), error_code.value()); + CCallbackHandler::Get()->ForwardError( + EErrorType::CONNECTION_ERROR, error_code.value(), + fmt::format("error while reading: {}", error_code.message())); } } @@ -263,8 +271,9 @@ void CNetwork::OnWrite(const boost::system::error_code &error_code) m_CmdWriteBuffer.clear(); if (error_code.value() != 0) { - logprintf(">> plugin.TSConnector: Error while writing: (#%d) %s", - error_code.message().c_str(), error_code.value()); + CCallbackHandler::Get()->ForwardError( + EErrorType::CONNECTION_ERROR, error_code.value(), + fmt::format("error while writing: {}", error_code.message())); } }