source: trunk/dll/inis.c@ 1104

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

Replace save_dir2(dir) with strcpy(dir, pFM2SaveDirectory)

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