コード例 #1
0
ファイル: ASLoader.hpp プロジェクト: CommunicoPublic/cas
//
// Get pointer to the object
//
template <typename T> T * ASLoader<T>::GetObject(CCHAR_P szLibraryName, CCHAR_P szClassName)
{
	// Check cache
	HandleInfo * pHandleInfo = CheckLibraryHandle(szLibraryName);
	// Locad library
	if (pHandleInfo == NULL)
	{
		DoLoadLibrary(szLibraryName);
		pHandleInfo = CheckLibraryHandle(szLibraryName);
	}

	STLW::string sInitHandler(szClassName);
	sInitHandler.append(sLibraryPrefix);

	// Initialize class
#if defined(linux) || defined(sun)
	// Linux brain-damaged stupidity
	void * vPtr = dlsym(pHandleInfo -> handle, sInitHandler.c_str());
	InitPtr vVInitPtr;
	memcpy((void *)(&vVInitPtr), (void *)(&vPtr), sizeof(void *));
#else
	InitPtr vVInitPtr = (InitPtr)dlfunc(pHandleInfo -> handle, sInitHandler.c_str());
#endif

	if (vVInitPtr == NULL)
	{
		STLW::string sTMP("Cannot get magic symbol \"");
		sTMP.append(sInitHandler);
		sTMP.append("\" from library \"");
		sTMP.append(szLibraryName);
		sTMP.append("\"");
		throw UnixException(sTMP.c_str(), errno);
	}
	// Number of references
	++(pHandleInfo -> refcount);

	// Create object
	T * pASObject = ((*vVInitPtr)());

	// All done
	if (pASObject != NULL) { return pASObject; }

	STLW::string sTMP("Internal error in module \"");
	sTMP.append(szClassName);
	sTMP.append("\", library \"");
	sTMP.append(szLibraryName);
	sTMP.append("\"");
	throw UnixException(sTMP.c_str(), errno);

// Make compiler happy; this should *not* happened
return NULL;
}
コード例 #2
0
static STLW::string GetBaseDir(const STLW::string & szTemplateName, STLW::string & sNormalizedFileName)
{
	if (szTemplateName.length() == 0) { return ""; }

	STLW::vector<STLW::string> vCurrentDir;

	CCHAR_P sBegin = szTemplateName.c_str();
	CCHAR_P szEnd  = szTemplateName.c_str() + szTemplateName.length();

	CCHAR_P sIter = sBegin;
	while (sIter != szEnd)
	{
		if (*sIter == '/')
		{
			if (sIter != sBegin)
			{
				STLW::string sTMP(sBegin, sIter);

				if      (sTMP == "/." || sTMP == "/") { ;; }
				else if (sTMP == "/..")
				{
					STLW::vector<STLW::string>::iterator itEnd = vCurrentDir.end();
					if (vCurrentDir.begin() == itEnd) { return ""; }
					vCurrentDir.erase(--itEnd);
				}
				else
				{
					vCurrentDir.push_back(sTMP);
				}
			}
			sBegin = sIter;
		}
		++sIter;
	}

	STLW::string sTMP(sBegin, sIter);
	if (sTMP == "/") { return ""; }

	STLW::string sResult;
	for (UINT_32 iI = 0; iI < vCurrentDir.size(); ++iI) { sResult.append(vCurrentDir[iI]); }

	sNormalizedFileName.assign(sResult);
	sNormalizedFileName.append(sTMP);

	sResult.append("/");

return sResult;
}
コード例 #3
0
ファイル: ASLoader.hpp プロジェクト: CommunicoPublic/cas
//
// Load library
//
template <typename T>void * ASLoader<T>::DoLoadLibrary(CCHAR_P szLibraryName)
{
	HandleInfo oHandleInfo;
	// Okay, try to load function
	oHandleInfo.handle   = dlopen(szLibraryName, RTLD_NOW | RTLD_GLOBAL);
	oHandleInfo.refcount = 0;
	// Error?
	if (oHandleInfo.handle == NULL)
	{
		STLW::string sTMP("Cannot open library \"");
		sTMP.append(szLibraryName);
		sTMP.append("\": ");
		sTMP.append(dlerror());
		throw UnixException(sTMP.c_str(), errno);
	}

	mLibraryMap[szLibraryName] = oHandleInfo;

return oHandleInfo.handle;
}