Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/SuperOrxoBros_HS18/src/libraries/core/module/DynLib.cc @ 12177

Last change on this file since 12177 was 12177, checked in by siramesh, 5 years ago

Super Orxo Bros Final (Sidharth Ramesh, Nisa Balta, Jeff Ren)

File size: 4.8 KB
Line 
1/*
2-----------------------------------------------------------------------------
3This source file is part of OGRE
4    (Object-oriented Graphics Rendering Engine)
5For the latest info, see http://www.ogre3d.org/
6
7Copyright (c) 2000-2006 Torus Knot Software Ltd
8Also see acknowledgements in Readme.html
9
10This program is free software; you can redistribute it and/or modify it under
11the terms of the GNU Lesser General Public License as published by the Free Software
12Foundation; either version 2 of the License, or (at your option) any later
13version.
14
15This program is distributed in the hope that it will be useful, but WITHOUT
16ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
17FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
18
19You should have received a copy of the GNU Lesser General Public License along with
20this program; if not, write to the Free Software Foundation, Inc., 59 Temple
21Place - Suite 330, Boston, MA 02111-1307, USA, or go to
22http://www.gnu.org/copyleft/lesser.txt.
23
24You may alternatively use this source under the terms of a specific version of
25the OGRE Unrestricted License provided you have obtained such a license from
26Torus Knot Software Ltd.
27-----------------------------------------------------------------------------
28*/
29
30// 08/11/2009: Small adjustments for Orxonox by Fabian 'x3n' Landau
31
32#include "DynLib.h"
33
34#include <algorithm>
35
36#include "util/Exception.h"
37
38#ifdef ORXONOX_PLATFORM_WINDOWS
39#  define WIN32_LEAN_AND_MEAN
40#  ifndef NOMINMAX
41#    define NOMINMAX // required to stop windows.h messing up std::min
42#  endif
43#  include <windows.h>
44#endif
45
46#ifdef ORXONOX_PLATFORM_UNIX
47#  include <dlfcn.h>
48#endif
49
50#ifdef ORXONOX_PLATFORM_APPLE
51#   include <OSX/macUtils.h> // OGRE include
52#endif
53
54namespace orxonox
55{
56    //-----------------------------------------------------------------------
57    DynLib::DynLib( const std::string& name )
58    {
59        mName = name;
60        m_hInst = nullptr;
61    }
62
63    //-----------------------------------------------------------------------
64    DynLib::~DynLib()
65    {
66    }
67
68    //-----------------------------------------------------------------------
69    void DynLib::load()
70    {
71        // Log library load
72        orxout(internal_info) << "load DynLib " << mName << endl;
73
74        std::string name = mName;
75#ifdef ORXONOX_PLATFORM_LINUX
76        // dlopen() does not add .so to the filename, like windows does for .dll
77        if (name.substr(name.length() - 3, 3) != ".so")
78           name += ".so";
79#elif defined(ORXONOX_PLATFORM_APPLE)
80        // dlopen() does not add .dylib to the filename, like windows does for .dll
81        if (name.substr(name.length() - 6, 6) != ".dylib")
82            name += ".dylib";
83#elif defined(ORXONOX_PLATFORM_WINDOWS)
84        //altered search path doesn't work with paths with forward slashes
85        std::replace(name.begin(), name.end(), '/', '\\');
86        // Although LoadLibraryEx will add .dll itself when you only specify the library name,
87        // if you include a relative path then it does not. So, add it to be sure.
88        if (name.substr(name.length() - 4, 4) != ".dll")
89            name += ".dll";
90#endif
91
92        m_hInst = (DYNLIB_HANDLE)DYNLIB_LOAD( name.c_str() );
93
94        if (!m_hInst)
95            ThrowException(
96                General,
97                "Could not load dynamic library " + mName +
98                ".  System Error: " + dynlibError());
99    }
100
101    //-----------------------------------------------------------------------
102    void DynLib::unload()
103    {
104        // Log library unload
105        orxout(internal_info) << "unload DynLib " << mName << endl;
106
107        if (DYNLIB_UNLOAD( m_hInst ))
108        {
109            ThrowException(
110                General,
111                "Could not unload dynamic library " + mName +
112                ".  System Error: " + dynlibError());
113        }
114
115    }
116
117    //-----------------------------------------------------------------------
118    void* DynLib::getSymbol( const std::string& strName ) const throw()
119    {
120        return (void*)DYNLIB_GETSYM( m_hInst, strName.c_str() );
121    }
122    //-----------------------------------------------------------------------
123    std::string DynLib::dynlibError( void )
124    {
125#if defined(ORXONOX_PLATFORM_WINDOWS)
126        LPVOID lpMsgBuf;
127        FormatMessage(
128            FORMAT_MESSAGE_ALLOCATE_BUFFER |
129            FORMAT_MESSAGE_FROM_SYSTEM |
130            FORMAT_MESSAGE_IGNORE_INSERTS,
131            nullptr,
132            GetLastError(),
133            MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
134            (LPTSTR) &lpMsgBuf,
135            0,
136            nullptr
137            );
138        std::string ret = (char*)lpMsgBuf;
139        // Free the buffer.
140        LocalFree( lpMsgBuf );
141        return ret;
142#elif defined(ORXONOX_PLATFORM_UNIX)
143        return std::string(dlerror());
144#else
145        return "";
146#endif
147    }
148}
Note: See TracBrowser for help on using the repository browser.