source: trunk/dll/inis.c@ 1185

Last change on this file since 1185 was 1185, checked in by John Small, 17 years ago

Ticket 187: Draft 2: Move remaining function declarations

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