Sirikata
space/src/CoordinateSegmentationClient.hpp
Go to the documentation of this file.
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