source: trunk/dll/inis.c@ 914

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

Use CloseProfile to avoid spurious system INI closes

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