Author: cazfi Date: Sun Apr 17 05:56:10 2016 New Revision: 32423 URL: http://svn.gna.org/viewcvs/freeciv?rev=32423&view=rev Log: Added new chat package type to be used for some chats related to login procedure on auth-enabled server. Unlike normal chat packet, this one is accepted by the client in the early phase.
Reported by Jacob Nevins <jtn> See bug #19526 Modified: trunk/client/client_main.c trunk/client/packhand.c trunk/common/packets.def trunk/fc_version trunk/server/auth.c trunk/server/notify.c trunk/server/notify.h Modified: trunk/client/client_main.c URL: http://svn.gna.org/viewcvs/freeciv/trunk/client/client_main.c?rev=32423&r1=32422&r2=32423&view=diff ============================================================================== --- trunk/client/client_main.c (original) +++ trunk/client/client_main.c Sun Apr 17 05:56:10 2016 @@ -752,7 +752,8 @@ && PACKET_SERVER_JOIN_REPLY != type && PACKET_AUTHENTICATION_REQ != type && PACKET_SERVER_SHUTDOWN != type - && PACKET_CONNECT_MSG != type) { + && PACKET_CONNECT_MSG != type + && PACKET_EARLY_CHAT_MSG != type) { log_error("Received packet %s (%d) before establishing connection!", packet_name(type), type); disconnect_from_server(); Modified: trunk/client/packhand.c URL: http://svn.gna.org/viewcvs/freeciv/trunk/client/packhand.c?rev=32423&r1=32422&r2=32423&view=diff ============================================================================== --- trunk/client/packhand.c (original) +++ trunk/client/packhand.c Sun Apr 17 05:56:10 2016 @@ -1358,6 +1358,26 @@ in-game messages and chats from other players. **************************************************************************/ void handle_chat_msg(const struct packet_chat_msg *packet) +{ + handle_event(packet->message, + index_to_tile(packet->tile), + packet->event, + packet->turn, + packet->phase, + packet->conn_id); +} + +/************************************************************************** + Handle an early message packet. Thease have format like other chat + messages but server sends them only about events related to establishing + the connection and other setup in the early phase. They are a separate + packet just so that client knows thse to be already relevant when it's + only setting itself up - other chat messages might be just something + sent to all clients, and we might want to still consider ourselves + "not connected" (not receivers of those messages) until we are fully + in the game. +**************************************************************************/ +void handle_early_chat_msg(const struct packet_early_chat_msg *packet) { handle_event(packet->message, index_to_tile(packet->tile), Modified: trunk/common/packets.def URL: http://svn.gna.org/viewcvs/freeciv/trunk/common/packets.def?rev=32423&r1=32422&r2=32423&view=diff ============================================================================== --- trunk/common/packets.def (original) +++ trunk/common/packets.def Sun Apr 17 05:56:10 2016 @@ -598,7 +598,20 @@ /************** Chat/event packets **********************/ +/* This MUST have identical structure to PACKET_EARLY_CHAT_MSG as there's casting + * the two. */ PACKET_CHAT_MSG = 25; sc, lsend + STRING message[MAX_LEN_MSG]; + TILE tile; + EVENT event; + TURN turn; + PHASE phase; + CONNECTION conn_id; +end + +/* This MUST have identical structure to PACKET_CHAT_MSG as there's casting + * the two. */ +PACKET_EARLY_CHAT_MSG = 28; sc, lsend STRING message[MAX_LEN_MSG]; TILE tile; EVENT event; Modified: trunk/fc_version URL: http://svn.gna.org/viewcvs/freeciv/trunk/fc_version?rev=32423&r1=32422&r2=32423&view=diff ============================================================================== --- trunk/fc_version (original) +++ trunk/fc_version Sun Apr 17 05:56:10 2016 @@ -55,7 +55,7 @@ # - Avoid adding a new mandatory capability to the development branch for # as long as possible. We want to maintain network compatibility with # the stable branch for as long as possible. -NETWORK_CAPSTRING_MANDATORY="+Freeciv.Devel-3.0-2016.Apr.13" +NETWORK_CAPSTRING_MANDATORY="+Freeciv.Devel-3.0-2016.Apr.17" NETWORK_CAPSTRING_OPTIONAL="" FREECIV_DISTRIBUTOR="" Modified: trunk/server/auth.c URL: http://svn.gna.org/viewcvs/freeciv/trunk/server/auth.c?rev=32423&r1=32422&r2=32423&view=diff ============================================================================== --- trunk/server/auth.c (original) +++ trunk/server/auth.c Sun Apr 17 05:56:10 2016 @@ -84,9 +84,9 @@ get_unique_guest_name(username); if (strncmp(tmpname, username, MAX_LEN_NAME) != 0) { - notify_conn(pconn->self, NULL, E_CONNECTION, ftc_warning, - _("Warning: the guest name '%s' has been " - "taken, renaming to user '%s'."), tmpname, username); + notify_conn_early(pconn->self, NULL, E_CONNECTION, ftc_warning, + _("Warning: the guest name '%s' has been " + "taken, renaming to user '%s'."), tmpname, username); } sz_strlcpy(pconn->username, username); establish_new_connection(pconn); @@ -111,10 +111,10 @@ sz_strlcpy(pconn->username, tmpname); log_error("Error reading database; connection -> guest"); - notify_conn(pconn->self, NULL, E_CONNECTION, ftc_warning, - _("There was an error reading the user " - "database, logging in as guest connection '%s'."), - pconn->username); + notify_conn_early(pconn->self, NULL, E_CONNECTION, ftc_warning, + _("There was an error reading the user " + "database, logging in as guest connection '%s'."), + pconn->username); establish_new_connection(pconn); } else { reject_new_connection(_("There was an error reading the user database " Modified: trunk/server/notify.c URL: http://svn.gna.org/viewcvs/freeciv/trunk/server/notify.c?rev=32423&r1=32422&r2=32423&view=diff ============================================================================== --- trunk/server/notify.c (original) +++ trunk/server/notify.c Sun Apr 17 05:56:10 2016 @@ -191,7 +191,8 @@ coordinates have been normalized. **************************************************************************/ static void notify_conn_packet(struct conn_list *dest, - const struct packet_chat_msg *packet) + const struct packet_chat_msg *packet, + bool early) { struct packet_chat_msg real_packet = *packet; int tile = packet->tile; @@ -224,7 +225,11 @@ real_packet.tile = -1; } - send_packet_chat_msg(pconn, &real_packet); + if (early) { + send_packet_early_chat_msg(pconn, (struct packet_early_chat_msg *)(&real_packet)); + } else { + send_packet_chat_msg(pconn, &real_packet); + } } conn_list_iterate_end; } @@ -244,7 +249,32 @@ vpackage_event(&genmsg, ptile, event, color, format, args); va_end(args); - notify_conn_packet(dest, &genmsg); + notify_conn_packet(dest, &genmsg, FALSE); + + if (!dest || dest == game.est_connections) { + /* Add to the cache */ + event_cache_add_for_all(&genmsg); + } +} + +/************************************************************************** + See notify_conn_packet - this is just the "non-v" version, with varargs. + Use for early connecting protocol messages. +**************************************************************************/ +void notify_conn_early(struct conn_list *dest, + const struct tile *ptile, + enum event_type event, + const struct ft_color color, + const char *format, ...) +{ + struct packet_chat_msg genmsg; + va_list args; + + va_start(args, format); + vpackage_event(&genmsg, ptile, event, color, format, args); + va_end(args); + + notify_conn_packet(dest, &genmsg, TRUE); if (!dest || dest == game.est_connections) { /* Add to the cache */ @@ -273,7 +303,7 @@ vpackage_event(&genmsg, ptile, event, color, format, args); va_end(args); - notify_conn_packet(dest, &genmsg); + notify_conn_packet(dest, &genmsg, FALSE); /* Add to the cache */ event_cache_add_for_player(&genmsg, pplayer); @@ -300,7 +330,7 @@ players_iterate(other_player) { if (player_has_embassy(other_player, pplayer) && pplayer != other_player) { - notify_conn_packet(other_player->connections, &genmsg); + notify_conn_packet(other_player->connections, &genmsg, FALSE); players = event_cache_player_add(players, other_player); } } players_iterate_end; @@ -348,7 +378,7 @@ event_cache_add_for_all(&genmsg); } - notify_conn_packet(dest, &genmsg); + notify_conn_packet(dest, &genmsg, FALSE); if (pplayer) { conn_list_destroy(dest); @@ -738,9 +768,9 @@ pcm = pdata->packet; fc_snprintf(pcm.message, sizeof(pcm.message), "(T%d - %s) %s", pdata->packet.turn, timestr, pdata->packet.message); - notify_conn_packet(pconn->self, &pcm); + notify_conn_packet(pconn->self, &pcm, FALSE); } else { - notify_conn_packet(pconn->self, &pdata->packet); + notify_conn_packet(pconn->self, &pdata->packet, FALSE); } } } event_cache_iterate_end; Modified: trunk/server/notify.h URL: http://svn.gna.org/viewcvs/freeciv/trunk/server/notify.h?rev=32423&r1=32422&r2=32423&view=diff ============================================================================== --- trunk/server/notify.h (original) +++ trunk/server/notify.h Sun Apr 17 05:56:10 2016 @@ -59,6 +59,12 @@ const struct ft_color color, const char *format, ...) fc__attribute((__format__ (__printf__, 5, 6))); +void notify_conn_early(struct conn_list *dest, + const struct tile *ptile, + enum event_type event, + const struct ft_color color, + const char *format, ...) + fc__attribute((__format__ (__printf__, 5, 6))); void notify_player(const struct player *pplayer, const struct tile *ptile, enum event_type event, _______________________________________________ Freeciv-commits mailing list Freeciv-commits@gna.org https://mail.gna.org/listinfo/freeciv-commits