Example #1
0
int WResLoadResourceX( PHANDLE_INFO hinfo, lpcstr idType, lpcstr idResource,
                                    lpstr *lpszBuffer, size_t *bufferSize )
/*************************************************************************/
{
    WResID              *resource_type;
    WResID              *resource_id;
    int                 rc;

    if( IS_INTRESOURCE( idResource ) ) {
        resource_id = WResIDFromNum( (uint_16)RESOURCE2INT( idResource ) );
    } else {
        resource_id = WResIDFromStrF( idResource );
    }
    if( IS_INTRESOURCE( idType ) ) {
        resource_type = WResIDFromNum( (uint_16)RESOURCE2INT( idType ) );
    } else {
        resource_type = WResIDFromStrF( idType );
    }
    rc = WResLoadResource2( MainDir, hinfo, resource_type, resource_id, lpszBuffer, bufferSize );
    if( resource_type != NULL )
        WResIDFree( resource_type );
    if( resource_id != NULL )
        WResIDFree( resource_id );
    return( rc );
}
Example #2
0
DepInfo *WResGetAutoDep( const char *fname )
{
    WResFileID      handle;
    WResDir         dir;
    bool            dup_discarded;
    WResID          *name;
    WResID          *type;
    WResDirWindow   window;
    WResLangInfo    *info;
    DepInfo         *ret;
    WResFileSSize   numread;

    ret = NULL;
    handle = ResOpenFileRO( fname );
    if( handle != WRES_NIL_HANDLE ) {
        if( WResIsWResFile( handle ) && (dir = WResInitDir()) != NULL ) {
            if( !WResReadDir( handle, dir, &dup_discarded ) ) {
                name = WResIDFromStr( DEP_LIST_NAME );
                type = WResIDFromNum( DEP_LIST_TYPE );
                if( name != NULL && type != NULL ) {
                    window = WResFindResource( type, name, dir, NULL );
                    if( WResIsEmptyWindow( window ) ) {
                        WRES_ERROR( WRS_RES_NOT_FOUND );
                    } else {
                        info = WResGetLangInfo( window );
                        if( WRESSEEK( handle, info->Offset, SEEK_SET ) == -1 ) {
                            WRES_ERROR( WRS_SEEK_FAILED );
                        } else {
                            ret = WRESALLOC( info->Length );
                            if( ret == NULL ) {
                                WRES_ERROR( WRS_MALLOC_FAILED );
                            } else {
                                numread = WRESREAD( handle, ret, info->Length );
                                if( numread != (WResFileSSize)info->Length ) {
                                    WRES_ERROR( WRESIOERR( handle, numread ) ? WRS_READ_FAILED : WRS_READ_INCOMPLETE );
                                    ret = NULL;
                                }
                            }
                        }
                    }
                }
                if( name != NULL ) {
                    WResIDFree( name );
                }
                if( type != NULL ) {
                    WResIDFree( type );
                }
            }
            WResFreeDir( dir );
        }
        ResCloseFile( handle );
    }
    return( ret );
}
Example #3
0
static int ConvertMResources( WResFileID infile, WResFileID outfile,
                        WResDir outdir )
