tMetaserver list functions now operate on passed variables, not a global - vacc… | |
git clone git://src.adamsgaard.dk/vaccinewars | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit 7b1208f1e56d5539ce80984621f6050223a1d869 | |
parent 53df30758f616cb8384288ec861c49eccd3212fb | |
Author: Ben Webb <[email protected]> | |
Date: Mon, 24 Sep 2001 21:55:59 +0000 | |
Metaserver list functions now operate on passed variables, not a global | |
Diffstat: | |
M src/curses_client.c | 4 ++-- | |
M src/gtk_client.c | 32 +++++++++++++++++++----------… | |
M src/message.c | 22 +++++++++++++--------- | |
M src/message.h | 4 ++-- | |
4 files changed, 37 insertions(+), 25 deletions(-) | |
--- | |
diff --git a/src/curses_client.c b/src/curses_client.c | |
t@@ -240,7 +240,7 @@ static char *SelectServerFromMetaServer(Player *Play) { | |
if (!MetaConn) return "Cannot connect"; | |
- ClearServerList(); | |
+ ClearServerList(&ServerList); | |
while(DoneOK) { | |
FD_ZERO(&readfds); FD_ZERO(&writefds); | |
t@@ -257,7 +257,7 @@ static char *SelectServerFromMetaServer(Player *Play) { | |
if (c=='\f') wrefresh(curscr); | |
} | |
if (RespondToSelect(&MetaConn->NetBuf,&readfds,&writefds,NULL,&DoneOK)) { | |
- while (HandleWaitingMetaServerData(MetaConn)) {} | |
+ while (HandleWaitingMetaServerData(MetaConn,&ServerList)) {} | |
} | |
if (!DoneOK) { | |
g_print("Metaserver communication closed"); | |
diff --git a/src/gtk_client.c b/src/gtk_client.c | |
t@@ -73,10 +73,6 @@ struct ClientDataStruct { | |
static struct ClientDataStruct ClientData; | |
static gboolean InGame=FALSE; | |
-/*#ifdef NETWORKING | |
-static gboolean MetaServerRead=FALSE; | |
-#endif*/ | |
- | |
static GtkWidget *FightDialog=NULL,*SpyReportsDialog; | |
static gboolean IsShowingPlayerList=FALSE,IsShowingTalkList=FALSE, | |
IsShowingInventory=FALSE,IsShowingGunShop=FALSE; | |
t@@ -98,6 +94,9 @@ static void GetClientMessage(gpointer data,gint socket, | |
static void SocketStatus(NetworkBuffer *NetBuf,gboolean Read,gboolean Write); | |
static void MetaSocketStatus(NetworkBuffer *NetBuf,gboolean Read, | |
gboolean Write); | |
+ | |
+/* List of servers on the metaserver */ | |
+static GSList *MetaList=NULL; | |
#endif | |
static void HandleClientMessage(char *buf,Player *Play); | |
t@@ -1905,6 +1904,7 @@ struct StartGameStruct { | |
#ifdef NETWORKING | |
gint ConnectTag; | |
HttpConnection *MetaConn; | |
+ GSList *NewMetaList; | |
#endif | |
}; | |
t@@ -1976,7 +1976,8 @@ static void ConnectToServer(GtkWidget *widget,struct Sta… | |
DoConnect(widgets); | |
} | |
-static void FillMetaServerList(struct StartGameStruct *widgets) { | |
+static void FillMetaServerList(struct StartGameStruct *widgets, | |
+ gboolean UseNewList) { | |
GtkWidget *metaserv; | |
ServerData *ThisServer; | |
gchar *titles[5]; | |
t@@ -1987,8 +1988,13 @@ static void FillMetaServerList(struct StartGameStruct *… | |
gtk_clist_freeze(GTK_CLIST(metaserv)); | |
gtk_clist_clear(GTK_CLIST(metaserv)); | |
+ if (UseNewList && widgets->NewMetaList) { | |
+ ClearServerList(&MetaList); | |
+ MetaList=widgets->NewMetaList; | |
+ widgets->NewMetaList=NULL; | |
+ } | |
- for (ListPt=ServerList;ListPt;ListPt=g_slist_next(ListPt)) { | |
+ for (ListPt=MetaList;ListPt;ListPt=g_slist_next(ListPt)) { | |
ThisServer=(ServerData *)(ListPt->data); | |
titles[0]=ThisServer->Name; | |
titles[1]=g_strdup_printf("%d",ThisServer->Port); | |
t@@ -2021,13 +2027,14 @@ static void HandleMetaSock(gpointer data,gint socket, | |
if (NetBufHandleNetwork(&widgets->MetaConn->NetBuf,condition&GDK_INPUT_READ, | |
condition&GDK_INPUT_WRITE,&DoneOK)) { | |
- while (HandleWaitingMetaServerData(widgets->MetaConn)) {} | |
+ while (HandleWaitingMetaServerData(widgets->MetaConn, | |
+ &widgets->NewMetaList)) {} | |
} | |
if (!DoneOK) { | |
- g_print("Metaserver communicated closed\n"); | |
+ g_print("Metaserver communication closed\n"); | |
CloseHttpConnection(widgets->MetaConn); | |
widgets->MetaConn=NULL; | |
- FillMetaServerList(widgets); | |
+ FillMetaServerList(widgets,TRUE); | |
} | |
} | |
t@@ -2049,13 +2056,12 @@ static void UpdateMetaServerList(GtkWidget *widget, | |
CloseHttpConnection(widgets->MetaConn); | |
widgets->MetaConn=NULL; | |
} | |
+ ClearServerList(&widgets->NewMetaList); | |
widgets->MetaConn = OpenMetaHttpConnection(); | |
if (widgets->MetaConn) { | |
metaserv=widgets->metaserv; | |
- gtk_clist_clear(GTK_CLIST(metaserv)); | |
- ClearServerList(); | |
SetNetworkBufferCallBack(&widgets->MetaConn->NetBuf, | |
MetaSocketStatus,(gpointer)widgets); | |
} | |
t@@ -2105,6 +2111,7 @@ static void CloseNewGameDia(GtkWidget *widget, | |
CloseHttpConnection(widgets->MetaConn); | |
widgets->MetaConn=NULL; | |
} | |
+ ClearServerList(&widgets->NewMetaList); | |
#endif | |
} | |
t@@ -2140,6 +2147,7 @@ void NewGameDialog(void) { | |
widgets.ConnectTag=0; | |
widgets.MetaConn=NULL; | |
+ widgets.NewMetaList=NULL; | |
#endif /* NETWORKING */ | |
t@@ -2324,7 +2332,7 @@ void NewGameDialog(void) { | |
if (UpdateMeta) { | |
UpdateMetaServerList(NULL,&widgets); | |
} else { | |
- FillMetaServerList(&widgets); | |
+ FillMetaServerList(&widgets,FALSE); | |
} | |
#endif | |
diff --git a/src/message.c b/src/message.c | |
t@@ -300,6 +300,7 @@ void InitNetworkBuffer(NetworkBuffer *NetBuf,char Terminat… | |
NetBuf->ReadBuf.Length=NetBuf->WriteBuf.Length=0; | |
NetBuf->ReadBuf.DataPresent=NetBuf->WriteBuf.DataPresent=0; | |
NetBuf->WaitConnect=FALSE; | |
+ NetBuf->Error=0; | |
} | |
void SetNetworkBufferCallBack(NetworkBuffer *NetBuf,NBCallBack CallBack, | |
t@@ -603,7 +604,7 @@ gboolean WriteDataToWire(NetworkBuffer *NetBuf) { | |
/* TRUE on success, or FALSE if the buffer's maximum length is */ | |
/* reached, or the remote end has closed the connection. */ | |
ConnBuf *conn; | |
- int CurrentPosition,BytesSent; | |
+ int CurrentPosition,BytesSent,Error; | |
conn=&NetBuf->WriteBuf; | |
if (!conn->Data || !conn->DataPresent) return TRUE; | |
if (conn->Length==MAXWRITEBUF) return FALSE; | |
t@@ -612,10 +613,13 @@ gboolean WriteDataToWire(NetworkBuffer *NetBuf) { | |
BytesSent=send(NetBuf->fd,&conn->Data[CurrentPosition], | |
conn->DataPresent-CurrentPosition,0); | |
if (BytesSent==SOCKET_ERROR) { | |
+ Error=GetSocketError(); | |
#ifdef CYGWIN | |
- if (GetSocketError()==WSAEWOULDBLOCK) break; else return FALSE; | |
+ if (Error==WSAEWOULDBLOCK) break; | |
+ else { NetBuf->Error=Error; return FALSE; } | |
#else | |
- if (GetSocketError()==EAGAIN) break; else return FALSE; | |
+ if (Error==EAGAIN) break; | |
+ else if (Error!=EINTR) { NetBuf->Error=Error; return FALSE; } | |
#endif | |
} else { | |
CurrentPosition+=BytesSent; | |
t@@ -783,7 +787,7 @@ gboolean HandleHttpCompletion(HttpConnection *conn) { | |
return TRUE; | |
} | |
-gboolean HandleWaitingMetaServerData(HttpConnection *conn) { | |
+gboolean HandleWaitingMetaServerData(HttpConnection *conn,GSList **listpt) { | |
gchar *msg; | |
ServerData *NewServer; | |
t@@ -807,7 +811,7 @@ gboolean HandleWaitingMetaServerData(HttpConnection *conn)… | |
NewServer->Update=ReadHttpResponse(conn); | |
NewServer->Comment=ReadHttpResponse(conn); | |
NewServer->UpSince=ReadHttpResponse(conn); | |
- ServerList=g_slist_append(ServerList,NewServer); | |
+ *listpt=g_slist_append(*listpt,NewServer); | |
} else if (conn->Status==HS_READSEPARATOR) { | |
/* This should be the first line of the body, the "MetaServer:" line */ | |
msg=ReadHttpResponse(conn); | |
t@@ -824,14 +828,14 @@ gboolean HandleWaitingMetaServerData(HttpConnection *con… | |
return TRUE; | |
} | |
-void ClearServerList() { | |
+void ClearServerList(GSList **listpt) { | |
ServerData *ThisServer; | |
- while (ServerList) { | |
- ThisServer=(ServerData *)(ServerList->data); | |
+ while (*listpt) { | |
+ ThisServer=(ServerData *)((*listpt)->data); | |
g_free(ThisServer->Name); g_free(ThisServer->Comment); | |
g_free(ThisServer->Version); g_free(ThisServer->Update); | |
g_free(ThisServer->UpSince); g_free(ThisServer); | |
- ServerList=g_slist_remove(ServerList,ThisServer); | |
+ *listpt=g_slist_remove(*listpt,ThisServer); | |
} | |
} | |
#endif /* NETWORKING */ | |
diff --git a/src/message.h b/src/message.h | |
t@@ -134,8 +134,8 @@ HttpConnection *OpenMetaHttpConnection(void); | |
void CloseHttpConnection(HttpConnection *conn); | |
gchar *ReadHttpResponse(HttpConnection *conn); | |
gboolean HandleHttpCompletion(HttpConnection *conn); | |
-gboolean HandleWaitingMetaServerData(HttpConnection *conn); | |
-void ClearServerList(void); | |
+gboolean HandleWaitingMetaServerData(HttpConnection *conn,GSList **listpt); | |
+void ClearServerList(GSList **listpt); | |
#endif /* NETWORKING */ | |
extern GSList *FirstClient; |