Sirikata
|
00001 /* Sirikata 00002 * CoordinateSegmentationClient.hpp 00003 * 00004 * Copyright (c) 2009, Tahir Azim 00005 * All rights reserved. 00006 * 00007 * Redistribution and use in source and binary forms, with or without 00008 * modification, are permitted provided that the following conditions are 00009 * met: 00010 * * Redistributions of source code must retain the above copyright 00011 * notice, this list of conditions and the following disclaimer. 00012 * * Redistributions in binary form must reproduce the above copyright 00013 * notice, this list of conditions and the following disclaimer in 00014 * the documentation and/or other materials provided with the 00015 * distribution. 00016 * * Neither the name of Sirikata nor the names of its contributors may 00017 * be used to endorse or promote products derived from this software 00018 * without specific prior written permission. 00019 * 00020 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS 00021 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 00022 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A 00023 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER 00024 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 00025 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 00026 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 00027 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 00028 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 00029 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 00030 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 00031 */ 00032 00033 #ifndef _SIRIKATA_COORDINATE_SEGMENTATION_CLIENT_HPP_ 00034 #define _SIRIKATA_COORDINATE_SEGMENTATION_CLIENT_HPP_ 00035 00036 00037 00038 #include <sirikata/core/util/Platform.hpp> 00039 #include <sirikata/core/network/Asio.hpp> 00040 #include <sirikata/core/network/Address4.hpp> 00041 #include <sirikata/space/CoordinateSegmentation.hpp> 00042 #include <sirikata/space/SegmentedRegion.hpp> 00043 00044 #include "Protocol_CSeg.pbj.hpp" 00045 00046 00047 namespace Sirikata { 00048 00049 typedef boost::asio::ip::tcp tcp; 00050 00051 class ServerIDMap; 00052 00054 class CoordinateSegmentationClient : public CoordinateSegmentation { 00055 public: 00056 CoordinateSegmentationClient(SpaceContext* ctx, const BoundingBox3f& region, const Vector3ui32& perdim, 00057 ServerIDMap* sidmap ); 00058 virtual ~CoordinateSegmentationClient(); 00059 00060 virtual ServerID lookup(const Vector3f& pos) ; 00061 virtual BoundingBoxList serverRegion(const ServerID& server) ; 00062 virtual BoundingBox3f region() ; 00063 virtual uint32 numServers() ; 00064 virtual std::vector<ServerID> lookupBoundingBox(const BoundingBox3f& bbox); 00065 00066 // From MessageRecipient 00067 virtual void receiveMessage(Message* msg); 00068 00069 virtual void reportLoad(ServerID, const BoundingBox3f& bbox, uint32 loadValue); 00070 00071 virtual void migrationHint( std::vector<ServerLoadInfo>& svrLoadInfo ); 00072 00073 private: 00074 virtual void service(); 00075 00076 void csegChangeMessage(Sirikata::Protocol::CSeg::ChangeMessage* ccMsg); 00077 00078 void downloadUpdatedBSPTree(); 00079 00080 bool mBSPTreeValid; 00081 00082 Trace::Trace* mTrace; 00083 00084 typedef struct LookupCacheEntry { 00085 LookupCacheEntry(ServerID sid, const BoundingBox3f& bbox) { 00086 this->bbox = bbox; 00087 this->sid = sid; 00088 } 00089 00090 BoundingBox3f bbox; 00091 ServerID sid; 00092 00093 } LookupCacheEntry; 00094 00095 boost::mutex mCacheMutex; 00096 std::vector<LookupCacheEntry> mLookupCache; 00097 uint16 mAvailableServersCount; 00098 std::map<ServerID, BoundingBoxList> mServerRegionCache; 00099 SegmentedRegion mTopLevelRegion; 00100 00101 Network::IOService* mIOService; //creates an io service 00102 boost::shared_ptr<Network::TCPListener> mAcceptor; 00103 boost::shared_ptr<Network::TCPSocket> mSocket; 00104 00105 ServerIDMap * mSidMap; 00106 00107 boost::mutex mMutex; 00108 boost::shared_ptr<Network::TCPSocket> mLeasedSocket; 00109 Time mLeaseExpiryTime; 00110 00111 String mCSEGHost; 00112 String mCSEGPort; 00113 00114 void handleSelfLookup(ServerID my_sid, Address4 my_addr); 00115 00116 void startAccepting(); 00117 void accept_handler(); 00118 00119 void sendSegmentationListenMessage(const Address4& my_addr); 00120 00121 boost::shared_ptr<Network::TCPSocket> getLeasedSocket(); 00122 00123 void writeCSEGMessage(boost::shared_ptr<tcp::socket> socket, 00124 Sirikata::Protocol::CSeg::CSegMessage& csegMessage); 00125 00126 00127 void readCSEGMessage(boost::shared_ptr<tcp::socket> socket, 00128 Sirikata::Protocol::CSeg::CSegMessage& csegMessage); 00129 00130 00131 }; // class CoordinateSegmentation 00132 00133 } // namespace Sirikata 00134 00135 #endif