source: trunk/dll/inis.c @ 761

Last change on this file since 761 was 761, checked in by Gregg Young, 13 years ago

Cleanup of FilesToGet? changes (ticket 138)

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