wesnoth-cvs-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Wesnoth-cvs-commits] wesnoth/src server/game.cpp server/server.cpp M...


From: David White
Subject: [Wesnoth-cvs-commits] wesnoth/src server/game.cpp server/server.cpp M...
Date: Wed, 20 Jul 2005 18:33:40 -0400

CVSROOT:        /cvsroot/wesnoth
Module name:    wesnoth
Branch:         
Changes by:     David White <address@hidden>    05/07/20 22:33:39

Modified files:
        src/server     : game.cpp server.cpp 
        src            : Makefile.am 
Added files:
        src/server     : proxy.cpp proxy.hpp 

Log message:
        made server able to act as a proxy. Fixed bug where the game host would 
not be recognized as a side owner in some context and so wouldn't receive 
messages from team members

CVSWeb URLs:
http://savannah.gnu.org/cgi-bin/viewcvs/wesnoth/wesnoth/src/server/proxy.cpp?rev=1.1
http://savannah.gnu.org/cgi-bin/viewcvs/wesnoth/wesnoth/src/server/proxy.hpp?rev=1.1
http://savannah.gnu.org/cgi-bin/viewcvs/wesnoth/wesnoth/src/server/game.cpp.diff?tr1=1.39&tr2=1.40&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/wesnoth/wesnoth/src/server/server.cpp.diff?tr1=1.83&tr2=1.84&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/wesnoth/wesnoth/src/Makefile.am.diff?tr1=1.97&tr2=1.98&r1=text&r2=text

Patches:
Index: wesnoth/src/Makefile.am
diff -u wesnoth/src/Makefile.am:1.97 wesnoth/src/Makefile.am:1.98
--- wesnoth/src/Makefile.am:1.97        Wed Jul  6 00:54:26 2005
+++ wesnoth/src/Makefile.am     Wed Jul 20 22:33:39 2005
@@ -406,6 +406,7 @@
        server/input_stream.cpp \
        server/metrics.cpp \
        server/player.cpp \
+       server/proxy.cpp \
        server/server.cpp \
        config.cpp \
        filesystem.cpp \
@@ -425,6 +426,7 @@
        server/input_stream.hpp \
        server/metrics.hpp \
        server/player.hpp \
+       server/proxy.hpp \
        config.hpp \
        filesystem.hpp \
        game_config.hpp \
