source: trunk/dll/extract.c@ 123

Last change on this file since 123 was 123, checked in by root, 21 years ago

Rework lstrip/rstrip usage

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