Sirikata
|
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_