source: trunk/dll/extract.c@ 549

Last change on this file since 549 was 549, checked in by root, 19 years ago

Support additional file systems types (Gregg)
Reorganize menus (Gregg)
Enhance unzip option controls (Gregg)
Remember search options in Seek and Scan (Gregg)
Allow drive flag editing for not ready drives (Gregg)
Correct bitmap loading defects (Steven)
Update documentation (Gregg)
Add newer, better bitmaps (David)
Update Readme to discuss move to Netlabs (Steve)

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 13.4 KB
Line 
1
2/***********************************************************************
3
4 $Id: extract.c 549 2007-02-04 03:14:36Z root $
5
6 Copyright (c) 1993-98 M. Kimes
7 Copyright (c) 2004, 2006 Steven H. Levine
8
9 01 Aug 04 SHL Rework lstrip/rstrip usage
10 05 Jun 05 SHL Use QWL_USER
11 17 Jul 06 SHL Use Runtime_Error
12 20 Dec 06 GKY Added checkbox to make default extract with directories
13
14***********************************************************************/
15
16#define INCL_WIN
17#define INCL_DOS
18#include <os2.h>
19
20#include <stdlib.h>
21#include <stdio.h>
22#include <string.h>
23#include <time.h>
24#include <ctype.h>
25
26#include "fm3dll.h"
27#include "fm3dlg.h"
28#include "fm3str.h"
29
30#pragma data_seg(DATA1)
31
32#pragma alloc_text(FMEXTRACT,ExtractTextProc,ExtractDlgProc)
33
34static PSZ pszSrcFile = __FILE__;
35
36MRESULT EXPENTRY ExtractTextProc (HWND hwnd,ULONG msg,MPARAM mp1,MPARAM mp2)
37{
38 PFNWP oldproc = (PFNWP)WinQueryWindowPtr(hwnd,0);
39 static BOOL emphasized = FALSE;
40
41 switch(msg) {
42 case DM_DRAGOVER:
43 if(!emphasized) {
44 emphasized = TRUE;
45 DrawTargetEmphasis(hwnd,emphasized);
46 }
47 if(AcceptOneDrop(mp1,mp2))
48 return MRFROM2SHORT(DOR_DROP,
49 DO_MOVE);
50 return MRFROM2SHORT(DOR_NEVERDROP,0);
51
52 case DM_DRAGLEAVE:
53 if(emphasized) {
54 emphasized = FALSE;
55 DrawTargetEmphasis(hwnd,emphasized);
56 }
57 break;
58
59 case DM_DROPHELP:
60 DropHelp(mp1,mp2,hwnd,
61 GetPString(IDS_EXTDROPHELPTEXT));
62 return 0;
63
64 case DM_DROP:
65 {
66 char szFrom[CCHMAXPATH + 2];
67
68 if(emphasized) {
69 emphasized = FALSE;
70 DrawTargetEmphasis(hwnd,emphasized);
71 }
72 if(GetOneDrop(mp1,mp2,szFrom,sizeof(szFrom)))
73 WinSendMsg(WinQueryWindow(hwnd,QW_PARENT),WM_COMMAND,
74 MPFROM2SHORT(IDM_SWITCH,0),MPFROMP(szFrom));
75 }
76 return 0;
77 }
78 return (oldproc) ? oldproc(hwnd,msg,mp1,mp2) :
79 WinDefWindowProc(hwnd,msg,mp1,mp2);
80}
81
82
83MRESULT EXPENTRY ExtractDlgProc (HWND hwnd,ULONG msg,MPARAM mp1,MPARAM mp2)
84{
85 EXTRDATA *arcdata = NULL;
86
87 switch(msg) {
88 case WM_INITDLG:
89 WinSetWindowPtr(hwnd,0,mp2);
90 arcdata = (EXTRDATA *)mp2;
91 {
92 ULONG size = sizeof(BOOL);
93 BOOL fRemember = FALSE;
94 BOOL fDirectory = FALSE;
95 PFNWP oldproc;
96
97 oldproc = WinSubclassWindow(WinWindowFromID(hwnd,EXT_DIRECTORY),
98 (PFNWP)ExtractTextProc);
99 if(oldproc)
100 WinSetWindowPtr(WinWindowFromID(hwnd,EXT_DIRECTORY),
101 QWL_USER,
102 (PVOID)oldproc);
103 PrfQueryProfileData(fmprof,FM3Str,"RememberExt",
104 (PVOID)&fRemember,&size);
105 PrfQueryProfileData(fmprof,FM3Str,"DirectoryExt",
106 (PVOID)&fDirectory,&size);
107 WinCheckButton(hwnd,EXT_REMEMBER,fRemember);
108 WinCheckButton(hwnd,EXT_AWDIRS,fDirectory);
109 WinSendDlgItemMsg(hwnd,EXT_DIRECTORY,EM_SETTEXTLIMIT,
110 MPFROM2SHORT(CCHMAXPATH,0),MPVOID);
111 WinSendDlgItemMsg(hwnd,EXT_COMMAND,EM_SETTEXTLIMIT,
112 MPFROM2SHORT(256,0),MPVOID);
113 WinSendDlgItemMsg(hwnd,EXT_MASK,EM_SETTEXTLIMIT,
114 MPFROM2SHORT(256,0),MPVOID);
115 WinSendDlgItemMsg(hwnd,EXT_FILENAME,EM_SETTEXTLIMIT,
116 MPFROM2SHORT(CCHMAXPATH,0),MPVOID);
117 if(arcdata->arcname && *arcdata->arcname)
118 WinSetDlgItemText(hwnd,EXT_FILENAME,arcdata->arcname);
119 else
120 WinSetDlgItemText(hwnd,EXT_FILENAME,
121 GetPString(IDS_EXTVARIOUSTEXT));
122 if(fDirectory){
123 WinSendDlgItemMsg(hwnd,EXT_WDIRS,BM_SETCHECK,
124 MPFROM2SHORT(TRUE,0),MPVOID);
125 WinSetDlgItemText(hwnd,EXT_COMMAND,arcdata->info->exwdirs);
126 }
127 else {
128 WinSendDlgItemMsg(hwnd,EXT_NORMAL,BM_SETCHECK,
129 MPFROM2SHORT(TRUE,0),MPVOID);
130 WinSetDlgItemText(hwnd,EXT_COMMAND,arcdata->info->extract);
131
132 }
133 if(fRemember) {
134
135 CHAR textdir[CCHMAXPATH];
136
137 size = sizeof(textdir);
138 *textdir = 0;
139 PrfQueryProfileData(fmprof,FM3Str,"Ext_ExtractDir",
140 (PVOID)textdir,&size);
141 if(*textdir && !IsFile(textdir))
142 strcpy(arcdata->extractdir,textdir);
143 size = sizeof(textdir);
144 *textdir = 0;
145 PrfQueryProfileData(fmprof,FM3Str,"Ext_Mask",(PVOID)textdir,&size);
146 WinSetDlgItemText(hwnd,EXT_MASK,textdir);
147 }
148 if(*extractpath && (!fRemember || !*arcdata->extractdir)) {
149 if(arcdata->arcname && *arcdata->arcname &&
150 !strcmp(extractpath,"*")) {
151
152 CHAR *p;
153
154 strcpy(arcdata->extractdir,arcdata->arcname);
155 p = strrchr(arcdata->extractdir,'\\');
156 if(p) {
157 if(p < arcdata->extractdir + 3)
158 p++;
159 *p = 0;
160 }
161 }
162 else
163 strcpy(arcdata->extractdir,extractpath);
164 }
165 if(!*arcdata->extractdir) {
166 if(*lastextractpath)
167 strcpy(arcdata->extractdir,lastextractpath);
168 else if(arcdata->arcname && *arcdata->arcname) {
169
170 CHAR *p;
171
172 strcpy(arcdata->extractdir,arcdata->arcname);
173 p = strrchr(arcdata->extractdir,'\\');
174 if(p) {
175 if(p < arcdata->extractdir + 3)
176 p++;
177 *p = 0;
178 }
179 }
180 if(!*arcdata->extractdir)
181 save_dir2(arcdata->extractdir);
182 }
183 WinSetDlgItemText(hwnd,EXT_DIRECTORY,arcdata->extractdir);
184 if(!arcdata->info->exwdirs)
185 WinEnableWindow(WinWindowFromID(hwnd,EXT_WDIRS),FALSE);
186 else if(fRemember) {
187 size = sizeof(BOOL);
188 fRemember = FALSE;
189 PrfQueryProfileData(fmprof,FM3Str,"Ext_WDirs",
190 (PVOID)&fRemember,&size);
191 if(fRemember)
192 PostMsg(WinWindowFromID(hwnd,EXT_WDIRS),BM_CLICK,MPVOID,MPVOID);
193 }
194 }
195 *arcdata->command = 0;
196 PosOverOkay(hwnd);
197 break;
198
199 case WM_ADJUSTWINDOWPOS:
200 PostMsg(hwnd,UM_SETDIR,MPVOID,MPVOID);
201 break;
202
203 case UM_SETDIR:
204 PaintRecessedWindow(WinWindowFromID(hwnd,EXT_HELP),(HPS)0,FALSE,TRUE);
205 return 0;
206
207 case WM_CONTROL:
208 arcdata = (EXTRDATA *)WinQueryWindowPtr(hwnd,0);
209 switch(SHORT1FROMMP(mp1)) {
210 case EXT_REMEMBER:
211 {
212 BOOL fRemember = WinQueryButtonCheckstate(hwnd,EXT_REMEMBER);
213
214 PrfWriteProfileData(fmprof,FM3Str,"RememberExt",
215 (PVOID)&fRemember,sizeof(BOOL));
216 }
217 break;
218
219 case EXT_AWDIRS:
220 {
221 BOOL fDirectory = WinQueryButtonCheckstate(hwnd,EXT_AWDIRS);
222
223 PrfWriteProfileData(fmprof,FM3Str,"DirectoryExt",
224 (PVOID)&fDirectory,sizeof(BOOL));
225
226 if(fDirectory){
227 WinSendDlgItemMsg(hwnd,EXT_WDIRS,BM_SETCHECK,
228 MPFROM2SHORT(TRUE,0),MPVOID);
229 WinSetDlgItemText(hwnd,EXT_COMMAND,arcdata->info->exwdirs);
230 }
231 else {
232 WinSendDlgItemMsg(hwnd,EXT_NORMAL,BM_SETCHECK,
233 MPFROM2SHORT(TRUE,0),MPVOID);
234 WinSetDlgItemText(hwnd,EXT_COMMAND,arcdata->info->extract);
235 }
236 }
237 break;
238
239 case EXT_FILENAME:
240 if(SHORT2FROMMP(mp1) == EN_KILLFOCUS)
241 WinSetDlgItemText(hwnd,EXT_HELP,
242 GetPString(IDS_ARCDEFAULTHELPTEXT));
243 if(SHORT2FROMMP(mp1) == EN_SETFOCUS)
244 WinSetDlgItemText(hwnd,EXT_HELP,
245 GetPString(IDS_ARCARCNAMEHELPTEXT));
246 break;
247
248 case EXT_DIRECTORY:
249 if(SHORT2FROMMP(mp1) == EN_KILLFOCUS)
250 WinSetDlgItemText(hwnd,EXT_HELP,GetPString(IDS_ARCDEFAULTHELPTEXT));
251 if(SHORT2FROMMP(mp1) == EN_SETFOCUS)
252 WinSetDlgItemText(hwnd,EXT_HELP,
253 GetPString(IDS_EXTEXTRACTDIRHELPTEXT));
254 break;
255
256 case EXT_COMMAND:
257 if(SHORT2FROMMP(mp1) == EN_KILLFOCUS)
258 WinSetDlgItemText(hwnd,EXT_HELP,
259 GetPString(IDS_ARCDEFAULTHELPTEXT));
260 if(SHORT2FROMMP(mp1) == EN_SETFOCUS)
261 WinSetDlgItemText(hwnd,EXT_HELP,
262 GetPString(IDS_ARCCMDHELPTEXT));
263 break;
264
265 case EXT_MASK:
266 if(SHORT2FROMMP(mp1) == EN_KILLFOCUS)
267 WinSetDlgItemText(hwnd,EXT_HELP,
268 GetPString(IDS_ARCDEFAULTHELPTEXT));
269 if(SHORT2FROMMP(mp1) == EN_SETFOCUS)
270 WinSetDlgItemText(hwnd,EXT_HELP,
271 GetPString(IDS_ARCMASKHELPTEXT));
272 break;
273
274 case EXT_NORMAL:
275 if((BOOL)WinSendDlgItemMsg(hwnd,EXT_NORMAL,BM_QUERYCHECK,
276 MPVOID,MPVOID))
277 WinSetDlgItemText(hwnd,EXT_COMMAND,arcdata->info->extract);
278 break;
279
280 case EXT_WDIRS:
281 if(arcdata->info->exwdirs) {
282 if((BOOL)WinSendDlgItemMsg(hwnd,EXT_WDIRS,BM_QUERYCHECK,
283 MPVOID,MPVOID))
284 WinSetDlgItemText(hwnd,EXT_COMMAND,arcdata->info->exwdirs);
285 }
286 break;
287 }
288 return 0;
289
290 case WM_COMMAND:
291 arcdata = (EXTRDATA *)WinQueryWindowPtr(hwnd,0);
292 switch(SHORT1FROMMP(mp1)) {
293 case IDM_SWITCH:
294 if(mp2) {
295
296 CHAR tdir[CCHMAXPATH];
297
298 strcpy(tdir,(CHAR *)mp2);
299 MakeValidDir(tdir);
300 WinSetDlgItemText(hwnd,EXT_DIRECTORY,tdir);
301 }
302 break;
303
304 case DID_CANCEL:
305 arcdata->ret = 0;
306 WinDismissDlg(hwnd,0);
307 break;
308 case DID_OK:
309 {
310 CHAR s[CCHMAXPATH + 1];
311 BOOL fRemember;
312
313 fRemember = WinQueryButtonCheckstate(hwnd,EXT_REMEMBER);
314 *s = 0;
315 WinQueryDlgItemText(hwnd,EXT_DIRECTORY,CCHMAXPATH,s);
316 bstrip(s);
317 if(*s) {
318 if(!SetDir(WinQueryWindow(WinQueryWindow(hwnd,QW_PARENT),
319 QW_OWNER),hwnd,s,0)) {
320 strcpy(arcdata->extractdir,s);
321 WinSetDlgItemText(hwnd,EXT_DIRECTORY,s);
322 if((!isalpha(*s) || s[1] != ':') && *s != '.')
323 saymsg(MB_ENTER,hwnd,
324 GetPString(IDS_WARNINGTEXT),
325 GetPString(IDS_SPECIFYDRIVETEXT));
326 }
327 else
328 break;
329 strcpy(lastextractpath,s);
330 if(fRemember) {
331 PrfWriteProfileString(fmprof,FM3Str,"Ext_ExtractDir",s);
332 fRemember = WinQueryButtonCheckstate(hwnd,EXT_WDIRS);
333 PrfWriteProfileData(fmprof,FM3Str,"Ext_WDirs",
334 (PVOID)&fRemember,sizeof(BOOL));
335 fRemember = TRUE;
336 }
337 *s = 0;
338 WinQueryDlgItemText(hwnd,EXT_COMMAND,256,s);
339 if(*s) {
340 strcpy(arcdata->command,s);
341 *s = 0;
342 WinQueryDlgItemText(hwnd,EXT_MASK,256,s);
343 *arcdata->masks = 0;
344 strcpy(arcdata->masks,s);
345 if(fRemember)
346 PrfWriteProfileString(fmprof,FM3Str,"Ext_Mask",s);
347 arcdata->ret = 1;
348 WinDismissDlg(hwnd,1);
349 break;
350 }
351 }
352 }
353 DosBeep(50,100); // Complain a refuse to quit
354 break;
355
356 case IDM_HELP:
357 if(hwndHelp)
358 WinSendMsg(hwndHelp,HM_DISPLAY_HELP,
359 MPFROM2SHORT(HELP_EXTRACT,0),
360 MPFROMSHORT(HM_RESOURCEID));
361 break;
362
363 case EXT_WALK:
364 {
365 CHAR temp[CCHMAXPATH + 1];
366
367 strcpy(temp,arcdata->extractdir);
368 if(WinDlgBox(HWND_DESKTOP,WinQueryWindow(WinQueryWindow(hwnd,
369 QW_PARENT),QW_OWNER),WalkExtractDlgProc,FM3ModHandle,
370 WALK_FRAME,(PVOID)temp)) {
371 if(*temp && stricmp(temp,arcdata->extractdir)) {
372 strcpy(arcdata->extractdir,temp);
373 }
374 }
375 WinSetDlgItemText(hwnd,EXT_DIRECTORY,arcdata->extractdir);
376 }
377 break;
378
379 case EXT_SEE:
380 {
381 CHAR s[1001],*p;
382 EXECARGS ex;
383
384 WinQueryDlgItemText(hwnd,EXT_COMMAND,256,s);
385 lstrip(s);
386 if (!*s)
387 Runtime_Error(pszSrcFile, __LINE__, "no command");
388 else {
389 p = strchr(s,' ');
390 if (p)
391 *p = 0; // Drop options
392 memset(&ex,0,sizeof(EXECARGS));
393 ex.commandline = s;
394 ex.flags = WINDOWED | SEPARATEKEEP | MAXIMIZED;
395 *ex.path = 0;
396 *ex.environment = 0;
397 if(WinDlgBox(HWND_DESKTOP,
398 hwnd,
399 CmdLineDlgProc,
400 FM3ModHandle,
401 EXEC_FRAME,
402 MPFROMP(&ex)) &&
403 *s)
404 {
405 runemf2(ex.flags,
406 hwnd,
407 NULL,
408 (*ex.environment) ? ex.environment : NULL ,
409 "%s",
410 s);
411 }
412 }
413 }
414 break;
415 }
416 return 0;
417
418 case WM_CLOSE:
419 break;
420 }
421 return WinDefDlgProc(hwnd,msg,mp1,mp2);
422}
Note: See TracBrowser for help on using the repository browser.