source: trunk/dll/avv.c@ 551

Last change on this file since 551 was 551, checked in by Gregg Young, 19 years ago

Indentation cleanup

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