source: branches/2.20_branch/hlpmgr/helptables.c@ 454

Last change on this file since 454 was 26, checked in by RBRi, 19 years ago

+ helpmgr files

  • Property svn:eol-style set to native
File size: 9.1 KB
Line 
1#include <stdlib.h>
2#include <string.h>
3
4#define INCL_WINHELP
5#define INCL_DOSRESOURCES
6#include <os2.h>
7
8#include "HelpTables.h"
9#include "log.h"
10
11void LoadHelpTableFromResource( PHELPTABLE* ppHelpTable,
12 HMODULE Module,
13 USHORT idHelpTable )
14{
15 int i;
16 int TableEntryCount;
17 APIRET rc;
18 USHORT idSubTable;
19 PHELPTABLE pHelpTable;
20 PHELPSUBTABLE2 pHelpSubTable;
21 PVOID pResourceData;
22 ULONG ulResourceSize;
23
24 PBYTE p;
25 PHELPSUBTABLEENTRY pEntry;
26
27 LogEvent( "Loading Help Table from Resource %hu", idHelpTable );
28
29 rc = DosQueryResourceSize( Module,
30 RT_HELPTABLE,
31 idHelpTable,
32 & ulResourceSize );
33 if ( rc != 0 )
34 {
35 LogEvent( " DosQueryResourceSize Failed, rc = %d", rc );
36 return;
37 }
38
39 LogEvent( " Resource Size: %u", ulResourceSize );
40 TableEntryCount = ulResourceSize / sizeof( HELPTABLE );
41 LogEvent( " Count: %d", TableEntryCount );
42
43 rc = DosGetResource( Module,
44 RT_HELPTABLE,
45 idHelpTable,
46 & pResourceData );
47
48 if ( rc != 0 )
49 {
50 LogEvent( " DosGetResource Failed, rc = %d", rc );
51 return;
52 }
53
54 pHelpTable = (PHELPTABLE) malloc( ( TableEntryCount + 1 ) // space for terminator
55 * sizeof( HELPTABLE ) );
56 memcpy( pHelpTable, pResourceData, ulResourceSize );
57 DosFreeResource( pResourceData );
58
59 *ppHelpTable = pHelpTable;
60
61 LogEvent( "# Win Panel Sub" );
62 for ( i = 0; i < TableEntryCount; i ++ )
63 {
64 LogEvent( "%d %hu %hu %hu",
65 i,
66 pHelpTable[ i ].idAppWindow,
67 pHelpTable[ i ].idExtPanel,
68 (USHORT) pHelpTable[ i ].phstHelpSubTable );
69
70 idSubTable = (USHORT) pHelpTable[ i ].phstHelpSubTable;
71 LogEvent( "Loading subtable %hu", idSubTable );
72
73 pHelpSubTable = NULL;
74
75 rc = DosQueryResourceSize( Module,
76 RT_HELPSUBTABLE,
77 idSubTable,
78 & ulResourceSize );
79 if ( rc == 0 )
80 {
81 LogEvent( " Resource Size: %u", ulResourceSize );
82 rc = DosGetResource( Module,
83 RT_HELPSUBTABLE,
84 idSubTable,
85 & pResourceData );
86 if ( rc == 0 )
87 {
88 // allocate space including terminator
89 pHelpSubTable =
90 (PHELPSUBTABLE2) malloc( ulResourceSize
91 + 2 * sizeof( USHORT ) );
92 memcpy( pHelpSubTable, pResourceData, ulResourceSize );
93
94 // terminate
95 memset( (char*) pHelpSubTable + ulResourceSize, 0, 2 * sizeof( USHORT ) );
96
97 LogEvent( " Subtable: %8x", pHelpSubTable );
98 LogData( pResourceData, ulResourceSize );
99
100 DosFreeResource( pResourceData );
101
102 p = (PBYTE) pHelpSubTable -> HelpSubTableEntry;
103
104 while( ( ( (PHELPSUBTABLEENTRY) p ) -> idWindow != 0 )
105 || ( ( (PHELPSUBTABLEENTRY) p ) -> idPanel != 0 ) )
106 {
107 pEntry = (PHELPSUBTABLEENTRY) p;
108
109 LogEvent( " Window: %hu Panel: %hu",
110 pEntry -> idWindow,
111 pEntry -> idPanel );
112
113 p += pHelpSubTable -> usSubitemSize * sizeof( USHORT );
114 }
115 }
116 else
117 {
118 LogEvent( " DosGetResource Failed, rc = %d", rc );
119 }
120 }
121 else
122 {
123 LogEvent( " DosQueryResourceSize Failed, rc = %d", rc );
124 }
125
126 // save help subtable
127 pHelpTable[ i ].phstHelpSubTable = (PHELPSUBTABLE) pHelpSubTable;
128 }
129
130 // terminate
131 memset( & pHelpTable[ TableEntryCount ], 0, sizeof( HELPTABLE ) );
132
133 LogEvent( "Help Table Loaded" );
134}
135
136void LoadHelpTableFromMemory( PHELPTABLE* ppDestTable,
137 PHELPTABLE pSourceTable )
138{
139 int i;
140 int ItemSize;
141 int SubTableSize;
142 int TableSize;
143 PHELPTABLE pDestTable;
144 PHELPSUBTABLE2 pSourceSubTable;
145 PHELPSUBTABLE2 pDestSubTable;
146 PBYTE p;
147 PHELPSUBTABLEENTRY pEntry;
148
149 LogEvent( "Loading Help Table from Memory" );
150 LogEvent( " Source: %8x", (ULONG) pSourceTable );
151
152 // First go thru the table to find the end and hence size to copy
153 i = 0;
154 LogEvent( "# Win Panel Sub" );
155 while ( ( pSourceTable[ i ].idAppWindow != 0 )
156 || ( pSourceTable[ i ].idExtPanel != 0 )
157 || ( pSourceTable[ i ].phstHelpSubTable != 0 ) )
158 {
159 LogEvent( "%d %hu %hu %8x",
160 i,
161 pSourceTable[ i ].idAppWindow,
162 pSourceTable[ i ].idExtPanel,
163 (ULONG) pSourceTable[ i ].phstHelpSubTable );
164 i ++;
165 }
166 // i is now count of entries, less terminating null entry
167 LogEvent( " Found %d entries", i );
168
169 // Calculate table size,
170 // including terminating null entry
171 TableSize = ( i + 1 ) * sizeof( HELPTABLE );
172
173 // allocate mem for the copied table
174 pDestTable = (PHELPTABLE) malloc( TableSize );
175
176 LogEvent( " New Table: %8x", (ULONG) pDestTable );
177
178 // Copy table
179 // we will later overwrite the copied subtable pointers
180 memcpy( pDestTable, pSourceTable, TableSize );
181
182 // store new table return value
183 *ppDestTable = pDestTable;
184
185 // now go thru subtables and copy them
186 i = 0;
187 while ( ( pSourceTable[ i ].idAppWindow != 0 )
188 || ( pSourceTable[ i ].idExtPanel != 0 )
189 || ( pSourceTable[ i ].phstHelpSubTable != 0 ) )
190 {
191 // copy subtable
192
193 // get pointer to source subtable
194 pSourceSubTable =
195 (PHELPSUBTABLE2) pSourceTable[ i ].phstHelpSubTable;
196
197 LogEvent( "Loading subtable at %8x",
198 (ULONG) pSourceSubTable );
199
200 LogEvent( " Entry size: %hu",
201 pSourceSubTable -> usSubitemSize );
202
203 // calculate size of subtable entries (which is variable)
204 ItemSize = ( pSourceSubTable -> usSubitemSize )
205 * sizeof( USHORT );
206
207 // now see how large the subtable is
208 SubTableSize = 0;
209 p = (PBYTE) pSourceSubTable -> HelpSubTableEntry;
210 while( ( ( (PHELPSUBTABLEENTRY) p ) -> idWindow != 0 )
211 || ( ( (PHELPSUBTABLEENTRY) p ) -> idPanel != 0 ) )
212 {
213 pEntry = (PHELPSUBTABLEENTRY) p;
214 p += ItemSize;
215 SubTableSize += ItemSize;
216 }
217
218 // allow for null terminating entry
219 SubTableSize += ItemSize;
220
221 LogEvent( " Total subtable size: %d", SubTableSize );
222
223 LogEvent( " Allocating mem" );
224 pDestSubTable = (PHELPSUBTABLE2) malloc( SubTableSize );
225 LogEvent( " Copying subtable" );
226 memcpy( pDestSubTable, pSourceSubTable, SubTableSize );
227
228 // save help subtable
229 pDestTable[ i ].phstHelpSubTable = (PHELPSUBTABLE) pDestSubTable;
230
231 LogEvent( " SubTable loaded" );
232
233 i ++;
234 }
235
236 LogEvent( "Help Table Loaded" );
237}
238
239void FreeHelpTable( PHELPTABLE* ppHelpTable )
240{
241 int i;
242 PHELPTABLE pHelpTable;
243
244 pHelpTable = *ppHelpTable;
245
246 if ( pHelpTable == NULL )
247 return;
248
249 LogEvent( "Freeing subtables" );
250
251 i = 0;
252 while ( ( pHelpTable[ i ].idAppWindow != 0 )
253 || ( pHelpTable[ i ].idExtPanel != 0 )
254 || ( pHelpTable[ i ].phstHelpSubTable != 0 ) )
255 {
256 LogEvent( " Subtable %d", i );
257 if ( pHelpTable[ i ].phstHelpSubTable != NULL )
258 free( pHelpTable[ i ].phstHelpSubTable );
259 i ++;
260 }
261
262 LogEvent( "Freeing help table" );
263
264 free( pHelpTable );
265
266 *ppHelpTable = NULL;
267
268 LogEvent( "Done" );
269
270}
271
272BOOL FindIDInHelpTable( USHORT idWindow,
273 PHELPTABLE pHelpTable,
274 USHORT* pExtendedHelpPanelID,
275 PHELPSUBTABLE2* ppHelpSubTable )
276{
277 int i;
278
279 LogEvent( "FindIDInHelpTable" );
280 LogEvent( " Search for Window ID: %hu", idWindow );
281 LogEvent( " In Help Table: %8x", (ULONG) pHelpTable );
282 i = 0;
283 while ( ( pHelpTable[ i ].idAppWindow != 0 )
284 || ( pHelpTable[ i ].idExtPanel != 0 )
285 || ( pHelpTable[ i ].phstHelpSubTable != 0 ) )
286 {
287 LogEvent( " Window ID: %hu Extended Panel: %hu",
288 pHelpTable[ i ].idAppWindow,
289 pHelpTable[ i ].idExtPanel );
290
291 if ( pHelpTable[ i ].idAppWindow == idWindow )
292 {
293 // found
294 LogEvent( " Found", i );
295
296 // note the cast to PHELPSUBTABLE2 because the PM definition
297 // is a bit wonky...
298 *ppHelpSubTable =
299 (PHELPSUBTABLE2) pHelpTable[ i ].phstHelpSubTable;
300
301 *pExtendedHelpPanelID = pHelpTable[ i ].idExtPanel;
302 return TRUE;
303 }
304 i ++;
305 }
306 LogEvent( " Not found" );
307 return FALSE;
308}
309
310BOOL FindIDInHelpSubTable( USHORT id,
311 PHELPSUBTABLE2 pHelpSubTable,
312 USHORT* pPanelID )
313{
314 PBYTE p;
315 PHELPSUBTABLEENTRY pEntry;
316
317 LogEvent( "FindIDInHelpSubTable" );
318 LogEvent( " Entry size: %hu",
319 pHelpSubTable -> usSubitemSize );
320
321 p = (PBYTE) pHelpSubTable -> HelpSubTableEntry;
322
323 while( ( ( (PHELPSUBTABLEENTRY) p ) -> idWindow != 0 )
324 || ( ( (PHELPSUBTABLEENTRY) p ) -> idPanel != 0 ) )
325 {
326 pEntry = (PHELPSUBTABLEENTRY) p;
327
328 LogEvent( " Window: %hu Panel: %hu",
329 pEntry -> idWindow,
330 pEntry -> idPanel );
331 if ( pEntry -> idWindow == id )
332 {
333 // found
334 *pPanelID = pEntry -> idPanel;
335 return TRUE;
336 }
337 p += pHelpSubTable -> usSubitemSize * sizeof( USHORT );
338 }
339
340 return FALSE;
341}
Note: See TracBrowser for help on using the repository browser.