Ignore:
Timestamp:
Aug 2, 2007, 6:20:51 PM (14 years ago)
Author:
Eugene Romanenko
Message:
  • If the filename does not have an extension or the extension is unknown, it will check file data to determine a suitable plugin (closes #43)
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Lucide/SOURCE/gui/pluginman.cpp

    r140 r215  
    3939#include "luutils.h"
    4040#include <dos.h>
     41#include <fcntl.h>
     42#include <stdio.h>
    4143#include <ludoc.xh>
    4244
     
    8789{
    8890    // Function pointer variables
    89     LuDocument * APIENTRY (*pCreateObject)();
    90     char * APIENTRY (*pGetSupportedExtensions)();
    91     char * APIENTRY (*pGetDescription)();
     91    LuDocument * APIENTRY (*pCreateObject)()      = NULL;
     92    char * APIENTRY (*pGetSupportedExtensions)()  = NULL;
     93    char * APIENTRY (*pGetDescription)()          = NULL;
     94    LuCheckStruct * APIENTRY (*pGetCheckStruct)() = NULL;
    9295
    9396    std::string fulldllname = path;
     
    111114        if ( DosQueryProcAddr( h, 0, "getDescription", (PFN *)&pGetDescription ) != 0 )
    112115            break;
     116
     117        // optional
     118        if ( DosQueryProcAddr( h, 0, "getCheckStruct", (PFN *)&pGetCheckStruct ) != 0 ) {
     119            pGetCheckStruct = NULL;
     120        }
    113121
    114122        res = true;
     
    122130        pi.extensions = pGetSupportedExtensions();
    123131        pi.description = pGetDescription();
     132        pi.checkStruct = ( pGetCheckStruct == NULL ) ? NULL : pGetCheckStruct();
    124133
    125134        plugins->push_back( pi );
     
    136145    }
    137146
    138     LuDocument * APIENTRY (*pCreateObject)();
     147    LuDocument * APIENTRY (*pCreateObject)() = NULL;
    139148
    140149    for ( int i = 0; i < plugins->size(); i++ )
     
    178187}
    179188
     189static bool checkDataEntry( LuCheckData *data, int h )
     190{
     191    lseek( h, data->offset, SEEK_SET );
     192    unsigned char *buf = new char[ data->length ];
     193    read( h, buf, data->length );
     194    bool result = ( memcmp( data->data, buf, data->length ) == 0 );
     195    delete buf;
     196    return result;
     197}
     198
     199static bool checkData( LuCheckStruct *checkStruct, const char *file )
     200{
     201    int h = open( file, O_RDONLY | O_BINARY );
     202
     203    if ( h != -1 )
     204    {
     205        bool result = true;
     206
     207        for ( unsigned long i = 0; i < checkStruct->count; i++ )
     208        {
     209            if ( !checkDataEntry( &(checkStruct->cdata[ i ]), h ) ) {
     210                result = false;
     211                break;
     212            }
     213        }
     214
     215        close( h );
     216        return result;
     217    }
     218
     219    return false;
     220}
     221
     222// returns NULL if not suitable plugin found
     223// if checkOnly is true - just check if suitable plugin exist
     224LuDocument *PluginManager::createDocumentForFile( const char *file, bool checkOnly )
     225{
     226    LuDocument *ld = NULL;
     227
     228    // Search by extension
     229    char *ext = strrchr( file, '.' );
     230    if ( ext != NULL ) {
     231        ld = createDocumentForExt( ext + 1, checkOnly );
     232    }
     233
     234    if ( ld != NULL ) {
     235        return ld;
     236    }
     237
     238    // Search by checkstruct
     239    LuDocument * APIENTRY (*pCreateObject)() = NULL;
     240
     241    for ( int i = 0; i < plugins->size(); i++ )
     242    {
     243        PluginInfo *pi = &(*plugins)[ i ];
     244
     245        if ( pi->checkStruct != NULL )
     246        {
     247            if ( checkData( pi->checkStruct, file ) )
     248            {
     249                if ( DosQueryProcAddr( pi->handle, 0, "createObject",
     250                                       (PFN *)&pCreateObject ) == 0 )
     251                {
     252                    if ( checkOnly ) {
     253                        return (LuDocument *)TRUE;
     254                    }
     255                    else {
     256                        return pCreateObject();
     257                    }
     258                }
     259            }
     260        }
     261    }
     262
     263    return NULL;
     264}
    180265
    181266std::string PluginManager::getExtsMask()
     
    198283}
    199284
     285
Note: See TracChangeset for help on using the changeset viewer.