Sirikata
libspace/include/sirikata/space/LocationService.hpp
Go to the documentation of this file.
00001 // Copyright (c) 2009 Sirikata Authors. All rights reserved.
00002 // Use of this source code is governed by a BSD-style license that can
00003 // be found in the LICENSE file.
00004 
00005 #ifndef _SIRIKATA_LOCATION_SERVICE_HPP_
00006 #define _SIRIKATA_LOCATION_SERVICE_HPP_
00007 
00008 #include <sirikata/space/SpaceContext.hpp>
00009 #include <sirikata/core/util/MotionVector.hpp>
00010 #include <sirikata/core/util/MotionQuaternion.hpp>
00011 #include <sirikata/core/util/AggregateBoundingInfo.hpp>
00012 #include <sirikata/space/ServerMessage.hpp>
00013 #include <sirikata/core/service/PollingService.hpp>
00014 
00015 #include <sirikata/core/network/SSTImpl.hpp>
00016 
00017 #include <sirikata/space/Platform.hpp>
00018 
00019 #include <sirikata/core/util/Factory.hpp>
00020 #include <sirikata/space/ObjectSessionManager.hpp>
00021 
00022 #include <sirikata/core/prox/Defs.hpp>
00023 
00024 namespace Sirikata {
00025 
00026 namespace Protocol {
00027 namespace Loc {
00028 class LocationUpdate;
00029 }
00030 }
00031 
00032 class LocationServiceListener;
00033 class LocationUpdatePolicy;
00034 class LocationService;
00035 
00037 class SIRIKATA_SPACE_EXPORT LocationServiceListener {
00038 public:
00039     virtual ~LocationServiceListener();
00040 
00041     virtual void localObjectAdded(const UUID& uuid, bool agg, const TimedMotionVector3f& loc, const TimedMotionQuaternion& orient, const AggregateBoundingInfo& bounds, const String& mesh, const String& physics, const String& zernike) {}
00042     virtual void localObjectRemoved(const UUID& uuid, bool agg) {}
00043     virtual void localLocationUpdated(const UUID& uuid, bool agg, const TimedMotionVector3f& newval) {}
00044     virtual void localOrientationUpdated(const UUID& uuid, bool agg, const TimedMotionQuaternion& newval) {}
00045     virtual void localBoundsUpdated(const UUID& uuid, bool agg, const AggregateBoundingInfo& newval) {}
00046     virtual void localMeshUpdated(const UUID& uuid, bool agg, const String& newval) {}
00047     virtual void localPhysicsUpdated(const UUID& uuid, bool agg, const String& newval) {}
00048 
00049     virtual void replicaObjectAdded(const UUID& uuid, const TimedMotionVector3f& loc, const TimedMotionQuaternion& orient, const AggregateBoundingInfo& bounds, const String& mesh, const String& physics, const String& zernike) {}
00050     virtual void replicaObjectRemoved(const UUID& uuid) {}
00051     virtual void replicaLocationUpdated(const UUID& uuid, const TimedMotionVector3f& newval) {}
00052     virtual void replicaOrientationUpdated(const UUID& uuid, const TimedMotionQuaternion& newval) {}
00053     virtual void replicaBoundsUpdated(const UUID& uuid, const AggregateBoundingInfo& newval) {}
00054     virtual void replicaMeshUpdated(const UUID& uuid, const String& newval) {}
00055     virtual void replicaPhysicsUpdated(const UUID& uuid, const String& newval) {}
00056 
00057     // Hooks for raw updates received by the LocationService
00058     virtual void onLocationUpdateFromServer(const ServerID sid, const Sirikata::Protocol::Loc::LocationUpdate& update) {}
00059 }; // class LocationServiceListener
00060 
00061 
00067 class SIRIKATA_SPACE_EXPORT LocationUpdatePolicy : public LocationServiceListener, public Service {
00068 public:
00069     LocationUpdatePolicy();
00070     virtual ~LocationUpdatePolicy();
00071 
00072     virtual void initialize(LocationService* loc);
00073 
00074     virtual void start() = 0;
00075     virtual void stop() = 0;
00076 
00077     // Server subscriptions
00078 
00086     virtual void subscribe(ServerID remote, const UUID& uuid, SeqNoPtr seqNo) = 0;
00097     virtual void subscribe(ServerID remote, const UUID& uuid, ProxIndexID index_id, SeqNoPtr seqNo) = 0;
00102     virtual void unsubscribe(ServerID remote, const UUID& uuid) = 0;
00108     virtual void unsubscribe(ServerID remote, const UUID& uuid, ProxIndexID index_id) = 0;
00110     virtual void unsubscribe(ServerID remote) = 0;
00111 
00112 
00113 
00114     // OH subscriptions
00115 
00120     virtual void subscribe(const OHDP::NodeID& remote, const UUID& uuid) = 0;
00128     virtual void subscribe(const OHDP::NodeID& remote, const UUID& uuid, ProxIndexID index_id) = 0;
00133     virtual void unsubscribe(const OHDP::NodeID& remote, const UUID& uuid) = 0;
00139     virtual void unsubscribe(const OHDP::NodeID& remote, const UUID& uuid, ProxIndexID index_id) = 0;
00141     virtual void unsubscribe(const OHDP::NodeID& remote) = 0;
00142 
00143 
00144     // Object subscriptions
00145 
00150     virtual void subscribe(const UUID& remote, const UUID& uuid) = 0;
00158     virtual void subscribe(const UUID& remote, const UUID& uuid, ProxIndexID index_id) = 0;
00163     virtual void unsubscribe(const UUID& remote, const UUID& uuid) = 0;
00169     virtual void unsubscribe(const UUID& remote, const UUID& uuid, ProxIndexID index_id) = 0;
00171     virtual void unsubscribe(const UUID& remote) = 0;
00172 
00173     virtual void service() = 0;
00174 
00175 protected:
00176     LocationService* mLocService; // The owner of this UpdatePolicy
00177     Router<Message*>* mLocMessageRouter; // Server Message Router for Loc Service
00178 }; // class LocationUpdatePolicy
00179 
00180 class SIRIKATA_SPACE_EXPORT LocationUpdatePolicyFactory
00181     : public AutoSingleton<LocationUpdatePolicyFactory>,
00182       public Factory2<LocationUpdatePolicy*, SpaceContext*, const String&>
00183 {
00184   public:
00185     static LocationUpdatePolicyFactory& getSingleton();
00186     static void destroy();
00187 }; // class LocationServiceFactory
00188 
00189 
00193 class SIRIKATA_SPACE_EXPORT LocationService : public MessageRecipient, public PollingService, public ObjectSessionListener {
00194 public:
00195     LocationService(SpaceContext* ctx, LocationUpdatePolicy* update_policy);
00196     virtual ~LocationService();
00197 
00198     const SpaceContext* context() const {
00199         return mContext;
00200     }
00201 
00202     // ObjectSessionListener Interface
00203     virtual void newSession(ObjectSession* session);
00204 
00207     virtual bool contains(const UUID& uuid) const = 0;
00208 
00210     virtual uint64 epoch(const UUID& uuid) = 0;
00211     virtual TimedMotionVector3f location(const UUID& uuid) = 0;
00212     virtual Vector3f currentPosition(const UUID& uuid) = 0;
00213     virtual TimedMotionQuaternion orientation(const UUID& uuid) = 0;
00214     virtual Quaternion currentOrientation(const UUID& uuid) = 0;
00215     virtual AggregateBoundingInfo bounds(const UUID& uuid) = 0;
00216     virtual const String& mesh(const UUID& uuid) = 0;
00217     virtual const String& physics(const UUID& uuid) = 0;
00218 
00220     virtual void addLocalObject(const UUID& uuid, const TimedMotionVector3f& loc, const TimedMotionQuaternion& orient, const AggregateBoundingInfo& bounds, const String& mesh, const String& physics, const String& zernike) = 0;
00221     virtual void removeLocalObject(const UUID& uuid) = 0;
00222 
00231     virtual void addLocalAggregateObject(const UUID& uuid, const TimedMotionVector3f& loc, const TimedMotionQuaternion& orient, const AggregateBoundingInfo& bounds, const String& mesh, const String& physics) = 0;
00232     virtual void removeLocalAggregateObject(const UUID& uuid) = 0;
00233     virtual void updateLocalAggregateLocation(const UUID& uuid, const TimedMotionVector3f& newval) = 0;
00234     virtual void updateLocalAggregateOrientation(const UUID& uuid, const TimedMotionQuaternion& newval) = 0;
00235     virtual void updateLocalAggregateBounds(const UUID& uuid, const AggregateBoundingInfo& newval) = 0;
00236     virtual void updateLocalAggregateMesh(const UUID& uuid, const String& newval) = 0;
00237     virtual void updateLocalAggregatePhysics(const UUID& uuid, const String& newval) = 0;
00238 
00240     virtual void addReplicaObject(const Time& t, const UUID& uuid, bool agg, const TimedMotionVector3f& loc, const TimedMotionQuaternion& orient, const AggregateBoundingInfo& bounds, const String& mesh, const String& physics, const String& zernike) = 0;
00241     virtual void removeReplicaObject(const Time& t, const UUID& uuid) = 0;
00242 
00244     virtual void addListener(LocationServiceListener* listener, bool want_aggregates);
00245     virtual void removeListener(LocationServiceListener* listener);
00246 
00248     virtual void subscribe(ServerID remote, const UUID& uuid, SeqNoPtr seq_no_ptr);
00249     virtual void subscribe(ServerID remote, const UUID& uuid, ProxIndexID index_id, SeqNoPtr seq_no_ptr);
00250     virtual void unsubscribe(ServerID remote, const UUID& uuid);
00251     virtual void unsubscribe(ServerID remote, const UUID& uuid, ProxIndexID index_id);
00253     virtual void unsubscribe(ServerID remote);
00254 
00256     virtual void subscribe(const OHDP::NodeID& remote, const UUID& uuid);
00257     virtual void subscribe(const OHDP::NodeID& remote, const UUID& uuid, ProxIndexID index_id);
00258     virtual void unsubscribe(const OHDP::NodeID& remote, const UUID& uuid);
00259     virtual void unsubscribe(const OHDP::NodeID& remote, const UUID& uuid, ProxIndexID index_id);
00261     virtual void unsubscribe(const OHDP::NodeID& remote);
00262 
00264     virtual void subscribe(const UUID& remote, const UUID& uuid);
00265     virtual void subscribe(const UUID& remote, const UUID& uuid, ProxIndexID index_id);
00266     virtual void unsubscribe(const UUID& remote, const UUID& uuid);
00267     virtual void unsubscribe(const UUID& remote, const UUID& uuid, ProxIndexID index_id);
00269     virtual void unsubscribe(const UUID& remote);
00270 
00271 
00273     virtual void receiveMessage(Message* msg) = 0;
00274 
00275     virtual bool locationUpdate(UUID source, void* buffer, uint32 length) = 0;
00276 
00277 
00278     // Command handlers -- for debugging and monitoring, LocationService's must
00279     // respond to at least a few basic commands:
00282     virtual void commandProperties(const Command::Command& cmd, Command::Commander* cmdr, Command::CommandID cmdid) = 0;
00284     virtual void commandObjectProperties(const Command::Command& cmd, Command::Commander* cmdr, Command::CommandID cmdid) = 0;
00285 
00286 protected:
00287     virtual void start();
00288     virtual void stop();
00289     virtual void poll();
00290     virtual void service() = 0;
00291 
00292     void notifyLocalObjectAdded(const UUID& uuid, bool agg, const TimedMotionVector3f& loc, const TimedMotionQuaternion& orient, const AggregateBoundingInfo& bounds, const String& mesh, const String& physics, const String& zernike) const;
00293     void notifyLocalObjectRemoved(const UUID& uuid, bool agg) const;
00294     void notifyLocalLocationUpdated(const UUID& uuid, bool agg, const TimedMotionVector3f& newval) const;
00295     void notifyLocalOrientationUpdated(const UUID& uuid, bool agg, const TimedMotionQuaternion& newval) const;
00296     void notifyLocalBoundsUpdated(const UUID& uuid, bool agg, const AggregateBoundingInfo& newval) const;
00297     void notifyLocalMeshUpdated(const UUID& uuid, bool agg, const String& newval) const;
00298     void notifyLocalPhysicsUpdated(const UUID& uuid, bool agg, const String& newval) const;
00299 
00300     void notifyReplicaObjectAdded(const UUID& uuid, const TimedMotionVector3f& loc, const TimedMotionQuaternion& orient, const AggregateBoundingInfo& bounds, const String& mesh, const String& physics, const String& zernike) const;
00301     void notifyReplicaObjectRemoved(const UUID& uuid) const;
00302     void notifyReplicaLocationUpdated(const UUID& uuid, const TimedMotionVector3f& newval) const;
00303     void notifyReplicaOrientationUpdated(const UUID& uuid, const TimedMotionQuaternion& newval) const;
00304     void notifyReplicaBoundsUpdated(const UUID& uuid, const AggregateBoundingInfo& newval) const;
00305     void notifyReplicaMeshUpdated(const UUID& uuid, const String& newval) const;
00306     void notifyReplicaPhysicsUpdated(const UUID& uuid, const String& newval) const;
00307 
00308     void notifyOnLocationUpdateFromServer(const ServerID sid, const Sirikata::Protocol::Loc::LocationUpdate& update);
00309 
00310     // Helpers for listening to streams
00311     typedef SST::Stream<SpaceObjectReference> SSTStream;
00312     typedef SSTStream::Ptr SSTStreamPtr;
00313     void handleLocationUpdateSubstream(const UUID& source, int err, SSTStreamPtr s);
00314     void handleLocationUpdateSubstreamRead(const UUID& source, SSTStreamPtr s, std::stringstream* prevdata, uint8* buffer, int length);
00315     void tryHandleLocationUpdate(const UUID& source, SSTStreamPtr s, const String& payload, std::stringstream* prevdata);
00316 
00317     SpaceContext* mContext;
00318 private:
00319     TimeProfiler::Stage* mProfiler;
00320 protected:
00321     struct ListenerInfo {
00322         LocationServiceListener* listener;
00323         bool wantAggregates;
00324 
00325         bool operator<(const ListenerInfo& rhs) const { return listener < rhs.listener; }
00326     };
00327     typedef std::set<ListenerInfo> ListenerList;
00328     ListenerList mListeners;
00329 
00330     LocationUpdatePolicy* mUpdatePolicy;
00331 }; // class LocationService
00332 
00333 class SIRIKATA_SPACE_EXPORT LocationServiceFactory
00334     : public AutoSingleton<LocationServiceFactory>,
00335       public Factory3<LocationService*, SpaceContext*, LocationUpdatePolicy*, const String&>
00336 {
00337   public:
00338     static LocationServiceFactory& getSingleton();
00339     static void destroy();
00340 }; // class LocationServiceFactory
00341 
00342 } // namespace Sirikata
00343 
00344 #endif //_SIRIKATA_LOCATION_SERVICE_HPP_