void scfFactory::IncRef () { csRefTrackerAccess::TrackIncRef (this, scfRefCount); if (!Library && (LibraryName != csInvalidStringID)) { size_t libidx = LibraryRegistry->FindLibrary(LibraryName); if (libidx != (size_t)-1) Library = (scfSharedLibrary *)LibraryRegistry->Get (libidx); else Library = new scfSharedLibrary (LibraryName, FactoryClass); if (Library->ok ()) { csString sym; sym << FactoryClass << "_Create"; CreateFunc = (scfFactoryFunc)csGetLibrarySymbol(Library->LibraryHandle, sym); if (CreateFunc == 0) csPrintLibraryError(sym); } if (!Library->ok () || CreateFunc == 0) { Library = 0; return; // Signify that IncRef() failed by _not_ incrementing count. } Library->IncRef (); } scfRefCount++; }
scfSharedLibrary::scfSharedLibrary (csStringID libraryName, const char *core) { LibraryRegistry->Push (this); RefCount = 0; LibraryName = libraryName; const char* lib = get_library_name(LibraryName); if (PrivateSCF->IsVerbose(SCF_VERBOSE_PLUGIN_LOAD)) csPrintfErr("SCF_NOTIFY: loading plugin %s to satisfy request for %s\n", lib, core); LibraryHandle = csLoadLibrary (lib); if (LibraryHandle != 0) { csString sym; sym << core << "_scfInitialize"; initFunc = (scfInitFunc)csGetLibrarySymbol(LibraryHandle, sym); if (!initFunc) { csPrintfErr("SCF_ERROR: %s doesn't export %s\n", CS::Quote::Single (lib), CS::Quote::Single (sym.GetData())); csPrintLibraryError (sym); } sym.Clear (); sym << core << "_scfFinalize"; finisFunc = (scfFinisFunc)csGetLibrarySymbol(LibraryHandle, sym); if (!finisFunc) { csPrintfErr("SCF_ERROR: %s doesn't export %s\n", CS::Quote::Single (lib), CS::Quote::Single (sym.GetData())); csPrintLibraryError (sym); } if (initFunc && finisFunc) initFunc (PrivateSCF); } else csPrintLibraryError (lib); }