Sirikata
libspace/include/sirikata/space/SpaceNetwork.hpp
Go to the documentation of this file.
00001 /*  Sirikata
00002  *  SpaceNetwork.hpp
00003  *
00004  *  Copyright (c) 2010, Daniel Reiter Horn
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_SPACE_NETWORK_HPP_
00034 #define _SIRIKATA_SPACE_NETWORK_HPP_
00035 
00036 #include <sirikata/core/util/Platform.hpp>
00037 #include <sirikata/space/SpaceContext.hpp>
00038 #include <sirikata/core/network/Stream.hpp>
00039 #include <sirikata/core/service/Service.hpp>
00040 #include <sirikata/core/util/ListenerProvider.hpp>
00041 
00042 namespace Sirikata {
00043 
00044 class ServerIDMap;
00045 
00048 class SIRIKATA_SPACE_EXPORT SpaceNetworkConnectionListener {
00049 public:
00050     virtual ~SpaceNetworkConnectionListener();
00051 
00052     virtual void onSpaceNetworkConnected(ServerID) {}
00053     virtual void onSpaceNetworkDisconnected(ServerID) {}
00054 };
00055 
00056 class SIRIKATA_SPACE_EXPORT SpaceNetwork : public Service, public Provider<SpaceNetworkConnectionListener*> {
00057 public:
00058     typedef Sirikata::Network::Chunk Chunk;
00059 
00063     class SendStream {
00064     public:
00065         virtual ~SendStream() {}
00066 
00067         virtual ServerID id() const = 0;
00068         virtual bool send(const Chunk&) = 0;
00069     };
00070 
00076     class SendListener {
00077       public:
00078         virtual ~SendListener() {}
00079 
00083         virtual void networkReadyToSend(const ServerID& from) = 0;
00084     };
00085 
00089     class ReceiveStream {
00090     public:
00091         virtual ~ReceiveStream() {}
00092 
00093         virtual ServerID id() const = 0;
00094         virtual Chunk* front() = 0;
00095         virtual Chunk* pop() = 0;
00096     };
00097 
00104     class ReceiveListener {
00105       public:
00106         virtual ~ReceiveListener() {}
00107 
00112         virtual void networkReceivedConnection(ReceiveStream* strm) = 0;
00113 
00118         virtual void networkReceivedData(ReceiveStream* strm) = 0;
00119     };
00120 
00121 
00122     virtual ~SpaceNetwork();
00123 
00124     virtual void setSendListener(SendListener* sl) = 0;
00125 
00126     virtual void listen (const ServerID& addr, ReceiveListener* receive_listener)=0;
00127     virtual SendStream* connect(Network::IOStrand* strand, const ServerID& addr) = 0;
00128 
00129     // ServerIDMap -- used for converting received server ID to a (ip,port) pair.  We have to do
00130     // this because the remote side might just report 127.0.0.1 + its port.  FIXME We'd like to
00131     // get rid of this or change this entire interface to just use ServerIDMap and ServerIDs.
00132     void setServerIDMap(ServerIDMap* sidmap);
00133 
00134 protected:
00135     SpaceNetwork(SpaceContext* ctx);
00136 
00137     // Service Interface
00138     virtual void start();
00139     virtual void stop();
00140 
00141     SpaceContext* mContext;
00142     ServerIDMap* mServerIDMap;
00143 };
00144 
00145 } // namespace Sirikata
00146 
00147 #endif //_SIRIKATA_SPACE_NETWORK_HPP_