source: trunk/dll/extract.c@ 350

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

Use Runtime_Error

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