/* Copyright (c) 2002-2012 Croteam Ltd. All rights reserved. */

#ifndef SE_INCL_DYNAMICLOADER_H
#define SE_INCL_DYNAMICLOADER_H
#ifdef PRAGMA_ONCE
  #pragma once
#endif

/*
 * This class handles DLL loading in a platform-abstracted manner.
 */
class ENGINE_API CDynamicLoader {
public:
    // Construct a CDynamicLoader to handle symbol lookups in a shared lib.
    // (libname) is a platform-independent filename. If you specify "game",
    //  then you get "Game.dll" on windows, and "libgame.so" on Linux.
    //  You should ALWAYS use lowercase, unless you know what you're doing.
  static CDynamicLoader *GetInstance(const char *libname);

    // Convert a win32 DLL path to a platform-specific equivalent.
    //  ("Bin\\Entities.dll" becomes "Bin/libEntities.so" on Linux, etc.)
  static CTFileName ConvertLibNameToPlatform(const char *libname);

  virtual ~CDynamicLoader(void) {}

    // Lookup (sym) and return a pointer to it.
    //  Returns NULL on error/symbol not found.
  virtual void *FindSymbol(const char *sym) = 0;

    // return a human-readable error message. NULL if there's no error.
  virtual const char *GetError(void) = 0;

protected:
    // use GetInstance(), instead.
  CDynamicLoader() {}
};

#endif

// end of DynamicLoader.h ...