Sirikata
liboh/plugins/simple_query/SimpleObjectQueryProcessor.hpp
Go to the documentation of this file.
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_