T * getSessionObjectImpl(bool createIfDoesntExist) { typedef boost::shared_ptr<T> TPtr; const std::type_info & whichType = typeid(T); const std::type_info * pWhichType = &whichType; SessionObjectMap::iterator iter = mSessionObjects.find(pWhichType); if (iter != mSessionObjects.end()) { boost::any & a = iter->second; TPtr * ptPtr = boost::any_cast<TPtr>(&a); RCF_ASSERT(ptPtr && *ptPtr); return ptPtr->get(); } else if (createIfDoesntExist) { TPtr tPtr( new T() ); mSessionObjects[pWhichType] = tPtr; return tPtr.get(); } else { return NULL; } }
RcfClientPtr makeServerStub() { boost::shared_ptr<T> tPtr( new T ); boost::shared_ptr< RCF::I_Deref<T> > derefPtr( new RCF::DerefSharedPtr<T>(tPtr) ); RcfClientPtr rcfClientPtr = createServerStub( (I1 *) NULL, (T *) NULL, derefPtr); { RcfClientPtr mergeePtr = createServerStub( (I2 *) 0, (T *) 0, derefPtr); rcfClientPtr->getServerStub().merge(mergeePtr); } { RcfClientPtr mergeePtr = createServerStub( (I3 *) 0, (T *) 0, derefPtr); rcfClientPtr->getServerStub().merge(mergeePtr); } return rcfClientPtr; }
T &deref() { boost::shared_ptr<T> tPtr(mTWeakPtr); if (tPtr.get()) { return *tPtr; } Exception e(_RcfError_ServerStubExpired()); RCF_THROW(e); }
RcfClientPtr makeServerStub() { boost::shared_ptr<T> tPtr( new T ); boost::shared_ptr< RCF::I_Deref<T> > derefPtr( new RCF::DerefSharedPtr<T>(tPtr) ); RcfClientPtr rcfClientPtr = createServerStub( (I1 *) NULL, (T *) NULL, derefPtr); return rcfClientPtr; }
boost::shared_ptr<T> getServerObjectImpl( const std::string & objectKey, boost::uint32_t timeoutMs, bool createIfDoesntExist) { typedef boost::shared_ptr<T> TPtr; Lock lock(mMutex); ServerObjectMap::iterator iter = mServerObjectMap.find(objectKey); if (iter != mServerObjectMap.end()) { ServerObjectHolder & holder = iter->second; boost::any & a = holder.mServerObject; TPtr * ptPtr = boost::any_cast<TPtr>(&a); RCF_ASSERT(ptPtr); TPtr tPtr = *ptPtr; T * pt = tPtr.get(); RCF_ASSERT(pt); // Return shared_ptr with custom deleter. holder.mLastTouchMs = getCurrentTimeMs(); RCF_ASSERT(holder.mUseCount >= 0); ++holder.mUseCount; TPtr ptr(pt, boost::bind(&ServerObjectService::customDeleter, this, objectKey, _1)); return ptr; } else if (createIfDoesntExist) { T * pt = new T(); TPtr tPtr(pt); mServerObjectMap[objectKey] = ServerObjectHolder(boost::any(tPtr), timeoutMs); ServerObjectHolder & holder = mServerObjectMap[objectKey]; // Return shared_ptr with custom deleter. holder.mLastTouchMs = getCurrentTimeMs(); RCF_ASSERT(holder.mUseCount >= 0); ++holder.mUseCount; TPtr ptr(pt, boost::bind(&ServerObjectService::customDeleter, this, objectKey, _1)); return ptr; } else { return TPtr(); } }
int NodeLuaMetaData::Index(lua_State * L, NodePtr & ptr, const std::string & index) { /*if (index == "FindOrCreateClass") { lua_pushcfunction(L, NodeLuaFunctions::FindOrCreateClass); return 1; } else if (index == "FindOrCreateNamespace") { lua_pushcfunction(L, NodeLuaFunctions::FindOrCreateNamespace); return 1; } else*/ if (index == "AdoptedHome") { NodePtr adoptedHome = ptr->GetAdoptedHome(); if (!adoptedHome) { lua_pushnil(L); } else { NodeLuaMetaData::PutInstanceOnStack(L, adoptedHome); } } else if (index == "Annotations") { AnnotationTable & table = ptr->GetAnnotations(); AnnotationTablePtr tPtr(&table); AnnotationTableLuaMetaData::PutInstanceOnStack(L, tPtr); } else if (index == "Find") { lua_pushcfunction(L, NodeLuaFunctions::Find); return 1; } else if (index == "FindOrCreate") { lua_pushcfunction(L, NodeLuaFunctions::FindOrCreate); return 1; } else if (index == "FullName") { lua_pushlstring(L, ptr->GetFullName().c_str(), ptr->GetFullName().size()); } else if (index == "GetOperatorName") { lua_pushcfunction(L, NodeLuaFunctions::GetOperatorName); } else if (index == "GetPrettyFullName") { lua_pushcfunction(L, NodeLuaFunctions::PrettyFullName); } else if (index == "HFilePath") { FileNamePtr fileName = ptr->GetHFilePath(); if (!fileName) { lua_pushnil(L); } else { FileNameLuaMetaData::PutInstanceOnStack(L, ptr->GetHFilePath()); } } else if (index == "IsOperator") { lua_pushboolean(L, ptr->IsOperator()); } else if (index == "IsRoot") { lua_pushboolean(L, ptr->IsRoot()); return 1; } else if (index == "Children") { // Put a lua pointer for this Node object on the Lua stack, // but associate it with a different meta table. createNodePtrUserData(L, ptr); luaL_getmetatable(L, MEMBERSPROPERTY_METATABLENAME); lua_setmetatable(L, -2); return 1; } else if (index == "Element") { ElementLuaMetaData::PutInstanceOnStack(L, ptr->GetElement()); } else if (index == "Member") { ElementLuaMetaData::PutInstanceOnStack(L, ptr->GetElement()); //return luaL_error(L, // "Member is the old name, please switch to \"Element\"."); } else if (index == "Name") { lua_pushlstring(L, ptr->GetName().c_str(), ptr->GetName().length()); } else if (index == "Node") { NodePtr scope = ptr->GetNode(); NodeLuaMetaData::PutInstanceOnStack(L, scope); } else if (index == "ParseComplexName") { lua_pushcfunction(L, NodeLuaFunctions::ParseComplexName); } else if (index == "SetHFilePath") { lua_pushcfunction(L, NodeLuaFunctions::SetHFilePath); } else if (index == "TypeName") { lua_pushstring(L, ptr->GetTypeName()); } else { lua_pushnil(L); } return 1; }