source: trunk/dll/extract.c@ 186

Last change on this file since 186 was 186, checked in by root, 20 years ago

Use QWL_USER

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