source: trunk/Lucide/SOURCE/gui/pluginman.cpp @ 33

Last change on this file since 33 was 25, checked in by Eugene Romanenko, 16 years ago

implemented D&D into view window

File size: 4.0 KB
Line 
1#define INCL_DOS
2#include <os2.h>
3
4#include "pluginman.h"
5#include "luutils.h"
6#include <dos.h>
7#include <ludoc.xh>
8
9
10PluginManager::PluginManager()
11{
12    plugins = new PluginInfoList;
13
14    // Find exe path
15    char buffer[ _MAX_PATH ];
16    char drive[ _MAX_DRIVE ];
17    char dir[ _MAX_DIR ];
18    _splitpath( __argv[0], drive, dir, NULL, NULL );
19    _makepath( buffer, drive, dir, NULL, NULL );
20    strcat( buffer, "\\LU*.DLL" );
21
22    // enum plugins, except for LUDOC.DLL, which is 'null' plugin
23    struct find_t ffblk;
24    unsigned done = _dos_findfirst( buffer, _A_RDONLY | _A_NORMAL, &ffblk );
25    while ( done == 0 )
26    {
27        if ( stricmp( ffblk.name, "LUDOC.DLL" ) != 0 ) {
28            loadPlugin( ffblk.name );
29        }
30        done = _dos_findnext( &ffblk );
31    }
32    _dos_findclose( &ffblk );
33}
34
35PluginManager::~PluginManager()
36{
37    for ( int i = 0; i < plugins->size(); i++ )
38    {
39        PluginInfo *pi = &(*plugins)[ i ];
40        DosFreeModule( pi->handle );
41        //printf( "NAME: %s  EXT: %s  DESC: %s\n", pi->name.c_str(),
42        //        pi->extensions.c_str(), pi->description.c_str() );
43    }
44    delete plugins;
45}
46
47void PluginManager::loadPlugin( const char *dllname )
48{
49    // Function pointer variables
50    LuDocument * APIENTRY (*pCreateObject)();
51    char * APIENTRY (*pGetSupportedExtensions)();
52    char * APIENTRY (*pGetDescription)();
53
54    // cut DLL name at last point
55    char *lpoint = strrchr( dllname, '.' );
56    *lpoint = '\0';
57
58    // load a DLL
59    HMODULE h = NULLHANDLE;
60    bool res = false;
61    do
62    {
63        if ( DosLoadModule( NULL, 0, dllname, &h ) != 0 )
64            break;
65        if ( DosQueryProcAddr( h, 0, "createObject", (PFN *)&pCreateObject ) != 0 )
66            break;
67        if ( DosQueryProcAddr( h, 0, "getSupportedExtensions", (PFN *)&pGetSupportedExtensions ) != 0 )
68            break;
69        if ( DosQueryProcAddr( h, 0, "getDescription", (PFN *)&pGetDescription ) != 0 )
70            break;
71
72        res = true;
73    } while (0);
74
75    if ( res )
76    {
77        PluginInfo pi;
78        pi.handle = h;
79        pi.name = dllname;
80        pi.extensions = pGetSupportedExtensions();
81        pi.description = pGetDescription();
82
83        plugins->push_back( pi );
84    }
85}
86
87
88// returns NULL if not suitable plugin found
89// if checkOnly is true - just check if suitable plugin exist
90LuDocument *PluginManager::createDocumentForExt( const char *ext, bool checkOnly )
91{
92        if ( ext == NULL ) {
93                return NULL;
94        }
95
96    LuDocument * APIENTRY (*pCreateObject)();
97
98    for ( int i = 0; i < plugins->size(); i++ )
99    {
100        PluginInfo *pi = &(*plugins)[ i ];
101
102        char *cExt = new char[ strlen( ext ) + 5 ];
103        strcpy( cExt, ";" );
104        strcat( cExt, ext );
105        strcat( cExt, ";" );
106        strupr( cExt );
107
108        char *cExts = new char[ pi->extensions.length() + 5 ];
109        strcpy( cExts, ";" );
110        strcat( cExts, pi->extensions.c_str() );
111        strcat( cExts, ";" );
112        strupr( cExts );
113
114        if ( strstr( cExts, cExt ) != NULL )
115        {
116            if ( DosQueryProcAddr( pi->handle, 0, "createObject",
117                                   (PFN *)&pCreateObject ) == 0 )
118            {
119                delete cExt;
120                delete cExts;
121
122                if ( checkOnly ) {
123                    return (LuDocument *)TRUE;
124                }
125                else {
126                    return pCreateObject();
127                }
128            }
129        }
130
131        delete cExt;
132        delete cExts;
133    }
134
135    return NULL;
136}
137
138
139std::string PluginManager::getExtsMask()
140{
141    std::string cRet = "";
142
143    for ( int i = 0; i < plugins->size(); i++ )
144    {
145        PluginInfo *pi = &(*plugins)[ i ];
146        char *tmpexts = newstrdup( pi->extensions.c_str() );
147        char *p = strtok( tmpexts, ";" );
148        while( p != NULL ) {
149            cRet += "*.";
150            cRet += p;
151            cRet += ";";
152            p = strtok( NULL, ";" );
153        }
154    }
155    return cRet;
156}
157
Note: See TracBrowser for help on using the repository browser.