tReport metaserver errors with GError - vaccinewars - be a doctor and try to va… | |
git clone git://src.adamsgaard.dk/vaccinewars | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit a2b557a74595793a733876f6164e1cce5df1e3a2 | |
parent 0eda1a10d2f68195b4e12ec9c938f59100b6099b | |
Author: Ben Webb <[email protected]> | |
Date: Mon, 2 Nov 2020 22:16:26 -0800 | |
Report metaserver errors with GError | |
Diffstat: | |
M src/curses_client/curses_client.c | 16 +++++++--------- | |
M src/gui_client/newgamedia.c | 13 +++++++++++-- | |
M src/message.c | 31 +++++++++++++++++++++--------… | |
M src/message.h | 13 ++++++++++++- | |
4 files changed, 51 insertions(+), 22 deletions(-) | |
--- | |
diff --git a/src/curses_client/curses_client.c b/src/curses_client/curses_clien… | |
t@@ -421,12 +421,14 @@ static gboolean SelectServerFromMetaServer(Player *Play,… | |
g_string_assign(errstr, merr); | |
return FALSE; | |
} else if (still_running == 0) { | |
- merr = HandleWaitingMetaServerData(&MetaConn, &ServerList); | |
- CloseCurlConnection(&MetaConn); | |
- if (merr) { | |
- g_string_assign(errstr, merr); | |
- return FALSE; | |
+ GError *tmp_error = NULL; | |
+ if (!HandleWaitingMetaServerData(&MetaConn, &ServerList, &tmp_error)) { | |
+ CloseCurlConnection(&MetaConn); | |
+ g_string_assign(errstr, tmp_error->message); | |
+ g_error_free(tmp_error); | |
+ return FALSE; | |
} | |
+ CloseCurlConnection(&MetaConn); | |
break; | |
} | |
} | |
t@@ -486,10 +488,6 @@ static gboolean SelectServerFromMetaServer(Player *Play, … | |
break; | |
} | |
} | |
- if (!ServerList) { | |
- g_string_assign(errstr, "No servers listed on metaserver"); | |
- return FALSE; | |
- } | |
clear_line(top + 1); | |
refresh(); | |
g_string_free(text, TRUE); | |
diff --git a/src/gui_client/newgamedia.c b/src/gui_client/newgamedia.c | |
t@@ -124,14 +124,23 @@ static gboolean glib_socket(GIOChannel *ch, GIOCondition… | |
if (g->still_running) { | |
return TRUE; | |
} else { | |
+ GError *tmp_error = NULL; | |
fprintf(stderr, "got data %s\n", stgam.MetaConn->data); | |
fprintf(stderr, "last transfer done, kill timeout\n"); | |
if (g->timer_event) { | |
g_source_remove(g->timer_event); | |
g->timer_event = 0; | |
} | |
- HandleWaitingMetaServerData(stgam.MetaConn, &stgam.NewMetaList); | |
- SetStartGameStatus(NULL); | |
+ if (!HandleWaitingMetaServerData(stgam.MetaConn, &stgam.NewMetaList, | |
+ &tmp_error)) { | |
+ char *str = g_strdup_printf(_("Status: ERROR: %s"), tmp_error->message); | |
+ SetStartGameStatus(str); | |
+ g_free(str); | |
+ g_error_free(tmp_error); | |
+ } else { | |
+ SetStartGameStatus(NULL); | |
+ } | |
+ | |
CloseCurlConnection(stgam.MetaConn); | |
FillMetaServerList(TRUE); | |
return FALSE; | |
diff --git a/src/message.c b/src/message.c | |
t@@ -439,7 +439,13 @@ const char *OpenMetaHttpConnection(CurlConnection *conn) | |
return errstr; | |
} | |
-const char *HandleWaitingMetaServerData(CurlConnection *conn, GSList **listpt) | |
+GQuark dope_meta_error_quark(void) | |
+{ | |
+ return g_quark_from_static_string("dope-meta-error-quark"); | |
+} | |
+ | |
+gboolean HandleWaitingMetaServerData(CurlConnection *conn, GSList **listpt, | |
+ GError **err) | |
{ | |
char *msg; | |
t@@ -447,14 +453,14 @@ const char *HandleWaitingMetaServerData(CurlConnection *… | |
msg = conn->data; | |
/* This should be the first line of the body, the "MetaServer:" line */ | |
- if (!msg) return NULL; | |
- if (strlen(msg) >= 14 && strncmp(msg, "FATAL ERROR:", 12) == 0) { | |
- //todo | |
-/* SetError(&conn->NetBuf.error, &ETMeta, MEC_INTERNAL, | |
- g_strdup(&msg[13]));*/ | |
- } else if (strncmp(msg, "MetaServer:", 11) != 0) { | |
- //todo | |
-/* SetError(&conn->NetBuf.error, &ETMeta, MEC_BADREPLY, g_strdup(msg));*/ | |
+ if (msg && strlen(msg) >= 14 && strncmp(msg, "FATAL ERROR:", 12) == 0) { | |
+ g_set_error(err, DOPE_META_ERROR, DOPE_META_ERROR_INTERNAL, | |
+ _("Internal metaserver error \"%s\""), &msg[13]); | |
+ return FALSE; | |
+ } else if (msg && strncmp(msg, "MetaServer:", 11) != 0) { | |
+ g_set_error(err, DOPE_META_ERROR, DOPE_META_ERROR_BAD_REPLY, | |
+ _("Bad metaserver reply \"%s\""), msg); | |
+ return FALSE; | |
} | |
msg = CurlNextLine(conn, msg); | |
t@@ -483,7 +489,12 @@ const char *HandleWaitingMetaServerData(CurlConnection *c… | |
*listpt = g_slist_append(*listpt, NewServer); | |
} | |
} | |
- return NULL; | |
+ if (!*listpt) { | |
+ g_set_error_literal(err, DOPE_META_ERROR, DOPE_META_ERROR_EMPTY, | |
+ _("No servers listed on metaserver")); | |
+ return FALSE; | |
+ } | |
+ return TRUE; | |
} | |
void ClearServerList(GSList **listpt) | |
diff --git a/src/message.h b/src/message.h | |
t@@ -76,6 +76,16 @@ void SendPrintMessage(Player *From, AICode AI, Player *To, … | |
void SendQuestion(Player *From, AICode AI, Player *To, char *Data); | |
#ifdef NETWORKING | |
+#define DOPE_META_ERROR dope_meta_error_quark() | |
+ | |
+typedef enum { | |
+ DOPE_META_ERROR_EMPTY, /* No servers listed on metaserver */ | |
+ DOPE_META_ERROR_INTERNAL, /* Internal metaserver error */ | |
+ DOPE_META_ERROR_BAD_REPLY /* Bad reply from metaserver */ | |
+} DopeMetaError; | |
+ | |
+GQuark dope_meta_error_quark(void); | |
+ | |
gboolean PlayerHandleNetwork(Player *Play, gboolean ReadReady, | |
gboolean WriteReady, gboolean *DoneOK); | |
gboolean ReadPlayerDataFromWire(Player *Play); | |
t@@ -84,7 +94,8 @@ gboolean WritePlayerDataToWire(Player *Play); | |
gchar *GetWaitingPlayerMessage(Player *Play); | |
const char *OpenMetaHttpConnection(CurlConnection *conn); | |
-const char *HandleWaitingMetaServerData(CurlConnection *conn, GSList **listpt); | |
+gboolean HandleWaitingMetaServerData(CurlConnection *conn, GSList **listpt, | |
+ GError **err); | |
void ClearServerList(GSList **listpt); | |
#endif /* NETWORKING */ | |