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 __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