Sirikata
liboh/plugins/js/EmersonHttpManager.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 __EMERSON_HTTP_MANAGER_HPP__
00006 #define __EMERSON_HTTP_MANAGER_HPP__
00007 
00008 #include <map>
00009 #include <sirikata/core/transfer/HttpManager.hpp>
00010 #include <v8.h>
00011 #include <sirikata/core/util/SelfWeakPtr.hpp>
00012 #include <sirikata/core/network/IOStrandImpl.hpp>
00013 #include "JSCtx.hpp"
00014 
00015 namespace Sirikata {
00016 
00017 class Context;
00018 
00019 namespace JS {
00020 
00021 class EmersonHttpManager;
00022 class JSContextStruct;
00023 
00024 typedef std::tr1::shared_ptr<EmersonHttpManager> EmersonHttpPtr;
00025 typedef std::tr1::weak_ptr  <EmersonHttpManager> EmersonHttpWPtr;
00026 
00027 
00028 class EmersonHttpManager : public SelfWeakPtr<EmersonHttpManager>
00029 {
00030 public:
00031     typedef uint32 EmersonHttpToken;
00032 
00033     EmersonHttpManager(JSCtx* ctx);
00034     ~EmersonHttpManager();
00035 
00036     typedef std::tr1::shared_ptr<Transfer::HttpManager::HttpResponse> HttpRespPtr;
00037 
00038 
00039     /*
00040       Whenever a context is destroyed, removes its entry from ctxTokeMap.  For
00041       all allbacks in tokeCBMap that are outstanding for this context, call
00042       dispose on their outstanding v8 callback functions, and sets their
00043       jscontext to null instead.
00044      */
00045     void deregisterContext(JSContextStruct* toDeregister);
00046 
00047 
00064     EmersonHttpToken makeRequest(
00065         Sirikata::Network::Address addr,Transfer::HttpManager::HTTP_METHOD method,
00066         std::string req,v8::Persistent<v8::Function> cb, JSContextStruct* jscont);
00067 
00068 
00069 private:
00070 
00071     typedef std::map<EmersonHttpToken, EmersonHttpToken> TokenMap;
00072     typedef TokenMap::iterator TokenMapIter;
00073 
00074     typedef std::pair<JSContextStruct* , v8::Persistent<v8::Function> > ContextCBPair;
00075     typedef std::map<EmersonHttpToken, ContextCBPair> TokenCBMap;
00076     typedef TokenCBMap::iterator TokenCBMapIter;
00077 
00078     typedef std::map<JSContextStruct*, TokenMap> ContextTokenMap;
00079     typedef ContextTokenMap::iterator ContextTokenMapIter;
00080 
00081     //to ensure uniqueness, makeRequest should be the only function (outside of
00082     //constructor that reads or writes to this value).
00083     EmersonHttpToken currentToken;
00084 
00090     ContextTokenMap ctxTokeMap;
00091 
00096     TokenCBMap tokeCBMap;
00097 
00098 
00111     void receiveHttpResponse(EmersonHttpToken respToken,
00112         HttpRespPtr hrp,
00113         Transfer::HttpManager::ERR_TYPE error,
00114         const boost::system::error_code& boost_error
00115     );
00116     void postReceiveResp(EmersonHttpToken respToken,HttpRespPtr hrp,Transfer::HttpManager::ERR_TYPE error,const boost::system::error_code& boost_error);
00117 
00118 
00119     void debugPrintTokenMap();
00120     void debugPrintContextMap();
00121 
00122 
00123 
00124 
00125     //If have outstanding requests, this pointer will have a pointer to self.
00126     //If don't, then it has an empty ptr.  Allows this to garbage collect properly
00127     EmersonHttpPtr managerLiveness;
00128     JSCtx* mContext;
00129 };
00130 
00131 static EmersonHttpPtr nullEmersonHttpPtr;
00132 
00133 
00134 } //namespace js
00135 } //namespace sirikata
00136 
00137 #endif