source: trunk/dll/inis.c@ 1161

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

Ticket 187: Draft 1: Functions only

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