source: trunk/dll/inis.c@ 1391

Last change on this file since 1391 was 1391, checked in by Gregg Young, 17 years ago

Move nontranslated strings to init.c and codepage.c; use those strings in place of GetPString calls. Move other strings to a StringTable; minor cleanup and code changes to codepage.c to use a string array instead of GetPString calls. Ticket 340

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