source: trunk/dll/avv.c@ 918

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

Fix CheckApp_QuoteAddExe to return a pointer on the stack instead of a string. Use MAXCOMLINESTRG for command line length.

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