source: trunk/dll/droplist.c@ 558

Last change on this file since 558 was 551, checked in by Gregg Young, 19 years ago

Indentation cleanup

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