From: <geo...@us...> - 2013-06-20 18:32:18
|
Revision: 6175 http://sourceforge.net/p/freeorion/code/6175 Author: geoffthemedio Date: 2013-06-20 18:32:15 +0000 (Thu, 20 Jun 2013) Log Message: ----------- Slighted edited patch by adrian_broher reorganizing app interface into an abstract base class which is implemented by ServerApp and ClientApp. Modified Paths: -------------- trunk/FreeOrion/CMakeLists.txt trunk/FreeOrion/Xcode/FreeOrion.xcodeproj/project.pbxproj trunk/FreeOrion/client/AI/AIClientApp.cpp trunk/FreeOrion/client/AI/AIClientApp.h trunk/FreeOrion/client/AI/CMakeLists.txt trunk/FreeOrion/client/ClientApp.cpp trunk/FreeOrion/client/ClientApp.h trunk/FreeOrion/client/human/CMakeLists.txt trunk/FreeOrion/msvc2010/Common/Common.vcxproj trunk/FreeOrion/msvc2010/Common/Common.vcxproj.filters trunk/FreeOrion/msvc2010/FreeOrion/FreeOrion.vcxproj trunk/FreeOrion/msvc2010/FreeOrion/FreeOrion.vcxproj.filters trunk/FreeOrion/msvc2010/FreeOrionCA/FreeOrionCA.vcxproj trunk/FreeOrion/msvc2010/FreeOrionCA/FreeOrionCA.vcxproj.filters trunk/FreeOrion/msvc2010/FreeOrionD/FreeOrionD.vcxproj trunk/FreeOrion/msvc2010/FreeOrionD/FreeOrionD.vcxproj.filters trunk/FreeOrion/parse/test/CMakeLists.txt trunk/FreeOrion/server/CMakeLists.txt trunk/FreeOrion/server/ServerApp.cpp trunk/FreeOrion/server/ServerApp.h trunk/FreeOrion/util/AppInterface.cpp trunk/FreeOrion/util/AppInterface.h Modified: trunk/FreeOrion/CMakeLists.txt =================================================================== --- trunk/FreeOrion/CMakeLists.txt 2013-06-20 17:05:19 UTC (rev 6174) +++ trunk/FreeOrion/CMakeLists.txt 2013-06-20 18:32:15 UTC (rev 6175) @@ -161,6 +161,7 @@ universe/Universe.cpp universe/UniverseObject.cpp universe/ValueRef.cpp + util/AppInterface.cpp util/DataTable.cpp util/GZStream.cpp util/Logger.cpp Modified: trunk/FreeOrion/Xcode/FreeOrion.xcodeproj/project.pbxproj =================================================================== --- trunk/FreeOrion/Xcode/FreeOrion.xcodeproj/project.pbxproj 2013-06-20 17:05:19 UTC (rev 6174) +++ trunk/FreeOrion/Xcode/FreeOrion.xcodeproj/project.pbxproj 2013-06-20 18:32:15 UTC (rev 6175) @@ -106,6 +106,7 @@ 34F0E429113F497500A10EED /* Python.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 34F0E427113F491C00A10EED /* Python.framework */; }; 34F0E455113F49E900A10EED /* Python.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = 34F0E427113F491C00A10EED /* Python.framework */; }; 34F909BF118B1BA0003A9EF1 /* Vec3Utilities.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 34B9EBEC0F5E1EEB005BF6A4 /* Vec3Utilities.cpp */; }; + 3A01E1E31749F93500EC9110 /* AppInterface.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 471D5D180A98A3F900DA9C21 /* AppInterface.cpp */; }; 3A1BF3EB1748875300812237 /* Version.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3A1BF3EA1748875200812237 /* Version.cpp */; }; 3A5105541748D68B00DC258B /* i18n.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3A5105521748D68B00DC258B /* i18n.cpp */; }; 3A5105571748D6A700DC258B /* Logger.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3A5105551748D6A600DC258B /* Logger.cpp */; }; @@ -245,7 +246,6 @@ 47103C1E0CF04E5900A7DF2B /* SaveLoad.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 471030490CEF569900A7DF2B /* SaveLoad.cpp */; }; 47103C3B0CF051B000A7DF2B /* Directories.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 471D5D1E0A98A3F900DA9C21 /* Directories.cpp */; }; 471D5D3F0A98A40900DA9C21 /* libGG.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 471D5A300A988D5700DA9C21 /* libGG.a */; }; - 471D5D400A98A42B00DA9C21 /* AppInterface.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 471D5D180A98A3F900DA9C21 /* AppInterface.cpp */; }; 471D5E0E0A98A96700DA9C21 /* About.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 471D5CA50A98A3F900DA9C21 /* About.cpp */; }; 471D5E0F0A98A96D00DA9C21 /* BuildDesignatorWnd.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 471D5CA70A98A3F900DA9C21 /* BuildDesignatorWnd.cpp */; }; 471D5E100A98A97300DA9C21 /* ClientUI.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 471D5CA90A98A3F900DA9C21 /* ClientUI.cpp */; }; @@ -274,7 +274,6 @@ 471D5E2F0A98AA1D00DA9C21 /* TurnProgressWnd.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 471D5CE20A98A3F900DA9C21 /* TurnProgressWnd.cpp */; }; 471D650E0A98B4C100DA9C21 /* OpenAL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 471D650C0A98B4C100DA9C21 /* OpenAL.framework */; }; 471D650F0A98B4C100DA9C21 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 471D650D0A98B4C100DA9C21 /* OpenGL.framework */; }; - 471FEF8D0A9A629800C36AA3 /* AppInterface.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 471D5D180A98A3F900DA9C21 /* AppInterface.cpp */; }; 471FEFDE0A9A631C00C36AA3 /* AIClientApp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 471D5C5A0A98A3F900DA9C21 /* AIClientApp.cpp */; }; 471FEFDF0A9A632000C36AA3 /* camain.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 471D5C5C0A98A3F900DA9C21 /* camain.cpp */; }; 478417700CF0581A00BE4710 /* freeorioncommon.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 47103BE20CF04D8800A7DF2B /* freeorioncommon.dylib */; }; @@ -297,7 +296,6 @@ 47B616150CF09ADC00318761 /* alutVersion.c in Sources */ = {isa = PBXBuildFile; fileRef = 47B616090CF09ADC00318761 /* alutVersion.c */; }; 47B616160CF09ADC00318761 /* alutWaveform.c in Sources */ = {isa = PBXBuildFile; fileRef = 47B6160A0CF09ADC00318761 /* alutWaveform.c */; }; 47B6163E0CF09C1000318761 /* libFREEALUT.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 47B615BF0CF099BD00318761 /* libFREEALUT.a */; }; - 47FAB64D0A98D83B00F0AF3F /* AppInterface.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 471D5D180A98A3F900DA9C21 /* AppInterface.cpp */; }; 47FAB6770A98D89F00F0AF3F /* dmain.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 471D5C9F0A98A3F900DA9C21 /* dmain.cpp */; }; 47FAB6780A98D8A600F0AF3F /* ServerApp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 471D5CA20A98A3F900DA9C21 /* ServerApp.cpp */; }; 82132C2F15DA2BBC00F5B537 /* ObjectListWnd.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 82132C2D15DA2BBC00F5B537 /* ObjectListWnd.cpp */; }; @@ -4046,6 +4044,7 @@ 3A7604BE1749B2FF00363653 /* name.cpp in Sources */, 3A7604C41749B39300363653 /* memory.cpp in Sources */, 3A7604CB1749B48200363653 /* string_pool.cpp in Sources */, + 3A01E1E31749F93500EC9110 /* AppInterface.cpp in Sources */, 34D3CE8C11D7DA11007C1E78 /* Species.cpp in Sources */, 34F909BF118B1BA0003A9EF1 /* Vec3Utilities.cpp in Sources */, 34C4495E1182716E0071E09A /* Math.cpp in Sources */, @@ -4168,7 +4167,6 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 47FAB64D0A98D83B00F0AF3F /* AppInterface.cpp in Sources */, 47FAB6770A98D89F00F0AF3F /* dmain.cpp in Sources */, 47FAB6780A98D8A600F0AF3F /* ServerApp.cpp in Sources */, 471032540CEF6C9700A7DF2B /* ServerNetworking.cpp in Sources */, @@ -4185,7 +4183,6 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 471FEF8D0A9A629800C36AA3 /* AppInterface.cpp in Sources */, 471FEFDE0A9A631C00C36AA3 /* AIClientApp.cpp in Sources */, 471FEFDF0A9A632000C36AA3 /* camain.cpp in Sources */, 471033860CEF721B00A7DF2B /* PythonAI.cpp in Sources */, @@ -4350,7 +4347,6 @@ 34A70291118360910013F8C6 /* CombatCamera.cpp in Sources */, 34ACA4C70FFFDBC000500F40 /* chmain.cpp in Sources */, 343EC66F0F3F60F000782AD3 /* DesignWnd.cpp in Sources */, - 471D5D400A98A42B00DA9C21 /* AppInterface.cpp in Sources */, 471D5E0E0A98A96700DA9C21 /* About.cpp in Sources */, 471D5E0F0A98A96D00DA9C21 /* BuildDesignatorWnd.cpp in Sources */, 471D5E100A98A97300DA9C21 /* ClientUI.cpp in Sources */, Modified: trunk/FreeOrion/client/AI/AIClientApp.cpp =================================================================== --- trunk/FreeOrion/client/AI/AIClientApp.cpp 2013-06-20 17:05:19 UTC (rev 6174) +++ trunk/FreeOrion/client/AI/AIClientApp.cpp 2013-06-20 18:32:15 UTC (rev 6175) @@ -24,18 +24,11 @@ CombatLogManager& GetCombatLogManager(); // static member(s) -AIClientApp* AIClientApp::s_app = 0; - AIClientApp::AIClientApp(const std::vector<std::string>& args) : m_AI(0), m_player_name(""), m_max_aggression(0) { - if (s_app) - throw std::runtime_error("Attempted to construct a second instance of singleton class AIClientApp"); - - s_app = this; - if (args.size() < 2) { std::cerr << "The AI client should not be executed directly! Run freeorion to start the game."; Exit(1); @@ -68,7 +61,7 @@ } AIClientApp* AIClientApp::GetApp() -{ return s_app; } +{ return static_cast<AIClientApp*>(s_app); } const AIBase* AIClientApp::GetAI() { return m_AI; } Modified: trunk/FreeOrion/client/AI/AIClientApp.h =================================================================== --- trunk/FreeOrion/client/AI/AIClientApp.h 2013-06-20 17:05:19 UTC (rev 6174) +++ trunk/FreeOrion/client/AI/AIClientApp.h 2013-06-20 18:32:15 UTC (rev 6175) @@ -35,7 +35,6 @@ AIBase* m_AI; ///< implementation of AI logic std::string m_player_name; - static AIClientApp* s_app; int m_max_aggression; }; Modified: trunk/FreeOrion/client/AI/CMakeLists.txt =================================================================== --- trunk/FreeOrion/client/AI/CMakeLists.txt 2013-06-20 17:05:19 UTC (rev 6174) +++ trunk/FreeOrion/client/AI/CMakeLists.txt 2013-06-20 18:32:15 UTC (rev 6175) @@ -47,7 +47,6 @@ ../../python/PythonUniverseWrapper.cpp ../../python/PythonEmpireWrapper.cpp ../../python/PythonLoggingWrapper.cpp - ../../util/AppInterface.cpp ) target_link_libraries(freeorionca Modified: trunk/FreeOrion/client/ClientApp.cpp =================================================================== --- trunk/FreeOrion/client/ClientApp.cpp 2013-06-20 17:05:19 UTC (rev 6174) +++ trunk/FreeOrion/client/ClientApp.cpp 2013-06-20 18:32:15 UTC (rev 6175) @@ -1,20 +1,19 @@ #include "ClientApp.h" #include "../combat/CombatOrder.h" +#include "../util/Logger.h" #include "../util/MultiplayerCommon.h" #include "../util/Serialize.h" #include "../universe/UniverseObject.h" +#include "../universe/System.h" #include "../Empire/Empire.h" #include "../Empire/EmpireManager.h" #include "../network/Networking.h" #include <stdexcept> - -// static member(s) -ClientApp* ClientApp::s_app = 0; - ClientApp::ClientApp() : + IApp(), m_universe(), m_empire_id(ALL_EMPIRES), m_current_turn(INVALID_GAME_TURN) @@ -22,10 +21,6 @@ #ifdef FREEORION_BUILD_HUMAN EmpireEliminatedSignal.connect(boost::bind(&Universe::HandleEmpireElimination, &m_universe, _1)); #endif - - if (s_app) - throw std::runtime_error("Attempted to construct a second instance of ClientApp"); - s_app = this; } ClientApp::~ClientApp() @@ -40,12 +35,30 @@ int ClientApp::CurrentTurn() const { return m_current_turn; } -const Universe& ClientApp::GetUniverse() const +Universe& ClientApp::GetUniverse() { return m_universe; } -const EmpireManager& ClientApp::Empires() const +EmpireManager& ClientApp::Empires() { return m_empires; } +UniverseObject* ClientApp::GetUniverseObject(int object_id) { + // attempt to get live / up to date / mutable object + UniverseObject* obj = GetUniverse().Objects().Object(object_id); + // if not up to date info, use latest known out of date info about object + if (!obj) + obj = EmpireKnownObjects(m_empire_id).Object(object_id); + return obj; +} + +ObjectMap& ClientApp::EmpireKnownObjects(int empire_id) { + if (empire_id == ALL_EMPIRES || empire_id == m_empire_id) + return m_universe.Objects(); + return m_universe.EmpireKnownObjects(empire_id); // should be empty as of this writing, as other empires' known objects aren't sent to clients +} + +UniverseObject* ClientApp::EmpireKnownObject(int object_id, int empire_id) +{ return GetUniverseObject(object_id); } + const OrderSet& ClientApp::Orders() const { return m_orders; } @@ -98,12 +111,6 @@ m_combat_orders.clear(); } -Universe& ClientApp::GetUniverse() -{ return m_universe; } - -EmpireManager& ClientApp::Empires() -{ return m_empires; } - OrderSet& ClientApp::Orders() { return m_orders; } @@ -113,13 +120,25 @@ ClientNetworking& ClientApp::Networking() { return m_networking; } +std::string ClientApp::GetVisibleObjectName(const UniverseObject* object) { + if (!object) { + Logger().errorStream() << "ServerApp::GetVisibleObjectName(): expected non null object pointer."; + return std::string(); + } + + std::string name_text = object->PublicName(m_empire_id); + if (const System* system = universe_object_cast<const System*>(object)) + name_text = system->ApparentName(m_empire_id); + + return name_text; +} + int ClientApp::GetNewObjectID() { Message msg; m_networking.SendSynchronousMessage(RequestNewObjectIDMessage(m_networking.PlayerID()), msg); std::string text = msg.Text(); - if (text.empty()) { + if (text.empty()) throw std::runtime_error("ClientApp::GetNewObjectID() didn't get a new object ID"); - } return boost::lexical_cast<int>(text); } @@ -127,14 +146,13 @@ Message msg; m_networking.SendSynchronousMessage(RequestNewDesignIDMessage(m_networking.PlayerID()), msg); std::string text = msg.Text(); - if (text.empty()) { + if (text.empty()) throw std::runtime_error("ClientApp::GetNewDesignID() didn't get a new design ID"); - } return boost::lexical_cast<int>(text); } ClientApp* ClientApp::GetApp() -{ return s_app; } +{ return static_cast<ClientApp*>(s_app); } void ClientApp::SetEmpireID(int id) { m_empire_id = id; } Modified: trunk/FreeOrion/client/ClientApp.h =================================================================== --- trunk/FreeOrion/client/ClientApp.h 2013-06-20 17:05:19 UTC (rev 6174) +++ trunk/FreeOrion/client/ClientApp.h 2013-06-20 18:32:15 UTC (rev 6175) @@ -6,6 +6,7 @@ #include "../network/ClientNetworking.h" #include "../universe/Universe.h" #include "../util/OrderSet.h" +#include "../util/AppInterface.h" /** The abstract base class for the application framework classes AIClientApp * and HumanClientApp. The static functions are designed to give both types @@ -13,7 +14,7 @@ * in either type of client app to handle Messages and gain access to the data * structures common to both apps, without worrying about which type of app the * code is being run in.*/ -class ClientApp { +class ClientApp : public IApp { public: /** \name Structors */ //@{ ClientApp(); @@ -30,8 +31,7 @@ const std::map<int, PlayerInfo>& Players() const; ///< returns the map, indexed by player ID, of PlayerInfo structs containing info about players in the game //@} - const Universe& GetUniverse() const; ///< returns client's local copy of Universe - const EmpireManager& Empires() const; ///< returns the set of known Empires + Universe& GetUniverse(); ///< returns client's local copy of Universe const OrderSet& Orders() const; ///< returns Order set for this client's player const CombatOrderSet& CombatOrders() const;///< returns CombatOrder set for this client's player const ClientNetworking& Networking() const; ///< returns the networking object for this client's player @@ -45,8 +45,10 @@ virtual void SendCombatSetup(); ///< encodes and sends combat setup orders message virtual void StartCombatTurn(); ///< encodes combat order sets and sends combat turn orders message - Universe& GetUniverse(); ///< returns client's local copy of Universe EmpireManager& Empires(); ///< returns the set of known Empires + UniverseObject* GetUniverseObject(int object_id); + ObjectMap& EmpireKnownObjects(int empire_id); ///< returns the server's map for known objects of specified empire. */ + UniverseObject* EmpireKnownObject(int object_id, int empire_id); OrderSet& Orders(); ///< returns Order set for this client's player CombatOrderSet& CombatOrders(); ///< returns CombatOrder set for this client's player ClientNetworking& Networking(); ///< returns the networking object for this client's player @@ -56,6 +58,8 @@ void SetCurrentTurn(int turn); ///< sets the current game turn void SetSinglePlayerGame(bool sp = true); ///< sets whether the current game is single player (sp = true) or multiplayer (sp = false) + std::string GetVisibleObjectName(const UniverseObject* object); + /** returns a universe object ID which can be used for new objects created by the client. Can return INVALID_OBJECT_ID if an ID cannot be created. */ int GetNewObjectID(); @@ -84,8 +88,6 @@ private: const ClientApp& operator=(const ClientApp&); // disabled ClientApp(const ClientApp&); // disabled - - static ClientApp* s_app; ///< a ClientApp pointer to the singleton instance of the app }; #endif // _ClientApp_h_ Modified: trunk/FreeOrion/client/human/CMakeLists.txt =================================================================== --- trunk/FreeOrion/client/human/CMakeLists.txt 2013-06-20 17:05:19 UTC (rev 6174) +++ trunk/FreeOrion/client/human/CMakeLists.txt 2013-06-20 18:32:15 UTC (rev 6175) @@ -115,7 +115,6 @@ ../../UI/TechTreeLayout.cpp ../../UI/TurnProgressWnd.cpp ../../UI/ShaderProgram.cpp - ../../util/AppInterface.cpp ) set(freeorion_LINK_LIBS Modified: trunk/FreeOrion/msvc2010/Common/Common.vcxproj =================================================================== --- trunk/FreeOrion/msvc2010/Common/Common.vcxproj 2013-06-20 17:05:19 UTC (rev 6174) +++ trunk/FreeOrion/msvc2010/Common/Common.vcxproj 2013-06-20 18:32:15 UTC (rev 6175) @@ -231,6 +231,7 @@ <ClCompile Include="..\..\universe\Universe.cpp" /> <ClCompile Include="..\..\universe\UniverseObject.cpp" /> <ClCompile Include="..\..\universe\ValueRef.cpp" /> + <ClCompile Include="..\..\util\AppInterface.cpp" /> <ClCompile Include="..\..\util\DataTable.cpp" /> <ClCompile Include="..\..\util\Directories.cpp" /> <ClCompile Include="..\..\util\GZStream.cpp" /> Modified: trunk/FreeOrion/msvc2010/Common/Common.vcxproj.filters =================================================================== --- trunk/FreeOrion/msvc2010/Common/Common.vcxproj.filters 2013-06-20 17:05:19 UTC (rev 6174) +++ trunk/FreeOrion/msvc2010/Common/Common.vcxproj.filters 2013-06-20 18:32:15 UTC (rev 6175) @@ -291,6 +291,9 @@ <ClCompile Include="..\..\util\SerializeUniverse.cpp"> <Filter>Source Files\util</Filter> </ClCompile> + <ClCompile Include="..\..\util\AppInterface.cpp"> + <Filter>Source Files\util</Filter> + </ClCompile> <ClCompile Include="..\..\util\SitRepEntry.cpp"> <Filter>Source Files\util</Filter> </ClCompile> Modified: trunk/FreeOrion/msvc2010/FreeOrion/FreeOrion.vcxproj =================================================================== --- trunk/FreeOrion/msvc2010/FreeOrion/FreeOrion.vcxproj 2013-06-20 17:05:19 UTC (rev 6174) +++ trunk/FreeOrion/msvc2010/FreeOrion/FreeOrion.vcxproj 2013-06-20 18:32:15 UTC (rev 6175) @@ -265,7 +265,6 @@ <ClCompile Include="..\..\UI\TechTreeLayout.cpp" /> <ClCompile Include="..\..\UI\TechTreeWnd.cpp" /> <ClCompile Include="..\..\UI\TurnProgressWnd.cpp" /> - <ClCompile Include="..\..\util\AppInterface.cpp" /> <ClCompile Include="..\..\util\Process.cpp" /> </ItemGroup> <ItemGroup> Modified: trunk/FreeOrion/msvc2010/FreeOrion/FreeOrion.vcxproj.filters =================================================================== --- trunk/FreeOrion/msvc2010/FreeOrion/FreeOrion.vcxproj.filters 2013-06-20 17:05:19 UTC (rev 6174) +++ trunk/FreeOrion/msvc2010/FreeOrion/FreeOrion.vcxproj.filters 2013-06-20 18:32:15 UTC (rev 6175) @@ -520,9 +520,6 @@ <ClCompile Include="..\..\UI\ServerConnectWnd.cpp"> <Filter>Source Files\UI</Filter> </ClCompile> - <ClCompile Include="..\..\util\AppInterface.cpp"> - <Filter>Source Files\util</Filter> - </ClCompile> <ClCompile Include="..\..\UI\PlayerListWnd.cpp"> <Filter>Source Files\UI</Filter> </ClCompile> Modified: trunk/FreeOrion/msvc2010/FreeOrionCA/FreeOrionCA.vcxproj =================================================================== --- trunk/FreeOrion/msvc2010/FreeOrionCA/FreeOrionCA.vcxproj 2013-06-20 17:05:19 UTC (rev 6174) +++ trunk/FreeOrion/msvc2010/FreeOrionCA/FreeOrionCA.vcxproj 2013-06-20 18:32:15 UTC (rev 6175) @@ -168,7 +168,6 @@ <ClCompile Include="..\..\python\PythonEnumWrapper.cpp" /> <ClCompile Include="..\..\python\PythonLoggingWrapper.cpp" /> <ClCompile Include="..\..\python\PythonUniverseWrapper.cpp" /> - <ClCompile Include="..\..\util\AppInterface.cpp" /> </ItemGroup> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> <ImportGroup Label="ExtensionTargets"> Modified: trunk/FreeOrion/msvc2010/FreeOrionCA/FreeOrionCA.vcxproj.filters =================================================================== --- trunk/FreeOrion/msvc2010/FreeOrionCA/FreeOrionCA.vcxproj.filters 2013-06-20 17:05:19 UTC (rev 6174) +++ trunk/FreeOrion/msvc2010/FreeOrionCA/FreeOrionCA.vcxproj.filters 2013-06-20 18:32:15 UTC (rev 6175) @@ -262,9 +262,6 @@ <ClCompile Include="..\..\network\Message.cpp"> <Filter>Source Files\network</Filter> </ClCompile> - <ClCompile Include="..\..\util\AppInterface.cpp"> - <Filter>Source Files\util</Filter> - </ClCompile> <ClCompile Include="..\..\python\PythonEnumWrapper.cpp"> <Filter>Source Files\python</Filter> </ClCompile> Modified: trunk/FreeOrion/msvc2010/FreeOrionD/FreeOrionD.vcxproj =================================================================== --- trunk/FreeOrion/msvc2010/FreeOrionD/FreeOrionD.vcxproj 2013-06-20 17:05:19 UTC (rev 6174) +++ trunk/FreeOrion/msvc2010/FreeOrionD/FreeOrionD.vcxproj 2013-06-20 18:32:15 UTC (rev 6175) @@ -159,7 +159,6 @@ <ClCompile Include="..\..\server\ServerApp.cpp" /> <ClCompile Include="..\..\server\ServerFSM.cpp" /> <ClCompile Include="..\..\universe\UniverseServer.cpp" /> - <ClCompile Include="..\..\util\AppInterface.cpp" /> <ClCompile Include="..\..\util\Process.cpp" /> </ItemGroup> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> Modified: trunk/FreeOrion/msvc2010/FreeOrionD/FreeOrionD.vcxproj.filters =================================================================== --- trunk/FreeOrion/msvc2010/FreeOrionD/FreeOrionD.vcxproj.filters 2013-06-20 17:05:19 UTC (rev 6174) +++ trunk/FreeOrion/msvc2010/FreeOrionD/FreeOrionD.vcxproj.filters 2013-06-20 18:32:15 UTC (rev 6175) @@ -143,9 +143,6 @@ <ClInclude Include="..\..\server\SaveLoad.h"> <Filter>Header Files\server</Filter> </ClInclude> - <ClInclude Include="..\..\util\AppInterface.h"> - <Filter>Header Files\util</Filter> - </ClInclude> <ClInclude Include="..\..\util\binreloc.h"> <Filter>Header Files\util</Filter> </ClInclude> Modified: trunk/FreeOrion/parse/test/CMakeLists.txt =================================================================== --- trunk/FreeOrion/parse/test/CMakeLists.txt 2013-06-20 17:05:19 UTC (rev 6174) +++ trunk/FreeOrion/parse/test/CMakeLists.txt 2013-06-20 18:32:15 UTC (rev 6175) @@ -15,7 +15,6 @@ ../../server/ServerFSM.cpp ../../universe/UniverseServer.cpp ../../universe/Universe.cpp - ../../util/AppInterface.cpp test.cpp lexer_test_rules.cpp ) Modified: trunk/FreeOrion/server/CMakeLists.txt =================================================================== --- trunk/FreeOrion/server/CMakeLists.txt 2013-06-20 17:05:19 UTC (rev 6174) +++ trunk/FreeOrion/server/CMakeLists.txt 2013-06-20 18:32:15 UTC (rev 6175) @@ -18,7 +18,6 @@ ../server/ServerFSM.cpp ../server/dmain.cpp ../universe/UniverseServer.cpp - ../util/AppInterface.cpp ../combat/CombatSystem.cpp ) Modified: trunk/FreeOrion/server/ServerApp.cpp =================================================================== --- trunk/FreeOrion/server/ServerApp.cpp 2013-06-20 17:05:19 UTC (rev 6174) +++ trunk/FreeOrion/server/ServerApp.cpp 2013-06-20 18:32:15 UTC (rev 6175) @@ -78,10 +78,8 @@ //////////////////////////////////////////////// // ServerApp //////////////////////////////////////////////// -// static member(s) -ServerApp* ServerApp::s_app = 0; - ServerApp::ServerApp() : + IApp(), m_current_combat(0), m_networking(m_io_service, boost::bind(&ServerApp::HandleNonPlayerMessage, this, _1, _2), @@ -91,11 +89,6 @@ m_current_turn(INVALID_GAME_TURN), m_single_player_game(false) { - if (s_app) - throw std::runtime_error("Attempted to construct a second instance of singleton class ServerApp"); - - s_app = this; - const std::string SERVER_LOG_FILENAME((GetUserDir() / "freeoriond.log").string()); InitLogger(SERVER_LOG_FILENAME, "%d %p Server : %m%n"); @@ -207,20 +200,44 @@ } ServerApp* ServerApp::GetApp() -{ return s_app; } +{ return static_cast<ServerApp*>(s_app); } Universe& ServerApp::GetUniverse() -{ return s_app->m_universe; } +{ return m_universe; } EmpireManager& ServerApp::Empires() -{ return s_app->m_empires; } +{ return m_empires; } CombatData* ServerApp::CurrentCombat() -{ return s_app->m_current_combat; } +{ return m_current_combat; } +UniverseObject* ServerApp::GetUniverseObject(int object_id) +{ return m_universe.Objects().Object(object_id); } + +ObjectMap& ServerApp::EmpireKnownObjects(int empire_id) +{ return m_universe.EmpireKnownObjects(empire_id); } + +UniverseObject* ServerApp::EmpireKnownObject(int object_id, int empire_id) +{ return m_universe.EmpireKnownObjects(empire_id).Object(object_id); } + ServerNetworking& ServerApp::Networking() -{ return s_app->m_networking; } +{ return m_networking; } +std::string ServerApp::GetVisibleObjectName(const UniverseObject* object) { + if(!object) { + Logger().errorStream() << "ServerApp::GetVisibleObjectName(): expected non null object pointer."; + return std::string(); + } + + return object->Name(); +} + +int ServerApp::GetNewObjectID() +{ return m_universe.GenerateObjectID(); } + +int ServerApp::GetNewDesignID() +{ return m_universe.GenerateDesignID(); } + void ServerApp::Run() { Logger().debugStream() << "FreeOrion server waiting for network events"; std::cout << "FreeOrion server waiting for network events" << std::endl; Modified: trunk/FreeOrion/server/ServerApp.h =================================================================== --- trunk/FreeOrion/server/ServerApp.h 2013-06-20 17:05:19 UTC (rev 6174) +++ trunk/FreeOrion/server/ServerApp.h 2013-06-20 18:32:15 UTC (rev 6175) @@ -6,6 +6,7 @@ #include "../Empire/EmpireManager.h" #include "../network/ServerNetworking.h" #include "../universe/Universe.h" +#include "../util/AppInterface.h" #include <set> #include <vector> @@ -52,7 +53,7 @@ }; /** the application framework class for the FreeOrion server. */ -class ServerApp { +class ServerApp : public IApp { public: /** \name Structors */ //@{ ServerApp(); @@ -154,11 +155,25 @@ //@} static ServerApp* GetApp(); ///< returns a ClientApp pointer to the singleton instance of the app - static Universe& GetUniverse(); ///< returns server's copy of Universe - static EmpireManager& Empires(); ///< returns the server's copy of the Empires - static CombatData* CurrentCombat(); ///< returns the server's currently executing Combat; may be 0 - static ServerNetworking& Networking(); ///< returns the networking object for the server + Universe& GetUniverse(); ///< returns server's copy of Universe + EmpireManager& Empires(); ///< returns the server's copy of the Empires + UniverseObject* GetUniverseObject(int object_id); + ObjectMap& EmpireKnownObjects(int empire_id); ///< returns the server's map for known objects of specified empire. */ + UniverseObject* EmpireKnownObject(int object_id, int empire_id); + CombatData* CurrentCombat(); ///< returns the server's currently executing Combat; may be 0 + ServerNetworking& Networking(); ///< returns the networking object for the server + + std::string GetVisibleObjectName(const UniverseObject* object); + + /** returns a universe object ID which can be used for new objects. + Can return INVALID_OBJECT_ID if an ID cannot be created. */ + int GetNewObjectID(); + + /** returns a design ID which can be used for a new design to uniquely identify it. + Can return INVALID_OBJECT_ID if an ID cannot be created. */ + int GetNewDesignID(); + private: const ServerApp& operator=(const ServerApp&); // disabled ServerApp(const ServerApp&); // disabled @@ -231,7 +246,6 @@ std::map<int, CombatOrderSet*> m_combat_turn_sequence; std::map<int, std::set<std::string> > m_victors; ///< for each player id, the victory types that player has achived std::set<int> m_eliminated_players; ///< ids of players whose connections have been severed by the server after they were eliminated - static ServerApp* s_app; // Give FSM and its states direct access. We are using the FSM code as a // control-flow mechanism; it is all notionally part of this class. Modified: trunk/FreeOrion/util/AppInterface.cpp =================================================================== --- trunk/FreeOrion/util/AppInterface.cpp 2013-06-20 17:05:19 UTC (rev 6174) +++ trunk/FreeOrion/util/AppInterface.cpp 2013-06-20 18:32:15 UTC (rev 6175) @@ -1,21 +1,12 @@ +#include "AppInterface.h" -#ifdef FREEORION_BUILD_SERVER -# include "../server/ServerApp.h" -#else // a client build -# ifdef FREEORION_BUILD_HUMAN -# include "../client/human/HumanClientApp.h" -# else -# undef int64_t -# include "../client/AI/AIClientApp.h" -# endif -#endif - #include "../universe/Planet.h" #include "../universe/System.h" #include "../universe/Ship.h" #include "../universe/Fleet.h" #include "../universe/Building.h" #include "../universe/Field.h" +#include "../universe/Universe.h" #include "Logger.h" #include "OptionsDB.h" @@ -28,144 +19,89 @@ const int IMPOSSIBLY_LARGE_TURN = 2 << 15; EmpireManager& Empires() { -#ifdef FREEORION_BUILD_SERVER - return ServerApp::GetApp()->Empires(); -#else - return ClientApp::GetApp()->Empires(); -#endif + return IApp::GetApp()->Empires(); } Universe& GetUniverse() { -#ifdef FREEORION_BUILD_SERVER - return ServerApp::GetApp()->GetUniverse(); -#else - return ClientApp::GetApp()->GetUniverse(); -#endif + return IApp::GetApp()->GetUniverse(); } ObjectMap& Objects() { return GetUniverse().Objects(); } -ObjectMap& EmpireKnownObjects(int empire_id) { -#ifdef FREEORION_BUILD_SERVER - return GetUniverse().EmpireKnownObjects(empire_id); -#else - int client_empire_id = ClientApp::GetApp()->EmpireID(); - if (empire_id == ALL_EMPIRES || empire_id == client_empire_id) - return Objects(); - return GetUniverse().EmpireKnownObjects(empire_id); // should be empty as of this writing, as other empires' known objects aren't sent to clients -#endif -} +ObjectMap& EmpireKnownObjects(int empire_id) +{ return IApp::GetApp()->EmpireKnownObjects(empire_id); } +UniverseObject* GetUniverseObject(int object_id) +{ return IApp::GetApp()->GetUniverseObject(object_id); } -UniverseObject* GetUniverseObject(int object_id) { -#ifdef FREEORION_BUILD_SERVER - return GetUniverse().Objects().Object(object_id); -#else - // attempt to get live / up to date / mutable object - UniverseObject* obj = GetUniverse().Objects().Object(object_id); - // if not up to date info, use latest known out of date info about object - if (!obj) - obj = EmpireKnownObjects(ClientApp::GetApp()->EmpireID()).Object(object_id); - return obj; -#endif -} - -UniverseObject* GetEmpireKnownObject(int object_id, int empire_id) { -#ifdef FREEORION_BUILD_SERVER - return EmpireKnownObjects(empire_id).Object(object_id); -#else - return GetUniverseObject(object_id);// as of this writing, players don't have info about what other players know about objects -#endif -} - std::string GetVisibleObjectName(const UniverseObject* object) -{ - if(NULL == object) - { - Logger().errorStream() << "GetVisibleObjectName: expected non null object pointer."; - return std::string(); - } +{ return IApp::GetApp()->GetVisibleObjectName(object); } -#ifdef FREEORION_BUILD_SERVER - std::string name_text = object->Name(); -#else - int client_empire_id = ClientApp::GetApp()->EmpireID(); - std::string name_text = object->PublicName(client_empire_id); - if (const System* system = universe_object_cast<const System*>(object)) - name_text = system->ApparentName(client_empire_id); -#endif - return name_text; -} +UniverseObject* GetEmpireKnownObject(int object_id, int empire_id) +{ return IApp::GetApp()->EmpireKnownObject(object_id, empire_id); } -template <class T> -T* GetUniverseObject(int object_id) -{ - return Objects().Object<T>(object_id); -} - -template <class T> -T* GetEmpireKnownObject(int object_id, int empire_id) -{ - return EmpireKnownObjects(empire_id).Object<T>(object_id); -} - Planet* GetPlanet(int object_id) -{ return GetUniverseObject<Planet>(object_id); } +{ return Objects().Object<Planet>(object_id); } Planet* GetEmpireKnownPlanet(int object_id, int empire_id) -{ return GetEmpireKnownObject<Planet>(object_id, empire_id); } +{ return EmpireKnownObjects(empire_id).Object<Planet>(object_id); } System* GetSystem(int object_id) -{ return GetUniverseObject<System>(object_id); } +{ return Objects().Object<System>(object_id); } System* GetEmpireKnownSystem(int object_id, int empire_id) -{ return GetEmpireKnownObject<System>(object_id, empire_id); } +{ return EmpireKnownObjects(empire_id).Object<System>(object_id); } Field* GetField(int object_id) -{ return GetUniverseObject<Field>(object_id); } +{ return Objects().Object<Field>(object_id); } Field* GetEmpireKnownField(int object_id, int empire_id) -{ return GetEmpireKnownObject<Field>(object_id, empire_id); } +{ return EmpireKnownObjects(empire_id).Object<Field>(object_id); } Ship* GetShip(int object_id) -{ return GetUniverseObject<Ship>(object_id); } +{ return Objects().Object<Ship>(object_id); } Ship* GetEmpireKnownShip(int object_id, int empire_id) -{ return GetEmpireKnownObject<Ship>(object_id, empire_id); } +{ return EmpireKnownObjects(empire_id).Object<Ship>(object_id); } Fleet* GetFleet(int object_id) -{ return GetUniverseObject<Fleet>(object_id); } +{ return Objects().Object<Fleet>(object_id); } Fleet* GetEmpireKnownFleet(int object_id, int empire_id) -{ return GetEmpireKnownObject<Fleet>(object_id, empire_id); } +{ return EmpireKnownObjects(empire_id).Object<Fleet>(object_id); } Building* GetBuilding(int object_id) -{ return GetUniverseObject<Building>(object_id); } +{ return Objects().Object<Building>(object_id); } Building* GetEmpireKnownBuilding(int object_id, int empire_id) -{ return GetEmpireKnownObject<Building>(object_id, empire_id); } +{ return EmpireKnownObjects(empire_id).Object<Building>(object_id); } -int GetNewObjectID() { -#ifdef FREEORION_BUILD_SERVER - return GetUniverse().GenerateObjectID(); -#else - return ClientApp::GetApp()->GetNewObjectID(); -#endif -} +int GetNewObjectID() +{ return IApp::GetApp()->GetNewObjectID(); } -int GetNewDesignID() { -#ifdef FREEORION_BUILD_SERVER - return GetUniverse().GenerateDesignID(); -#else - return ClientApp::GetApp()->GetNewDesignID(); -#endif +int GetNewDesignID() +{ return IApp::GetApp()->GetNewDesignID(); } + +int CurrentTurn() +{ return IApp::GetApp()->CurrentTurn(); } + +//////////////////////////////////////////////// +// IApp +//////////////////////////////////////////////// +// static member(s) +IApp* IApp::s_app = 0; + +IApp::IApp() { + if (s_app) + throw std::runtime_error("Attempted to construct a second instance of Application"); + + s_app = this; } -int CurrentTurn() { -#ifdef FREEORION_BUILD_SERVER - return ServerApp::GetApp()->CurrentTurn(); -#else - return const_cast<const ClientApp*>(ClientApp::GetApp())->CurrentTurn(); -#endif -} +IApp::~IApp() +{ s_app = 0; } + +IApp* IApp::GetApp() +{ return s_app; } + Modified: trunk/FreeOrion/util/AppInterface.h =================================================================== --- trunk/FreeOrion/util/AppInterface.h 2013-06-20 17:05:19 UTC (rev 6174) +++ trunk/FreeOrion/util/AppInterface.h 2013-06-20 18:32:15 UTC (rev 6175) @@ -31,11 +31,7 @@ /** Accessor for known objects of specified empire. */ ObjectMap& EmpireKnownObjects(int empire_id); -/** Accessor for individual objects. These are all implemented as separate - * functions to avoid needing template code in header, as the template code - * also needs to have implementation-dependent #ifdef code in it which would - * make the header code not buildable in a common library used by different - * implementations (ie. server vs. clients). */ +/** Accessor for individual objects. */ UniverseObject* GetUniverseObject(int object_id); UniverseObject* GetEmpireKnownObject(int object_id, int empire_id); Planet* GetPlanet(int object_id); @@ -75,4 +71,43 @@ that are needed for both the server and the client, but for which access will vary and requires an #ifdef */ +class IApp { +public: + virtual ~IApp(); + + static IApp* GetApp(); ///< returns a IApp pointer to the singleton instance of the app + + virtual Universe& GetUniverse() = 0; ///< returns applications copy of Universe + + virtual EmpireManager& Empires() = 0; ///< returns the set of known Empires for this application + + virtual UniverseObject* GetUniverseObject(int object_id) = 0; + + /** Accessor for known objects of specified empire. */ + virtual ObjectMap& EmpireKnownObjects(int empire_id) = 0; + + virtual UniverseObject* EmpireKnownObject(int object_id, int empire_id) = 0; + + virtual std::string GetVisibleObjectName(const UniverseObject* object) = 0; + + /** returns a universe object ID which can be used for new objects. + Can return INVALID_OBJECT_ID if an ID cannot be created. */ + virtual int GetNewObjectID() = 0; + + /** returns a design ID which can be used for a new design to uniquely identify it. + Can return INVALID_OBJECT_ID if an ID cannot be created. */ + virtual int GetNewDesignID() = 0; + + virtual int CurrentTurn() const = 0; ///< returns the current game turn + +protected: + IApp(); + + static IApp* s_app; ///< a IApp pointer to the singleton instance of the app + +private: + const IApp& operator=(const IApp&); // disabled + IApp(const IApp&); // disabled +}; + #endif // _AppInterface_h_ |