예제 #1
0
        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;
            }
        }
예제 #2
0
        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;
        }
예제 #3
0
 T &deref()
 {
     boost::shared_ptr<T> tPtr(mTWeakPtr);
     if (tPtr.get())
     {
         return *tPtr;
     }
     Exception e(_RcfError_ServerStubExpired());
     RCF_THROW(e);
 }
예제 #4
0
        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;
        }
예제 #5
0
        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();
            }
        }
예제 #6
0
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;
}