source: trunk/dll/extract.c@ 2

Last change on this file since 2 was 2, checked in by root, 23 years ago

Initial revision

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