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 ); }
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 ); }
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 */
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 */
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 ); }
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 ); }
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 ); }
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 ); }
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 ); }