UnitLoader.cpp

Go to the documentation of this file.
00001 /*
00002 *        This file contains class that helps you load working unit from DLL.
00003 *
00004 *       Author:
00005 *                       Tomas Mrkvicka
00006 *                       xmrkvi03@stud.fit.vutbr.cz
00007 *
00008 */
00009 
00010 #include "pipeline/UnitLoader.h"
00011 
00012 ////////////////////////////////////////////////////////////////////////////////
00013 ////////////////////////////////////////////////////////////////////////////////
00014 ////////////////////////////////////////////////////////////////////////////////
00015 // TUnitLoader
00016 
00017 /** Konstruktor.
00018 */
00019 TUnitLoader::TUnitLoader(void)
00020 {
00021         m_unit          = NULL;
00022         m_library       = NULL;
00023 }
00024 //OK 2007-08-25 18:22:54 B04-315B\Tom
00025 
00026 /** Destruktor.
00027 *
00028 *       Zavre otevrenou knihovnu (pokud existuje).
00029 *
00030 *       Pred volanim destruktoru musi byt jednotka z dane DLL knihovny znicena.
00031 */
00032 TUnitLoader::~TUnitLoader(void)
00033 {
00034         if ( m_library )
00035         {
00036                 //zavreme knihovnu
00037                 FreeLibrary( m_library );
00038                 m_library = NULL;
00039         }
00040 }
00041 //OK 2007-08-25 18:22:57 B04-315B\Tom
00042 
00043 /** Ziska jednotku ze zadane knihovny.
00044 *
00045 *       Metoda muze vratit ukazatel na drive vracenou jednotku, pokud uz byla nekdy
00046 *       nejaka jednotka uvnitr objektu vytvorena.
00047 *
00048 *       Pri chybe vraci metoda NULL.
00049 *
00050 *       \param  dllName         [in] jmeno souboru s knihovnou
00051 *       \param  dispatcher      [in] ukazatel na platny dispatcher pouzity v aplikaci
00052 */
00053 TUnitInterface* TUnitLoader::GetUnit_BASIC(const char * dllName , TDispatcherInterface * dispatcher)
00054 {
00055         // pokud jiz existuje nejaka jednotka pak ji vratime
00056         if ( m_unit )
00057         {
00058                 return m_unit;
00059         }
00060         else
00061         {
00062                 //musime jednotku nacist
00063                 m_library = LoadLibrary( dllName );
00064                 if ( ! m_library )
00065                 {
00066                         return NULL;
00067                 }
00068 
00069                 //overime typ jednotky
00070                 PTR_DLLTYPE type_ptr = (PTR_DLLTYPE) GetProcAddress( m_library, "GetType" );
00071                 if ( ! type_ptr )
00072                 {
00073                         FreeLibrary( m_library );
00074                         m_library = NULL;
00075 
00076                         return NULL;
00077                 }
00078 
00079                 //ziskame typ a overime
00080                 EnumDLLType dllType = (*type_ptr)();
00081                 if ( dllType != ENUM_DLLTYPE_BASIC )
00082                 {
00083                         FreeLibrary( m_library );
00084                         m_library = NULL;
00085 
00086                         return NULL;
00087                 }
00088 
00089                 //ziskame objekt z knihovny
00090                 PTR_UNITGET_BASIC fce_ptr = (PTR_UNITGET_BASIC)GetProcAddress( m_library, "CreateUnit" );
00091                 if ( ! fce_ptr )
00092                 {
00093                         FreeLibrary( m_library );
00094                         m_library = NULL;
00095 
00096                         return NULL;
00097                 }
00098 
00099                 //vytvorime objekt
00100                 m_unit = (*fce_ptr)( dispatcher );
00101 
00102                 if ( ! m_unit )
00103                 {
00104                         FreeLibrary( m_library );
00105                         m_library = NULL;
00106                 }
00107 
00108                 return m_unit;
00109         }
00110 }
00111 //OK 2007-08-25 18:23:20 B04-315B\Tom
00112 
00113 /** Ziska jednotku ze zadane knihovny.
00114 *
00115 *       Metoda muze vratit ukazatel na drive vracenou jednotku, pokud uz byla nekdy
00116 *       nejaka jednotka uvnitr objektu vytvorena.
00117 *
00118 *       Pri chybe vraci metoda NULL.
00119 *
00120 *       \param  dllName         [in] jmeno souboru s knihovnou
00121 *       \param  dispatcher      [in] ukazatel na platny dispatcher pouzity v aplikaci
00122 *       \param  str                     [in] retezec predany jednotce jako druhy parametr
00123 */
00124 TUnitInterface* TUnitLoader::GetUnit_STRING(
00125         const char * dllName ,
00126         TDispatcherInterface * dispatcher,
00127         const char * str
00128         )
00129 {
00130         // pokud jiz existuje nejaka jednotka pak ji vratime
00131         if ( m_unit )
00132         {
00133                 return m_unit;
00134         }
00135         else
00136         {
00137                 //musime jednotku nacist
00138                 m_library = LoadLibrary( dllName );
00139                 if ( ! m_library )
00140                 {
00141                         return NULL;
00142                 }
00143 
00144                 //overime typ jednotky
00145                 PTR_DLLTYPE type_ptr = (PTR_DLLTYPE) GetProcAddress( m_library, "GetType" );
00146                 if ( ! type_ptr )
00147                 {
00148                         FreeLibrary( m_library );
00149                         m_library = NULL;
00150 
00151                         return NULL;
00152                 }
00153 
00154                 //ziskame typ a overime
00155                 EnumDLLType dllType = (*type_ptr)();
00156                 if ( dllType != ENUM_DLLTYPE_STRING )
00157                 {
00158                         FreeLibrary( m_library );
00159                         m_library = NULL;
00160 
00161                         return NULL;
00162                 }
00163 
00164                 //ziskame objekt z knihovny
00165                 PTR_UNITGET_STRING fce_ptr = (PTR_UNITGET_STRING)GetProcAddress( m_library, "CreateUnit" );
00166                 if ( ! fce_ptr )
00167                 {
00168                         FreeLibrary( m_library );
00169                         m_library = NULL;
00170 
00171                         return NULL;
00172                 }
00173 
00174                 //vytvorime objekt
00175                 m_unit = (*fce_ptr)( dispatcher, str );
00176 
00177                 if ( ! m_unit )
00178                 {
00179                         FreeLibrary( m_library );
00180                         m_library = NULL;
00181                 }
00182 
00183                 return m_unit;
00184         }
00185 }
00186 //OK 2007-08-25 18:23:23 B04-315B\Tom
00187 
00188 // TUnitLoader
00189 ////////////////////////////////////////////////////////////////////////////////
00190 ////////////////////////////////////////////////////////////////////////////////
00191 ////////////////////////////////////////////////////////////////////////////////

Generated on Sat Nov 17 16:23:26 2007 for Image Processing Pipeline by  doxygen 1.4.6-NO