license headers in libnetxms changed to LGPL
[public/netxms.git] / src / libnetxms / dload.cpp
index dfd316a..520c794 100644 (file)
@@ -1,11 +1,11 @@
 /* 
 ** NetXMS - Network Management System
 ** Utility Library
-** Copyright (C) 2003, 2004, 2005, 2006 Victor Kirhenshtein
+** Copyright (C) 2003-2010 Victor Kirhenshtein
 **
 ** This program is free software; you can redistribute it and/or modify
-** it under the terms of the GNU General Public License as published by
-** the Free Software Foundation; either version 2 of the License, or
+** it under the terms of the GNU Lesser General Public License as published
+** by the Free Software Foundation; either version 3 of the License, or
 ** (at your option) any later version.
 **
 ** This program is distributed in the hope that it will be useful,
 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 ** GNU General Public License for more details.
 **
-** You should have received a copy of the GNU General Public License
+** You should have received a copy of the GNU Lesser General Public License
 ** along with this program; if not, write to the Free Software
 ** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 **
-** $module: dload.cpp
+** File: dload.cpp
 **
 **/
 
 #include "libnetxms.h"
 
 #if defined(_NETWARE)
+#undef SEVERITY_CRITICAL
 #include <netware.h>
 #elif !defined(_WIN32)
 #include <dlfcn.h>
@@ -70,34 +71,48 @@ static char *m_pszErrorText[] =
 // Load DLL/shared library
 //
 
-HMODULE LIBNETXMS_EXPORTABLE DLOpen(TCHAR *szLibName, TCHAR *pszErrorText)
+HMODULE LIBNETXMS_EXPORTABLE DLOpen(const TCHAR *pszLibName, TCHAR *pszErrorText)
 {
    HMODULE hModule;
 
 #if defined(_WIN32)
-   hModule = LoadLibrary(szLibName);
-   if (hModule == NULL)
+   hModule = LoadLibrary(pszLibName);
+   if ((hModule == NULL) && (pszErrorText != NULL))
       GetSystemErrorText(GetLastError(), pszErrorText, 255);
 #elif defined(_NETWARE)
    TCHAR szBuffer[MAX_PATH + 4];
    int nError;
 
-   nx_strncpy(&szBuffer[4], szLibName, MAX_PATH);
+   nx_strncpy(&szBuffer[4], pszLibName, MAX_PATH);
    nError = LoadModule(getnetwarelogger(), &szBuffer[4], LO_RETURN_HANDLE);
    if (nError == 0)
    {
       hModule = *((HMODULE *)szBuffer);
-      *pszErrorText = 0;
+               if (pszErrorText != NULL)
+       *pszErrorText = 0;
    }
    else
    {
       hModule = NULL;
-      nx_strncpy(pszErrorText, (nError <= 19) ? m_pszErrorText[nError] : "Unknown error code", 255);
+               if (pszErrorText != NULL)
+       nx_strncpy(pszErrorText, (nError <= 19) ? m_pszErrorText[nError] : "Unknown error code", 255);
    }
-#else    /* _WIN32 */
-   hModule = dlopen(szLibName, RTLD_NOW | RTLD_GLOBAL);
-   if (hModule == NULL)
+#else    /* not _WIN32 and not _NETWARE */
+#ifdef UNICODE
+       char *mbbuffer = MBStringFromWideString(pszLibName);
+   hModule = dlopen(mbbuffer, RTLD_NOW | RTLD_GLOBAL);
+   if ((hModule == NULL) && (pszErrorText != NULL))
+   {
+       WCHAR *wbuffer = WideStringFromMBString(dlerror());
+      nx_strncpy(pszErrorText, wbuffer, 255);
+      free(wbuffer);
+   }
+   free(mbbuffer);
+#else
+   hModule = dlopen(pszLibName, RTLD_NOW | RTLD_GLOBAL);
+   if ((hModule == NULL) && (pszErrorText != NULL))
       nx_strncpy(pszErrorText, dlerror(), 255);
+#endif
 #endif
    return hModule;
 }
@@ -131,7 +146,7 @@ void LIBNETXMS_EXPORTABLE DLClose(HMODULE hModule)
 //
 
 void LIBNETXMS_EXPORTABLE *DLGetSymbolAddr(HMODULE hModule,
-                                                                                  TCHAR *pszSymbol,
+                                                                                  const TCHAR *pszSymbol,
                                                                                   TCHAR *pszErrorText)
 {
    void *pAddr;
@@ -153,9 +168,23 @@ void LIBNETXMS_EXPORTABLE *DLGetSymbolAddr(HMODULE hModule,
    if (pszErrorText != NULL)
       *pszErrorText = 0;
 #else    /* _WIN32 */
+#ifdef UNICODE
+   char mbbuffer[256];
+
+   WideCharToMultiByte(CP_ACP, WC_COMPOSITECHECK | WC_DEFAULTCHAR,
+                       pszSymbol, -1, mbbuffer, 256, NULL, NULL);
+   pAddr = dlsym(hModule, mbbuffer);
+   if ((pAddr == NULL) && (pszErrorText != NULL))
+   {
+       WCHAR *wbuffer = WideStringFromMBString(dlerror());
+      nx_strncpy(pszErrorText, wbuffer, 255);
+      free(wbuffer);
+   }
+#else
    pAddr = dlsym(hModule, pszSymbol);
    if ((pAddr == NULL) && (pszErrorText != NULL))
       nx_strncpy(pszErrorText, dlerror(), 255);
+#endif
 #endif
    return pAddr;
 }