blob: c4ec51e4dcc869b70696b9fd2e270d6ccf5eeae7 [file] [log] [blame]
Alexandre Julliardade697e1995-11-26 13:59:11 +00001/*
2 * WINElib-Resources
3 *
4 * Copied and modified heavily from loader/resource.c
5 */
6
Alexandre Julliardd4719651995-12-12 18:49:11 +00007#include <stdlib.h>
Marcus Meissner04c3e1d1999-02-19 10:37:02 +00008#include "wine/winestring.h"
Alexandre Julliardd4719651995-12-12 18:49:11 +00009#include "libres.h"
Marcus Meissner317af321999-02-17 13:51:06 +000010#include "resource.h"
Alexandre Julliarda099a551999-06-12 15:45:58 +000011#include "debugtools.h"
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +000012#include "heap.h"
Alexandre Julliard89f079b1999-08-08 18:54:47 +000013#include "crtdll.h"
Alexandre Julliardd7d4fdf1995-12-26 15:05:24 +000014#include "xmalloc.h"
Alexandre Julliardade697e1995-11-26 13:59:11 +000015
Patrik Stridvallb4b9fae1999-04-19 14:56:29 +000016DEFAULT_DEBUG_CHANNEL(resource)
17
Alexandre Julliardade697e1995-11-26 13:59:11 +000018typedef struct RLE
19{
Alexandre Julliarda845b881998-06-01 10:44:35 +000020 const wrc_resource32_t * const * Resources; /* NULL-terminated array of pointers */
Alexandre Julliardd7d4fdf1995-12-26 15:05:24 +000021 struct RLE* next;
Alexandre Julliardade697e1995-11-26 13:59:11 +000022} ResListE;
23
24static ResListE* ResourceList=NULL;
25
Alexandre Julliarda845b881998-06-01 10:44:35 +000026void LIBRES_RegisterResources(const wrc_resource32_t * const * Res)
Alexandre Julliardade697e1995-11-26 13:59:11 +000027{
28 ResListE** Curr;
29 ResListE* n;
30 for(Curr=&ResourceList; *Curr; Curr=&((*Curr)->next)) { }
Alexandre Julliardd4719651995-12-12 18:49:11 +000031 n=xmalloc(sizeof(ResListE));
Alexandre Julliardd7d4fdf1995-12-26 15:05:24 +000032 n->Resources=Res;
33 n->next=NULL;
34 *Curr=n;
Alexandre Julliardade697e1995-11-26 13:59:11 +000035}
36
37/**********************************************************************
Alexandre Julliard46ea8b31998-05-03 19:01:20 +000038 * LIBRES_FindResource
Alexandre Julliardade697e1995-11-26 13:59:11 +000039 */
Ulrich Czekallae91d9761999-09-27 13:31:47 +000040typedef int (*CmpFunc_t)(LPCWSTR a, LPCWSTR b, int c);
41
42int CompareOrdinal(LPCWSTR ordinal, LPCWSTR resstr, int resid)
43{
44 return !resstr && (resid == LOWORD(ordinal));
45}
46
47int CompareName(LPCWSTR name, LPCWSTR resstr, int resid)
48{
49 return resstr && !CRTDLL__wcsnicmp(resstr+1, name, *(resstr));
50}
51
Alexandre Julliarda3960291999-02-26 11:11:13 +000052HRSRC LIBRES_FindResource( HINSTANCE hModule, LPCWSTR name, LPCWSTR type )
Alexandre Julliard75d86e11996-11-17 18:59:11 +000053{
Ulrich Czekallae91d9761999-09-27 13:31:47 +000054 LPCWSTR nameid = name, typeid = type;
Alexandre Julliard75d86e11996-11-17 18:59:11 +000055 ResListE* ResBlock;
Alexandre Julliarda845b881998-06-01 10:44:35 +000056 const wrc_resource32_t* const * Res;
Ulrich Czekallae91d9761999-09-27 13:31:47 +000057 CmpFunc_t EqualNames = CompareOrdinal;
58 CmpFunc_t EqualTypes = CompareOrdinal;
Alexandre Julliard75d86e11996-11-17 18:59:11 +000059
60 if(HIWORD(name))
61 {
62 if(*name=='#')
63 {
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +000064 LPSTR nameA = HEAP_strdupWtoA( GetProcessHeap(), 0, name );
Ulrich Czekallae91d9761999-09-27 13:31:47 +000065 nameid = (LPCWSTR) atoi(nameA+1);
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +000066 HeapFree( GetProcessHeap(), 0, nameA );
Alexandre Julliard75d86e11996-11-17 18:59:11 +000067 }
Alexandre Julliard75d86e11996-11-17 18:59:11 +000068 else
Ulrich Czekallae91d9761999-09-27 13:31:47 +000069 EqualNames = CompareName;
Alexandre Julliard75d86e11996-11-17 18:59:11 +000070 }
Ulrich Czekallae91d9761999-09-27 13:31:47 +000071
Alexandre Julliard75d86e11996-11-17 18:59:11 +000072 if(HIWORD(type))
73 {
74 if(*type=='#')
75 {
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +000076 LPSTR typeA = HEAP_strdupWtoA( GetProcessHeap(), 0, type );
Ulrich Czekallae91d9761999-09-27 13:31:47 +000077 typeid= (LPCWSTR) atoi(typeA+1);
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +000078 HeapFree( GetProcessHeap(), 0, typeA );
Alexandre Julliard75d86e11996-11-17 18:59:11 +000079 }
80 else
Ulrich Czekallae91d9761999-09-27 13:31:47 +000081 EqualTypes = CompareName;
Alexandre Julliard75d86e11996-11-17 18:59:11 +000082 }
Alexandre Julliard75d86e11996-11-17 18:59:11 +000083
84 for(ResBlock=ResourceList; ResBlock; ResBlock=ResBlock->next)
85 for(Res=ResBlock->Resources; *Res; Res++)
Ulrich Czekallae91d9761999-09-27 13:31:47 +000086 if (EqualNames(nameid, (*Res)->resname, (*Res)->resid) &&
87 EqualTypes(typeid, (*Res)->restypename, (*Res)->restype))
Alexandre Julliarda3960291999-02-26 11:11:13 +000088 return (HRSRC)*Res;
Ulrich Czekallae91d9761999-09-27 13:31:47 +000089
Alexandre Julliard75d86e11996-11-17 18:59:11 +000090 return 0;
91}
92
Alexandre Julliardade697e1995-11-26 13:59:11 +000093
94/**********************************************************************
95 * LIBRES_LoadResource
96 */
Alexandre Julliarda3960291999-02-26 11:11:13 +000097HGLOBAL LIBRES_LoadResource( HINSTANCE hModule, HRSRC hRsrc )
Alexandre Julliardade697e1995-11-26 13:59:11 +000098{
Alexandre Julliarda3960291999-02-26 11:11:13 +000099 return (HGLOBAL)(((wrc_resource32_t*)hRsrc)->data);
Alexandre Julliardade697e1995-11-26 13:59:11 +0000100}
101
102
103/**********************************************************************
Alexandre Julliardade697e1995-11-26 13:59:11 +0000104 * LIBRES_SizeofResource
105 */
Alexandre Julliarda3960291999-02-26 11:11:13 +0000106DWORD LIBRES_SizeofResource( HINSTANCE hModule, HRSRC hRsrc )
Alexandre Julliardade697e1995-11-26 13:59:11 +0000107{
Alexandre Julliarda845b881998-06-01 10:44:35 +0000108 return (DWORD)(((wrc_resource32_t*)hRsrc)->datasize);
Alexandre Julliardade697e1995-11-26 13:59:11 +0000109}