Sirikata
|
00001 // Copyright (c) 2011 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_OH_SIMPLE_OBJECT_QUERY_PROCESSOR_HPP_ 00006 #define _SIRIKATA_OH_SIMPLE_OBJECT_QUERY_PROCESSOR_HPP_ 00007 00008 #include <sirikata/oh/ObjectQueryProcessor.hpp> 00009 00010 #include <sirikata/pintoloc/OrphanLocUpdateManager.hpp> 00011 00012 namespace Sirikata { 00013 namespace OH { 00014 namespace Simple { 00015 00021 class SimpleObjectQueryProcessor : 00022 public ObjectQueryProcessor, 00023 OrphanLocUpdateManager::Listener 00024 { 00025 public: 00026 static SimpleObjectQueryProcessor* create(ObjectHostContext* ctx, const String& args); 00027 00028 SimpleObjectQueryProcessor(ObjectHostContext* ctx); 00029 virtual ~SimpleObjectQueryProcessor(); 00030 00031 virtual void start(); 00032 virtual void stop(); 00033 00034 virtual void presenceConnectedStream(HostedObjectPtr ho, const SpaceObjectReference& sporef, HostedObject::SSTStreamPtr strm); 00035 virtual void presenceDisconnected(HostedObjectPtr ho, const SpaceObjectReference& sporef); 00036 00037 virtual void updateQuery(HostedObjectPtr ho, const SpaceObjectReference& sporef, const String& new_query); 00038 00039 00040 // OrphanLocUpdateManager::Listener Interface 00041 virtual void onOrphanLocUpdate(const LocUpdate& lu, const SpaceObjectReference& observer); 00042 00043 private: 00044 void handleStop(); 00045 00046 // Proximity 00047 void handleProximitySubstream(const HostedObjectWPtr &weakSelf, const SpaceObjectReference& spaceobj, int err, SSTStreamPtr s); 00048 void handleProximitySubstreamRead(const HostedObjectWPtr &weakSelf, const SpaceObjectReference& spaceobj, SSTStreamPtr s, String* prevdata, uint8* buffer, int length); 00049 bool handleProximityMessage(HostedObjectPtr self, const SpaceObjectReference& spaceobj, const std::string& payload); 00050 00051 // Location 00052 // Handlers for substreams for space-managed updates 00053 void handleLocationSubstream(const HostedObjectWPtr &weakSelf, const SpaceObjectReference& spaceobj, int err, SSTStreamPtr s); 00054 // Handlers for substream read events for space-managed updates 00055 void handleLocationSubstreamRead(const HostedObjectWPtr &weakSelf, const SpaceObjectReference& spaceobj, SSTStreamPtr s, std::stringstream* prevdata, uint8* buffer, int length); 00056 bool handleLocationMessage(const HostedObjectPtr& self, const SpaceObjectReference& spaceobj, const std::string& paylod); 00057 00058 00059 // BaseProxCommandable 00060 virtual void commandProperties(const Command::Command& cmd, Command::Commander* cmdr, Command::CommandID cmdid); 00061 virtual void commandListHandlers(const Command::Command& cmd, Command::Commander* cmdr, Command::CommandID cmdid); 00062 virtual void commandListNodes(const Command::Command& cmd, Command::Commander* cmdr, Command::CommandID cmdid); 00063 virtual void commandListQueriers(const Command::Command& cmd, Command::Commander* cmdr, Command::CommandID cmdid); 00064 virtual void commandForceRebuild(const Command::Command& cmd, Command::Commander* cmdr, Command::CommandID cmdid); 00065 virtual void commandStats(const Command::Command& cmd, Command::Commander* cmdr, Command::CommandID cmdid); 00066 00067 00068 ObjectHostContext* mContext; 00069 00070 // We resolve ordering issues here instead of leaving it up to the 00071 // object. To do so, we track a bit of state for each query -- the 00072 // object so we can check it's ProxyManager for proxies (i.e. the 00073 // current query result state) and an OrphanLocUpdateManager for 00074 // fixing the ordering problems. 00075 struct ObjectState { 00076 ObjectState(Context* ctx, HostedObjectPtr _ho) 00077 : ho(_ho), 00078 orphans(ctx, ctx->mainStrand, Duration::seconds(10)), 00079 stopped(false) 00080 { 00081 orphans.start(); 00082 } 00083 ~ObjectState() { 00084 stop(); 00085 } 00086 00087 void stop() { 00088 if (!stopped) { 00089 orphans.stop(); 00090 stopped = true; 00091 } 00092 } 00093 00094 HostedObjectWPtr ho; 00095 OrphanLocUpdateManager orphans; 00096 bool stopped; 00097 }; 00098 typedef std::tr1::shared_ptr<ObjectState> ObjectStatePtr; 00099 typedef std::tr1::unordered_map<SpaceObjectReference, ObjectStatePtr, SpaceObjectReference::Hasher> ObjectStateMap; 00100 ObjectStateMap mObjectStateMap; 00101 }; 00102 00103 } // namespace Simple 00104 } // namespace OH 00105 } // namespace Sirikata 00106 00107 #endif //_SIRIKATA_OH_SIMPLE_OBJECT_QUERY_PROCESSOR_HPP_