// // 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; }
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; }
// // 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; }