source: trunk/dll/avv.c@ 574

Last change on this file since 574 was 574, checked in by Gregg Young, 18 years ago

Use QWL_USER; Replace doesn't move the command and Okay on cmd dialog removed error on unchanged command

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 25.1 KB
RevLine 
[107]1
2/***********************************************************************
3
4 $Id: avv.c 574 2007-03-23 22:37:07Z gyoung $
5
[122]6 archiver.bb2 editor
7
[107]8 Copyright (c) 1993-98 M. Kimes
[304]9 Copyright (c) 2004, 2006 Steven H.Levine
[107]10
[199]11 31 Jul 04 SHL ArcReviewDlgProc: correct nameis... decodes
12 01 Aug 04 SHL Localize functions
13 01 Aug 04 SHL Rework fixup usage
14 06 Jun 05 SHL Drop unused
[250]15 14 Aug 05 SHL rewrite_archiverbb2: avoid dereferencing null signature
16 14 Aug 05 SHL ArcReviewDlgProc: ensure signature allocated
[420]17 29 May 06 SHL EditArchiverDefinition: rework
[313]18 26 Jun 06 SHL rewrite_archiverbb2: include user comments
[347]19 14 Jul 06 SHL Use Runtime_Error
[404]20 29 Jul 06 SHL Use xfgets
[420]21 30 Jul 06 SHL Avoid warnings when editing new definition
[574]22 22 Mar 07 GKY Use QWL_USER
[107]23
24***********************************************************************/
25
[2]26#define INCL_DOS
27#define INCL_WIN
[250]28#include <os2.h>
[2]29
30#include <stdlib.h>
31#include <stdio.h>
32#include <stdarg.h>
33#include <string.h>
34#include <ctype.h>
35#include <time.h>
[250]36
[2]37#include "fm3dll.h"
38#include "fm3dlg.h"
39#include "version.h"
40#include "fm3str.h"
41
42#pragma data_seg(DATA1)
[347]43
44static PSZ pszSrcFile = __FILE__;
45
[420]46#pragma alloc_text(AVV,EditArchiverDefinition,free_and_strdup_from_window)
[2]47#pragma alloc_text(AVV,get_int_from_window,get_int2_from_window)
48#pragma alloc_text(AVV,get_long_from_window,get_int3_from_window)
49#pragma alloc_text(AVV,get_int4_from_window)
50
[551]51static PSZ checkfile(PSZ file, INT * error);
52static BOOL check_archiver(HWND hwnd, ARC_TYPE * info);
53static INT get_int_from_window(HWND hwnd, USHORT id);
54static LONG get_long_from_window(HWND hwnd, USHORT id);
[122]55static PSZ nonull(PSZ a);
[551]56static PSZ free_and_strdup_from_window(HWND hwnd, USHORT id, PSZ pszDest);
[2]57
[420]58//=== EditArchiverDefinition() Select archiver to edit definition ===
[304]59
[420]60VOID EditArchiverDefinition(HWND hwnd)
[122]61{
[2]62 ARCDUMP ad;
[551]63 FILE *fp;
[304]64 ARC_TYPE *pat;
[2]65
[304]66 // Allow multiple edits
67 for (;;) {
[551]68 pat = NULL; // Do not hide dups
[304]69 if (!WinDlgBox(HWND_DESKTOP,
[551]70 hwnd,
71 SBoxDlgProc,
72 FM3ModHandle, ASEL_EDIT_FRAME, (PVOID) & pat) || !pat) {
[304]73 break; // we are done
[2]74 }
[304]75
[551]76 memset(&ad, 0, sizeof(ARCDUMP));
[304]77 ad.info = pat;
78 WinDlgBox(HWND_DESKTOP,
[551]79 hwnd, ArcReviewDlgProc, FM3ModHandle, AD_FRAME, MPFROMP(&ad));
80 } // for
[2]81}
82
[551]83static PSZ free_and_strdup_from_window(HWND hwnd, USHORT id, PSZ pszDest)
[122]84{
[420]85 CHAR sz[256];
[2]86
[420]87 xfree(pszDest);
[551]88 WinQueryDlgItemText(hwnd, id, sizeof(sz), sz);
[347]89 if (*sz)
90 pszDest = xstrdup(sz, pszSrcFile, __LINE__);
91 else
92 pszDest = NULL;
[122]93 return pszDest;
[2]94}
95
[551]96static INT get_int_from_window(HWND hwnd, USHORT id)
[122]97{
[420]98 CHAR s[256];
[2]99
[551]100 WinQueryDlgItemText(hwnd, id, sizeof(s), s);
[2]101 return atoi(s);
102}
103
[551]104static INT get_int2_from_window(HWND hwnd, USHORT id)
[122]105{
[420]106 CHAR s[256];
107 PSZ p;
[2]108
[551]109 WinQueryDlgItemText(hwnd, id, sizeof(s), s);
110 p = strchr(s, ',');
111 if (p)
[2]112 p++;
[420]113 return p ? atoi(p) : 0;
[2]114}
115
[551]116INT get_int3_from_window(HWND hwnd, USHORT id)
[122]117{
[420]118 CHAR s[256];
119 PSZ p;
[2]120
[551]121 WinQueryDlgItemText(hwnd, id, sizeof(s), s);
122 p = strchr(s, ',');
123 if (p) {
[2]124 p++;
[551]125 p = strchr(p, ',');
126 if (p)
[2]127 p++;
128 }
[420]129 return p ? atoi(p) : 0;
[2]130}
131
[551]132INT get_int4_from_window(HWND hwnd, USHORT id)
[122]133{
[420]134 CHAR s[256];
135 PSZ p;
[2]136
[551]137 WinQueryDlgItemText(hwnd, id, sizeof(s), s);
138 p = strchr(s, ',');
[420]139 if (p) {
[2]140 p++;
[551]141 p = strchr(p, ',');
[420]142 if (p) {
[2]143 p++;
[551]144 p = strchr(p, ',');
[420]145 if (p)
[551]146 p++;
[2]147 }
148 }
[420]149 return p ? atoi(p) : 0;
[2]150}
151
[551]152LONG get_long_from_window(HWND hwnd, USHORT id)
[122]153{
[420]154 CHAR s[256];
[2]155
[551]156 WinQueryDlgItemText(hwnd, id, sizeof(s), s);
[2]157 return atol(s);
158}
159
[199]160#pragma alloc_text (AVV2,nonull,rewrite_archiverbb2,checkfile)
[2]161
[122]162// nonull - convert NULL pointer to empty string
[2]163
[122]164static PSZ nonull(PSZ psz)
165{
[551]166 if (!psz)
[122]167 psz = NullStr;
168 return psz;
[2]169}
170
[313]171//=== rewrite_archiverbb2() rewrite archiver.bb2, prompt if arg NULL, merge comments ===
[2]172
[551]173VOID rewrite_archiverbb2(PSZ archiverbb2)
[122]174{
[551]175 FILE *fpNew;
176 FILE *fpOld = NULL;
177 UINT entry_num = 0; // Definition counter
178 UINT input_line_num = 0; // Input file line counter
179 ARC_TYPE *pat;
180 CHAR sz[258];
181 CHAR *psz;
182 BOOL needEntryNumber;
183 BOOL needReload = FALSE; // Because line numbers changed
184 time_t t;
[313]185 struct tm *tm;
[551]186 CHAR ch;
[2]187
[304]188 arcsigsmodified = FALSE;
189
190 if (!arcsighead) {
[2]191 saymsg(MB_CANCEL | MB_ICONEXCLAMATION,
[551]192 HWND_DESKTOP,
193 GetPString(IDS_SAYWHATTEXT), GetPString(IDS_NOINFOTOSAVETEXT));
[2]194 return;
195 }
[304]196 // Alert unless file name passed
197 if (!archiverbb2 || !*archiverbb2) {
[2]198 saymsg(MB_ENTER | MB_ICONASTERISK,
[551]199 HWND_DESKTOP,
200 GetPString(IDS_NOTETEXT), GetPString(IDS_SAVEARCBB2TEXT));
[2]201 archiverbb2 = GetPString(IDS_ARCHIVERBB2);
202 }
[313]203
204 /* save a backup */
[551]205 psz = strrchr(archiverbb2, '.');
206 if (psz && !stricmp(psz, ".BB2")) {
207 strcpy(psz, ".BAK");
[2]208 DosDelete(archiverbb2);
[551]209 strcpy(sz, archiverbb2);
210 strcpy(psz, ".BB2");
211 DosMove(archiverbb2, sz);
212 fpOld = fopen(sz, "r"); // OK for file not to exist
[2]213 }
[313]214
[551]215 fpNew = fopen(archiverbb2, "w");
[313]216
217 if (fpNew) {
218
[551]219 fprintf(fpNew, "%u\n", LINES_PER_ARCSIG);
[313]220 t = time(NULL);
221 tm = localtime(&t);
222
223 fprintf(fpNew,
[551]224 ";\n; %s file written by FM/2 v%d.%02d on %u/%u/%u %u:%02u:%02u\n;\n",
225 GetPString(IDS_ARCHIVERBB2),
226 VERMAJOR, VERMINOR,
227 tm->tm_mon + 1, tm->tm_mday, tm->tm_year + 1900,
228 tm->tm_hour, tm->tm_min, tm->tm_sec);
[313]229 // Rewrite header if known
230 if (fpOld && arcsigs_header_lines) {
231 needReload = TRUE;
232 while (input_line_num < arcsigs_header_lines) {
[551]233 psz = xfgets(sz, sizeof(sz), fpOld, pszSrcFile, __LINE__);
[313]234 if (!psz)
235 break;
[551]236 input_line_num++;
[313]237 if (input_line_num == 1)
[551]238 continue; // Bypass sig count
239 fputs(sz, fpNew);
[313]240 }
241 }
242 else {
243 // Write default header
[551]244 fputs(GetPString(IDS_ARCHIVERBB2TEXT), fpNew);
[313]245 }
246 pat = arcsighead;
247 while (pat) {
248 needEntryNumber = TRUE;
249 // Rewrite per sig header comments if any exist
[551]250 if (fpOld && pat->comment_line_num) {
251 needReload = TRUE; // fixme to optimize
[313]252 // Definitions reordered - need to rewind
[551]253 if (input_line_num > pat->comment_line_num) {
[313]254 fseek(fpOld, 0, SEEK_SET);
255 input_line_num = 0;
256 }
[551]257 while (input_line_num + 1 < pat->defn_line_num) {
258 psz = xfgets(sz, sizeof(sz), fpOld, pszSrcFile, __LINE__);
[313]259 if (!psz)
260 break; // Unexpected EOF
[551]261 input_line_num++;
262 if (input_line_num < pat->comment_line_num)
[313]263 continue;
[551]264 if (needEntryNumber && strnicmp(sz, "; Entry #", 9) == 0) {
265 // Rewrite entry count comment
[313]266 needEntryNumber = FALSE;
[551]267 for (psz = sz + 9; *psz == ' '; psz++) ; // Find non-blank
268 for (; (ch = *psz) >= '0' && ch <= '9'; psz++) ; // Find end of entry#
269 fprintf(fpNew, GetPString(IDS_ENTRYCNTRTEXT), ++entry_num);
270 fputs(psz, fpNew);
271 }
[313]272 else {
[551]273 fputs(sz, fpNew);
[313]274 }
[551]275 }
[313]276 }
277
278 if (needEntryNumber) {
[551]279 fputs(";\n", fpNew);
280 fprintf(fpNew, GetPString(IDS_ENTRYCNTRTEXT), ++entry_num);
281 if (pat->id)
282 fprintf(fpNew, " (%s)", pat->id);
283 fputs("\n;\n", fpNew);
[313]284 }
285
286 fprintf(fpNew,
[551]287 "%s\n%s\n%ld\n%s\n",
288 nonull(pat->id),
289 nonull(pat->ext), pat->file_offset, nonull(pat->list));
[313]290 fprintf(fpNew,
[551]291 "%s\n%s\n%s\n%s\n%s\n%s\n",
292 nonull(pat->extract),
293 nonull(pat->exwdirs),
294 nonull(pat->test),
295 nonull(pat->create),
296 nonull(pat->createwdirs), nonull(pat->createrecurse));
[313]297 fprintf(fpNew,
[551]298 "%s\n%s\n%s\n",
299 nonull(pat->move), nonull(pat->movewdirs), nonull(pat->delete));
[313]300 fprintf(fpNew,
[551]301 "%s\n%s\n%s\n%d\n%d\n%d,%d\n%d\n%d,%lu,%lu,%lu\n",
302 fixup(pat->signature,
303 sz,
304 sizeof(sz),
305 pat->siglen),
306 nonull(pat->startlist),
307 nonull(pat->endlist),
308 pat->osizepos,
309 pat->nsizepos,
310 pat->fdpos,
311 pat->datetype,
312 pat->fdflds,
313 pat->fnpos, pat->nameislast, pat->nameisnext, pat->nameisfirst);
[313]314 pat = pat->next;
[551]315 } // while more sigs
[313]316
317 // Rewrite trailer comments if known
318 if (fpOld && arcsigs_trailer_line_num) {
319 for (;;) {
[551]320 psz = xfgets(sz, sizeof(sz), fpOld, pszSrcFile, __LINE__);
[313]321 if (!psz)
322 break;
[551]323 input_line_num++;
[313]324 if (input_line_num < arcsigs_trailer_line_num)
[551]325 continue; // Bypass sig count
326 fputs(sz, fpNew);
[313]327 }
[2]328 }
[313]329
330 fclose(fpNew);
331
[551]332 } // if fpNew open OK
[313]333
334 if (fpOld)
335 fclose(fpOld);
336
337 if (needReload)
338 load_archivers(); // Resync commend line numbers
[2]339}
340
[551]341static PSZ checkfile(PSZ file, INT * error)
[122]342{
[551]343 CHAR *p, *pp = NULL;
344 INT ret;
[2]345 ULONG apptype;
346
[551]347 if (!file || !*file) {
[2]348 *error = 3;
349 return NULL;
350 }
[551]351 pp = strchr(file, ' ');
352 if (pp)
[2]353 *pp = 0;
354 p = searchpath(file);
[551]355 if (!p || !*p)
[2]356 *error = 1;
357 else {
[551]358 ret = (INT) DosQAppType(p, &apptype);
359 if (ret)
[2]360 *error = -1;
361 else {
362 apptype &= (~FAPPTYP_32BIT);
[551]363 if (!apptype ||
364 (apptype == FAPPTYP_NOTWINDOWCOMPAT) ||
365 (apptype == FAPPTYP_WINDOWCOMPAT) ||
366 (apptype & FAPPTYP_BOUND) ||
367 (apptype & FAPPTYP_WINDOWAPI) || (apptype & FAPPTYP_DOS)) {
368 *error = 0;
[2]369 }
370 else
[551]371 *error = 2;
[2]372 }
373 }
[551]374 if (pp)
[2]375 *pp = ' ';
376 return p;
377}
378
[199]379#pragma alloc_text (AVV3,check_archiver,ArcReviewDlgProc)
[2]380
[551]381static BOOL check_archiver(HWND hwnd, ARC_TYPE * info)
[122]382{
[551]383 BOOL noStart = FALSE, noEnd = FALSE, badPos = FALSE;
384 INT badList = 0, badCreate = 0, badExtract = 0;
[122]385 static PSZ aerrors[3];
[2]386
387 aerrors[0] = GetPString(IDS_STARTLISTEMPTYTEXT);
388 aerrors[1] = GetPString(IDS_ENDLISTEMPTYTEXT);
389 aerrors[2] = GetPString(IDS_BOGUSNAMETEXT);
[551]390 if (!info->startlist || !*info->startlist)
[304]391 noStart = TRUE;
[551]392 if (!info->endlist || !*info->endlist)
[304]393 noEnd = TRUE;
[551]394 if (info->fnpos > 50 || info->fnpos < -1)
[304]395 badPos = TRUE;
[551]396 checkfile(info->list, &badList);
397 checkfile(info->create, &badCreate);
398 checkfile(info->extract, &badExtract);
399 if (!noStart && !noEnd && !badPos && !badList && !badCreate && !badExtract)
[304]400 return TRUE; // OK
[420]401 if (!info->id)
402 return FALSE; // Assume new if no id
[2]403 saymsg(MB_ENTER | MB_ICONASTERISK,
[551]404 hwnd,
405 GetPString(IDS_WARNINGSTEXT),
406 GetPString(IDS_AVVCHK1TEXT),
407 noStart ? aerrors[0] : NullStr,
408 noEnd ? aerrors[1] : NullStr,
409 badPos ? aerrors[2] : NullStr,
410 badList == 1 ?
411 GetPString(IDS_AVVCHK2TEXT) :
412 badList == -1 ?
413 GetPString(IDS_AVVCHK3TEXT) :
414 badList == 2 ?
415 GetPString(IDS_AVVCHK4TEXT) :
416 badList == 3 ?
417 GetPString(IDS_AVVCHK5TEXT) :
418 NullStr,
419 badCreate == 1 ?
420 GetPString(IDS_AVVCHK6TEXT) :
421 badCreate == -1 ?
422 GetPString(IDS_AVVCHK7TEXT) :
423 badCreate == 2 ?
424 GetPString(IDS_AVVCHK8TEXT) :
425 badCreate == 3 ?
426 GetPString(IDS_AVVCHK9TEXT) :
427 NullStr,
428 badExtract == 1 ?
429 GetPString(IDS_AVVCHK10TEXT) :
430 badExtract == -1 ?
431 GetPString(IDS_AVVCHK11TEXT) :
432 badExtract == 2 ?
433 GetPString(IDS_AVVCHK12TEXT) :
434 badExtract == 3 ? GetPString(IDS_AVVCHK13TEXT) : NullStr);
435 if (badList || badExtract)
[304]436 return FALSE; // Problems
437 return TRUE; // OK
[2]438}
439
[304]440//=== ArcReviewDlgProc() View/edit single archiver.bb2 setup ===
[2]441
[551]442MRESULT EXPENTRY ArcReviewDlgProc(HWND hwnd, ULONG msg, MPARAM mp1,
443 MPARAM mp2)
[122]444{
[551]445 ARCDUMP *admp;
446 CHAR s[256];
447 SHORT sSelect;
[2]448
[551]449 if (msg != WM_INITDLG)
[574]450 admp = (ARCDUMP *) WinQueryWindowPtr(hwnd, QWL_USER);
[2]451
[551]452 switch (msg) {
453 case WM_INITDLG:
454 admp = (ARCDUMP *) mp2;
455 if (!admp || !admp->info) {
456 WinDismissDlg(hwnd, 0);
457 return 0;
458 }
[122]459
[551]460 WinSetWindowPtr(hwnd, QWL_USER, mp2);
[122]461
[551]462 WinSendDlgItemMsg(hwnd, AD_LISTBOX, LM_DELETEALL, MPVOID, MPVOID);
463 for (sSelect = AD_ID; sSelect < AD_ADDWPATHS + 1; sSelect++) {
464 WinSendDlgItemMsg(hwnd,
465 sSelect,
466 EM_SETTEXTLIMIT,
467 MPFROM2SHORT(sizeof(s) - 1, 0), MPVOID);
468 }
469 if (admp->info->id)
470 WinSetDlgItemText(hwnd, AD_ID, admp->info->id);
471 if (admp->info->ext)
472 WinSetDlgItemText(hwnd, AD_EXT, admp->info->ext);
473 sprintf(s, "%ld", admp->info->file_offset);
474 WinSetDlgItemText(hwnd, AD_SIGPOS, s);
475 if (admp->info->siglen) {
476 WinSetDlgItemText(hwnd,
477 AD_SIG,
478 fixup(admp->info->signature,
479 s, sizeof(s), admp->info->siglen));
480 }
481 if (admp->info->startlist)
482 WinSetDlgItemText(hwnd, AD_STARTLIST, admp->info->startlist);
483 if (admp->info->endlist)
484 WinSetDlgItemText(hwnd, AD_ENDLIST, admp->info->endlist);
485 if (admp->info->list)
486 WinSetDlgItemText(hwnd, AD_LIST, admp->info->list);
487 sprintf(s,
488 "%d,%d,%d,%d",
489 admp->info->fnpos,
490 admp->info->nameislast,
491 admp->info->nameisnext, admp->info->nameisfirst);
492 WinSetDlgItemText(hwnd, AD_FNAMEPOS, s);
493 sprintf(s, "%d", admp->info->osizepos);
494 WinSetDlgItemText(hwnd, AD_OLDSZ, s);
495 sprintf(s, "%d", admp->info->nsizepos);
496 WinSetDlgItemText(hwnd, AD_NEWSZ, s);
497 sprintf(s, "%d,%d", admp->info->fdpos, admp->info->datetype);
498 WinSetDlgItemText(hwnd, AD_DATEPOS, s);
499 sprintf(s, "%d", admp->info->fdflds);
500 WinSetDlgItemText(hwnd, AD_NUMDATEFLDS, s);
501 if (admp->info->extract)
502 WinSetDlgItemText(hwnd, AD_EXTRACT, admp->info->extract);
503 if (admp->info->exwdirs)
504 WinSetDlgItemText(hwnd, AD_WDIRS, admp->info->exwdirs);
505 if (admp->info->test)
506 WinSetDlgItemText(hwnd, AD_TEST, admp->info->test);
507 if (admp->info->create)
508 WinSetDlgItemText(hwnd, AD_ADD, admp->info->create);
509 if (admp->info->move)
510 WinSetDlgItemText(hwnd, AD_MOVE, admp->info->move);
511 if (admp->info->delete)
512 WinSetDlgItemText(hwnd, AD_DELETE, admp->info->delete);
513 if (admp->info->createrecurse)
514 WinSetDlgItemText(hwnd, AD_ADDRECURSE, admp->info->createrecurse);
515 if (admp->info->createwdirs)
516 WinSetDlgItemText(hwnd, AD_ADDWPATHS, admp->info->createwdirs);
517 if (admp->info->movewdirs)
518 WinSetDlgItemText(hwnd, AD_MOVEWPATHS, admp->info->movewdirs);
[122]519
[551]520 PostMsg(hwnd, UM_SETUP, MPVOID, MPVOID);
521 break; // WM_INITDLG
[2]522
[551]523 case UM_SETUP:
524 if (admp->listname && *admp->listname) {
[2]525
[551]526 FILE *fp = fopen(admp->listname, "r");
527
528 if (!fp) {
529 WinSendDlgItemMsg(hwnd,
530 AD_LISTBOX,
531 LM_INSERTITEM,
532 MPFROM2SHORT(LIT_END, 0),
533 MPFROMP(GetPString(IDS_CANTOPENFILETEXT)));
[2]534 }
535 else {
[551]536 while (!feof(fp)) {
537 if (!xfgets(s, sizeof(s), fp, pszSrcFile, __LINE__))
538 break;
539 stripcr(s);
540 WinSendDlgItemMsg(hwnd,
541 AD_LISTBOX,
542 LM_INSERTITEM,
543 MPFROM2SHORT(LIT_END, 0), MPFROMP(s));
544 }
545 fclose(fp);
[2]546 }
[551]547 }
548 else {
549 WinSendDlgItemMsg(hwnd,
550 AD_LISTBOX,
551 LM_INSERTITEM,
552 MPFROM2SHORT(LIT_END, 0),
553 MPFROMP(GetPString(IDS_NOTAPPLICABLETEXT)));
554 }
555 check_archiver(hwnd, admp->info);
556 return 0;
[2]557
[551]558 case WM_ADJUSTWINDOWPOS:
559 PostMsg(hwnd, UM_SETDIR, MPVOID, MPVOID);
560 break;
[2]561
[551]562 case UM_SETDIR:
563 PaintRecessedWindow(WinWindowFromID(hwnd, AD_HELP), (HPS) 0, FALSE, TRUE);
564 return 0;
[2]565
[551]566 case WM_CONTROL:
567 switch (SHORT1FROMMP(mp1)) {
568 case AD_LISTBOX:
569 switch (SHORT2FROMMP(mp1)) {
570 case LN_ENTER:
571 for (sSelect = 0; sSelect < 10; sSelect++)
572 WinSetDlgItemText(hwnd, AD_FLD1 + sSelect, NullStr);
573 if (!admp->listname)
574 Runtime_Error(pszSrcFile, __LINE__, "no listname");
575 else {
576 sSelect = (SHORT) WinSendDlgItemMsg(hwnd,
577 AD_LISTBOX,
578 LM_QUERYSELECTION,
579 MPVOID, MPVOID);
580 WinSendDlgItemMsg(hwnd,
581 AD_LISTBOX,
582 LM_QUERYITEMTEXT,
583 MPFROM2SHORT(sSelect, 255), MPFROMP(s));
584 if (!*s)
585 Runtime_Error(pszSrcFile, __LINE__, "no text");
586 else {
587 PSZ p;
588 PSZ pp;
[2]589
[551]590 p = s;
591 for (sSelect = 0; sSelect < 10; sSelect++) {
592 pp = p;
593 while (*pp == ' ' || *pp == '\t')
594 pp++;
595 if (!*pp)
596 break;
597 p = pp;
598 while (*p && (*p != ' ' && *p != '\t'))
599 p++;
600 if (*p)
601 *p++ = 0;
602 WinSetDlgItemText(hwnd, AD_FLD1 + sSelect, pp);
603 }
604 }
605 }
606 break;
[2]607
[551]608 case LN_KILLFOCUS:
609 WinSetDlgItemText(hwnd, AD_HELP, NullStr);
610 break;
[2]611
[551]612 case LN_SETFOCUS:
613 WinSetDlgItemText(hwnd, AD_HELP, GetPString(IDS_TEXTARCPRODUCEDTEXT));
614 break;
615 }
616 break;
[2]617
[551]618 case AD_ID:
619 if (SHORT2FROMMP(mp1) == EN_KILLFOCUS)
620 WinSetDlgItemText(hwnd, AD_HELP, NullStr);
621 if (SHORT2FROMMP(mp1) == EN_SETFOCUS)
622 WinSetDlgItemText(hwnd, AD_HELP, GetPString(IDS_ADIDTEXT));
623 break;
[2]624
[551]625 case AD_ADD:
626 if (SHORT2FROMMP(mp1) == EN_KILLFOCUS)
627 WinSetDlgItemText(hwnd, AD_HELP, NullStr);
628 if (SHORT2FROMMP(mp1) == EN_SETFOCUS)
629 WinSetDlgItemText(hwnd, AD_HELP, GetPString(IDS_ADADDTEXT));
630 break;
[2]631
[551]632 case AD_MOVE:
633 if (SHORT2FROMMP(mp1) == EN_KILLFOCUS)
634 WinSetDlgItemText(hwnd, AD_HELP, NullStr);
635 if (SHORT2FROMMP(mp1) == EN_SETFOCUS)
636 WinSetDlgItemText(hwnd, AD_HELP, GetPString(IDS_ADMOVETEXT));
637 break;
[2]638
[551]639 case AD_EXT:
640 if (SHORT2FROMMP(mp1) == EN_KILLFOCUS)
641 WinSetDlgItemText(hwnd, AD_HELP, NullStr);
642 if (SHORT2FROMMP(mp1) == EN_SETFOCUS)
643 WinSetDlgItemText(hwnd, AD_HELP, GetPString(IDS_ADEXTTEXT));
644 break;
[2]645
[551]646 case AD_EXTRACT:
647 if (SHORT2FROMMP(mp1) == EN_KILLFOCUS)
648 WinSetDlgItemText(hwnd, AD_HELP, NullStr);
649 if (SHORT2FROMMP(mp1) == EN_SETFOCUS)
650 WinSetDlgItemText(hwnd, AD_HELP, GetPString(IDS_ADEXTRACTTEXT));
651 break;
[2]652
[551]653 case AD_WDIRS:
654 if (SHORT2FROMMP(mp1) == EN_KILLFOCUS)
655 WinSetDlgItemText(hwnd, AD_HELP, NullStr);
656 if (SHORT2FROMMP(mp1) == EN_SETFOCUS)
657 WinSetDlgItemText(hwnd, AD_HELP, GetPString(IDS_ADWDIRSTEXT));
658 break;
[2]659
[551]660 case AD_SIG:
661 if (SHORT2FROMMP(mp1) == EN_KILLFOCUS)
662 WinSetDlgItemText(hwnd, AD_HELP, NullStr);
663 if (SHORT2FROMMP(mp1) == EN_SETFOCUS)
664 WinSetDlgItemText(hwnd, AD_HELP, GetPString(IDS_ADSIGTEXT));
665 break;
[2]666
[551]667 case AD_LIST:
668 if (SHORT2FROMMP(mp1) == EN_KILLFOCUS)
669 WinSetDlgItemText(hwnd, AD_HELP, NullStr);
670 if (SHORT2FROMMP(mp1) == EN_SETFOCUS)
671 WinSetDlgItemText(hwnd, AD_HELP, GetPString(IDS_ADLISTTEXT));
672 break;
[2]673
[551]674 case AD_TEST:
675 if (SHORT2FROMMP(mp1) == EN_KILLFOCUS)
676 WinSetDlgItemText(hwnd, AD_HELP, NullStr);
677 if (SHORT2FROMMP(mp1) == EN_SETFOCUS)
678 WinSetDlgItemText(hwnd, AD_HELP, GetPString(IDS_ADTESTTEXT));
679 break;
[2]680
[551]681 case AD_ADDWPATHS:
682 if (SHORT2FROMMP(mp1) == EN_KILLFOCUS)
683 WinSetDlgItemText(hwnd, AD_HELP, NullStr);
684 if (SHORT2FROMMP(mp1) == EN_SETFOCUS)
685 WinSetDlgItemText(hwnd, AD_HELP, GetPString(IDS_ADADDWPATHSTEXT));
686 break;
[2]687
[551]688 case AD_MOVEWPATHS:
689 if (SHORT2FROMMP(mp1) == EN_KILLFOCUS)
690 WinSetDlgItemText(hwnd, AD_HELP, NullStr);
691 if (SHORT2FROMMP(mp1) == EN_SETFOCUS)
692 WinSetDlgItemText(hwnd, AD_HELP, GetPString(IDS_ADMOVEWPATHSTEXT));
693 break;
[2]694
[551]695 case AD_ADDRECURSE:
696 if (SHORT2FROMMP(mp1) == EN_KILLFOCUS)
697 WinSetDlgItemText(hwnd, AD_HELP, NullStr);
698 if (SHORT2FROMMP(mp1) == EN_SETFOCUS)
699 WinSetDlgItemText(hwnd, AD_HELP, GetPString(IDS_ADADDRECURSETEXT));
700 break;
[2]701
[551]702 case AD_DELETE:
703 if (SHORT2FROMMP(mp1) == EN_KILLFOCUS)
704 WinSetDlgItemText(hwnd, AD_HELP, NullStr);
705 if (SHORT2FROMMP(mp1) == EN_SETFOCUS)
706 WinSetDlgItemText(hwnd, AD_HELP, GetPString(IDS_ADDELETETEXT));
707 break;
[2]708
[551]709 case AD_SIGPOS:
710 if (SHORT2FROMMP(mp1) == EN_KILLFOCUS)
711 WinSetDlgItemText(hwnd, AD_HELP, NullStr);
712 if (SHORT2FROMMP(mp1) == EN_SETFOCUS)
713 WinSetDlgItemText(hwnd, AD_HELP, GetPString(IDS_ADSIGPOSTEXT));
714 break;
[2]715
[551]716 case AD_FNAMEPOS:
717 if (SHORT2FROMMP(mp1) == EN_KILLFOCUS)
718 WinSetDlgItemText(hwnd, AD_HELP, NullStr);
719 if (SHORT2FROMMP(mp1) == EN_SETFOCUS)
720 WinSetDlgItemText(hwnd, AD_HELP, GetPString(IDS_ADFNAMEPOSTEXT));
721 break;
[2]722
[551]723 case AD_OLDSZ:
724 if (SHORT2FROMMP(mp1) == EN_KILLFOCUS)
725 WinSetDlgItemText(hwnd, AD_HELP, NullStr);
726 if (SHORT2FROMMP(mp1) == EN_SETFOCUS)
727 WinSetDlgItemText(hwnd, AD_HELP, GetPString(IDS_ADOLDSZTEXT));
728 break;
[2]729
[551]730 case AD_NUMDATEFLDS:
731 if (SHORT2FROMMP(mp1) == EN_KILLFOCUS)
732 WinSetDlgItemText(hwnd, AD_HELP, NullStr);
733 if (SHORT2FROMMP(mp1) == EN_SETFOCUS)
734 WinSetDlgItemText(hwnd, AD_HELP, GetPString(IDS_ADNUMDATEFLDSTEXT));
735 break;
[2]736
[551]737 case AD_DATEPOS:
738 if (SHORT2FROMMP(mp1) == EN_KILLFOCUS)
739 WinSetDlgItemText(hwnd, AD_HELP, NullStr);
740 if (SHORT2FROMMP(mp1) == EN_SETFOCUS)
741 WinSetDlgItemText(hwnd, AD_HELP, GetPString(IDS_ADDATEPOSTEXT));
742 break;
[2]743
[551]744 case AD_NEWSZ:
745 if (SHORT2FROMMP(mp1) == EN_KILLFOCUS)
746 WinSetDlgItemText(hwnd, AD_HELP, NullStr);
747 if (SHORT2FROMMP(mp1) == EN_SETFOCUS)
748 WinSetDlgItemText(hwnd, AD_HELP, GetPString(IDS_ADNEWSZTEXT));
749 break;
[2]750
[551]751 case AD_STARTLIST:
752 if (SHORT2FROMMP(mp1) == EN_KILLFOCUS)
753 WinSetDlgItemText(hwnd, AD_HELP, NullStr);
754 if (SHORT2FROMMP(mp1) == EN_SETFOCUS)
755 WinSetDlgItemText(hwnd, AD_HELP, GetPString(IDS_ADSTARTLISTTEXT));
756 break;
[2]757
[551]758 case AD_ENDLIST:
759 if (SHORT2FROMMP(mp1) == EN_KILLFOCUS)
760 WinSetDlgItemText(hwnd, AD_HELP, NullStr);
761 if (SHORT2FROMMP(mp1) == EN_SETFOCUS)
762 WinSetDlgItemText(hwnd, AD_HELP, GetPString(IDS_ADENDLISTTEXT));
763 break;
[2]764
[551]765 }
766 return 0;
[2]767
[551]768 case WM_COMMAND:
769 switch (SHORT1FROMMP(mp1)) {
770 case AD_SEEEXTRACTOR:
771 case AD_SEEADDER:
772 {
773 static CHAR tempargs[1026];
[2]774
[551]775 *tempargs = 0;
776 if (SHORT1FROMMP(mp1) == AD_SEEADDER)
777 WinQueryDlgItemText(hwnd, AD_ADD, 255, tempargs);
778 else
779 WinQueryDlgItemText(hwnd, AD_EXTRACT, 255, tempargs);
780 if (!*tempargs)
781 saymsg(MB_CANCEL,
782 hwnd,
783 GetPString(IDS_BZZZTTEXT), GetPString(IDS_NEEDENTRYTEXT));
784 else {
[2]785
[551]786 PSZ p;
[2]787
[551]788 lstrip(tempargs);
789 p = strchr(tempargs, ' ');
790 if (p)
791 *p = 0;
792 {
793 EXECARGS ex;
[2]794
[551]795 ex.flags = SEPARATEKEEP | WINDOWED | MAXIMIZED;
796 ex.commandline = tempargs;
797 *ex.path = 0;
798 *ex.environment = 0;
799 if (WinDlgBox(HWND_DESKTOP,
800 hwnd,
801 CmdLineDlgProc, FM3ModHandle, EXEC_FRAME, &ex) == 1)
802 runemf2(ex.flags,
803 hwnd,
804 NULL,
805 (*ex.environment) ? ex.environment : NULL,
806 "%s", tempargs);
807 }
808 }
809 }
810 return 0;
[2]811
[551]812 case DID_OK:
813 // fixme to avoid creating empty strings for startlist and endlist
814 admp->info->startlist =
815 free_and_strdup_from_window(hwnd, AD_STARTLIST,
816 admp->info->startlist);
817 admp->info->endlist =
818 free_and_strdup_from_window(hwnd, AD_ENDLIST, admp->info->endlist);
819 admp->info->id =
820 free_and_strdup_from_window(hwnd, AD_ID, admp->info->id);
821 admp->info->create =
822 free_and_strdup_from_window(hwnd, AD_ADD, admp->info->create);
823 admp->info->createwdirs =
824 free_and_strdup_from_window(hwnd, AD_ADDWPATHS,
825 admp->info->createwdirs);
826 admp->info->createrecurse =
827 free_and_strdup_from_window(hwnd, AD_ADDRECURSE,
828 admp->info->createrecurse);
829 admp->info->movewdirs =
830 free_and_strdup_from_window(hwnd, AD_MOVEWPATHS,
831 admp->info->movewdirs);
832 admp->info->move =
833 free_and_strdup_from_window(hwnd, AD_MOVE, admp->info->move);
834 admp->info->delete =
835 free_and_strdup_from_window(hwnd, AD_DELETE, admp->info->delete);
836 admp->info->test =
837 free_and_strdup_from_window(hwnd, AD_TEST, admp->info->test);
838 admp->info->extract =
839 free_and_strdup_from_window(hwnd, AD_EXTRACT, admp->info->extract);
840 admp->info->exwdirs =
841 free_and_strdup_from_window(hwnd, AD_WDIRS, admp->info->exwdirs);
842 admp->info->ext =
843 free_and_strdup_from_window(hwnd, AD_EXT, admp->info->ext);
844 admp->info->signature =
845 free_and_strdup_from_window(hwnd, AD_SIG, admp->info->signature);
846 admp->info->siglen = literal(admp->info->signature);
847 admp->info->list = free_and_strdup_from_window(hwnd,
848 AD_LIST,
849 admp->info->list);
850 admp->info->file_offset = get_long_from_window(hwnd, AD_SIGPOS);
851 admp->info->osizepos = get_int_from_window(hwnd, AD_OLDSZ);
852 admp->info->nsizepos = get_int_from_window(hwnd, AD_NEWSZ);
853 admp->info->fdpos = get_int_from_window(hwnd, AD_DATEPOS);
854 admp->info->datetype = get_int2_from_window(hwnd, AD_DATEPOS);
855 admp->info->fdflds = get_int_from_window(hwnd, AD_NUMDATEFLDS);
856 admp->info->fnpos = get_int_from_window(hwnd, AD_FNAMEPOS);
857 admp->info->nameislast =
858 (get_int2_from_window(hwnd, AD_FNAMEPOS)) ? TRUE : FALSE;
859 admp->info->nameisnext =
860 (get_int3_from_window(hwnd, AD_FNAMEPOS)) ? TRUE : FALSE;
861 admp->info->nameisfirst =
862 (get_int4_from_window(hwnd, AD_FNAMEPOS)) ? TRUE : FALSE;
863 {
864 INT ok = check_archiver(hwnd, admp->info);
[2]865
[551]866 if (saymsg(MB_YESNO,
867 hwnd,
868 GetPString(IDS_ADCHANGESINMEMTEXT),
869 GetPString(IDS_ADREWRITETEXT),
870 !ok ? GetPString(IDS_NOTRECOMMENDTEXT) : NullStr) ==
871 MBID_YES) {
[2]872
[551]873 PSZ ab2;
[2]874
[551]875 ab2 = searchpath(GetPString(IDS_ARCHIVERBB2)); // Rewrite without alerting
876 rewrite_archiverbb2(ab2);
877 }
878 }
879 WinDismissDlg(hwnd, TRUE);
880 return 0;
[2]881
[551]882 case IDM_HELP:
883 if (hwndHelp)
884 WinSendMsg(hwndHelp,
885 HM_DISPLAY_HELP,
886 MPFROM2SHORT(HELP_EDITARC, 0), MPFROMSHORT(HM_RESOURCEID));
887 break;
[2]888
[551]889 case DID_CANCEL:
890 WinDismissDlg(hwnd, FALSE);
891 return 0;
892
893 case AD_TOSTART:
894 if (!admp->listname)
895 Runtime_Error(pszSrcFile, __LINE__, "no listname");
896 else {
897 sSelect = (SHORT) WinSendDlgItemMsg(hwnd,
898 AD_LISTBOX,
899 LM_QUERYSELECTION,
900 MPVOID, MPVOID);
901 WinSendDlgItemMsg(hwnd,
902 AD_LISTBOX,
903 LM_QUERYITEMTEXT,
904 MPFROM2SHORT(sSelect, 255), MPFROMP(s));
905 if (*s)
906 WinSetDlgItemText(hwnd, AD_STARTLIST, s);
907 else
908 BooBoo:
909 saymsg(MB_ENTER,
910 hwnd,
911 GetPString(IDS_OOPSTEXT),
912 GetPString(IDS_SELECTFROMLISTTEXT));
[2]913 }
914 return 0;
[551]915
916 case AD_TOEND:
917 if (!admp->listname)
918 Runtime_Error(pszSrcFile, __LINE__, "no listname");
919 else {
920 sSelect = (SHORT) WinSendDlgItemMsg(hwnd,
921 AD_LISTBOX,
922 LM_QUERYSELECTION,
923 MPVOID, MPVOID);
924 WinSendDlgItemMsg(hwnd,
925 AD_LISTBOX,
926 LM_QUERYITEMTEXT,
927 MPFROM2SHORT(sSelect, 255), MPFROMP(s));
928 if (*s)
929 WinSetDlgItemText(hwnd, AD_ENDLIST, s);
930 else
931 goto BooBoo;
932 }
933 return 0;
934 }
935 return 0;
[2]936 }
[551]937 return WinDefDlgProc(hwnd, msg, mp1, mp2);
[2]938}
Note: See TracBrowser for help on using the repository browser.