source: trunk/dll/inis.c@ 1335

Last change on this file since 1335 was 1335, checked in by Steven Levine, 17 years ago

Ticket 26: Add exception handlers to all threads using xbeginthread

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