source: trunk/dll/inis.c@ 871

Last change on this file since 871 was 871, checked in by Steven Levine, 18 years ago

Correct hex edit buffer sizing to avoid data loss
Detect and report overflows in fixup()

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