/******************************************************************/
{
    MResResourceHeader *    mheader;
    WResID *                name;
    WResID *                type;
    int                     error;
    int                     lastheader;     /*TRUE if lastheader has been read*/
    uint_32                 offset;
    int                     duplicate;

    mheader = MResReadResourceHeader( infile );
    /* assume that any error reading here means end of file */
    lastheader = (mheader == NULL);
    error = FALSE;

    while (!lastheader && !error) {
        name = ConvertNameOrOrdToID( mheader->Name );
        type = ConvertNameOrOrdToID( mheader->Type );
        offset = tell( outfile );

        /* copy the resource if it isn't a name table or if the user */
        /* requested that name tables be copied */
        if (type->IsName || type->ID.Num != RT_NAMETABLE ||
                        CmdLineParms.KeepNameTable ) {
            error = WResAddResource( type, name, mheader->MemoryFlags, offset,
                        mheader->Size, outdir, NULL, &(duplicate) );
            if (duplicate) {
                /* print message and continue */
                puts( "Error: duplicate entry" );
                error = FALSE;
            } else {
                error = BinaryCopy( infile, outfile, mheader->Size );
            }
        } else {
            lseek( infile, mheader->Size, SEEK_CUR );
        }

        WResIDFree( name );
        WResIDFree( type );
        MResFreeResourceHeader( mheader );

        mheader = MResReadResourceHeader( infile );
        /* assume that any error reading here means end of file */
        lastheader = (mheader == NULL);
    }

    return( error );
} /* ConvertMResources */
Example #4
0
static bool ConvertMResources( FILE *in_fp, FILE *out_fp, WResDir outdir )
/************************************************************************/
{
    MResResourceHeader *    mheader;
    WResID *                name;
    WResID *                type;
    bool                    error;
    bool                    lastheader; /* true if lastheader has been read */
    uint_32                 offset;
    bool                    duplicate;

    mheader = MResReadResourceHeader( in_fp );
    /* assume that any error reading here means end of file */
    lastheader = ( mheader == NULL );
    error = false;

    while( !lastheader && !error ) {
        name = ConvertNameOrOrdToID( mheader->Name );
        type = ConvertNameOrOrdToID( mheader->Type );
        offset = RESTELL( out_fp );

        /* copy the resource if it isn't a name table or if the user */
        /* requested that name tables be copied */
        if( type->IsName || type->ID.Num != RESOURCE2INT( RT_NAMETABLE ) ||
                        CmdLineParms.KeepNameTable ) {
            error = WResAddResource( type, name, mheader->MemoryFlags, offset,
                        mheader->Size, outdir, NULL, &duplicate );
            if( duplicate ) {
                /* print message and continue */
                puts( "Error: duplicate entry" );
                error = false;
            } else {
                error = BinaryCopy( in_fp, out_fp, mheader->Size );
            }
        } else {
            RESSEEK( in_fp, mheader->Size, SEEK_CUR );
        }

        WResIDFree( name );
        WResIDFree( type );
        MResFreeResourceHeader( mheader );

        mheader = MResReadResourceHeader( in_fp );
        /* assume that any error reading here means end of file */
        lastheader = ( mheader == NULL );
    }

    return( error );
} /* ConvertMResources */
Example #5
0
bool WRHandleWinNTNameEntry( WResFileID file, WResDir *dir, WResID *type,
                             resource_dir_entry *rd_entry, bool is_name )
{
    WResLangType    def_lang;
    resource_entry  res_entry;
    uint_32         offset;
    WResID          *name;
    bool            add_now;
    bool            ok;

    def_lang.lang = DEF_LANG;
    def_lang.sublang = DEF_SUBLANG;

    /* verify the id_name */
    if ( ((rd_entry->id_name & PE_RESOURCE_MASK_ON) && !is_name) ||
            (!(rd_entry->id_name & PE_RESOURCE_MASK_ON) && is_name) ) {
        WRDisplayErrorMsg( WR_BADIDDISCARDNAME );
        return( FALSE );
    }

    if( is_name ) {
        name = WRGetUniCodeWResID( file, PE_RESOURCE_MASK & rd_entry->id_name );
    } else {
        name = WResIDFromNum( rd_entry->id_name );
    }

    ok = (name != NULL);

    if( ok ) {
        /* is the entry_rva is a subdir */
        if( rd_entry->entry_rva & PE_RESOURCE_MASK_ON ) {
            add_now = false;
            ok = WRHandleWinNTLangIDDir( file, dir, type, name,
                                         rd_entry->entry_rva & PE_RESOURCE_MASK );
        } else {
            /* will this to happen often ???? */
            add_now = true;
            offset = WR_MAP_RES_RVA( rd_entry->entry_rva );
            ok = WRReadResourceEntry( file, offset, &res_entry );
        }
    }

    if( ok ) {
        if( add_now ) {
            offset = WR_MAP_RES_RVA( res_entry.data_rva );
            ok = !WResAddResource( type, name, 0, offset, res_entry.size,
                                   *dir, &def_lang, NULL );
        }
    }

    if( name != NULL ) {
        WResIDFree( name );
    }

    return( ok );
}
Example #6
0
bool WdeSetObjectInfo( OBJPTR dlg, WdeResInfo **ri, WdeResDlgItem **di, WResID *id )
{
    WdeResInfo      *res_info;
    WdeResDlgItem   *item;
    WResID          *name;
    bool            ok;

    ok = (dlg != NULL && id != NULL && ri != NULL && di != NULL);

    if( ok ) {
        ok = ((res_info = WdeGetCurrentRes()) != NULL);
    }

    if( ok ) {
        ok = ((item = WdeAllocResDlgItem()) != NULL);
    }

    if( ok ) {
        ok = ((name = WdeCopyWResID( id )) != NULL);
    }

    if( ok ) {
        item->object = dlg;
        item->dialog_name = name;
        item->modified = true;
        item->is32bit = res_info->is32bit;
        WdeAddResDlgItemToResInfo( res_info, item );
        *ri = res_info;
        *di = item;
    } else {
        if( item != NULL ) {
            WdeFreeResDlgItem( &item, FALSE );
        }
        if( name != NULL ) {
            WResIDFree( name );
        }
    }

    return( ok );
}
Example #7
0
bool WRHandleWinNTTypeEntry( WResFileID file, WResDir *dir,
                             resource_dir_entry *rd_entry, int is_name )
{
    WResID  *type;
    bool    ok;

    /* verify the id_name */
    if( ((rd_entry->id_name & PE_RESOURCE_MASK_ON) && !is_name) ||
            (!(rd_entry->id_name & PE_RESOURCE_MASK_ON) && is_name) ) {
        WRDisplayErrorMsg( WR_BADIDDISCARDTYPE );
        return( FALSE );
    }

    if( is_name ) {
        type = WRGetUniCodeWResID( file, PE_RESOURCE_MASK & rd_entry->id_name );
    } else {
        type = WResIDFromNum( rd_entry->id_name );
    }

    ok = (type != NULL);

    if( ok ) {
        /* verify that entry_rva is a subdir */
        ok = ((rd_entry->entry_rva & PE_RESOURCE_MASK_ON) != 0);
        if( !ok ) {
            WRDisplayErrorMsg( WR_BADRVADISCARDTYPE );
        }
    }

    if( ok ) {
        ok = WRHandleWinNTNameDir( file, dir, type, rd_entry->entry_rva & PE_RESOURCE_MASK );
    }

    if( type != NULL ) {
        WResIDFree( type );
    }

    return( ok );
}
Example #8
0
bool WdeSaveObjectInto( WdeResInfo *rinfo, WdeDialogBoxInfo *dbi,
                        WResID *name, void *data, uint_32 size,
                        WResLangType *lang )
{
    char                *fname;
    WdeGetFileStruct    gf;
    bool                dup;
    WRSaveIntoData      idata;
    WdeResDlgItem       ditem;
    bool                is_rc;
    bool                ok;

    idata.type = NULL;
    fname = NULL;
    dup = false;

    ok = (rinfo != NULL && dbi != NULL && name != NULL && data != NULL);

    if( ok ) {
        gf.file_name = NULL;
        gf.title = WdeDlgSaveIntoTitle;
        gf.filter = WdeResSaveFilter;
        fname = WdeGetOpenFileName( &gf );
        ok = (fname != NULL && *fname != '\0');
    }

    if( ok ) {
        is_rc = WdeIsFileAnRCFile( fname );
        if( !is_rc ) {
            ok = ((idata.type = WResIDFromNum( RESOURCE2INT( RT_DIALOG ) )) != NULL);
        }
    }

    if( ok ) {
        if( is_rc ) {
            memset( &ditem, 0, sizeof( WdeResDlgItem ) );
            ditem.dialog_info = dbi;
            ditem.dialog_name = name;
            ok = WdeSaveObjectToRC( fname, rinfo, &ditem, TRUE );
        } else {
            idata.next = NULL;
            idata.name = name;
            idata.data = data;
            idata.lang = *lang;
            idata.size = size;
            idata.MemFlags = dbi->MemoryFlags;
            ok = WRSaveObjectInto( fname, &idata, &dup ) && !dup;
        }
    }

    if( dup ) {
        WdeDisplayErrorMsg( WDE_DUPRESNAMEINFILE );
    }

    if( fname != NULL ) {
        WRMemFree( fname );
    }

    if( idata.type != NULL ) {
        WResIDFree( idata.type );
    }

    return( ok );
}
Example #9
0
bool WdeSaveObjectAs( WdeResInfo *rinfo, WdeDialogBoxInfo *dbi,
                      char **file_name, WResID *name, void *rdata, uint_32 size,
                      WResLangType *lang, bool get_name )
{
    char                *fname;
    WRFileType          ftype;
    WdeGetFileStruct    gf;
    WRSaveIntoData      idata;
    WdeResDlgItem       ditem;
    bool                is_rc;
    bool                ok;

    fname = NULL;
    idata.type = NULL;

    ok = (rinfo != NULL && dbi != NULL && file_name != NULL &&
          name != NULL && rdata != NULL);

    if( ok ) {
        if( get_name || *file_name == NULL ) {
            gf.file_name = *file_name;
            gf.title = WdeDlgSaveTitle;
            if( get_name ) {
                gf.title = WdeDlgSaveAsTitle;
            }
            gf.filter = WdeResSaveFilter;
            fname = WdeGetSaveFileName( &gf );
        } else {
            fname = WdeStrDup( *file_name );
        }
        ok = (fname != NULL && *fname != '\0');
    }

    if( ok ) {
        ftype = WdeSelectFileType( fname, rinfo->is32bit );
        ok = (ftype != WR_DONT_KNOW);
    }

    if( ok ) {
        is_rc = WdeIsFileAnRCFile( fname );
        ok = ((idata.type = WResIDFromNum( RESOURCE2INT( RT_DIALOG ) )) != NULL);
    }

    if( ok ) {
        memset( &ditem, 0, sizeof( WdeResDlgItem ) );
        ditem.dialog_info = dbi;
        ditem.dialog_name = name;
        if( is_rc ) {
            ok = WdeSaveObjectToRC( fname, rinfo, &ditem, FALSE );
        }
    }

    // if we are saving a .RES file then auto create a dlg script
    if( ok ) {
        if( ftype == WR_WIN16M_RES || ftype == WR_WIN16W_RES ||
            ftype == WR_WINNTM_RES || ftype == WR_WINNTW_RES ) {
            char        dlgName[_MAX_PATH];
            if( WdeCreateDLGName( fname, dlgName ) ) {
                ok = WdeSaveObjectToRC( dlgName, rinfo, &ditem, FALSE );
            }
        }
    }

    if( ok ) {
        idata.next = NULL;
        idata.name = name;
        idata.data = rdata;
        idata.lang = *lang;
        idata.size = size;
        idata.MemFlags = dbi->MemoryFlags;
        ok = WRSaveObjectAs( fname, ftype, &idata );
    }

    if( idata.type != NULL ) {
        WResIDFree( idata.type );
    }

    if( ok ) {
        if( fname != NULL ) {
            if( *file_name != NULL ) {
                WRMemFree( *file_name );
            }
            *file_name = fname;
        }
    } else {
        if( fname != NULL ) {
            WRMemFree( fname );
        }
    }

    return( ok );
}