source: trunk/dll/inis.c@ 1036

Last change on this file since 1036 was 1014, checked in by Gregg Young, 17 years ago

Fix 2 more memory leaks.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 75.2 KB
Line 
1
2/***********************************************************************
3
4 $Id: inis.c 1014 2008-05-11 23:05:08Z gyoung $
5
6 Copyright (c) 1993-98 M. Kimes
7 Copyright (c) 2004, 2008 Steven H. Levine
8
9 01 Aug 04 SHL Rework lstrip/rstrip usage
10 01 Aug 04 SHL Rework fixup usage
11 24 May 05 SHL Rework Win_Error usage
12 05 Jun 05 SHL Use QWL_USER
13 17 Jul 06 SHL Use Runtime_Error
14 03 Nov 06 SHL Renames
15 03 Nov 06 SHL Count thread usage
16 22 Mar 07 GKY Use QWL_USER
17 30 Mar 07 GKY Remove GetPString for window class names
18 06 Apr 07 GKY Work around PM DragInfo and DrgFreeDISH limits
19 06 Apr 07 GKY Add some error checking in drag/drop
20 19 Apr 07 SHL Use FreeDragInfoData. Add more drag/drop error checks.
21 20 Aug 07 GKY Move #pragma alloc_text to end for OpenWatcom compat
22 16 Nov 07 SHL Ensure fixup buffer sufficiently large
23 09 Jan 08 SHL Avoid closing INI more times than opened
24 09 Jan 08 SHL Add some missing error reporting
25 09 Jan 08 SHL Standardize PrfOpenProfile return checks
26 09 Jan 08 SHL Use CloseProfile to avoid spurious system INI closes
27 29 Feb 08 GKY Use xfree where appropriate
28
29***********************************************************************/
30
31#include <stdlib.h>
32#include <string.h>
33#include <ctype.h>
34#include <share.h>
35#include <process.h> // _beginthread
36
37#define INCL_DOS
38#define INCL_DOSERRORS
39#define INCL_WIN
40#define INCL_GPI
41#define INCL_LONGLONG // dircnrs.h
42
43#include "fm3dlg.h"
44#include "fm3str.h"
45#include "mle.h"
46#include "errutil.h" // Dos_Error...
47#include "strutil.h" // GetPString
48#include "fm3dll.h"
49
50#pragma data_seg(DATA2)
51
52static PSZ pszSrcFile = __FILE__;
53
54typedef struct
55{
56 USHORT size;
57 CHAR ininame[CCHMAXPATH]; // Must be null string if user or system ini
58 HINI hini;
59 BOOL working;
60 BOOL edit;
61 BOOL confirm;
62 HWND hwndMenu;
63 CHAR applname[CCHMAXPATH];
64 CHAR keyname[CCHMAXPATH];
65 CHAR *data;
66 ULONG datalen;
67 SHORT appindex;
68 SHORT keyindex;
69 BOOL dontclose;
70 USHORT currid;
71 BOOL isbinary;
72 HWND hwndIni;
73 HWND hwndApp;
74 HWND hwndKey;
75 HWND hwndData;
76 HWND hwndPopup;
77 HWND hwndCurrent;
78}
79INIDATA;
80
81typedef struct
82{
83 USHORT size;
84 USHORT action;
85 CHAR filename1[CCHMAXPATH];
86 CHAR filename2[CCHMAXPATH];
87 CHAR app[CCHMAXPATH];
88 CHAR key[CCHMAXPATH];
89 CHAR app2[CCHMAXPATH];
90 CHAR key2[CCHMAXPATH];
91 HWND hwndDlg;
92 HWND hwndSource;
93 BOOL confirm;
94}
95INIREC;
96
97/**
98 * Close profile unless it is user or system INI
99 * @param hini is profile handle
100 * @param fSkipIfSystem bypasses close for system INIs
101 */
102
103static VOID CloseProfile(HINI hini, BOOL fSkipIfSystem)
104{
105 BOOL ok = fSkipIfSystem &&
106 (hini == HINI_USERPROFILE || hini == HINI_SYSTEMPROFILE);
107
108 if (!ok) {
109 ok = PrfCloseProfile(hini);
110 if (!ok) {
111 Win_Error(HWND_DESKTOP, HWND_DESKTOP, pszSrcFile, __LINE__,
112 "PrfCloseProfile failed for handle 0x%x", hini);
113 }
114 }
115}
116
117VOID CopyIniThread(VOID * args)
118{
119 INIREC *inirec = (INIREC *) args;
120 HAB hab2;
121 HMQ hmq2;
122 HINI hiniFrom = NULLHANDLE;
123 HINI hiniTo = NULLHANDLE;
124 PRFPROFILE cprfp;
125 CHAR userini[CCHMAXPATH], sysini[CCHMAXPATH];
126
127 if (inirec) {
128 hab2 = WinInitialize(0);
129 if (hab2) {
130 hmq2 = WinCreateMsgQueue(hab2, 0);
131 if (hmq2) {
132 WinCancelShutdown(hmq2, TRUE);
133 IncrThreadUsage();
134 *userini = *sysini = 0;
135 memset(&cprfp, 0, sizeof(PRFPROFILE));
136 cprfp.cchUserName = CCHMAXPATH;
137 cprfp.cchSysName = CCHMAXPATH;
138 cprfp.pszUserName = (PSZ) userini;
139 cprfp.pszSysName = (PSZ) sysini;
140 if (PrfQueryProfile(hab2, &cprfp)) {
141 if (!stricmp(cprfp.pszUserName, inirec->filename1))
142 hiniFrom = HINI_USERPROFILE;
143 else if (!stricmp(cprfp.pszSysName, inirec->filename1))
144 hiniFrom = HINI_SYSTEMPROFILE;
145 if (!stricmp(cprfp.pszUserName, inirec->filename2))
146 hiniTo = HINI_USERPROFILE;
147 else if (!stricmp(cprfp.pszSysName, inirec->filename2))
148 hiniTo = HINI_SYSTEMPROFILE;
149 }
150 if (hiniFrom == NULLHANDLE) {
151 hiniFrom = PrfOpenProfile(hab2, inirec->filename1);
152 if (hiniFrom == NULLHANDLE) {
153 Win_Error(HWND_DESKTOP, HWND_DESKTOP, pszSrcFile, __LINE__,
154 "PrfOpenProfile failed for %s", inirec->filename1);
155 }
156 }
157 if (hiniTo == NULLHANDLE) {
158 if (!stricmp(inirec->filename1, inirec->filename2))
159 hiniTo = hiniFrom;
160 else {
161 hiniTo = PrfOpenProfile(hab2, inirec->filename2);
162 if (hiniTo == NULLHANDLE) {
163 Win_Error(HWND_DESKTOP, HWND_DESKTOP, pszSrcFile, __LINE__,
164 "PrfOpenProfile failed for %s", inirec->filename2);
165 }
166 }
167 }
168 if (hiniFrom && hiniTo && (*inirec->app2 || hiniFrom != hiniTo)) {
169
170 PVOID pDataK, pData;
171 PBYTE pCurrentK;
172 ULONG ulSize = 0L;
173
174 if (inirec->action == IDM_MOVE || inirec->action == IDM_COPY) {
175 if (!*inirec->key) {
176 if (inirec->confirm &&
177 PrfQueryProfileSize(hiniFrom, (PSZ) ((*inirec->app2) ?
178 inirec->app2 : inirec->
179 app), NULL,
180 (PULONG) & ulSize) && ulSize) {
181 if (saymsg
182 (MB_YESNOCANCEL, HWND_DESKTOP,
183 GetPString(IDS_CONFIRMTEXT),
184 GetPString(IDS_INIOVERAPPNAMETEXT),
185 ((*inirec->app2) ? inirec->app2 : inirec->app),
186 inirec->filename1) != MBID_YES)
187 goto Abort;
188 }
189 if (PrfQueryProfileSize(hiniTo,
190 (PSZ) inirec->app,
191 NULL, (PULONG) & ulSize) && ulSize) {
192 pDataK = xmalloc(ulSize, pszSrcFile, __LINE__); /* allocate space for keynames */
193 if (pDataK) {
194 /* get keynames */
195 if (PrfQueryProfileString(hiniTo,
196 (PSZ) inirec->app,
197 NULL, "\0", pDataK, ulSize)) {
198 pCurrentK = pDataK;
199 /* step through keynames */
200 while (*pCurrentK) {
201 if (PrfQueryProfileSize(hiniTo, inirec->app,
202 pCurrentK,
203 (PULONG) & ulSize) && ulSize) {
204 pData = xmalloc(ulSize, pszSrcFile, __LINE__);
205 if (pData) {
206 /* get data */
207 if (PrfQueryProfileData(hiniTo, inirec->app,
208 pCurrentK,
209 pData, (PULONG) & ulSize))
210 /* write data to new ini file */
211 PrfWriteProfileData(hiniFrom, ((*inirec->app2) ?
212 inirec->
213 app2 : inirec->app),
214 pCurrentK, pData, ulSize);
215 xfree(pData, pszSrcFile, __LINE__); /* free data */
216 }
217 }
218 while (*pCurrentK) /* next keyname */
219 pCurrentK++;
220 pCurrentK++;
221 }
222 }
223 xfree(pDataK, pszSrcFile, __LINE__); /* free keynames */
224 }
225 }
226 }
227 else {
228 if (inirec->confirm &&
229 PrfQueryProfileSize(hiniFrom, (PSZ) ((*inirec->app2) ?
230 inirec->app2 : inirec->
231 app),
232 ((*inirec->key2) ? inirec->
233 key2 : inirec->key), (PULONG) & ulSize)
234 && ulSize) {
235 if (saymsg
236 (MB_YESNOCANCEL, HWND_DESKTOP,
237 GetPString(IDS_CONFIRMTEXT),
238 GetPString(IDS_INIOVERAPPKEYNAMETEXT),
239 ((*inirec->app2) ? inirec->app2 : inirec->app),
240 ((*inirec->key2) ? inirec->key2 : inirec->key),
241 inirec->filename1) != MBID_YES)
242 goto Abort;
243 }
244 if (PrfQueryProfileSize(hiniTo, inirec->app,
245 inirec->key,
246 (PULONG) & ulSize) && ulSize) {
247 pData = xmalloc(ulSize, pszSrcFile, __LINE__);
248 if (pData) {
249 /* get data */
250 if (PrfQueryProfileData(hiniTo, inirec->app,
251 inirec->key,
252 pData, (PULONG) & ulSize))
253 /* write data to new ini file */
254 PrfWriteProfileData(hiniFrom, ((*inirec->app2) ?
255 inirec->app2 : inirec->app),
256 ((*inirec->key2) ?
257 inirec->key2 : inirec->key),
258 pData, ulSize);
259 xfree(pData, pszSrcFile, __LINE__); /* free data */
260 }
261 }
262 }
263 if (inirec->action == IDM_MOVE) {
264 if (inirec->confirm &&
265 saymsg(MB_YESNOCANCEL,
266 HWND_DESKTOP,
267 GetPString(IDS_CONFIRMTEXT),
268 GetPString(IDS_INIDELETEMOVEDTEXT),
269 inirec->filename2) != MBID_YES)
270 goto Abort;
271 PrfWriteProfileData(hiniTo,
272 inirec->app,
273 ((*inirec->key) ? inirec->key : NULL),
274 NULL, 0L);
275 }
276 }
277 }
278 Abort:
279 if (hiniFrom)
280 CloseProfile(hiniFrom, TRUE);
281 if (hiniTo && hiniTo != hiniFrom)
282 CloseProfile(hiniTo, FALSE);
283 WinDestroyMsgQueue(hmq2);
284 }
285 DecrThreadUsage();
286 WinTerminate(hab2);
287 }
288 PostMsg(inirec->hwndDlg, WM_COMMAND, MPFROM2SHORT(INI_REFRESH, 0),
289 MPVOID);
290 if (inirec->action == IDM_MOVE && inirec->hwndSource &&
291 inirec->hwndSource != inirec->hwndDlg)
292 PostMsg(inirec->hwndSource, WM_COMMAND, MPFROM2SHORT(INI_REFRESH, 0),
293 MPVOID);
294 xfree(inirec, pszSrcFile, __LINE__);
295 }
296}
297
298static VOID CompareIniThread(VOID * args)
299{
300 INIREC *inirec = (INIREC *) args;
301 HAB hab2;
302 HMQ hmq2;
303
304 if (inirec) {
305 hab2 = WinInitialize(0);
306 if (hab2) {
307 hmq2 = WinCreateMsgQueue(hab2, 0);
308 if (hmq2) {
309 WinCancelShutdown(hmq2, TRUE);
310 IncrThreadUsage();
311
312 // fixme to do something?
313
314 WinDestroyMsgQueue(hmq2);
315 }
316 DecrThreadUsage();
317 WinTerminate(hab2);
318 }
319 xfree(inirec, pszSrcFile, __LINE__);
320 }
321}
322
323static VOID BackupIniThread(VOID * args)
324{
325 PPRFPROFILE prfp = (PPRFPROFILE)args;
326 HAB hab2;
327 HMQ hmq2;
328 HINI orig = NULLHANDLE;
329 HINI new;
330 PVOID pDataA, pDataK, pData;
331 PBYTE pCurrentA, pCurrentK;
332 ULONG ulSize;
333 PRFPROFILE cprfp;
334 CHAR userini[CCHMAXPATH], sysini[CCHMAXPATH];
335
336 if (prfp) {
337 hab2 = WinInitialize(0);
338 if (hab2) {
339 hmq2 = WinCreateMsgQueue(hab2, 0);
340 if (hmq2) {
341 WinCancelShutdown(hmq2, TRUE);
342 IncrThreadUsage();
343 *userini = *sysini = 0;
344 memset(&cprfp, 0, sizeof(PRFPROFILE));
345 cprfp.cchUserName = CCHMAXPATH;
346 cprfp.cchSysName = CCHMAXPATH;
347 cprfp.pszUserName = (PSZ) userini;
348 cprfp.pszSysName = (PSZ) sysini;
349 if (PrfQueryProfile(hab2, &cprfp)) {
350 if (!stricmp(cprfp.pszUserName, prfp->pszUserName))
351 orig = HINI_USERPROFILE;
352 else if (!stricmp(cprfp.pszSysName, prfp->pszUserName))
353 orig = HINI_SYSTEMPROFILE;
354 }
355 if (orig == NULLHANDLE)
356 orig = PrfOpenProfile(hab2, prfp->pszUserName);
357 if (orig == NULLHANDLE) {
358 Win_Error(HWND_DESKTOP, HWND_DESKTOP, pszSrcFile, __LINE__,
359 "PrfOpenProfile failed for %s", prfp->pszUserName);
360 }
361 else {
362 new = PrfOpenProfile(hab2, prfp->pszSysName);
363 if (new == NULLHANDLE) {
364 Win_Error(HWND_DESKTOP, HWND_DESKTOP, pszSrcFile, __LINE__,
365 "PrfOpenProfile failed for %s", prfp->pszSysName);
366 }
367 else {
368 ulSize = 0;
369 if (PrfQueryProfileSize(orig, NULL, NULL, (PULONG) & ulSize)
370 && ulSize) {
371 pDataA = xmalloc(ulSize, pszSrcFile, __LINE__); /* allocate space for applnames */
372 if (pDataA) {
373 /* get applnames */
374 if (PrfQueryProfileString
375 (orig, NULL, NULL, "\0", pDataA, ulSize)) {
376 pCurrentA = pDataA;
377 /* step through applnames */
378 while (*pCurrentA) {
379 /* now keynames for this applname */
380 if (PrfQueryProfileSize(orig, (PSZ) pCurrentA, NULL,
381 (PULONG) & ulSize) && ulSize) {
382 pDataK = xmalloc(ulSize, pszSrcFile, __LINE__); /* allocate space for keynames */
383 if (pDataK) {
384 /* get keynames */
385 if (PrfQueryProfileString(orig, (PSZ) pCurrentA, NULL,
386 "\0", pDataK, ulSize)) {
387 pCurrentK = pDataK;
388 /* step through keynames */
389 while (*pCurrentK) {
390 if (PrfQueryProfileSize(orig, pCurrentA,
391 pCurrentK,
392 (PULONG) & ulSize) &&
393 ulSize) {
394 pData = xmalloc(ulSize, pszSrcFile, __LINE__);
395 if (pData) {
396 /* get data */
397 if (PrfQueryProfileData(orig, pCurrentA,
398 pCurrentK,
399 pData,
400 (PULONG) & ulSize))
401 /* write data to new ini file */
402 PrfWriteProfileData(new, pCurrentA,
403 pCurrentK, pData,
404 ulSize);
405 xfree(pData, pszSrcFile, __LINE__); /* free data */
406 }
407 }
408 while (*pCurrentK) /* next keyname */
409 pCurrentK++;
410 pCurrentK++;
411 }
412 }
413 xfree(pDataK, pszSrcFile, __LINE__); /* free keynames */
414 }
415 }
416 while (*pCurrentA) /* next applname */
417 pCurrentA++;
418 pCurrentA++;
419 }
420 }
421 xfree(pDataA, pszSrcFile, __LINE__); /* free applnames */
422 }
423 }
424 CloseProfile(new, FALSE);
425 }
426 CloseProfile(orig, TRUE);
427 }
428 WinDestroyMsgQueue(hmq2);
429 }
430 DecrThreadUsage();
431 WinTerminate(hab2);
432 }
433 xfree(prfp->pszUserName, pszSrcFile, __LINE__);
434 xfree(prfp->pszSysName, pszSrcFile, __LINE__);
435 xfree(prfp, pszSrcFile, __LINE__);
436 }
437}
438
439static VOID EnumAppNames(HWND hwndList, HINI hini)
440{
441 PVOID pData;
442 PBYTE pCurrent;
443 ULONG ulSize = 0;
444
445 WinSendMsg(hwndList, LM_DELETEALL, NULL, NULL);
446 if (!PrfQueryProfileSize(hini, NULL, NULL, (PULONG) & ulSize))
447 Win_Error(HWND_DESKTOP, HWND_DESKTOP, pszSrcFile, __LINE__,
448 "PrfQueryProfileSize");
449 else if (!ulSize)
450 Runtime_Error2(pszSrcFile, __LINE__, IDS_NODATATEXT);
451 else {
452 pData = xmalloc(ulSize, pszSrcFile, __LINE__);
453 if (pData) {
454 if (PrfQueryProfileString(hini, NULL, NULL, "\0", pData, ulSize)) {
455 pCurrent = pData;
456 WinEnableWindowUpdate(hwndList, FALSE);
457 while (*pCurrent) {
458 WinSendMsg(hwndList, LM_INSERTITEM, MPFROMSHORT(LIT_SORTASCENDING),
459 MPFROMP(pCurrent));
460 while (*pCurrent)
461 pCurrent++;
462 pCurrent++;
463 }
464 WinSendMsg(hwndList, LM_SELECTITEM, MPFROMSHORT(0),
465 MPFROMSHORT(TRUE));
466 WinEnableWindowUpdate(hwndList, TRUE);
467 }
468 xfree(pData, pszSrcFile, __LINE__);
469 }
470 }
471}
472
473static CHAR *GetKeyData(HWND hwndList, HINI hini, PSZ pAppName,
474 PSZ pKeyName, PULONG datalen)
475{
476 ULONG ulKeySize = 0L;
477 PVOID pKeyData = NULL;
478
479 *datalen = 0L;
480 if (!PrfQueryProfileSize(hini, pAppName, pKeyName, (PULONG) & ulKeySize))
481 Win_Error(HWND_DESKTOP, HWND_DESKTOP, pszSrcFile, __LINE__,
482 "PrfQueryProfileSize");
483 else {
484 pKeyData = xmalloc(ulKeySize + 1L, pszSrcFile, __LINE__);
485 if (pKeyData) {
486 if (!PrfQueryProfileData
487 (hini, pAppName, pKeyName, pKeyData, (PULONG) & ulKeySize))
488 Win_Error(HWND_DESKTOP, HWND_DESKTOP, pszSrcFile, __LINE__,
489 "PrfQueryProfileData");
490 else {
491 HexDump(hwndList, pKeyData, ulKeySize);
492 {
493 CHAR s[81];
494
495 sprintf(s,
496 GetPString(IDS_INIBYTESTEXT),
497 ulKeySize, &"s"[ulKeySize == 1]);
498 WinSetDlgItemText(WinQueryWindow(hwndList, QW_PARENT),
499 INI_NUMDATA, s);
500 }
501 *datalen = ulKeySize;
502 return (CHAR *)pKeyData;
503 }
504 }
505 }
506 return NULL;
507}
508
509static BOOL EnumKeyNames(HWND hwndList, HINI hini, PSZ pAppName)
510{
511 PVOID pData;
512 PBYTE pCurrent;
513 ULONG ulSize = 0;
514
515 WinSendMsg(hwndList, LM_DELETEALL, NULL, NULL);
516 if (!PrfQueryProfileSize(hini, pAppName, NULL, (PULONG) & ulSize))
517 Win_Error(HWND_DESKTOP, HWND_DESKTOP, pszSrcFile, __LINE__,
518 "PrfQueryProfileSize");
519 else {
520 if (!ulSize)
521 Runtime_Error2(pszSrcFile, __LINE__, IDS_NODATATEXT);
522 pData = xmalloc(ulSize + 1L, pszSrcFile, __LINE__);
523 if (pData) {
524 if (!PrfQueryProfileString(hini, pAppName, NULL, "\0", pData, ulSize)) {
525 Win_Error(HWND_DESKTOP, HWND_DESKTOP, pszSrcFile, __LINE__,
526 "PrfQueryProfileString");
527 xfree(pData, pszSrcFile, __LINE__);
528 }
529 else {
530 pCurrent = pData;
531 WinEnableWindowUpdate(hwndList, FALSE);
532 while (*pCurrent) {
533 WinSendMsg(hwndList, LM_INSERTITEM, MPFROMSHORT(LIT_SORTASCENDING),
534 MPFROMP(pCurrent));
535 while (*pCurrent)
536 pCurrent++;
537 pCurrent++;
538 }
539 WinSendMsg(hwndList, LM_SELECTITEM, MPFROMSHORT(0),
540 MPFROMSHORT(TRUE));
541 WinEnableWindowUpdate(hwndList, TRUE);
542 xfree(pData, pszSrcFile, __LINE__);
543 return TRUE;
544 }
545 }
546 }
547 return FALSE;
548}
549
550#define hwndMLE WinWindowFromID(hwnd,IAF_MLE)
551
552MRESULT EXPENTRY FilterIniProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
553{
554 INIDATA *inidata;
555 static CHAR lasttext[8192] = "";
556
557 switch (msg) {
558 case WM_INITDLG:
559 WinSetWindowPtr(hwnd, QWL_USER, mp2);
560 inidata = (INIDATA *) mp2;
561 WinSendDlgItemMsg(hwnd, IAF_SAVENAME, EM_SETTEXTLIMIT,
562 MPFROM2SHORT(CCHMAXPATH, 0), MPVOID);
563 MLEsetformat(hwndMLE, MLFIE_NOTRANS);
564 MLEsetlimit(hwndMLE, 8192);
565 WinSetWindowText(hwndMLE, lasttext);
566 {
567 FILEFINDBUF3 ffb;
568 ULONG nm;
569 HDIR hdir;
570
571 hdir = HDIR_CREATE;
572 nm = 1;
573 DosError(FERR_DISABLEHARDERR);
574 if (!DosFindFirst("*.IST",
575 &hdir,
576 FILE_NORMAL | FILE_ARCHIVED,
577 &ffb, sizeof(ffb), &nm, FIL_STANDARD)) {
578 do {
579 priority_bumped();
580 WinSendDlgItemMsg(hwnd, IAF_LISTBOX, LM_INSERTITEM,
581 MPFROMSHORT(LIT_SORTASCENDING),
582 MPFROMP(ffb.achName));
583 nm = 1;
584 } while (!DosFindNext(hdir, &ffb, sizeof(ffb), &nm));
585 DosFindClose(hdir);
586 priority_bumped();
587 }
588 }
589 break;
590
591 case WM_ADJUSTWINDOWPOS:
592 PostMsg(hwnd, UM_SETDIR, MPVOID, MPVOID);
593 break;
594
595 case UM_SETDIR:
596 PaintRecessedWindow(WinWindowFromID(hwnd, IAF_HELP), (HPS) 0, FALSE,
597 TRUE);
598 PaintRecessedWindow(WinWindowFromID(hwnd, IAF_SAVENAME), (HPS) 0, FALSE,
599 FALSE);
600 PaintRecessedWindow(WinWindowFromID(hwnd, IAF_LISTBOX), (HPS) 0, FALSE,
601 FALSE);
602 PaintRecessedWindow(WinWindowFromID(hwnd, IAF_MLE), (HPS) 0, FALSE,
603 FALSE);
604 return 0;
605
606 case WM_CONTROL:
607 switch (SHORT1FROMMP(mp1)) {
608 case IAF_SAVENAME:
609 if (SHORT2FROMMP(mp1) == EN_KILLFOCUS)
610 WinSetDlgItemText(hwnd, IAF_HELP, NullStr);
611 if (SHORT2FROMMP(mp1) == EN_SETFOCUS)
612 WinSetDlgItemText(hwnd,
613 IAF_HELP, GetPString(IDS_MASKLISTNAMEHELPTEXT));
614 break;
615
616 case IAF_LISTBOX:
617 if (SHORT2FROMMP(mp1) == LN_KILLFOCUS)
618 WinSetDlgItemText(hwnd, IAF_HELP, NullStr);
619 if (SHORT2FROMMP(mp1) == LN_SETFOCUS)
620 WinSetDlgItemText(hwnd,
621 IAF_HELP, GetPString(IDS_MASKLISTFILESHELPTEXT));
622 else if (SHORT2FROMMP(mp1) == LN_ENTER)
623 PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(IAF_LOAD, 0), MPVOID);
624 break;
625
626 case IAF_MLE:
627 if (SHORT2FROMMP(mp1) == MLN_KILLFOCUS)
628 WinSetDlgItemText(hwnd, IAF_HELP, NullStr);
629 if (SHORT2FROMMP(mp1) == MLN_SETFOCUS)
630 WinSetDlgItemText(hwnd,
631 IAF_HELP, GetPString(IDS_MASKLISTMASKSHELPTEXT));
632 break;
633 }
634 return 0;
635
636 case WM_COMMAND:
637 switch (SHORT1FROMMP(mp1)) {
638 case DID_OK:
639 inidata = INSTDATA(hwnd);
640 if (!inidata)
641 Runtime_Error2(pszSrcFile, __LINE__, IDS_NODATATEXT);
642 else {
643 CHAR s[8193], app[1024];
644 register CHAR *p;
645 SHORT sSelect, numitems;
646 BOOL match;
647
648 *s = 0;
649 WinQueryWindowText(hwndMLE, 8192, s);
650 if (!*s) {
651 DosBeep(250, 100);
652 break;
653 }
654 else {
655 strcpy(lasttext, s);
656 p = s;
657 while (*p) {
658 if (*p == '\r') {
659 memmove(p, p + 1, strlen(p));
660 continue;
661 }
662 if (*p == '\n')
663 *p = 0;
664 p++;
665 }
666 p++;
667 *p = 0;
668 }
669 numitems = (SHORT) WinSendMsg(inidata->hwndApp,
670 LM_QUERYITEMCOUNT, MPVOID, MPVOID);
671 if (!numitems) {
672 DosBeep(250, 100);
673 break;
674 }
675 else {
676 WinSetPointer(HWND_DESKTOP, hptrBusy);
677 WinSetDlgItemText(hwnd, IAF_HELP, GetPString(IDS_FILTERINGTEXT));
678 sSelect = 0;
679 while (numitems) {
680 *app = 0;
681 WinSendMsg(inidata->hwndApp,
682 LM_QUERYITEMTEXT,
683 MPFROM2SHORT(sSelect, 1024), MPFROMP(app));
684 match = FALSE;
685 if (*app) {
686 p = s;
687 while (*p) {
688 if (*p != '/') {
689 if (wildcard(app, p, TRUE))
690 match = TRUE;
691 }
692 else if (wildcard(app, p + 1, TRUE)) {
693 match = FALSE;
694 break;
695 }
696 while (*p)
697 p++;
698 p++;
699 }
700 }
701 if (!match)
702 WinSendMsg(inidata->hwndApp, LM_DELETEITEM,
703 MPFROMSHORT(sSelect), MPVOID);
704 else
705 sSelect++;
706 numitems--;
707 }
708 WinSetPointer(HWND_DESKTOP, hptrArrow);
709 }
710 }
711 WinDismissDlg(hwnd, 1);
712 break;
713
714 case IAF_LOAD:
715 {
716 CHAR s[8193];
717 FILE *fp;
718 INT len;
719 SHORT sSelect;
720
721 sSelect = (SHORT) WinSendDlgItemMsg(hwnd, IAF_LISTBOX,
722 LM_QUERYSELECTION,
723 MPFROM2SHORT(LIT_FIRST, 0),
724 MPVOID);
725 if (sSelect < 0)
726 Runtime_Error2(pszSrcFile, __LINE__, IDS_NODATATEXT);
727 else {
728 *s = 0;
729 WinSendDlgItemMsg(hwnd, IAF_LISTBOX, LM_QUERYITEMTEXT,
730 MPFROM2SHORT(sSelect, CCHMAXPATH), MPFROMP(s));
731 bstrip(s);
732 if (*s) {
733 fp = _fsopen(s, "r", SH_DENYWR);
734 if (fp) {
735 len = fread(s, 1, 8192, fp);
736 s[len] = 0;
737 WinSetWindowText(hwndMLE, s);
738 fclose(fp);
739 }
740 }
741 }
742 }
743 break;
744
745 case IAF_SAVE:
746 {
747 CHAR s[8193], filename[CCHMAXPATH], *p;
748 FILE *fp;
749
750 *filename = 0;
751 WinQueryDlgItemText(hwnd, IAF_SAVENAME, CCHMAXPATH, filename);
752 bstrip(filename);
753 if (*filename) {
754 p = strchr(filename, '.');
755 if (p) {
756 strcpy(p, ".IST");
757 WinSetDlgItemText(hwnd, IAF_SAVENAME, filename);
758 }
759 *s = 0;
760 WinQueryWindowText(hwndMLE, 8192, s);
761 if (!*s)
762 Runtime_Error2(pszSrcFile, __LINE__, IDS_NODATATEXT);
763 else {
764 fp = xfopen(filename, "w", pszSrcFile, __LINE__);
765 if (fp) {
766 fwrite(s, 1, strlen(s), fp);
767 fclose(fp);
768 WinSendDlgItemMsg(hwnd,
769 IAF_LISTBOX,
770 LM_INSERTITEM,
771 MPFROMSHORT(LIT_SORTASCENDING),
772 MPFROMP(filename));
773 }
774 }
775 }
776 }
777 break;
778
779 case IAF_DELETE:
780 {
781 CHAR s[CCHMAXPATH];
782 SHORT sSelect;
783
784 sSelect = (SHORT) WinSendDlgItemMsg(hwnd, IAF_LISTBOX,
785 LM_QUERYSELECTION,
786 MPFROM2SHORT(LIT_FIRST, 0),
787 MPVOID);
788 if (sSelect >= 0) {
789 *s = 0;
790 WinSendDlgItemMsg(hwnd, IAF_LISTBOX, LM_QUERYITEMTEXT,
791 MPFROM2SHORT(sSelect, CCHMAXPATH), MPFROMP(s));
792 bstrip(s);
793 if (*s) {
794 unlinkf(s);
795 WinSendDlgItemMsg(hwnd, IAF_LISTBOX, LM_DELETEITEM,
796 MPFROMSHORT(sSelect), MPVOID);
797 }
798 }
799 }
800 break;
801
802 case DID_CANCEL:
803 WinDismissDlg(hwnd, 0);
804 break;
805
806 case IDM_HELP:
807 if (hwndHelp)
808 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
809 MPFROM2SHORT(HELP_FILTERINI, 0),
810 MPFROMSHORT(HM_RESOURCEID));
811 break;
812 }
813 return 0;
814 }
815 return WinDefDlgProc(hwnd, msg, mp1, mp2);
816}
817
818MRESULT EXPENTRY IntraIniProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
819{
820 INIREC *inirec;
821
822 switch (msg) {
823 case WM_INITDLG:
824 WinSetWindowPtr(hwnd, QWL_USER, mp2);
825 inirec = (INIREC *) mp2;
826 WinSendDlgItemMsg(hwnd,
827 INII_NEWAPP,
828 EM_SETTEXTLIMIT, MPFROM2SHORT(CCHMAXPATH, 0), MPVOID);
829 WinSendDlgItemMsg(hwnd,
830 INII_NEWKEY,
831 EM_SETTEXTLIMIT, MPFROM2SHORT(CCHMAXPATH, 0), MPVOID);
832 {
833 CHAR s[CCHMAXPATH + 34];
834
835 sprintf(s, GetPString(IDS_INIWASTEXT), inirec->app);
836 WinSetDlgItemText(hwnd, INII_OLDAPP, s);
837 }
838 if (!*inirec->key) {
839 WinEnableWindow(WinWindowFromID(hwnd, INII_NEWKEY), FALSE);
840 WinEnableWindow(WinWindowFromID(hwnd, INII_NEWKEYHDR), FALSE);
841 switch (inirec->action) {
842 case IDM_MOVE:
843 WinSetWindowText(hwnd, GetPString(IDS_INIRENAMEAPPTITLETEXT));
844 break;
845 case IDM_COPY:
846 WinSetWindowText(hwnd, GetPString(IDS_INICOPYAPPTITLETEXT));
847 break;
848 }
849 }
850 else {
851 {
852 CHAR s[CCHMAXPATH + 34];
853
854 sprintf(s, GetPString(IDS_INIWASTEXT), inirec->key);
855 WinSetDlgItemText(hwnd, INII_OLDKEY, s);
856 }
857 WinSetDlgItemText(hwnd, INII_NEWAPP, inirec->app);
858 WinSendDlgItemMsg(hwnd,
859 INII_NEWAPP,
860 EM_SETSEL, MPFROM2SHORT(0, CCHMAXPATH), MPVOID);
861 switch (inirec->action) {
862 case IDM_MOVE:
863 WinSetWindowText(hwnd, GetPString(IDS_INIRENAMEKEYTITLETEXT));
864 break;
865 case IDM_COPY:
866 WinSetWindowText(hwnd, GetPString(IDS_INICOPYKEYTITLETEXT));
867 break;
868 }
869 }
870 break;
871
872 case WM_COMMAND:
873 switch (SHORT1FROMMP(mp1)) {
874 case DID_OK:
875 inirec = (INIREC *) WinQueryWindowPtr(hwnd, QWL_USER);
876 if (inirec) {
877 WinQueryDlgItemText(hwnd, INII_NEWAPP, CCHMAXPATH, inirec->app2);
878 bstrip(inirec->app2);
879 if (!*inirec->app2) {
880 DosBeep(50, 100);
881 break;
882 }
883 if (*inirec->key) {
884 WinQueryDlgItemText(hwnd, INII_NEWKEY, CCHMAXPATH, inirec->key2);
885 bstrip(inirec->key2);
886 if (!*inirec->key2) {
887 DosBeep(50, 100);
888 break;
889 }
890 }
891 WinDismissDlg(hwnd, 1);
892 }
893 break;
894
895 case DID_CANCEL:
896 WinDismissDlg(hwnd, 0);
897 break;
898
899 case IDM_HELP:
900 if (hwndHelp)
901 WinSendMsg(hwndHelp,
902 HM_DISPLAY_HELP,
903 MPFROM2SHORT(HELP_INTRAINI, 0),
904 MPFROMSHORT(HM_RESOURCEID));
905 break;
906 }
907 return 0;
908 }
909 return WinDefDlgProc(hwnd, msg, mp1, mp2);
910}
911
912MRESULT EXPENTRY ChangeIniProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
913{
914 switch (msg) {
915 case WM_INITDLG:
916 WinSetWindowPtr(hwnd, QWL_USER, mp2);
917 WinSendDlgItemMsg(hwnd, INIR_USERPROFILE, EM_SETTEXTLIMIT,
918 MPFROM2SHORT(CCHMAXPATH, 0), MPVOID);
919 WinSendDlgItemMsg(hwnd, INIR_SYSTEMPROFILE, EM_SETTEXTLIMIT,
920 MPFROM2SHORT(CCHMAXPATH, 0), MPVOID);
921 break;
922
923 case WM_COMMAND:
924 switch (SHORT1FROMMP(mp1)) {
925 case INIR_FIND:
926 {
927 CHAR filename[CCHMAXPATH], *p, *ininame;
928 USHORT id = 0;
929 HWND hwndFocus;
930
931 hwndFocus = WinQueryFocus(HWND_DESKTOP);
932 if (hwndFocus)
933 id = WinQueryWindowUShort(hwndFocus, QWS_ID);
934 if (id != INIR_SYSTEMPROFILE)
935 id = INIR_USERPROFILE;
936 ininame = INSTDATA(hwnd);
937 if (ininame && *ininame) {
938 strcpy(filename, ininame);
939 p = filename;
940 while (*p) {
941 if (*p == '/')
942 *p = '\\';
943 p++;
944 }
945 p = strrchr(filename, '\\');
946 if (p) {
947 p++;
948 *p = 0;
949 }
950 else
951 *filename = 0;
952 }
953 else
954 *filename = 0;
955 strcat(filename, "*.INI");
956 if (insert_filename(hwnd, filename, TRUE, FALSE) && *filename)
957 WinSetDlgItemText(hwnd, id, filename);
958 }
959 break;
960
961 case DID_OK:
962 {
963 HINI testini;
964 PRFPROFILE prfp;
965 CHAR sysini[CCHMAXPATH];
966 CHAR userini[CCHMAXPATH];
967
968 WinQueryDlgItemText(hwnd, INIR_USERPROFILE, CCHMAXPATH, userini);
969 WinQueryDlgItemText(hwnd, INIR_SYSTEMPROFILE, CCHMAXPATH, sysini);
970 testini = PrfOpenProfile(WinQueryAnchorBlock(hwnd), userini);
971 if (testini == NULLHANDLE) {
972 saymsg(MB_CANCEL,
973 hwnd,
974 GetPString(IDS_ERRORTEXT),
975 GetPString(IDS_INICANTOPENUSERTEXT), userini);
976 break;
977 }
978 CloseProfile(testini, FALSE);
979 testini = PrfOpenProfile(WinQueryAnchorBlock(hwnd), sysini);
980 if (testini == NULLHANDLE) {
981 saymsg(MB_CANCEL,
982 hwnd,
983 GetPString(IDS_ERRORTEXT),
984 GetPString(IDS_INICANTOPENSYSTEXT), sysini);
985 break;
986 }
987 CloseProfile(testini, FALSE);
988 memset(&prfp, 0, sizeof(PRFPROFILE));
989 prfp.cchUserName = strlen(sysini);
990 prfp.cchSysName = strlen(userini);
991 prfp.pszUserName = (PSZ) userini;
992 prfp.pszSysName = (PSZ) sysini;
993 if (!PrfReset(WinQueryAnchorBlock(hwnd), &prfp)) {
994 Win_Error(hwnd, hwnd, __FILE__, __LINE__,
995 GetPString(IDS_INIPRFRESETFAILEDTEXT));
996 }
997 else
998 WinDismissDlg(hwnd, 1);
999 }
1000 break;
1001
1002 case DID_CANCEL:
1003 WinDismissDlg(hwnd, 0);
1004 break;
1005
1006 case IDM_HELP:
1007 if (hwndHelp)
1008 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
1009 MPFROM2SHORT(HELP_CHANGEINI, 0),
1010 MPFROMSHORT(HM_RESOURCEID));
1011 break;
1012 }
1013 return 0;
1014 }
1015 return WinDefDlgProc(hwnd, msg, mp1, mp2);
1016}
1017
1018MRESULT EXPENTRY SwapIniProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
1019{
1020 switch (msg) {
1021 case WM_INITDLG:
1022 WinSetWindowPtr(hwnd, QWL_USER, mp2);
1023 WinSendDlgItemMsg(hwnd,
1024 INIR_USERPROFILE,
1025 EM_SETTEXTLIMIT, MPFROM2SHORT(CCHMAXPATH, 0), MPVOID);
1026 WinSendDlgItemMsg(hwnd,
1027 INIR_SYSTEMPROFILE,
1028 EM_SETTEXTLIMIT, MPFROM2SHORT(CCHMAXPATH, 0), MPVOID);
1029 WinSetWindowText(hwnd, GetPString(IDS_INISWAPOS2INISTITLETEXT));
1030 break;
1031
1032 case WM_COMMAND:
1033 switch (SHORT1FROMMP(mp1)) {
1034 case INIR_FIND:
1035 {
1036 CHAR filename[CCHMAXPATH], *p, *ininame;
1037 USHORT id = 0;
1038 HWND hwndFocus;
1039
1040 hwndFocus = WinQueryFocus(HWND_DESKTOP);
1041 if (hwndFocus)
1042 id = WinQueryWindowUShort(hwndFocus, QWS_ID);
1043 if (id != INIR_SYSTEMPROFILE)
1044 id = INIR_USERPROFILE;
1045 ininame = INSTDATA(hwnd);
1046 if (ininame && *ininame) {
1047 strcpy(filename, ininame);
1048 p = filename;
1049 while (*p) {
1050 if (*p == '/')
1051 *p = '\\';
1052 p++;
1053 }
1054 p = strrchr(filename, '\\');
1055 if (p) {
1056 p++;
1057 *p = 0;
1058 }
1059 else
1060 *filename = 0;
1061 }
1062 else
1063 *filename = 0;
1064 strcat(filename, "*.INI");
1065 if (insert_filename(hwnd, filename, TRUE, FALSE) && *filename)
1066 WinSetDlgItemText(hwnd, id, filename);
1067 }
1068 break;
1069
1070 case DID_OK:
1071 {
1072 HINI testini;
1073 PRFPROFILE prfp;
1074 CHAR sysini[CCHMAXPATH];
1075 CHAR userini[CCHMAXPATH];
1076 CHAR oldsysini[CCHMAXPATH];
1077 CHAR olduserini[CCHMAXPATH];
1078 CHAR tempsysini[CCHMAXPATH];
1079 CHAR tempuserini[CCHMAXPATH];
1080 CHAR tempsysini2[CCHMAXPATH];
1081 CHAR tempuserini2[CCHMAXPATH];
1082 CHAR *p;
1083 APIRET rc;
1084
1085 *tempuserini = 0;
1086 *tempsysini = 0;
1087 *tempuserini2 = 0;
1088 *tempsysini2 = 0;
1089 memset(&prfp, 0, sizeof(PRFPROFILE));
1090 prfp.cchUserName = CCHMAXPATH;
1091 prfp.cchSysName = CCHMAXPATH;
1092 prfp.pszUserName = (PSZ) olduserini;
1093 prfp.pszSysName = (PSZ) oldsysini;
1094 if (!PrfQueryProfile(WinQueryAnchorBlock(hwnd), &prfp)) {
1095 Win_Error(hwnd, hwnd, __FILE__, __LINE__,
1096 GetPString(IDS_INIQUERYPRFFAILEDTEXT));
1097 break;
1098 }
1099 WinQueryDlgItemText(hwnd, INIR_USERPROFILE, CCHMAXPATH, userini);
1100 WinQueryDlgItemText(hwnd, INIR_SYSTEMPROFILE, CCHMAXPATH, sysini);
1101 MakeFullName(userini);
1102 MakeFullName(sysini);
1103 testini = PrfOpenProfile(WinQueryAnchorBlock(hwnd), userini);
1104 if (testini == NULLHANDLE) {
1105 saymsg(MB_CANCEL,
1106 hwnd,
1107 GetPString(IDS_ERRORTEXT),
1108 GetPString(IDS_INICANTOPENUSERTEXT), userini);
1109 break;
1110 }
1111 CloseProfile(testini, FALSE);
1112 testini = PrfOpenProfile(WinQueryAnchorBlock(hwnd), sysini);
1113 if (testini == NULLHANDLE) {
1114 saymsg(MB_CANCEL,
1115 hwnd,
1116 GetPString(IDS_ERRORTEXT),
1117 GetPString(IDS_INICANTOPENSYSTEXT), sysini);
1118 break;
1119 }
1120 CloseProfile(testini, FALSE);
1121 /* make copies of new inis */
1122 *tempuserini = 0;
1123 *tempsysini = 0;
1124 save_dir2(tempuserini);
1125 if (tempuserini[strlen(tempuserini) - 1] != '\\')
1126 strcat(tempuserini, "\\");
1127 strcat(tempuserini, "TEMPUSER.INI");
1128 rc = DosCopy(userini, tempuserini, DCPY_EXISTING);
1129 if (rc) {
1130 Dos_Error(MB_CANCEL,
1131 rc,
1132 hwnd,
1133 __FILE__,
1134 __LINE__,
1135 GetPString(IDS_COMPCOPYFAILEDTEXT), userini, tempuserini);
1136 break;
1137 }
1138 save_dir2(tempsysini);
1139 if (tempsysini[strlen(tempsysini) - 1] != '\\')
1140 strcat(tempsysini, "\\");
1141 strcat(tempsysini, "TEMPSYS.INI");
1142 rc = DosCopy(sysini, tempsysini, DCPY_EXISTING);
1143 if (rc) {
1144 Dos_Error(MB_CANCEL,
1145 rc,
1146 hwnd,
1147 __FILE__,
1148 __LINE__,
1149 GetPString(IDS_COMPCOPYFAILEDTEXT), sysini, tempsysini);
1150 break;
1151 }
1152 memset(&prfp, 0, sizeof(PRFPROFILE));
1153 prfp.cchUserName = strlen(tempuserini);
1154 prfp.cchSysName = strlen(tempsysini);
1155 prfp.pszUserName = (PSZ) tempuserini;
1156 prfp.pszSysName = (PSZ) tempsysini;
1157 if (!PrfReset(WinQueryAnchorBlock(hwnd), &prfp)) {
1158 Win_Error(hwnd, hwnd, __FILE__, __LINE__,
1159 GetPString(IDS_INIPRFRESETFAILEDTEXT));
1160 }
1161 else {
1162 /* backup old inis */
1163 strcpy(tempuserini2, olduserini);
1164 p = strrchr(tempuserini2, '\\');
1165 if (!p)
1166 *tempuserini2 = 0;
1167 else {
1168 p++;
1169 *p = 0;
1170 }
1171 strcat(tempuserini2, "OS2INI.BAK");
1172 rc = DosCopy(olduserini, tempuserini2, DCPY_EXISTING);
1173 if (rc) {
1174 Dos_Error(MB_CANCEL,
1175 rc,
1176 hwnd,
1177 __FILE__,
1178 __LINE__,
1179 GetPString(IDS_COMPCOPYFAILEDTEXT),
1180 olduserini, tempuserini2);
1181 WinDismissDlg(hwnd, 1);
1182 break;
1183 }
1184 strcpy(tempsysini2, oldsysini);
1185 p = strrchr(tempsysini2, '\\');
1186 if (!p)
1187 *tempsysini2 = 0;
1188 else {
1189 p++;
1190 *p = 0;
1191 }
1192 strcat(tempsysini2, "OS2SYINI.BAK");
1193 rc = DosCopy(oldsysini, tempsysini2, DCPY_EXISTING);
1194 if (rc) {
1195 Dos_Error(MB_CANCEL,
1196 rc,
1197 hwnd,
1198 __FILE__,
1199 __LINE__,
1200 GetPString(IDS_COMPCOPYFAILEDTEXT),
1201 oldsysini, tempsysini2);
1202 WinDismissDlg(hwnd, 1);
1203 break;
1204 }
1205 /* copy new inis to old ini names */
1206 rc = DosCopy(userini, olduserini, DCPY_EXISTING);
1207 if (rc) {
1208 Dos_Error(MB_CANCEL,
1209 rc,
1210 hwnd,
1211 __FILE__,
1212 __LINE__,
1213 GetPString(IDS_COMPCOPYFAILEDTEXT),
1214 userini, olduserini);
1215 WinDismissDlg(hwnd, 1);
1216 break;
1217 }
1218 rc = DosCopy(sysini, oldsysini, DCPY_EXISTING);
1219 if (rc) {
1220 Dos_Error(MB_CANCEL,
1221 rc,
1222 hwnd,
1223 __FILE__,
1224 __LINE__,
1225 GetPString(IDS_COMPCOPYFAILEDTEXT),
1226 userini, olduserini);
1227 WinDismissDlg(hwnd, 1);
1228 break;
1229 }
1230 /* replace temp inis with new permanent inis */
1231 memset(&prfp, 0, sizeof(PRFPROFILE));
1232 prfp.cchUserName = strlen(oldsysini);
1233 prfp.cchSysName = strlen(olduserini);
1234 prfp.pszUserName = (PSZ) olduserini;
1235 prfp.pszSysName = (PSZ) oldsysini;
1236 if (!PrfReset(WinQueryAnchorBlock(hwnd), &prfp)) {
1237 Win_Error(hwnd, hwnd, __FILE__, __LINE__,
1238 GetPString(IDS_INIPRFRESETFAILEDTEXT));
1239 }
1240 else {
1241 Notify(GetPString(IDS_SUCCESSTEXT));
1242 unlinkf(tempuserini);
1243 unlinkf(tempsysini);
1244 }
1245 WinDismissDlg(hwnd, 1);
1246 }
1247 }
1248 break;
1249
1250 case DID_CANCEL:
1251 WinDismissDlg(hwnd, 0);
1252 break;
1253
1254 case IDM_HELP:
1255 if (hwndHelp)
1256 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
1257 MPFROM2SHORT(HELP_SWAPINI, 0), MPFROMSHORT(HM_RESOURCEID));
1258 break;
1259 }
1260 return 0;
1261 }
1262 return WinDefDlgProc(hwnd, msg, mp1, mp2);
1263}
1264
1265MRESULT EXPENTRY AddIniProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
1266{
1267 INIDATA *inidata = INSTDATA(hwnd);
1268 size_t l;
1269
1270 switch (msg) {
1271 case WM_INITDLG:
1272 if (!mp2) {
1273 WinDismissDlg(hwnd, 0);
1274 break;
1275 }
1276 inidata = (INIDATA *) mp2;
1277 if (inidata->edit)
1278 WinSetWindowText(hwnd, GetPString(IDS_INIEDITINITITLETEXT));
1279 WinSetWindowPtr(hwnd, QWL_USER, (PVOID) mp2);
1280 WinSendDlgItemMsg(hwnd,
1281 IAD_APPNAME,
1282 EM_SETTEXTLIMIT, MPFROM2SHORT(CCHMAXPATH, 0), MPVOID);
1283 WinSendDlgItemMsg(hwnd,
1284 IAD_KEYNAME,
1285 EM_SETTEXTLIMIT, MPFROM2SHORT(CCHMAXPATH, 0), MPVOID);
1286 WinSendDlgItemMsg(hwnd,
1287 IAD_DATA,
1288 EM_SETTEXTLIMIT, MPFROM2SHORT(32767, 0), MPVOID);
1289 WinEnableWindow(WinWindowFromID(hwnd, DID_OK), FALSE);
1290 WinSetDlgItemText(hwnd, IAD_APPNAME, inidata->applname);
1291 if (inidata->edit) {
1292 WinSetDlgItemText(hwnd, IAD_KEYNAME, inidata->keyname);
1293 if (inidata->data && inidata->datalen) {
1294
1295 CHAR *p;
1296
1297 inidata->isbinary = FALSE;
1298 p = inidata->data;
1299 while ((p - inidata->data) < inidata->datalen - 1) {
1300 if (*p < ' ' || !isprint(*p)) {
1301 inidata->isbinary = TRUE;
1302 break;
1303 }
1304 p++;
1305 }
1306 if (inidata->isbinary) {
1307 inidata->isbinary = TRUE;
1308 WinCheckButton(hwnd, IAD_ISBINARY, TRUE);
1309 if (saymsg(MB_ENTERCANCEL | MB_ICONEXCLAMATION,
1310 hwnd,
1311 GetPString(IDS_WARNINGTEXT),
1312 GetPString(IDS_INIBINARYDATASKIPTEXT)) == MBID_CANCEL)
1313 WinDismissDlg(hwnd, 0);
1314 l = inidata->datalen * 4 + 1;
1315 p = xmallocz(l, pszSrcFile, __LINE__);
1316 if (p) {
1317 fixup(inidata->data, p, l, inidata->datalen);
1318 WinSetDlgItemText(hwnd, IAD_DATA, p);
1319 xfree(p, pszSrcFile, __LINE__);
1320 }
1321 }
1322 else
1323 WinSetDlgItemText(hwnd, IAD_DATA, inidata->data);
1324 }
1325 PostMsg(hwnd, UM_SETDIR, MPFROMLONG(1L), MPVOID);
1326 }
1327 else
1328 PostMsg(hwnd, UM_SETDIR, MPVOID, MPVOID);
1329 {
1330 CHAR s[32];
1331
1332 *s = 0;
1333 WinQueryDlgItemText(hwnd, IAD_DATA, 32, s);
1334 if (*s)
1335 WinEnableWindow(WinWindowFromID(hwnd, DID_OK), TRUE);
1336 }
1337 WinSendDlgItemMsg(hwnd, IAD_APPNAME, EM_QUERYCHANGED, MPVOID, MPVOID);
1338 WinSendDlgItemMsg(hwnd, IAD_KEYNAME, EM_QUERYCHANGED, MPVOID, MPVOID);
1339 WinSendDlgItemMsg(hwnd, IAD_DATA, EM_QUERYCHANGED, MPVOID, MPVOID);
1340 break;
1341
1342 case UM_SETDIR:
1343 if (mp1)
1344 WinSetFocus(HWND_DESKTOP, WinWindowFromID(hwnd, IAD_DATA));
1345 else
1346 WinSetFocus(HWND_DESKTOP, WinWindowFromID(hwnd, IAD_KEYNAME));
1347 return 0;
1348
1349 case UM_SETUP:
1350 saymsg(MB_ENTER | MB_ICONASTERISK,
1351 hwnd,
1352 GetPString(IDS_WARNINGTEXT), GetPString(IDS_INIAPPKEYEXISTSTEXT));
1353 return 0;
1354
1355 case WM_CONTROL:
1356 switch (SHORT2FROMMP(mp1)) {
1357 case EN_KILLFOCUS:
1358 inidata = INSTDATA(hwnd);
1359 if (!inidata)
1360 Runtime_Error2(pszSrcFile, __LINE__, IDS_NODATATEXT);
1361 else {
1362 CHAR s[CCHMAXPATH], applname[CCHMAXPATH];
1363 BOOL appchanged = FALSE, keychanged = FALSE;
1364
1365 *applname = 0;
1366 WinQueryDlgItemText(hwnd, IAD_APPNAME, CCHMAXPATH, applname);
1367 bstrip(applname);
1368 if (*applname) {
1369 *s = 0;
1370 WinQueryDlgItemText(hwnd, IAD_KEYNAME, CCHMAXPATH, s);
1371 bstrip(s);
1372 if (*s) {
1373 appchanged = (BOOL) WinSendDlgItemMsg(hwnd, IAD_APPNAME,
1374 EM_QUERYCHANGED,
1375 MPVOID, MPVOID);
1376 keychanged = (BOOL) WinSendDlgItemMsg(hwnd, IAD_KEYNAME,
1377 EM_QUERYCHANGED,
1378 MPVOID, MPVOID);
1379 if (appchanged || keychanged) {
1380
1381 ULONG size = 0L;
1382
1383 if (PrfQueryProfileSize(inidata->hini, applname, s, &size))
1384 PostMsg(hwnd, UM_SETUP, MPVOID, MPVOID);
1385 }
1386 *s = 0;
1387 WinQueryDlgItemText(hwnd, IAD_DATA, CCHMAXPATH, s);
1388 bstrip(s);
1389 WinEnableWindow(WinWindowFromID(hwnd, DID_OK), (*s != 0));
1390 }
1391 else
1392 WinEnableWindow(WinWindowFromID(hwnd, DID_OK), FALSE);
1393 }
1394 else
1395 WinEnableWindow(WinWindowFromID(hwnd, DID_OK), FALSE);
1396 }
1397 break;
1398 }
1399 return 0;
1400
1401 case WM_COMMAND:
1402 switch (SHORT1FROMMP(mp1)) {
1403 case DID_OK:
1404 {
1405 CHAR applname[CCHMAXPATH], keyname[CCHMAXPATH], data[CCHMAXPATH];
1406 INT len;
1407
1408 inidata = INSTDATA(hwnd);
1409 if (!inidata) {
1410 Runtime_Error2(pszSrcFile, __LINE__, IDS_NODATATEXT);
1411 break;
1412 }
1413 inidata->isbinary = WinQueryButtonCheckstate(hwnd, IAD_ISBINARY);
1414 *applname = 0;
1415 WinQueryDlgItemText(hwnd, IAD_APPNAME, CCHMAXPATH, applname);
1416 bstrip(applname);
1417 if (*applname) {
1418 *keyname = 0;
1419 WinQueryDlgItemText(hwnd, IAD_KEYNAME, CCHMAXPATH, keyname);
1420 bstrip(keyname);
1421 if (*keyname) {
1422 *data = 0;
1423 WinQueryDlgItemText(hwnd, IAD_DATA, CCHMAXPATH, data);
1424 if (*data) {
1425 if (inidata->isbinary)
1426 len = literal(data);
1427 else
1428 len = strlen(data) + 1;
1429 PrfWriteProfileData(inidata->hini, applname, keyname, data,
1430 (ULONG) len);
1431 WinSendMsg(inidata->hwndIni, UM_RESCAN,
1432 MPFROMP(applname), MPFROMP(keyname));
1433 WinDismissDlg(hwnd, 1);
1434 }
1435 }
1436 }
1437 }
1438 break;
1439
1440 case DID_CANCEL:
1441 WinDismissDlg(hwnd, 0);
1442 break;
1443
1444 case IDM_HELP:
1445 if (hwndHelp)
1446 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
1447 MPFROM2SHORT(HELP_INIADD, 0), MPFROMSHORT(HM_RESOURCEID));
1448 break;
1449 }
1450 return 0;
1451 }
1452 return WinDefDlgProc(hwnd, msg, mp1, mp2);
1453}
1454
1455static ULONG flFrameFlags = FCF_SYSMENU | FCF_SIZEBORDER | FCF_ICON |
1456 FCF_TITLEBAR | FCF_MINMAX | FCF_MENU | FCF_ACCELTABLE | FCF_NOBYTEALIGN;
1457
1458HWND StartIniEditor(HWND hwnd, CHAR * fname, INT flags)
1459{
1460 /*
1461 * create an ini editor window
1462 * bitmapped flags:
1463 * 2 = don't position window for non-desktop client
1464 * 4 = don't kill proc when closed
1465 */
1466
1467 HWND hwndFrame, hwndClient;
1468 HINI hINI;
1469 HAB useHab = (HAB) 0;
1470 CHAR *filename = NULL;
1471
1472 if (fExternalINIs || strcmp(realappname, FM3Str))
1473 hwnd = HWND_DESKTOP;
1474 if (hwnd != HWND_DESKTOP)
1475 useHab = WinQueryAnchorBlock(hwnd);
1476 if (fname && *fname) {
1477 filename = xstrdup(fname, pszSrcFile, __LINE__);
1478 if (!filename)
1479 return (HWND) 0;
1480 hINI = PrfOpenProfile(useHab, filename);
1481 if (hINI == NULLHANDLE) {
1482 xfree(filename, pszSrcFile, __LINE__);
1483 return (HWND) 0;
1484 }
1485 else
1486 CloseProfile(hINI, FALSE);
1487 }
1488
1489 if (ParentIsDesktop(hwnd, hwnd))
1490 flFrameFlags |= FCF_TASKLIST;
1491 hwndFrame = WinCreateStdWindow(hwnd,
1492 0,
1493 &flFrameFlags,
1494 WC_INIEDITOR,
1495 NullStr,
1496 fwsAnimate,
1497 FM3ModHandle, INI_FRAME, &hwndClient);
1498 if (hwndFrame) {
1499 WinSetWindowUShort(hwndFrame, QWS_ID, INI_FRAME);
1500 if (!ParentIsDesktop(hwndFrame, hwnd) && !(flags & 2)) {
1501
1502 SWP swp;
1503
1504 FillClient(hwnd, &swp, NULL, FALSE);
1505 WinSetWindowPos(hwndFrame, HWND_TOP, swp.x, swp.y, swp.cx, swp.cy,
1506 SWP_SIZE | SWP_MOVE);
1507 }
1508 else if (ParentIsDesktop(hwndFrame, hwnd)) {
1509 if (!WinRestoreWindowPos(FM2Str, "INIWindowPos", hwndFrame)) {
1510
1511 ULONG fl = SWP_MOVE | SWP_SIZE;
1512 SWP swp;
1513
1514 WinQueryTaskSizePos(WinQueryAnchorBlock(hwndFrame), 0L, &swp);
1515 if (swp.fl & (SWP_MINIMIZE | SWP_HIDE))
1516 fl = swp.fl;
1517 else if (swp.fl & SWP_ACTIVATE)
1518 fl |= SWP_ACTIVATE;
1519 WinSetWindowPos(hwndFrame, HWND_TOP, swp.x, swp.y, swp.cx, swp.cy,
1520 fl);
1521 }
1522 }
1523 PostMsg(hwndClient, UM_SELECT, MPVOID, MPVOID);
1524 PostMsg(hwndClient, UM_ACTION, MPVOID, MPVOID);
1525 if (!PostMsg(hwndClient, UM_LOADFILE, MPFROMP(((filename && *filename) ?
1526 filename : NULL)), MPVOID))
1527 WinSendMsg(hwndClient, UM_LOADFILE, MPFROMP(((filename && *filename) ?
1528 filename : NULL)), MPVOID);
1529 if (flags & 4)
1530 PostMsg(hwndClient, UM_INITIALSIZE, MPVOID, MPVOID);
1531 }
1532 else
1533 xfree(filename, pszSrcFile, __LINE__);
1534 return hwndFrame;
1535}
1536
1537MRESULT EXPENTRY IniLBSubProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
1538{
1539 PFNWP oldproc = (PFNWP) WinQueryWindowPtr(hwnd, QWL_USER);
1540 static HWND hwndPopup = (HWND) 0;
1541
1542 switch (msg) {
1543 case WM_SETFOCUS:
1544 if (mp2)
1545 PostMsg(WinQueryWindow(hwnd, QW_PARENT), UM_FOCUSME, mp1, mp2);
1546 break;
1547
1548 case WM_MENUEND:
1549 if (hwndPopup == (HWND) mp2) {
1550 WinDestroyWindow(hwndPopup);
1551 hwndPopup = (HWND) 0;
1552 }
1553 break;
1554
1555 case WM_CONTEXTMENU:
1556 {
1557 USHORT id = WinQueryWindowUShort(hwnd, QWS_ID);
1558
1559 switch (id) {
1560 case INI_APPLIST:
1561 id = INI_APPMENU;
1562 break;
1563 case INI_KEYLIST:
1564 id = INI_KEYMENU;
1565 break;
1566 default:
1567 id = 0;
1568 break;
1569 }
1570 if (id) {
1571 if (hwndPopup)
1572 WinDestroyWindow(hwndPopup);
1573 hwndPopup = WinLoadMenu(HWND_DESKTOP, FM3ModHandle, id);
1574 if (hwndPopup)
1575 WinPopupMenu(hwnd, WinQueryWindow(hwnd, QW_PARENT),
1576 hwndPopup, 8, 8, 0,
1577 PU_HCONSTRAIN | PU_VCONSTRAIN |
1578 PU_KEYBOARD | PU_MOUSEBUTTON1);
1579 }
1580 }
1581 break;
1582
1583 case WM_BEGINDRAG:
1584 {
1585 PDRAGINFO pDInfo;
1586 DRAGITEM DItem;
1587 DRAGIMAGE DIcon;
1588 INIDATA *inidata;
1589 HPOINTER hptrINI;
1590 USHORT id;
1591 HWND hDrop = 0;
1592
1593 id = WinQueryWindowUShort(hwnd, QWS_ID);
1594 inidata = WinQueryWindowPtr(WinQueryWindow(hwnd, QW_PARENT), QWL_USER);
1595 if (!inidata || !*inidata->ininame || !*inidata->applname ||
1596 !inidata->keyname) {
1597 DosBeep(50, 100);
1598 break;
1599 }
1600 hptrINI = WinLoadPointer(HWND_DESKTOP, FM3ModHandle, INI_FRAME);
1601 memset(&DItem, 0, sizeof(DItem));
1602 memset(&DIcon, 0, sizeof(DIcon));
1603 DIcon.cb = sizeof(DIcon);
1604 DIcon.cptl = 0;
1605 DIcon.hImage = hptrINI;
1606 DIcon.fl = DRG_ICON;
1607 DIcon.sizlStretch.cx = 32;
1608 DIcon.sizlStretch.cy = 32;
1609 DIcon.cxOffset = -16;
1610 DIcon.cyOffset = 0;
1611 DItem.hwndItem = hwnd;
1612 DItem.ulItemID = 0L;
1613 DItem.hstrType = DrgAddStrHandle(DRT_UNKNOWN);
1614 DItem.hstrRMF = DrgAddStrHandle("<DRM_FM2INIRECORD,DRF_FM2INI>");
1615 DItem.hstrContainerName = DrgAddStrHandle(inidata->ininame);
1616 DItem.hstrSourceName = DrgAddStrHandle(inidata->applname);
1617 if (id == INI_APPLIST)
1618 DItem.hstrTargetName = DrgAddStrHandle(NullStr);
1619 else
1620 DItem.hstrTargetName = DrgAddStrHandle(inidata->keyname);
1621 DItem.fsControl = 0;
1622 DItem.fsSupportedOps = DO_COPYABLE | DO_LINKABLE | DO_MOVEABLE;
1623 pDInfo = DrgAllocDraginfo(1L);
1624 DrgSetDragitem(pDInfo, &DItem, sizeof(DRAGITEM), 0L);
1625 hDrop = DrgDrag(hwnd, pDInfo, &DIcon, 1L, VK_ENDDRAG, (PVOID) NULL);
1626 if (hDrop == NULLHANDLE)
1627 FreeDragInfoData(hwnd, pDInfo);
1628 WinDestroyPointer(hptrINI);
1629 }
1630 break;
1631
1632 case DM_DRAGOVER:
1633 {
1634 PDRAGINFO pDInfo = (PDRAGINFO) mp1;
1635 PDRAGITEM pDItem;
1636
1637 if (!DrgAccessDraginfo(pDInfo)) {
1638 Win_Error(HWND_DESKTOP, HWND_DESKTOP, pszSrcFile, __LINE__,
1639 "DrgAccessDraginfo");
1640 }
1641 else {
1642 pDItem = DrgQueryDragitemPtr(pDInfo,0);
1643 /* Check valid rendering mechanisms and data */
1644 if (DrgVerifyRMF(pDItem, DRM_OS2FILE, NULL)) {
1645 DrgFreeDraginfo(pDInfo);
1646 return (MRFROM2SHORT(DOR_DROP, DO_LINK)); /* OK to drop */
1647 }
1648 else if (DrgVerifyRMF(pDItem, DRM_FM2INIRECORD, DRF_FM2INI)) {
1649 if (WinQueryWindow(pDInfo->hwndSource, QW_PARENT) !=
1650 WinQueryWindow(hwnd, QW_PARENT))
1651 {
1652 DrgFreeDraginfo(pDInfo);
1653 return (MRFROM2SHORT(DOR_DROP, ((fCopyDefault) ? DO_COPY : DO_MOVE)));
1654 }
1655 }
1656 DrgFreeDraginfo(pDInfo);
1657 }
1658 }
1659 return MRFROM2SHORT(DOR_NEVERDROP, 0);
1660
1661 case DM_DRAGLEAVE:
1662
1663 break;
1664
1665 case DM_DROP:
1666 {
1667 PDRAGINFO pDInfo = (PDRAGINFO) mp1;
1668 PDRAGITEM pDItem; /* Pointer to DRAGITEM */
1669 ULONG numitems, curitem, len;
1670 USHORT action;
1671 CHAR szFrom[CCHMAXPATH + 2], szDir[CCHMAXPATH + 1],
1672 szTemp[CCHMAXPATH + 2];
1673 FILESTATUS3 fsa;
1674 INIREC inirec;
1675
1676 if (!DrgAccessDraginfo(pDInfo)) {
1677 Win_Error(HWND_DESKTOP, HWND_DESKTOP, pszSrcFile, __LINE__,
1678 "DrgAccessDraginfo");
1679 return 0;
1680 }
1681 numitems = DrgQueryDragitemCount(pDInfo);
1682 for (curitem = 0; curitem < numitems; curitem++) {
1683 pDItem = DrgQueryDragitemPtr(pDInfo, curitem);
1684 if (DrgVerifyRMF(pDItem, DRM_OS2FILE, NULL)) {
1685 if (pDItem->fsControl & DC_PREPARE)
1686 DrgSendTransferMsg(pDItem->hwndItem,
1687 DM_ENDCONVERSATION,
1688 MPFROMLONG(pDItem->ulItemID),
1689 MPFROMLONG(DMFL_TARGETFAIL));
1690 else {
1691 if (FullDrgName(pDItem, szFrom, sizeof(szFrom)) &&
1692 !DosQueryPathInfo(szFrom, FIL_STANDARD, &fsa, sizeof(fsa)))
1693 WinSendMsg(WinQueryWindow(hwnd, QW_PARENT), WM_COMMAND,
1694 MPFROM2SHORT(IDM_COMPARE, 0), MPFROMP(szFrom));
1695 DrgSendTransferMsg(pDItem->hwndItem,
1696 DM_ENDCONVERSATION,
1697 MPFROMLONG(pDItem->ulItemID),
1698 MPFROMLONG(DMFL_TARGETFAIL));
1699 }
1700 }
1701 else if (DrgVerifyRMF(pDItem, DRM_FM2INIRECORD, DRF_FM2INI)) {
1702 *szDir = *szFrom = *szTemp = 0;
1703 len = DrgQueryStrName(pDItem->hstrContainerName, CCHMAXPATH, szDir);
1704 szDir[len] = 0;
1705 len = DrgQueryStrName(pDItem->hstrSourceName, CCHMAXPATH, szFrom);
1706 szFrom[len] = 0;
1707 len = DrgQueryStrName(pDItem->hstrTargetName, CCHMAXPATH, szTemp);
1708 szTemp[len] = 0;
1709 switch (pDInfo->usOperation) {
1710 case DO_MOVE:
1711 action = IDM_MOVE;
1712 break;
1713 case DO_COPY:
1714 action = IDM_COPY;
1715 break;
1716 default:
1717 action = IDM_INFO;
1718 break;
1719 }
1720 memset(&inirec, 0, sizeof(inirec));
1721 inirec.size = sizeof(inirec);
1722 strcpy(inirec.filename2, szDir);
1723 strcpy(inirec.app, szFrom);
1724 strcpy(inirec.key, szTemp);
1725 inirec.action = action;
1726 inirec.hwndSource = WinQueryWindow(pDInfo->hwndSource, QW_PARENT);
1727 WinSendMsg(WinQueryWindow(hwnd, QW_PARENT), WM_COMMAND,
1728 MPFROM2SHORT(action, 0), MPFROMP(&inirec));
1729 DrgSendTransferMsg(pDItem->hwndItem,
1730 DM_ENDCONVERSATION,
1731 MPFROMLONG(pDItem->ulItemID),
1732 MPFROMLONG(DMFL_TARGETFAIL));
1733 }
1734 } // for
1735 FreeDragInfoData(hwnd, pDInfo);
1736 }
1737 return 0;
1738
1739 case WM_DESTROY:
1740 if (hwndPopup)
1741 WinDestroyWindow(hwndPopup);
1742 hwndPopup = (HWND) 0;
1743 break;
1744 } // switch
1745 if (oldproc)
1746 return oldproc(hwnd, msg, mp1, mp2);
1747 return WinDefWindowProc(hwnd, msg, mp1, mp2);
1748}
1749
1750MRESULT EXPENTRY IniLBSubProc2(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
1751{
1752 PFNWP oldproc = (PFNWP) WinQueryWindowPtr(hwnd, QWL_USER);
1753
1754 switch (msg) {
1755 case WM_SETFOCUS:
1756 if (mp2)
1757 PostMsg(WinQueryWindow(hwnd, QW_PARENT), UM_FOCUSME, mp1, mp2);
1758 break;
1759 }
1760 if (oldproc)
1761 return oldproc(hwnd, msg, mp1, mp2);
1762 return WinDefWindowProc(hwnd, msg, mp1, mp2);
1763}
1764
1765MRESULT EXPENTRY IniProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
1766{
1767 INIDATA *inidata;
1768 SHORT sSel;
1769 PFNWP oldproc;
1770
1771 switch (msg) {
1772 case WM_CREATE:
1773 inidata = xmallocz(sizeof(INIDATA), pszSrcFile, __LINE__);
1774 if (!inidata) {
1775 PostMsg(hwnd, WM_CLOSE, MPVOID, MPVOID);
1776 break;
1777 }
1778 inidata->size = sizeof(INIDATA);
1779 inidata->confirm = TRUE;
1780 inidata->currid = INI_APPLIST;
1781 inidata->hwndMenu = WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
1782 FID_MENU);
1783 inidata->hwndIni = hwnd;
1784 WinSetWindowPtr(hwnd, QWL_USER, (PVOID) inidata);
1785 WinCheckMenuItem(inidata->hwndMenu, INI_CONFIRM, inidata->confirm);
1786
1787 if (!WinCreateWindow
1788 (hwnd, WC_LISTBOX, (PSZ) NULL,
1789 WS_VISIBLE | LS_HORZSCROLL | LS_NOADJUSTPOS, 0, 0, 0, 0, hwnd,
1790 HWND_TOP, INI_APPLIST, NULL, NULL)) {
1791 Win_Error2(hwnd, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
1792 }
1793 if (!WinCreateWindow
1794 (hwnd, WC_LISTBOX, (PSZ) NULL,
1795 WS_VISIBLE | LS_HORZSCROLL | LS_NOADJUSTPOS, 0, 0, 0, 0, hwnd,
1796 HWND_TOP, INI_KEYLIST, NULL, NULL)) {
1797 Win_Error2(hwnd, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
1798 }
1799 if (!WinCreateWindow
1800 (hwnd, WC_LISTBOX, (PSZ) NULL,
1801 WS_VISIBLE | LS_HORZSCROLL | LS_NOADJUSTPOS, 0, 0, 0, 0, hwnd,
1802 HWND_TOP, INI_DATALIST, NULL, NULL)) {
1803 Win_Error2(hwnd, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
1804 }
1805 if (!WinCreateWindow(hwnd, WC_STATIC, (PSZ) NULL, WS_VISIBLE | SS_TEXT |
1806 DT_CENTER | DT_VCENTER, 0, 0, 0, 0, hwnd, HWND_TOP,
1807 INI_NUMAPPS, NULL, NULL)) {
1808 Win_Error2(hwnd, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
1809 }
1810 if (!WinCreateWindow(hwnd, WC_STATIC, (PSZ) NULL, WS_VISIBLE | SS_TEXT |
1811 DT_CENTER | DT_VCENTER, 0, 0, 0, 0, hwnd, HWND_TOP,
1812 INI_NUMKEYS, NULL, NULL)) {
1813 Win_Error2(hwnd, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
1814 }
1815 if (!WinCreateWindow(hwnd, WC_STATIC, (PSZ) NULL, WS_VISIBLE | SS_TEXT |
1816 DT_CENTER | DT_VCENTER, 0, 0, 0, 0, hwnd, HWND_TOP,
1817 INI_NUMDATA, NULL, NULL)) {
1818 Win_Error2(hwnd, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
1819 }
1820 if (!WinCreateWindow(hwnd,
1821 WC_STATIC,
1822 GetPString(IDS_APPLICATIONSTITLETEXT),
1823 WS_VISIBLE | SS_TEXT |
1824 DT_CENTER | DT_VCENTER,
1825 0,
1826 0, 0, 0, hwnd, HWND_TOP, INI_APPHDR, NULL, NULL)) {
1827 Win_Error2(hwnd, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
1828 }
1829 if (!WinCreateWindow(hwnd,
1830 WC_STATIC,
1831 GetPString(IDS_KEYWORDSTITLETEXT),
1832 WS_VISIBLE | SS_TEXT |
1833 DT_CENTER | DT_VCENTER,
1834 0,
1835 0, 0, 0, hwnd, HWND_TOP, INI_KEYHDR, NULL, NULL)) {
1836 Win_Error2(hwnd, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
1837 }
1838 if (!WinCreateWindow(hwnd,
1839 WC_STATIC,
1840 GetPString(IDS_DATABYTESTITLETEXT),
1841 WS_VISIBLE | SS_TEXT |
1842 DT_CENTER | DT_VCENTER,
1843 0,
1844 0, 0, 0, hwnd, HWND_TOP, INI_DATAHDR, NULL, NULL)) {
1845 Win_Error2(hwnd, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
1846 }
1847
1848 inidata->hwndApp = WinWindowFromID(hwnd, INI_APPLIST);
1849 inidata->hwndKey = WinWindowFromID(hwnd, INI_KEYLIST);
1850 inidata->hwndData = WinWindowFromID(hwnd, INI_DATALIST);
1851
1852 oldproc = WinSubclassWindow(WinWindowFromID(hwnd, INI_APPLIST),
1853 IniLBSubProc);
1854 WinSetWindowPtr(WinWindowFromID(hwnd, INI_APPLIST),
1855 QWL_USER, (PVOID) oldproc);
1856 oldproc = WinSubclassWindow(WinWindowFromID(hwnd, INI_KEYLIST),
1857 IniLBSubProc);
1858 WinSetWindowPtr(WinWindowFromID(hwnd, INI_KEYLIST),
1859 QWL_USER, (PVOID) oldproc);
1860 oldproc = WinSubclassWindow(WinWindowFromID(hwnd, INI_DATALIST),
1861 IniLBSubProc2);
1862 WinSetWindowPtr(WinWindowFromID(hwnd, INI_DATALIST),
1863 QWL_USER, (PVOID) oldproc);
1864 break;
1865
1866 case UM_FOCUSME:
1867 case WM_SETFOCUS:
1868 if (mp2) {
1869 if (hwndMain && fAutoView)
1870 PostMsg(hwndMain, UM_LOADFILE, MPVOID, MPVOID);
1871 inidata = INSTDATA(hwnd);
1872 if (!inidata)
1873 Runtime_Error2(pszSrcFile, __LINE__, IDS_NODATATEXT);
1874 else if (hwndStatus) {
1875 if (*inidata->ininame) {
1876 WinSetWindowText(hwndStatus, GetPString(IDS_INTERNALINIVIEWERTEXT));
1877 if (hwndStatus2)
1878 WinSetWindowText(hwndStatus2, inidata->ininame);
1879 }
1880 else
1881 PostMsg(hwnd, UM_SETUP, MPVOID, MPVOID);
1882 }
1883 }
1884 if (msg == WM_SETFOCUS)
1885 break;
1886 return 0;
1887
1888 case UM_SELECT:
1889 WinSetFocus(HWND_DESKTOP, WinWindowFromID(hwnd, INI_APPLIST));
1890 break;
1891
1892 case UM_ACTION:
1893 SetPresParams(WinWindowFromID(hwnd, INI_APPHDR),
1894 &RGBGREY,
1895 &RGBBLACK, &RGBBLACK, GetPString(IDS_8HELVBOLDTEXT));
1896 SetPresParams(WinWindowFromID(hwnd, INI_KEYHDR),
1897 &RGBGREY,
1898 &RGBBLACK, &RGBBLACK, GetPString(IDS_8HELVBOLDTEXT));
1899 SetPresParams(WinWindowFromID(hwnd, INI_DATAHDR),
1900 &RGBGREY,
1901 &RGBBLACK, &RGBBLACK, GetPString(IDS_8HELVBOLDTEXT));
1902 SetPresParams(WinWindowFromID(hwnd, INI_NUMAPPS),
1903 &RGBGREY,
1904 &RGBBLACK, &RGBBLACK, GetPString(IDS_8HELVBOLDTEXT));
1905 SetPresParams(WinWindowFromID(hwnd, INI_NUMKEYS),
1906 &RGBGREY,
1907 &RGBBLACK, &RGBBLACK, GetPString(IDS_8HELVBOLDTEXT));
1908 SetPresParams(WinWindowFromID(hwnd, INI_NUMDATA),
1909 &RGBGREY,
1910 &RGBBLACK, &RGBBLACK, GetPString(IDS_8HELVBOLDTEXT));
1911 if (!WinSetPresParam(WinWindowFromID(hwnd, INI_DATALIST),
1912 PP_FONTNAMESIZE,
1913 (ULONG) strlen(GetPString(IDS_5SYSTEMVIOTEXT)) + 1,
1914 (PVOID) GetPString(IDS_5SYSTEMVIOTEXT)))
1915 WinSetPresParam(WinWindowFromID(hwnd, INI_DATALIST),
1916 PP_FONTNAMESIZE,
1917 (ULONG) strlen(GetPString(IDS_10SYSTEMMONOTEXT)) + 1,
1918 (PVOID) GetPString(IDS_10SYSTEMMONOTEXT));
1919 RestorePresParams(hwnd, "IniUtil");
1920 return 0;
1921
1922 case WM_PRESPARAMCHANGED:
1923 PresParamChanged(hwnd, "IniUtil", mp1, mp2);
1924 break;
1925
1926 case UM_RESCAN:
1927 inidata = INSTDATA(hwnd);
1928 if (!inidata)
1929 Runtime_Error2(pszSrcFile, __LINE__, IDS_NODATATEXT);
1930 else if (mp1) {
1931 SHORT sSelect;
1932 BOOL inprofile;
1933 ULONG size;
1934 SHORT numitems = (SHORT)WinSendDlgItemMsg(hwnd,
1935 INI_APPLIST,
1936 LM_QUERYITEMCOUNT,
1937 MPVOID, MPVOID);
1938 if (!numitems) {
1939 PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(INI_REFRESH, 0), MPVOID);
1940 return 0;
1941 }
1942 size = 0;
1943 if (PrfQueryProfileSize(inidata->hini,
1944 (CHAR *)mp1, NULL, (PULONG) & size) && size)
1945 inprofile = TRUE;
1946 else
1947 inprofile = FALSE;
1948 sSelect = (SHORT) WinSendDlgItemMsg(hwnd,
1949 INI_APPLIST,
1950 LM_SEARCHSTRING,
1951 MPFROM2SHORT(LSS_CASESENSITIVE,
1952 LIT_FIRST),
1953 MPFROMP((CHAR *)mp1));
1954 if (sSelect >= 0) {
1955 if (!inprofile)
1956 WinSendDlgItemMsg(hwnd,
1957 INI_APPLIST,
1958 LM_DELETEITEM, MPFROMSHORT(sSelect), MPVOID);
1959 else if (!strcmp(inidata->applname, (CHAR *)mp1))
1960 PostMsg(hwnd,
1961 WM_CONTROL,
1962 MPFROM2SHORT(INI_APPLIST, LN_SELECT),
1963 MPFROMLONG(WinWindowFromID(hwnd, INI_APPLIST)));
1964 }
1965 else if (inprofile)
1966 WinSendDlgItemMsg(hwnd,
1967 INI_APPLIST,
1968 LM_INSERTITEM,
1969 MPFROM2SHORT(LIT_SORTASCENDING, 0),
1970 MPFROMP((CHAR *)mp1));
1971 if (mp2 && inidata->applname) {
1972 if (!EnumKeyNames(WinWindowFromID(hwnd, INI_KEYLIST),
1973 inidata->hini, inidata->applname))
1974 PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(INI_REFRESH, 0), MPVOID);
1975 }
1976 }
1977 return 0;
1978
1979 case UM_INITIALSIZE: /* kludge */
1980 inidata = INSTDATA(hwnd);
1981 if (!inidata)
1982 Runtime_Error2(pszSrcFile, __LINE__, IDS_NODATATEXT);
1983 else
1984 inidata->dontclose = TRUE;
1985 return 0;
1986
1987 case WM_SIZE:
1988 {
1989 SHORT cx = SHORT1FROMMP(mp2);
1990 SHORT cy = SHORT2FROMMP(mp2);
1991
1992 WinSetWindowPos(WinWindowFromID(hwnd, INI_APPHDR), HWND_TOP,
1993 2, cy - 22, (cx / 4) - 4, 20, SWP_MOVE | SWP_SIZE);
1994 WinSetWindowPos(WinWindowFromID(hwnd, INI_NUMAPPS), HWND_TOP,
1995 (cx / 4) + 2, cy - 22, (cx / 4) - 4, 20,
1996 SWP_MOVE | SWP_SIZE);
1997 WinSetWindowPos(WinWindowFromID(hwnd, INI_APPLIST), HWND_TOP,
1998 2, (cy / 2) + 2, (cx / 2) - 4, (cy / 2) - 28,
1999 SWP_MOVE | SWP_SIZE);
2000 WinSetWindowPos(WinWindowFromID(hwnd, INI_KEYHDR), HWND_TOP,
2001 (cx / 2) + 2, cy - 22, (cx / 4) - 4, 20,
2002 SWP_MOVE | SWP_SIZE);
2003 WinSetWindowPos(WinWindowFromID(hwnd, INI_NUMKEYS), HWND_TOP,
2004 (cx - (cx / 4)) + 2, cy - 22, (cx / 4) - 4, 20,
2005 SWP_MOVE | SWP_SIZE);
2006 WinSetWindowPos(WinWindowFromID(hwnd, INI_KEYLIST), HWND_TOP,
2007 (cx / 2) + 2, (cy / 2) + 2, (cx / 2) - 4, (cy / 2) - 28,
2008 SWP_MOVE | SWP_SIZE);
2009 WinSetWindowPos(WinWindowFromID(hwnd, INI_DATAHDR), HWND_TOP,
2010 2, (cy / 2) - 22, (cx / 2) - 4, 20,
2011 SWP_MOVE | SWP_SIZE);
2012 WinSetWindowPos(WinWindowFromID(hwnd, INI_NUMDATA), HWND_TOP,
2013 (cx / 2) + 2, (cy / 2) - 22, (cx / 2) - 4, 20,
2014 SWP_MOVE | SWP_SIZE);
2015 WinSetWindowPos(WinWindowFromID(hwnd, INI_DATALIST), HWND_TOP,
2016 2, 2, cx - 4, (cy / 2) - 28, SWP_MOVE | SWP_SIZE);
2017 }
2018 break;
2019
2020 case UM_LOADFILE:
2021 /* load initial file */
2022 inidata = INSTDATA(hwnd);
2023 if (!inidata)
2024 Runtime_Error2(pszSrcFile, __LINE__, IDS_NODATATEXT);
2025 else {
2026 if (mp1) {
2027 strcpy(inidata->ininame, (CHAR *)mp1);
2028 inidata->hini = PrfOpenProfile(WinQueryAnchorBlock(hwnd),
2029 inidata->ininame);
2030 xfree(mp1, pszSrcFile, __LINE__);
2031 }
2032 else
2033 inidata->hini = HINI_USERPROFILE;
2034 if (inidata->hini == NULLHANDLE) {
2035 Win_Error(HWND_DESKTOP, HWND_DESKTOP, pszSrcFile, __LINE__,
2036 "PrfOpenProfile failed for %s", inidata->ininame);
2037 }
2038 else {
2039 WinSendMsg(hwnd, UM_SETUP, MPVOID, MPVOID);
2040 WinSendMsg(hwnd, UM_SETDIR, MPVOID, MPVOID);
2041 WinSetWindowPos(WinQueryWindow(hwnd, QW_PARENT),
2042 HWND_TOP,
2043 0, 0, 0, 0, SWP_SHOW | SWP_ACTIVATE | SWP_ZORDER);
2044 EnumAppNames(WinWindowFromID(hwnd, INI_APPLIST), inidata->hini);
2045 return 0;
2046 }
2047 }
2048 PostMsg(hwnd, WM_CLOSE, MPVOID, MPVOID);
2049 return 0;
2050
2051 case WM_ERASEBACKGROUND:
2052 WinFillRect((HPS) mp1, (PRECTL) mp2, 0x00d0d0d0);
2053 return 0;
2054
2055 case WM_PAINT:
2056 {
2057 HPS hps;
2058 RECTL rcl;
2059
2060 hps = WinBeginPaint(hwnd, (HPS) 0, NULL);
2061 if (hps) {
2062 WinQueryWindowRect(hwnd, &rcl);
2063 WinFillRect(hps, &rcl, CLR_PALEGRAY);
2064 WinEndPaint(hps);
2065 /*
2066 * tell status window to paint its box
2067 */
2068 PaintRecessedWindow(WinWindowFromID(hwnd, INI_APPHDR),
2069 (HPS) 0, FALSE, FALSE);
2070 PaintRecessedWindow(WinWindowFromID(hwnd, INI_KEYHDR),
2071 (HPS) 0, FALSE, FALSE);
2072 PaintRecessedWindow(WinWindowFromID(hwnd, INI_DATAHDR),
2073 (HPS) 0, FALSE, FALSE);
2074 PaintRecessedWindow(WinWindowFromID(hwnd, INI_NUMAPPS),
2075 (HPS) 0, FALSE, FALSE);
2076 PaintRecessedWindow(WinWindowFromID(hwnd, INI_NUMKEYS),
2077 (HPS) 0, FALSE, FALSE);
2078 PaintRecessedWindow(WinWindowFromID(hwnd, INI_NUMDATA),
2079 (HPS) 0, FALSE, FALSE);
2080 inidata = INSTDATA(hwnd);
2081 if (!inidata)
2082 Runtime_Error2(pszSrcFile, __LINE__, IDS_NODATATEXT);
2083 else if (inidata->hwndCurrent)
2084 BoxWindow(inidata->hwndCurrent, (HPS) 0, CLR_RED);
2085 }
2086 }
2087 break;
2088
2089 case WM_CONTROL:
2090 switch (SHORT1FROMMP(mp1)) {
2091 case INI_KEYLIST:
2092 case INI_APPLIST:
2093 case INI_DATALIST:
2094 switch (SHORT2FROMMP(mp1)) {
2095 case LN_SETFOCUS:
2096 inidata = INSTDATA(hwnd);
2097 if (!inidata)
2098 Runtime_Error2(pszSrcFile, __LINE__, IDS_NODATATEXT);
2099 else {
2100 if (inidata->hwndCurrent)
2101 BoxWindow(inidata->hwndCurrent, (HPS) 0, CLR_PALEGRAY);
2102 inidata->hwndCurrent = WinWindowFromID(hwnd, SHORT1FROMMP(mp1));
2103 BoxWindow(WinWindowFromID(hwnd,
2104 SHORT1FROMMP(mp1)), (HPS) 0, CLR_RED);
2105 }
2106 break;
2107
2108 case LN_ENTER:
2109 case LN_SELECT:
2110 {
2111 CHAR applname[CCHMAXPATH], keyname[CCHMAXPATH];
2112 SHORT sSelect;
2113
2114 if (SHORT1FROMMP(mp1) == INI_DATALIST)
2115 break;
2116
2117 inidata = INSTDATA(hwnd);
2118 if (!inidata || !inidata->hini) {
2119 Runtime_Error2(pszSrcFile, __LINE__, IDS_NODATATEXT);
2120 break;
2121 }
2122 WinSendMsg(hwnd, UM_SETDIR, MPVOID, MPVOID);
2123 inidata->keyindex = inidata->appindex = 0;
2124 *applname = *keyname = *inidata->applname = *inidata->keyname = 0;
2125 sSelect = (SHORT) WinSendDlgItemMsg(hwnd,
2126 INI_APPLIST,
2127 LM_QUERYSELECTION,
2128 MPFROM2SHORT(LIT_FIRST, 0),
2129 MPVOID);
2130 if (sSelect < 0)
2131 break;
2132 inidata->appindex = sSelect;
2133 WinSendDlgItemMsg(hwnd,
2134 INI_APPLIST,
2135 LM_QUERYITEMTEXT,
2136 MPFROM2SHORT(sSelect, CCHMAXPATH - 1),
2137 MPFROMP(applname));
2138 if (SHORT1FROMMP(mp1) == INI_APPLIST) {
2139 if (!EnumKeyNames(WinWindowFromID(hwnd, INI_KEYLIST),
2140 inidata->hini, applname))
2141 PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(INI_REFRESH, 0), MPVOID);
2142 }
2143 else {
2144 sSelect = (SHORT) WinSendDlgItemMsg(hwnd, INI_KEYLIST,
2145 LM_QUERYSELECTION,
2146 MPFROM2SHORT(LIT_FIRST, 0),
2147 MPVOID);
2148 if (sSelect < 0)
2149 break;
2150 inidata->keyindex = sSelect;
2151 WinSendDlgItemMsg(hwnd,
2152 INI_KEYLIST,
2153 LM_QUERYITEMTEXT,
2154 MPFROM2SHORT(sSelect, CCHMAXPATH - 1),
2155 MPFROMP(keyname));
2156 if (!*keyname || !*applname)
2157 break;
2158 strcpy(inidata->keyname, keyname);
2159 strcpy(inidata->applname, applname);
2160 xfree(inidata->data, pszSrcFile, __LINE__);
2161 inidata->data = GetKeyData(WinWindowFromID(hwnd,
2162 INI_DATALIST),
2163 inidata->hini,
2164 applname, keyname, &inidata->datalen);
2165 if (!inidata->data)
2166 PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(INI_REFRESH, 0), MPVOID);
2167 }
2168 }
2169 break;
2170 }
2171 break;
2172 }
2173 return 0;
2174
2175 case UM_SETDIR:
2176 {
2177 SHORT num;
2178 CHAR s[81];
2179
2180 num = (SHORT) WinSendDlgItemMsg(hwnd,
2181 INI_APPLIST,
2182 LM_QUERYITEMCOUNT, MPVOID, MPVOID);
2183 sprintf(s, "%u", num);
2184 WinSetDlgItemText(hwnd, INI_NUMAPPS, s);
2185 num = (SHORT) WinSendDlgItemMsg(hwnd,
2186 INI_KEYLIST,
2187 LM_QUERYITEMCOUNT, MPVOID, MPVOID);
2188 sprintf(s, "%u", num);
2189 WinSetDlgItemText(hwnd, INI_NUMKEYS, s);
2190 WinSetDlgItemText(hwnd, INI_NUMDATA, "0");
2191 WinSendDlgItemMsg(hwnd, INI_DATALIST, LM_DELETEALL, MPVOID, MPVOID);
2192 // inidata = WinQueryWindowPtr(hwnd, QWL_USER); // 09 Jan 08 SHL
2193 }
2194 return 0;
2195
2196 case UM_SETUP:
2197 inidata = INSTDATA(hwnd);
2198 if (!inidata)
2199 Runtime_Error2(pszSrcFile, __LINE__, IDS_NODATATEXT);
2200 else {
2201 PRFPROFILE prfp;
2202 CHAR sysini[CCHMAXPATH + 81];
2203 CHAR userini[CCHMAXPATH];
2204
2205 memset(&prfp, 0, sizeof(PRFPROFILE));
2206 prfp.cchUserName = CCHMAXPATH;
2207 prfp.cchSysName = CCHMAXPATH;
2208 prfp.pszUserName = (PSZ) userini;
2209 prfp.pszSysName = (PSZ) sysini;
2210 if (PrfQueryProfile(WinQueryAnchorBlock(hwnd), &prfp)) {
2211 if (inidata->hini == HINI_SYSTEMPROFILE)
2212 strcpy(inidata->ininame, sysini);
2213 else if (inidata->hini == HINI_USERPROFILE)
2214 strcpy(inidata->ininame, userini);
2215 sprintf(sysini, GetPString(IDS_INITITLETEXT), inidata->ininame);
2216 WinSetWindowText(WinQueryWindow(hwnd, QW_PARENT), sysini);
2217 if (WinQueryWindow(hwnd, QW_PARENT) ==
2218 WinQueryActiveWindow(WinQueryWindow
2219 (WinQueryWindow(hwnd, QW_PARENT),
2220 QW_PARENT))) {
2221 if (hwndStatus)
2222 WinSetWindowText(hwndStatus,
2223 GetPString(IDS_INTERNALINIVIEWERTEXT));
2224 if (hwndStatus2)
2225 WinSetWindowText(hwndStatus2, inidata->ininame);
2226 }
2227 }
2228 else
2229 WinSetWindowText(WinQueryWindow(hwnd, QW_PARENT),
2230 GetPString(IDS_INIQUERYPRFFAILEDTEXT));
2231 return 0;
2232 }
2233
2234 PostMsg(hwnd, WM_CLOSE, MPVOID, MPVOID);
2235 return 0;
2236
2237 case WM_CHAR:
2238 if (!(SHORT1FROMMP(mp1) & KC_KEYUP)) {
2239 if (SHORT1FROMMP(mp1) & KC_VIRTUALKEY) {
2240 switch (SHORT2FROMMP(mp2)) {
2241 case VK_DELETE:
2242 inidata = INSTDATA(hwnd);
2243 if (!inidata)
2244 Runtime_Error2(pszSrcFile, __LINE__, IDS_NODATATEXT);
2245 else {
2246 SHORT cmd = inidata->hwndCurrent &&
2247 WinQueryWindowUShort(inidata->hwndCurrent, QWS_ID) ==
2248 INI_APPLIST ?
2249 INI_DELETEAPP :INI_DELETEKEY;
2250 PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(cmd, 0), MPVOID);
2251 }
2252 break;
2253 }
2254 }
2255 }
2256 break;
2257
2258 case WM_COMMAND:
2259 switch (SHORT1FROMMP(mp1)) {
2260 case IDM_FINDNEXT:
2261 case IDM_FINDFIRST:
2262 inidata = INSTDATA(hwnd);
2263 if (!inidata)
2264 Runtime_Error2(pszSrcFile, __LINE__, IDS_NODATATEXT);
2265 else if (inidata->hwndCurrent) {
2266 STRINGINPARMS sip;
2267 static CHAR tofind[258] = "";
2268 SHORT x, z;
2269
2270 if (SHORT1FROMMP(mp1) == IDM_FINDFIRST || !*tofind) {
2271 z = LIT_FIRST;
2272 memset(&sip, 0, sizeof(sip));
2273 sip.help = GetPString(IDS_INISEARCHHELPTEXT);
2274 sip.prompt = GetPString(IDS_INISEARCHPROMPTTEXT);
2275 sip.inputlen = 257;
2276 sip.ret = tofind;
2277 sip.title = GetPString(IDS_INISEARCHTITLETEXT);
2278 if (WinDlgBox(HWND_DESKTOP,
2279 hwnd,
2280 InputDlgProc, FM3ModHandle, STR_FRAME, &sip)) {
2281 rstrip(tofind);
2282 if (!*tofind) {
2283 DosBeep(50, 100);
2284 break;
2285 }
2286 }
2287 else
2288 break;
2289 }
2290 else {
2291 z = (SHORT) WinSendMsg(inidata->hwndCurrent,
2292 LM_QUERYSELECTION,
2293 MPFROM2SHORT(LIT_CURSOR, 0), MPVOID);
2294 if (z < 0)
2295 z = LIT_FIRST;
2296 }
2297 x = (SHORT) WinSendMsg(inidata->hwndCurrent,
2298 LM_SEARCHSTRING,
2299 MPFROM2SHORT(LSS_SUBSTRING, z),
2300 MPFROMP(tofind));
2301 if (x >= 0 && x > z) {
2302 WinSendMsg(inidata->hwndCurrent,
2303 LM_SETTOPINDEX, MPFROM2SHORT(x, 0), MPVOID);
2304 WinSendMsg(inidata->hwndCurrent,
2305 LM_SELECTITEM,
2306 MPFROM2SHORT(x, 0), MPFROM2SHORT(TRUE, 0));
2307 }
2308 else
2309 DosBeep(250, 100);
2310 }
2311 break;
2312
2313 case IDM_FILTER:
2314 inidata = INSTDATA(hwnd);
2315 if (!inidata)
2316 Runtime_Error2(pszSrcFile, __LINE__, IDS_NODATATEXT);
2317 else {
2318 SHORT numitems = (SHORT)WinSendDlgItemMsg(hwnd,
2319 INI_APPLIST,
2320 LM_QUERYITEMCOUNT,
2321 MPVOID, MPVOID);
2322 if (numitems)
2323 WinDlgBox(HWND_DESKTOP,
2324 hwnd,
2325 FilterIniProc, FM3ModHandle, IAF_FRAME, (PVOID) inidata);
2326 else
2327 DosBeep(50, 100);
2328 }
2329 break;
2330
2331 case IDM_COPY:
2332 case IDM_INFO:
2333 case IDM_MOVE:
2334 inidata = INSTDATA(hwnd);
2335 if (!inidata || !*inidata->ininame)
2336 Runtime_Error2(pszSrcFile, __LINE__, IDS_NODATATEXT);
2337 else if (mp2) {
2338 INIREC *inirec = xmallocz(sizeof(INIREC), pszSrcFile, __LINE__);
2339 if (inirec) {
2340 *inirec = *(INIREC *) mp2;
2341 inirec->hwndDlg = hwnd;
2342 inirec->confirm = inidata->confirm;
2343 strcpy(inirec->filename1, inidata->ininame);
2344 if (_beginthread(CopyIniThread, NULL, 122880, (PVOID) inirec) == -1) {
2345 Runtime_Error(pszSrcFile, __LINE__,
2346 GetPString(IDS_COULDNTSTARTTHREADTEXT));
2347 xfree(inirec, pszSrcFile, __LINE__);
2348 }
2349 }
2350 }
2351 break;
2352
2353 case IDM_COMPARE:
2354 inidata = INSTDATA(hwnd);
2355 if (!inidata || !*inidata->ininame)
2356 Runtime_Error2(pszSrcFile, __LINE__, IDS_NODATATEXT);
2357 else if (mp2) {
2358 INIREC *inirec = xmalloc(sizeof(INIREC), pszSrcFile, __LINE__);
2359 if (inirec) {
2360 strcpy(inirec->filename2, (CHAR *)(mp2));
2361 strcpy(inirec->filename1, inidata->ininame);
2362 inirec->hwndDlg = hwnd;
2363 if (_beginthread(CompareIniThread, NULL, 122880, (PVOID) inirec) ==
2364 -1) {
2365 Runtime_Error(pszSrcFile, __LINE__,
2366 GetPString(IDS_COULDNTSTARTTHREADTEXT));
2367 xfree(inirec, pszSrcFile, __LINE__);
2368 }
2369 }
2370 }
2371 break;
2372
2373 case INI_COPYAPP:
2374 case INI_COPYKEY:
2375 case INI_RENAMEAPP:
2376 case INI_RENAMEKEY:
2377 inidata = INSTDATA(hwnd);
2378 if (!inidata) {
2379 Runtime_Error2(pszSrcFile, __LINE__, IDS_NODATATEXT);
2380 break;
2381 }
2382 if (!*inidata->ininame ||
2383 !*inidata->applname ||
2384 (!*inidata->keyname &&
2385 (SHORT1FROMMP(mp1) == INI_RENAMEKEY ||
2386 SHORT1FROMMP(mp1) == INI_COPYKEY)))
2387 break;
2388 {
2389 INIREC *inirec = xmallocz(sizeof(INIREC), pszSrcFile, __LINE__);
2390 if (inirec) {
2391 inirec->size = sizeof(INIREC);
2392 inirec->hwndDlg = hwnd;
2393 inirec->confirm = inidata->confirm;
2394 inirec->action = (SHORT1FROMMP(mp1) == INI_COPYAPP ||
2395 SHORT1FROMMP(mp1) == INI_COPYKEY) ?
2396 IDM_COPY : IDM_MOVE;
2397 strcpy(inirec->filename1, inidata->ininame);
2398 strcpy(inirec->filename2, inidata->ininame);
2399 if (SHORT1FROMMP(mp1) == INI_COPYKEY ||
2400 SHORT1FROMMP(mp1) == INI_RENAMEKEY)
2401 strcpy(inirec->key, inidata->keyname);
2402 strcpy(inirec->app, inidata->applname);
2403 if (!WinDlgBox(HWND_DESKTOP,
2404 hwnd,
2405 IntraIniProc,
2406 FM3ModHandle, INII_FRAME, (PVOID) inirec)) {
2407 xfree(inirec, pszSrcFile, __LINE__);
2408 break;
2409 }
2410 if (_beginthread(CopyIniThread, NULL, 122880, (PVOID) inirec) == -1) {
2411 Runtime_Error(pszSrcFile, __LINE__,
2412 GetPString(IDS_COULDNTSTARTTHREADTEXT));
2413 xfree(inirec, pszSrcFile, __LINE__);
2414 }
2415 }
2416 }
2417 break;
2418
2419 case INI_BACKUPINI:
2420 inidata = INSTDATA(hwnd);
2421 if (!inidata)
2422 Runtime_Error2(pszSrcFile, __LINE__, IDS_NODATATEXT);
2423 else if (*inidata->ininame) {
2424 // 09 Jan 08 SHL fixme to complain
2425 CHAR filename[CCHMAXPATH], *p;
2426
2427 strcpy(filename, inidata->ininame);
2428 p = filename;
2429 while (*p) {
2430 if (*p == '/')
2431 *p = '\\';
2432 p++;
2433 }
2434 p = strrchr(filename, '\\');
2435 if (p) {
2436 p++;
2437 *p = 0;
2438 }
2439 else
2440 *filename = 0;
2441 strcat(filename, "*.INI");
2442 if (export_filename(hwnd, filename, TRUE)) {
2443
2444 PPRFPROFILE prfp;
2445
2446 prfp = xmallocz(sizeof(PRFPROFILE), pszSrcFile, __LINE__);
2447 if (prfp) {
2448 prfp->pszUserName =
2449 xstrdup(inidata->ininame, pszSrcFile, __LINE__);
2450 if (!prfp->pszUserName)
2451 xfree(prfp, pszSrcFile, __LINE__);
2452 else {
2453 prfp->cchUserName = strlen(prfp->pszUserName);
2454 prfp->pszSysName = xstrdup(filename, pszSrcFile, __LINE__);
2455 if (!prfp->pszSysName) {
2456 xfree(prfp->pszUserName, pszSrcFile, __LINE__);
2457 xfree(prfp, pszSrcFile, __LINE__);
2458 }
2459 else {
2460 prfp->cchSysName = strlen(prfp->pszSysName);
2461 if (_beginthread(BackupIniThread, NULL, 122880, (PVOID) prfp)
2462 == -1) {
2463 Runtime_Error(pszSrcFile, __LINE__,
2464 GetPString(IDS_COULDNTSTARTTHREADTEXT));
2465 xfree(prfp->pszSysName, pszSrcFile, __LINE__);
2466 xfree(prfp->pszUserName, pszSrcFile, __LINE__);
2467 xfree(prfp, pszSrcFile, __LINE__);
2468 }
2469 else
2470 DosSleep(100); //05 Aug 07 GKY 250
2471 }
2472 }
2473 }
2474 }
2475 }
2476 break;
2477
2478 case INI_CHANGEINI:
2479 inidata = INSTDATA(hwnd);
2480 if (!inidata)
2481 Runtime_Error2(pszSrcFile, __LINE__, IDS_NODATATEXT);
2482 else {
2483 if (WinDlgBox(HWND_DESKTOP,
2484 hwnd,
2485 ChangeIniProc,
2486 FM3ModHandle, INIR_FRAME, (PVOID) inidata->ininame)) {
2487 WinSendMsg(hwnd, UM_SETUP, MPVOID, MPVOID);
2488 WinSendMsg(hwnd, UM_SETDIR, MPVOID, MPVOID);
2489 EnumAppNames(WinWindowFromID(hwnd, INI_APPLIST), inidata->hini);
2490 }
2491 }
2492 break;
2493
2494 case INI_SWAPINI:
2495 inidata = INSTDATA(hwnd);
2496 if (!inidata)
2497 Runtime_Error2(pszSrcFile, __LINE__, IDS_NODATATEXT);
2498 else {
2499 if (WinDlgBox(HWND_DESKTOP,
2500 hwnd,
2501 SwapIniProc,
2502 FM3ModHandle, INIR_FRAME, (PVOID) inidata->ininame)) {
2503 WinSendMsg(hwnd, UM_SETUP, MPVOID, MPVOID);
2504 WinSendMsg(hwnd, UM_SETDIR, MPVOID, MPVOID);
2505 EnumAppNames(WinWindowFromID(hwnd, INI_APPLIST), inidata->hini);
2506 }
2507 }
2508 break;
2509
2510 case IDM_NEXTWINDOW:
2511 inidata = INSTDATA(hwnd);
2512 if (!inidata)
2513 Runtime_Error2(pszSrcFile, __LINE__, IDS_NODATATEXT);
2514 else {
2515 inidata->currid++;
2516 if (inidata->currid > INI_DATALIST)
2517 inidata->currid = INI_APPLIST;
2518 }
2519 WinSetFocus(HWND_DESKTOP, WinWindowFromID(hwnd, inidata->currid));
2520 break;
2521
2522 case IDM_PREVWINDOW:
2523 inidata = INSTDATA(hwnd);
2524 if (!inidata)
2525 Runtime_Error2(pszSrcFile, __LINE__, IDS_NODATATEXT);
2526 else {
2527 inidata->currid--;
2528 if (inidata->currid < INI_APPLIST)
2529 inidata->currid = INI_DATALIST;
2530 }
2531 WinSetFocus(HWND_DESKTOP, WinWindowFromID(hwnd, inidata->currid));
2532 break;
2533
2534 case INI_CONFIRM:
2535 inidata = INSTDATA(hwnd);
2536 if (!inidata)
2537 Runtime_Error2(pszSrcFile, __LINE__, IDS_NODATATEXT);
2538 else {
2539 inidata->confirm = (inidata->confirm) ? FALSE : TRUE;
2540 WinCheckMenuItem(inidata->hwndMenu, INI_CONFIRM, inidata->confirm);
2541
2542 }
2543 break;
2544
2545 case INI_EDITENTRY:
2546 case INI_ADDENTRY:
2547 inidata = INSTDATA(hwnd);
2548 if (!inidata)
2549 Runtime_Error2(pszSrcFile, __LINE__, IDS_NODATATEXT);
2550 else {
2551 inidata->edit = (SHORT1FROMMP(mp1) == INI_EDITENTRY);
2552 WinDlgBox(HWND_DESKTOP,
2553 hwnd, AddIniProc, FM3ModHandle, IAD_FRAME, (PVOID) inidata);
2554 }
2555 break;
2556
2557 case INI_OTHERPROFILE:
2558 inidata = INSTDATA(hwnd);
2559 if (!inidata)
2560 Runtime_Error2(pszSrcFile, __LINE__, IDS_NODATATEXT);
2561 else {
2562 CHAR filename[CCHMAXPATH + 81], *p;
2563 FILESTATUS3 fsa;
2564 HINI hINI;
2565
2566 strcpy(filename, inidata->ininame);
2567 p = filename;
2568 while (*p) {
2569 if (*p == '/')
2570 *p = '\\';
2571 p++;
2572 }
2573 p = strrchr(filename, '\\');
2574 if (p) {
2575 p++;
2576 *p = 0;
2577 }
2578 else
2579 *filename = 0;
2580 strcat(filename, "*.INI");
2581 if (insert_filename(hwnd,
2582 filename,
2583 TRUE,
2584 TRUE) &&
2585 *filename &&
2586 !DosQueryPathInfo(filename, FIL_STANDARD, &fsa, sizeof(fsa))) {
2587 hINI = PrfOpenProfile(WinQueryAnchorBlock(hwnd), filename);
2588 if (hINI == NULLHANDLE) {
2589 Win_Error(hwnd, hwnd, __FILE__, __LINE__,
2590 GetPString(IDS_INICANTOPENINITEXT), filename);
2591 }
2592 else {
2593 if (*inidata->ininame) {
2594 if (inidata->hini)
2595 CloseProfile(inidata->hini, FALSE);
2596 *inidata->ininame = 0;
2597 }
2598 inidata->hini = hINI;
2599 strcpy(inidata->ininame, filename);
2600 WinSendMsg(hwnd, UM_SETUP, MPVOID, MPVOID);
2601 WinSendMsg(hwnd, UM_SETDIR, MPVOID, MPVOID);
2602 EnumAppNames(WinWindowFromID(hwnd, INI_APPLIST), inidata->hini);
2603 }
2604 }
2605 }
2606 break;
2607
2608 case INI_USERPROFILE:
2609 inidata = INSTDATA(hwnd);
2610 if (!inidata)
2611 Runtime_Error2(pszSrcFile, __LINE__, IDS_NODATATEXT);
2612 else {
2613 if (inidata->hini && *inidata->ininame)
2614 CloseProfile(inidata->hini, FALSE);
2615 *inidata->ininame = 0;
2616 inidata->hini = HINI_USERPROFILE;
2617 WinSendMsg(hwnd, UM_SETUP, MPVOID, MPVOID);
2618 WinSendMsg(hwnd, UM_SETDIR, MPVOID, MPVOID);
2619 EnumAppNames(WinWindowFromID(hwnd, INI_APPLIST), inidata->hini);
2620 }
2621 break;
2622
2623 case INI_SYSTEMPROFILE:
2624 inidata = INSTDATA(hwnd);
2625 if (!inidata)
2626 Runtime_Error2(pszSrcFile, __LINE__, IDS_NODATATEXT);
2627 else {
2628 if (inidata->hini && *inidata->ininame)
2629 CloseProfile(inidata->hini, FALSE);
2630 *inidata->ininame = 0;
2631 inidata->hini = HINI_SYSTEMPROFILE;
2632 WinSendMsg(hwnd, UM_SETUP, MPVOID, MPVOID);
2633 WinSendMsg(hwnd, UM_SETDIR, MPVOID, MPVOID);
2634 EnumAppNames(WinWindowFromID(hwnd, INI_APPLIST), inidata->hini);
2635 }
2636 break;
2637
2638 case INI_REFRESH:
2639 inidata = INSTDATA(hwnd);
2640 if (!inidata)
2641 Runtime_Error2(pszSrcFile, __LINE__, IDS_NODATATEXT);
2642 else {
2643 WinSendMsg(hwnd, UM_SETDIR, MPVOID, MPVOID);
2644 EnumAppNames(WinWindowFromID(hwnd, INI_APPLIST), inidata->hini);
2645 }
2646 break;
2647
2648 case INI_DELETEKEY:
2649 inidata = INSTDATA(hwnd);
2650 if (!inidata)
2651 Runtime_Error2(pszSrcFile, __LINE__, IDS_NODATATEXT);
2652 else if (*inidata->applname && *inidata->keyname) {
2653
2654 SHORT keyindex = inidata->keyindex;
2655
2656 if (inidata->confirm && saymsg(MB_YESNO,
2657 hwnd,
2658 GetPString(IDS_CONFIRMTEXT),
2659 GetPString(IDS_INIDELETEKEYTEXT),
2660 inidata->keyname) == MBID_NO)
2661 break;
2662 PrfWriteProfileData(inidata->hini,
2663 inidata->applname, inidata->keyname, NULL, 0L);
2664 *inidata->keyname = 0;
2665 WinSendDlgItemMsg(hwnd,
2666 INI_KEYLIST,
2667 LM_DELETEITEM, MPFROM2SHORT(keyindex, 0), MPVOID);
2668 WinSendMsg(hwnd, UM_SETDIR, MPVOID, MPVOID);
2669 sSel = (SHORT) WinSendDlgItemMsg(hwnd,
2670 INI_KEYLIST,
2671 LM_QUERYITEMCOUNT, MPVOID, MPVOID);
2672 if (!sSel)
2673 WinSendMsg(hwnd, INI_DELETEAPP, MPVOID, MPVOID);
2674 else {
2675 sSel = min(keyindex, sSel - 1);
2676 WinSendDlgItemMsg(hwnd,
2677 INI_KEYLIST,
2678 LM_SELECTITEM,
2679 MPFROMSHORT(sSel), MPFROMSHORT(TRUE));
2680 }
2681 }
2682 break;
2683
2684 case INI_DELETEAPP:
2685 inidata = INSTDATA(hwnd);
2686 if (!inidata)
2687 Runtime_Error2(pszSrcFile, __LINE__, IDS_NODATATEXT);
2688 // 09 Jan 08 SHL fixme to complain?
2689 else if (*inidata->applname) {
2690
2691 SHORT appindex = inidata->appindex;
2692
2693 if (inidata->confirm && saymsg(MB_YESNO,
2694 hwnd,
2695 GetPString(IDS_CONFIRMTEXT),
2696 GetPString(IDS_INIDELETEAPPTEXT),
2697 inidata->applname) == MBID_NO)
2698 break;
2699 PrfWriteProfileData(inidata->hini, inidata->applname, NULL, NULL, 0L);
2700 *inidata->applname = *inidata->keyname = 0;
2701 WinSendMsg(hwnd, UM_SETDIR, MPVOID, MPVOID);
2702 WinSendDlgItemMsg(hwnd, INI_KEYLIST, LM_DELETEALL, MPVOID, MPVOID);
2703 WinSendDlgItemMsg(hwnd,
2704 INI_APPLIST,
2705 LM_DELETEITEM, MPFROM2SHORT(appindex, 0), MPVOID);
2706 WinSendMsg(hwnd, UM_SETDIR, MPVOID, MPVOID);
2707 sSel = (SHORT) WinSendDlgItemMsg(hwnd,
2708 INI_APPLIST,
2709 LM_QUERYITEMCOUNT, MPVOID, MPVOID);
2710 if (sSel) {
2711 sSel = min(appindex, sSel - 1);
2712 WinSendDlgItemMsg(hwnd,
2713 INI_APPLIST,
2714 LM_SELECTITEM,
2715 MPFROMSHORT(sSel), MPFROMSHORT(TRUE));
2716 }
2717 }
2718 break;
2719
2720 case DID_OK:
2721 case DID_CANCEL:
2722 PostMsg(hwnd, WM_CLOSE, MPVOID, MPVOID);
2723 break;
2724
2725 case IDM_HELP:
2726 if (hwndHelp)
2727 WinSendMsg(hwndHelp,
2728 HM_DISPLAY_HELP,
2729 MPFROM2SHORT(HELP_INI, 0), MPFROMSHORT(HM_RESOURCEID));
2730 break;
2731
2732 case IDM_ABOUT:
2733 saymsg(MB_ENTER | MB_ICONASTERISK,
2734 hwnd,
2735 GetPString(IDS_VIEWABOUTTITLETEXT),
2736 GetPString(IDS_INIABOUTTEXT));
2737 break;
2738 }
2739 return 0;
2740
2741 case WM_CLOSE:
2742 if (ParentIsDesktop(WinQueryWindow(hwnd, QW_PARENT), (HWND) 0)) {
2743
2744 SWP swp;
2745
2746 WinQueryWindowPos(WinQueryWindow(hwnd, QW_PARENT), &swp);
2747 if (!(swp.fl & (SWP_HIDE | SWP_MINIMIZE)))
2748 WinStoreWindowPos(FM2Str,
2749 "INIWindowPos", WinQueryWindow(hwnd, QW_PARENT));
2750 // inidata = WinQueryWindowPtr(hwnd, QWL_USER); // 09 Jan 08 SHL
2751 }
2752 WinDestroyWindow(WinQueryWindow(hwnd, QW_PARENT));
2753 return 0;
2754
2755 case WM_DESTROY:
2756 {
2757 BOOL dontclose = FALSE;
2758
2759 inidata = INSTDATA(hwnd);
2760 if (!inidata)
2761 Runtime_Error2(pszSrcFile, __LINE__, IDS_NODATATEXT);
2762 else {
2763 dontclose = inidata->dontclose;
2764 if (inidata->hini != NULLHANDLE && *inidata->ininame)
2765 CloseProfile(inidata->hini, FALSE);
2766 xfree(inidata->data, pszSrcFile, __LINE__);
2767 if (inidata->hwndPopup)
2768 WinDestroyWindow(inidata->hwndPopup);
2769 xfree(inidata, pszSrcFile, __LINE__);
2770 }
2771 if (!dontclose &&
2772 ParentIsDesktop(hwnd, WinQueryWindow(WinQueryWindow(hwnd,
2773 QW_PARENT),
2774 QW_PARENT))) {
2775 if (!PostMsg((HWND) 0, WM_QUIT, MPVOID, MPVOID))
2776 DosExit(EXIT_PROCESS, 1);
2777 }
2778 }
2779 break;
2780 }
2781 return WinDefWindowProc(hwnd, msg, mp1, mp2);
2782}
2783
2784#pragma alloc_text(INIS,EnumAppNames,GetKeyData,EnumKeyNames,AddIniProc,IniProc,BackupIniThread)
2785#pragma alloc_text(INIS,ChangeIniProc,SwapIniProc,IniLBSubProc,IniLBSubProc2,CopyIniThread)
2786#pragma alloc_text(INIS,IntraIniProc,FilterIniProc)
2787#pragma alloc_text(STARTUP,StartIniEditor)
Note: See TracBrowser for help on using the repository browser.