Index: wesnoth/src/server/game.cpp
diff -u wesnoth/src/server/game.cpp:1.39 wesnoth/src/server/game.cpp:1.40
--- wesnoth/src/server/game.cpp:1.39    Wed Jul 20 07:51:46 2005
+++ wesnoth/src/server/game.cpp Wed Jul 20 22:33:39 2005
@@ -1,4 +1,4 @@
-/* $Id: game.cpp,v 1.39 2005/07/20 07:51:46 ott Exp $ */
+/* $Id: game.cpp,v 1.40 2005/07/20 22:33:39 Sirp Exp $ */
 /*
    Copyright (C) 2003-5 by David White <address@hidden>
    Part of the Battle for Wesnoth Project http://www.wesnoth.org/
@@ -133,9 +133,9 @@
 
        // verify that side is a side id
        const std::string& side = cfg["side"];
-       ssize_t side_num;
+       size_t side_num;
        try {
-               side_num = lexical_cast<ssize_t, std::string>(side);
+               side_num = lexical_cast<size_t, std::string>(side);
                if(side_num < 1 || side_num > 9)
                        return false;
        }
@@ -153,7 +153,7 @@
                        if((**i)["controller"] == "network") {
                                // don't allow players to take sides in games 
with invalid side numbers
                                try {
-                                       side_num = lexical_cast<ssize_t, 
std::string>((**i)["side"]);
+                                       side_num = lexical_cast<size_t, 
std::string>((**i)["side"]);
                                        if(side_num < 1 || side_num > 9)
                                                return false;
                                }
@@ -204,12 +204,12 @@
                        continue;
                }
 
-               ssize_t side_num;
+               size_t side_num;
                size_t side_index;
                config::child_iterator sd;
                for(sd = level_sides.first; sd != level_sides.second; ++sd) {
                        try {
-                               side_num = lexical_cast<ssize_t, 
std::string>((**sd)["side"]);
+                               side_num = lexical_cast<size_t, 
std::string>((**sd)["side"]);
                                if(side_num < 1 || side_num > 9)
                                        continue;
                        }
@@ -232,7 +232,8 @@
                                side_controllers_[side_index] = "ai";
                                sides_taken_[side_index] = true;
                        }
-                       else if((**sd)["controller"] == "human") {
+                       else if((**sd)["controller"] == "human") {
+                               
sides_.insert(std::pair<network::connection,size_t>(players_.front(),side_index));
                                sides_taken_[side_index] = true;
                                side_controllers_[side_index] = "human";
                        }
@@ -258,9 +259,9 @@
        }
        const std::string& side = cfg["side"];
        static const std::string invalid = "Invalid side number";
-       ssize_t side_num;
+       size_t side_num;
        try {
-               side_num = lexical_cast<ssize_t, std::string>(side);
+               side_num = lexical_cast<size_t, std::string>(side);
                if(side_num < 1 || side_num > 9)
                        return invalid;
        }
Index: wesnoth/src/server/server.cpp
diff -u wesnoth/src/server/server.cpp:1.83 wesnoth/src/server/server.cpp:1.84
--- wesnoth/src/server/server.cpp:1.83  Wed Jul 20 07:51:47 2005
+++ wesnoth/src/server/server.cpp       Wed Jul 20 22:33:39 2005
@@ -1,4 +1,4 @@
-/* $Id: server.cpp,v 1.83 2005/07/20 07:51:47 ott Exp $ */
+/* $Id: server.cpp,v 1.84 2005/07/20 22:33:39 Sirp Exp $ */
 /*
    Copyright (C) 2003-5 by David White <address@hidden>
    Part of the Battle for Wesnoth Project http://www.wesnoth.org/
@@ -27,7 +27,8 @@
 #include "input_stream.hpp"
 #include "metrics.hpp"
 #include "serialization/parser.hpp"
-#include "player.hpp"
+#include "player.hpp"
+#include "proxy.hpp"
 
 #include <algorithm>
 #include <cstdlib>
@@ -122,12 +123,13 @@
 
        input_stream& input_;
 
-       metrics metrics_;
-
-       const config& cfg_;
-
-       std::set<std::string> accepted_versions_;
-       std::map<std::string,config> redirected_versions_;
+       metrics metrics_;
+
+       const config& cfg_;
+
+       std::set<std::string> accepted_versions_;
+       std::map<std::string,config> redirected_versions_; 
+       std::map<std::string,config> proxy_versions_;
 
        bool is_ip_banned(const std::string& ip);
        std::string ban_ip(const std::string& mask);
@@ -158,6 +160,14 @@
                        redirected_versions_[*j] = **i;
                }
        }
+
+       const config::child_list& proxies = cfg_.get_children("proxy");
+       for(config::child_list::const_iterator p = proxies.begin(); p != 
proxies.end(); ++p) {
+               const std::vector<std::string> 
versions(utils::split((**p)["version"]));
+               for(std::vector<std::string>::const_iterator j = 
versions.begin(); j != versions.end(); ++j) {
+                       proxy_versions_[*j] = **p;
+               }
+       }
 
        join_lobby_response_.add_child("join_lobby");
 }
@@ -369,7 +379,10 @@
                                        }
                                }
 
-                               if(e.socket) {
+                               if(e.socket) {
+                                       if(proxy::is_proxy(e.socket)) {
+                                               proxy::disconnect(e.socket);
+                                       }
                                        e.disconnect();
                                }
 
@@ -389,10 +402,13 @@
 }
 
 void server::process_data(const network::connection sock, config& data, 
config& gamelist)
-{
+{
+       if(proxy::is_proxy(sock)) {
+               proxy::received_data(sock,data);
+       }
        //if someone who is not yet logged in is sending
        //login details
-       if(not_logged_in_.is_member(sock)) {
+       else if(not_logged_in_.is_member(sock)) {
                process_login(sock,data,gamelist);
        } else if(const config* query = data.child("query")) {
                process_query(sock,*query,gamelist);
@@ -404,42 +420,51 @@
 }
 
 void server::process_login(const network::connection sock, const config& data, 
config& gamelist)
-{
-       //see if client is sending their version number
-       const config* const version = data.child("version");
-       if(version != NULL) {
-               const std::string& version_str = (*version)["version"];
-
-               if(accepted_versions_.count(version_str)) {
-                       std::cerr << "player joined using accepted version " << 
version_str << ": telling them to log in\n";
-                       network::send_data(login_response_,sock);
-               } else {
-                       const std::map<std::string,config>::const_iterator i = 
redirected_versions_.find(version_str);
-                       if(i != redirected_versions_.end()) {
-                               std::cerr << "player joined using version " << 
version_str << ": redirecting them to "
-                                         << i->second["host"] << ":" << 
i->second["port"] << "\n";
-                               config response;
-                               response.add_child("redirect",i->second);
-                               network::send_data(response,sock);
-                       } else {
-                               std::cerr << "player joined using unknown 
version " << version_str << ": rejecting them\n";
-                               config response;
-                               if(accepted_versions_.empty() == false) {
-                                       response["version"] = 
*accepted_versions_.begin();
-                               } else if(redirected_versions_.empty() == 
false) {
-                                       response["version"] = 
redirected_versions_.begin()->first;
-                               } else {
-                                       std::cerr << "this server doesn't 
accept any versions at all\n";
-                                       response["version"] = "null";
-                               }
-
-                               network::send_data(response,sock);
-                       }
-               }
-
-               return;
-       }
-
+{
+       //see if client is sending their version number
+       const config* const version = data.child("version");
+       if(version != NULL) {
+               const std::string& version_str = (*version)["version"];
+
+               if(accepted_versions_.count(version_str)) {
+                       std::cerr << "player joined using accepted version " << 
version_str << ": telling them to log in\n";
+                       network::send_data(login_response_,sock);
+               } else {
+                       const std::map<std::string,config>::const_iterator i = 
redirected_versions_.find(version_str);
+                       if(i != redirected_versions_.end()) {
+                               std::cerr << "player joined using version " << 
version_str << ": redirecting them to "
+                                         << i->second["host"] << ":" << 
i->second["port"] << "\n";
+                               config response;
+                               response.add_child("redirect",i->second);
+                               network::send_data(response,sock);
+                       } else {
+                               const 
std::map<std::string,config>::const_iterator i = 
proxy_versions_.find(version_str);
+
+                               if(i != proxy_versions_.end()) {
+                                       std::cerr << "player joined using 
version " << version_str << ": connecting them by proxy to "
+                                                 << i->second["host"] << ":" 
<< i->second["port"] << "\n";
+
+                                       
proxy::create_proxy(sock,i->second["host"],lexical_cast_default<int>(i->second["port"],15000));
+                               } else {
+
+                                       std::cerr << "player joined using 
unknown version " << version_str << ": rejecting them\n";
+                                       config response;
+                                       if(accepted_versions_.empty() == false) 
{
+                                               response["version"] = 
*accepted_versions_.begin();
+                                       } else if(redirected_versions_.empty() 
== false) {
+                                               response["version"] = 
redirected_versions_.begin()->first;
+                                       } else {
+                                               std::cerr << "this server 
doesn't accept any versions at all\n";
+                                               response["version"] = "null";
+                                       }
+
+                                       network::send_data(response,sock);
+                               }
+                       }
+               }
+               
+               return;
+       }
 
        const config* const login = data.child("login");
 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]