source: trunk/dll/droplist.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: 12.3 KB
Line 
1#define INCL_DOS
2#define INCL_WIN
3
4#include <os2.h>
5#include <stdio.h>
6#include <stdlib.h>
7#include <string.h>
8#include <ctype.h>
9#include "fm3dll.h"
10#include "fm3str.h"
11
12#pragma alloc_text(DROPLIST,DoFileDrop,FullDrgName,TwoDrgNames,GetOneDrop)
13
14
15BOOL TwoDrgNames (PDRAGITEM pDItem,CHAR *buffer1,ULONG buflen1,
16 char *buffer2,ULONG buflen2) {
17
18 /*
19 * Gets archive name from directory field, file name from file field
20 * Returns FALSE on error, TRUE on success.
21 */
22
23 register ULONG len;
24 BOOL ret = FALSE;
25
26 if(pDItem && buffer2 && buflen2) { /* else error calling function */
27 if(buffer1 && buflen1) /* zero buffers */
28 *buffer1 = 0;
29 *buffer2 = 0;
30
31 if(buffer1 && buflen1) {
32 len = DrgQueryStrName(pDItem->hstrContainerName,
33 buflen1,buffer1);
34 buffer1[len] = 0;
35 if(len) { /* be sure we get full pathname of arc file */
36
37 char szTemp[CCHMAXPATH + 2];
38
39 if(!DosQueryPathInfo(buffer1,
40 FIL_QUERYFULLNAME,
41 szTemp,
42 sizeof(szTemp))) {
43 strncpy(buffer1,
44 szTemp,
45 buflen1);
46 buffer1[buflen1 - 1] = 0;
47 }
48 }
49 { /* be sure that file/directory is accessible */
50 FILESTATUS3 fsa3;
51
52 DosError(FERR_DISABLEHARDERR);
53 if(DosQueryPathInfo(buffer1,
54 FIL_STANDARD,
55 &fsa3,
56 sizeof(fsa3)) ||
57 (fsa3.attrFile & FILE_DIRECTORY) != 0) {
58 *buffer1 = 0;
59 return ret;
60 }
61 }
62 }
63
64 len = DrgQueryStrName(pDItem->hstrSourceName,
65 buflen2,
66 buffer2);
67 buffer2[len] = 0;
68 if(len)
69 ret = TRUE;
70 }
71 return ret;
72}
73
74
75BOOL FullDrgName (PDRAGITEM pDItem,CHAR *buffer,ULONG buflen) {
76
77 /*
78 * Gets full name of file from a dragged item.
79 * Returns FALSE on error, TRUE on success.
80 */
81
82 register ULONG len,blen;
83 BOOL ret = FALSE;
84
85 if(pDItem && buffer && buflen) { /* else error calling function */
86 *buffer = 0; /* zero buffer */
87
88 blen = DrgQueryStrName(pDItem->hstrContainerName,
89 buflen,buffer);
90 if(blen) {
91 if(*(buffer + (blen - 1)) != '\\') {
92 *(buffer + blen) = '\\';
93 blen++;
94 }
95 }
96 buffer[blen] = 0;
97 len = DrgQueryStrName(pDItem->hstrSourceName,
98 buflen - blen,buffer + blen);
99 buffer[blen + len] = 0;
100 { /* be sure we get full pathname of file/directory */
101 char szTemp[CCHMAXPATH + 2];
102
103 if(!DosQueryPathInfo(buffer,
104 FIL_QUERYFULLNAME,
105 szTemp,
106 sizeof(szTemp))) {
107 strncpy(buffer,
108 szTemp,
109 buflen);
110 buffer[buflen - 1] = 0;
111 }
112 }
113 { /* be sure that file/directory is accessible */
114 FILESTATUS3 fsa3;
115
116 if(!DosQueryPathInfo(buffer,
117 FIL_STANDARD,
118 &fsa3,
119 sizeof(fsa3)))
120 ret = TRUE;
121 else
122 *buffer = 0;
123 }
124 }
125 return ret;
126}
127
128
129BOOL GetOneDrop (MPARAM mp1,MPARAM mp2,char *buffer,ULONG buflen) {
130
131 PDRAGITEM pDItem; /* DRAGITEM struct ptr */
132 PDRAGINFO pDInfo; /* DRAGINFO struct ptr */
133 ULONG numitems;
134 register ULONG x;
135 BOOL ret = FALSE;
136
137 if(buffer && buflen)
138 *buffer = 0; /* zero buffer field */
139
140 pDInfo = (PDRAGINFO)mp1; /* Get DRAGINFO pointer */
141 if(pDInfo) {
142 DrgAccessDraginfo(pDInfo); /* Access DRAGINFO */
143 numitems = DrgQueryDragitemCount(pDInfo);
144 pDItem = DrgQueryDragitemPtr(pDInfo, /* Access DRAGITEM */
145 0); /* Index to DRAGITEM */
146 if(buflen && buffer) {
147 if(DrgVerifyRMF(pDItem, /* Check valid rendering */
148 DRM_OS2FILE, /* mechanisms and data */
149 NULL) &&
150 !(pDItem->fsControl & DC_PREPARE))
151 ret = FullDrgName(pDItem,buffer,buflen);
152 }
153 /* note: targetfail is returned to source for all items */
154 for(x = 0;x < numitems;x++) {
155 pDItem = DrgQueryDragitemPtr(pDInfo, /* Access DRAGITEM */
156 x); /* Index to DRAGITEM */
157 DrgSendTransferMsg(pDInfo->hwndSource,DM_ENDCONVERSATION,
158 MPFROMLONG(pDItem->ulItemID),
159 MPFROMLONG(DMFL_TARGETFAIL));
160 }
161 DrgDeleteDraginfoStrHandles(pDInfo);
162 DrgFreeDraginfo(pDInfo); /* Free DRAGINFO */
163 }
164
165 return ret;
166}
167
168
169BOOL AcceptOneDrop (MPARAM mp1,MPARAM mp2) {
170
171 PDRAGITEM pDItem; /* Pointer to DRAGITEM */
172 PDRAGINFO pDInfo; /* Pointer to DRAGINFO */
173 BOOL ret = FALSE;
174
175 pDInfo = (PDRAGINFO)mp1; /* Get DRAGINFO pointer */
176 if(pDInfo) {
177 DrgAccessDraginfo(pDInfo); /* Access DRAGINFO */
178 pDItem = DrgQueryDragitemPtr(pDInfo, /* Access DRAGITEM */
179 0); /* Index to DRAGITEM */
180 if(DrgVerifyRMF(pDItem, /* Check valid rendering */
181 DRM_OS2FILE, /* mechanisms and data */
182 NULL)) /* formats */
183 ret = TRUE;
184 DrgFreeDraginfo(pDInfo);
185 }
186 return ret;
187}
188
189
190ULONG FreeDrop (MPARAM mp1,MPARAM mp2) {
191
192 PDRAGINFO pDInfo;
193 ULONG numitems;
194
195 pDInfo = mp1;
196 if(pDInfo) {
197 DrgAccessDraginfo(pDInfo);
198 numitems = DrgQueryDragitemCount(pDInfo);
199 DrgDeleteDraginfoStrHandles(pDInfo);
200 DrgFreeDraginfo(pDInfo);
201 }
202 return numitems;
203}
204
205
206void DropHelp (MPARAM mp1,MPARAM mp2,HWND hwnd,char *text) {
207
208 ULONG numitems;
209
210 numitems = FreeDrop(mp1,mp2);
211 saymsg(MB_ENTER | MB_ICONASTERISK,
212 hwnd,
213 GetPString(IDS_FM2DROPHELPTEXT),
214 text,
215 numitems,
216 numitems);
217}
218
219
220LISTINFO * DoFileDrop (HWND hwndCnr, CHAR *directory, BOOL arcfilesok,
221 MPARAM mp1, MPARAM mp2) {
222
223 /* builds a list from the dropped files */
224
225 BOOL isArc = FALSE,arctest = FALSE;
226 PDRAGITEM pDItem;
227 PDRAGINFO pDInfo;
228 PCNRITEM pci;
229 CHAR szFrom[CCHMAXPATH + 1],
230 szArc[CCHMAXPATH + 1];
231 register CHAR **files = NULL;
232 INT numfiles = 0,numalloc = 0;
233 register ULONG curitem = 0L,numitems,*cbFile = NULL,*ulitemID = NULL;
234 LISTINFO *li = NULL;
235 ARC_TYPE *arcinfo = NULL;
236 USHORT Operation;
237
238 *szArc = 0;
239 pci = (PCNRITEM)((PCNRDRAGINFO)mp2)->pRecord;
240 pDInfo = ((PCNRDRAGINFO)mp2)->pDragInfo;
241 if(!pDInfo)
242 return NULL;
243 DrgAccessDraginfo(pDInfo);
244 Operation = pDInfo->usOperation;
245 pDItem = DrgQueryDragitemPtr(pDInfo,0L);
246 if(Operation == DO_MOVE &&
247 !(pDItem->fsSupportedOps & DO_MOVEABLE)) {
248 DosBeep(50,100);
249 Operation = DO_COPY;
250 }
251 numitems = DrgQueryDragitemCount(pDInfo);
252 while(curitem < numitems) {
253 pDItem = DrgQueryDragitemPtr(pDInfo,
254 curitem);
255 if(!pDItem)
256 break;
257
258 /* ambiguous drop request -- see what's allowed */
259 if(Operation == DO_DEFAULT || Operation >= DO_UNKNOWN) {
260 if(pDItem->fsSupportedOps & DO_COPYABLE)
261 Operation = DO_COPY;
262 else if(pDItem->fsSupportedOps & DO_MOVEABLE)
263 Operation = DO_MOVE;
264 else if(pDItem->fsSupportedOps & DO_LINKABLE)
265 Operation = DO_LINK;
266 }
267 else { /* ignore object if selected command not allowed for it */
268 switch(Operation) {
269 case DO_MOVE:
270 if(pDItem->fsSupportedOps & DO_MOVEABLE)
271 goto Okay;
272 break;
273 case DO_COPY:
274 if(pDItem->fsSupportedOps & DO_COPYABLE)
275 goto Okay;
276 break;
277 case DO_LINK:
278 if(pDItem->fsSupportedOps & DO_LINKABLE)
279 goto Okay;
280 break;
281 }
282 DrgSendTransferMsg(pDItem->hwndItem,
283 DM_ENDCONVERSATION,
284 MPFROMLONG(pDItem->ulItemID),
285 MPFROMLONG(DMFL_TARGETFAIL));
286 curitem++;
287 continue;
288 }
289
290Okay:
291
292 if(DrgVerifyRMF(pDItem,
293 DRM_OS2FILE,
294 NULL) ||
295 (arcfilesok &&
296 ((arctest = DrgVerifyRMF(pDItem,
297 DRM_FM2ARCMEMBER,
298 DRF_FM2ARCHIVE)) != FALSE))) {
299 if(pDItem->fsControl & DC_PREPARE) {
300 DrgSendTransferMsg(pDItem->hwndItem,
301 DM_ENDCONVERSATION,
302 MPFROMLONG(pDItem->ulItemID),
303 MPFROMLONG(DMFL_TARGETFAIL));
304 curitem++;
305 continue;
306 }
307
308 if(arctest ||
309 isArc) {
310 if(!isArc) {
311 if(TwoDrgNames(pDItem,
312 szArc,
313 sizeof(szArc),
314 szFrom,
315 sizeof(szFrom)) &&
316 *szArc &&
317 *szFrom) {
318 isArc = TRUE;
319 arcinfo = find_type(szArc,arcsighead);
320 }
321 if(!arcinfo ||
322 !arcinfo->extract ||
323 !*arcinfo->extract) {
324 *szArc = *szFrom = 0;
325 isArc = FALSE;
326 }
327 }
328 else
329 TwoDrgNames(pDItem,
330 NULL,
331 0,
332 szFrom,
333 sizeof(szFrom));
334 }
335 else
336 FullDrgName(pDItem,
337 szFrom,
338 sizeof(szFrom));
339
340 if(!*szFrom) {
341 DrgSendTransferMsg(pDItem->hwndItem,
342 DM_ENDCONVERSATION,
343 MPFROMLONG(pDItem->ulItemID),
344 MPFROMLONG(DMFL_TARGETFAIL));
345 curitem++;
346 continue;
347 }
348
349 if(numfiles + 2 > numalloc) {
350
351 CHAR **test;
352 ULONG *ltest;
353
354 numalloc += 12;
355 test = realloc(files,numalloc * sizeof(CHAR *));
356 if(!test)
357 goto AbortDrop;
358 files = test;
359 ltest = realloc(cbFile,numalloc * sizeof(ULONG));
360 if(!ltest)
361 goto AbortDrop;
362 cbFile = ltest;
363 ltest = realloc(ulitemID,numalloc * sizeof(ULONG));
364 if(!ltest)
365 goto AbortDrop;
366 ulitemID = ltest;
367 }
368 cbFile[numfiles] = 0;
369 if(!isArc) {
370
371 FILESTATUS4 fsa4;
372
373 if(!DosQueryPathInfo(szFrom,
374 FIL_QUERYEASIZE,
375 &fsa4,
376 sizeof(fsa4)))
377 cbFile[numfiles] = fsa4.cbFile + ((fsa4.cbList > 4L) ?
378 fsa4.cbList : 0L);
379 }
380 ulitemID[numfiles] = pDItem->ulItemID;
381 files[numfiles] = strdup(szFrom);
382 files[numfiles + 1] = NULL;
383 if(!files[numfiles])
384 goto AbortDrop;
385 numfiles++;
386 DrgSendTransferMsg(pDItem->hwndItem,
387 DM_ENDCONVERSATION,
388 MPFROMLONG(pDItem->ulItemID),
389 MPFROMLONG(DMFL_TARGETSUCCESSFUL));
390 }
391 else
392 DrgSendTransferMsg(pDItem->hwndItem,
393 DM_ENDCONVERSATION,
394 MPFROMLONG(pDItem->ulItemID),
395 MPFROMLONG(DMFL_TARGETFAIL));
396 curitem++;
397 }
398
399AbortDrop:
400
401 if(files &&
402 numfiles &&
403 files[0] &&
404 cbFile &&
405 ulitemID) {
406 li = malloc(sizeof(LISTINFO));
407 if(li) {
408 memset(li,0,sizeof(LISTINFO));
409 li->type = Operation;
410 li->hwnd = hwndCnr;
411 li->list = files;
412 li->cbFile = cbFile;
413 li->ulitemID = ulitemID;
414 li->hwndS = pDInfo->hwndSource;
415 if(!pci &&
416 directory)
417 strcpy(li->targetpath,directory);
418 else if(pci)
419 strcpy(li->targetpath,pci->szFileName);
420 if(isArc) {
421 strcpy(li->arcname,szArc);
422 li->info = arcinfo;
423 }
424 SortList(li);
425 }
426 else {
427 if(cbFile)
428 free(cbFile);
429 if(ulitemID)
430 free(ulitemID);
431 if(files)
432 FreeList(files);
433 }
434 }
435 else {
436 if(cbFile)
437 free(cbFile);
438 if(ulitemID)
439 free(ulitemID);
440 if(files)
441 FreeList(files);
442 }
443 DrgDeleteDraginfoStrHandles(pDInfo);
444 DrgFreeDraginfo(pDInfo);
445 return li;
446}
447
Note: See TracBrowser for help on using the repository browser.