source: trunk/dll/update.c@ 1229

Last change on this file since 1229 was 1228, checked in by John Small, 17 years ago

Ticket 187: Moved typedef's and some #define's from fm3dll.h

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 18.1 KB
Line 
1
2/***********************************************************************
3
4 $Id: update.c 1228 2008-09-13 23:13:40Z jbs $
5
6 Update Container record/list
7
8 Copyright (c) 1993-98 M. Kimes
9 Copyright (c) 2003, 2008 Steven H. Levine
10
11 12 Feb 03 SHL Standardize EA math
12 10 Jan 04 SHL Add some intermin large drive error avoidance
13 25 May 05 SHL Rework for ULONGLONG
14 25 May 05 SHL Rework for FillInRecordFromFFB
15 06 Jun 05 SHL Drop unused code
16 22 Jul 06 SHL Use wrappers
17 20 Feb 07 GKY Add SelectDriveIcon()
18 09 Mar 07 GKY Cleanup SelectDriveIcon using "driveflag =" from Steven
19 02 Aug 07 SHL Sync with CNRITEM mods
20 20 Aug 07 GKY Move #pragma alloc_text to end for OpenWatcom compat
21
22***********************************************************************/
23
24#include <stdlib.h>
25#include <string.h>
26#include <ctype.h>
27
28#define INCL_DOS
29#define INCL_WIN
30#define INCL_LONGLONG
31
32#include "fm3dll.h"
33#include "fm3dll2.h" // #define's for UM_*, control id's, etc.
34#include "update.h"
35#include "init.h" // Data declaration(s)
36#include "notebook.h" // Data declaration(s)
37#include "info.h" // Data declaration(s)
38#include "newview.h" // Data declarations
39#include "fm3str.h"
40#include "errutil.h" // Dos_Error...
41#include "filldir.h" // FillInRecordFromFFB
42#include "dircnrs.h"
43#include "flesh.h" // Flesh, Stubby
44#include "findrec.h" // FindCnrRecord
45#include "valid.h" // IsFullName
46#include "wrappers.h" // xDosFindFirst
47#include "misc.h" // PostMsg
48#include "fortify.h"
49
50static PSZ pszSrcFile = __FILE__;
51
52HPOINTER SelectDriveIcon(PCNRITEM pci)
53{
54 UINT driveflag = driveflags[toupper(*pci->pszFileName) - 'A'];
55 *pci->pszFileName = toupper(*pci->pszFileName);
56 if (isalpha(*pci->pszFileName) &&
57 toupper(*pci->pszFileName) > 'B') {
58 if (driveflag & DRIVE_CDROM)
59 pci->rc.hptrIcon = hptrCDROM;
60 else
61 pci->rc.hptrIcon =
62 (driveflag & DRIVE_REMOVABLE) ? hptrRemovable
63 :(driveflag & DRIVE_VIRTUAL) ? hptrVirtual
64 :(driveflag & DRIVE_REMOTE) ? hptrRemote
65 :(driveflag & DRIVE_RAMDISK) ? hptrRamdisk
66 :(driveflag & DRIVE_ZIPSTREAM) ? hptrZipstrm : hptrDrive;
67 }
68 else
69 pci->rc.hptrIcon = hptrFloppy;
70 return pci->rc.hptrIcon;
71}
72PCNRITEM UpdateCnrRecord(HWND hwndCnr, CHAR * filename, BOOL partial,
73 DIRCNRDATA * dcd)
74{
75 PCNRITEM pci;
76 FILEFINDBUF4L ffb;
77 HDIR hDir = HDIR_CREATE;
78 ULONG nm = 1;
79 ULONG oldemphasis = 0;
80 APIRET status;
81
82#ifdef DEBUG
83 BOOL existed = FALSE, updated = FALSE, added = FALSE, deleted =
84 FALSE, found = FALSE;
85#endif
86
87 if (!filename || !*filename)
88 return (PCNRITEM) NULL;
89 if (IsFullName(filename)) {
90 if (driveflags[toupper(*filename) - 'A'] & DRIVE_NOTWRITEABLE)
91 /* ignore non-writeable drives */
92 return (PCNRITEM) NULL;
93 }
94 status = xDosFindFirst(filename,
95 &hDir,
96 FILE_NORMAL | FILE_DIRECTORY |
97 FILE_ARCHIVED | FILE_READONLY |
98 FILE_HIDDEN | FILE_SYSTEM,
99 &ffb, sizeof(ffb), &nm, FIL_QUERYEASIZEL);
100 if (!status) {
101#ifdef DEBUG
102 existed = TRUE;
103#endif
104 /* file exists */
105 DosFindClose(hDir);
106 if (!dcd)
107 dcd = INSTDATA(hwndCnr);
108/*
109 if(dcd->type == TREE_FRAME &&
110 !(ffb.attrFile & FILE_DIRECTORY))
111 return (PCNRITEM)NULL;
112*/
113 if (dcd->type == ARC_FRAME)
114 return (PCNRITEM) NULL;
115 if (*dcd->directory) {
116
117 CHAR *p, temp;
118
119 p = strrchr(filename, '\\');
120 if (p) {
121 if (p < filename + 3)
122 p++;
123 temp = *p;
124 *p = 0;
125 if (stricmp(filename, dcd->directory)) {
126 *p = temp;
127 return (PCNRITEM) NULL;
128 }
129 *p = temp;
130 }
131 else
132 return (PCNRITEM) NULL;
133 }
134 pci = FindCnrRecord(hwndCnr,
135 filename, (PCNRITEM) NULL, partial, FALSE, TRUE);
136 Update:
137 if (pci) { /* update record? */
138#ifdef DEBUG
139 found = TRUE;
140#endif
141 if ((!fForceUpper && !fForceLower && strcmp(pci->pszFileName, filename)) ||
142 pci->cbFile != ffb.cbFile || pci->attrFile != ffb.attrFile ||
143 pci->easize != CBLIST_TO_EASIZE(ffb.cbList) || pci->date.day !=
144 ffb.fdateLastWrite.day || pci->date.month != ffb.fdateLastWrite.month ||
145 pci->date.year != ffb.fdateLastWrite.year + 1980 || pci->time.seconds !=
146 ffb.ftimeLastWrite.twosecs * 2 || pci->time.minutes != ffb.ftimeLastWrite.minutes ||
147 pci->time.hours != ffb.ftimeLastWrite.hours || pci->ladate.day !=
148 ffb.fdateLastAccess.day || pci->ladate.month != ffb.fdateLastAccess.month ||
149 pci->ladate.year != ffb.fdateLastAccess.year + 1980 || pci->latime.seconds !=
150 ffb.ftimeLastAccess.twosecs * 2 || pci->latime.minutes !=
151 ffb.ftimeLastAccess.minutes || pci->latime.hours != ffb.ftimeLastAccess.hours) { /* changed; update */
152#ifdef DEBUG
153 updated = TRUE;
154#endif
155 *ffb.achName = 0;
156 ffb.cchName = 0;
157 FillInRecordFromFFB(hwndCnr, pci, filename, &ffb, partial, dcd);
158 if (strlen(pci->pszFileName) < 4)
159 SelectDriveIcon(pci);
160 oldemphasis = pci->rc.flRecordAttr & (CRA_SELECTED | CRA_CURSORED);
161 if (oldemphasis)
162 WinSendMsg(hwndCnr,
163 CM_SETRECORDEMPHASIS,
164 MPFROMP(pci), MPFROM2SHORT(FALSE, oldemphasis));
165 WinSendMsg(hwndCnr,
166 CM_INVALIDATERECORD, MPFROMP(&pci), MPFROM2SHORT(1,
167 /* CMA_ERASE | */
168 CMA_TEXTCHANGED));
169 if (oldemphasis)
170 WinSendMsg(hwndCnr,
171 CM_SETRECORDEMPHASIS,
172 MPFROMP(pci), MPFROM2SHORT(TRUE, oldemphasis));
173 }
174 else /* existed, unchanged, do nothing but return */
175 return pci;
176 }
177 else { /* add record */
178#ifdef DEBUG
179 added = TRUE;
180#endif
181 if (dcd->type == DIR_FRAME) {
182
183 RECORDINSERT ri;
184 ULONGLONG ullTotalBytes;
185
186 pci = WinSendMsg(hwndCnr,
187 CM_ALLOCRECORD,
188 MPFROMLONG(EXTRA_RECORD_BYTES), MPFROMLONG(1));
189 if (pci) {
190 *ffb.achName = 0;
191 ullTotalBytes = FillInRecordFromFFB(hwndCnr,
192 pci,
193 filename, &ffb, partial, dcd);
194 if (strlen(pci->pszFileName) < 4)
195 SelectDriveIcon(pci);
196 memset(&ri, 0, sizeof(RECORDINSERT));
197 ri.cb = sizeof(RECORDINSERT);
198 ri.pRecordOrder = (PRECORDCORE) CMA_END;
199 ri.pRecordParent = (PRECORDCORE) NULL;
200 ri.zOrder = (USHORT) CMA_TOP;
201 ri.cRecordsInsert = 1;
202 ri.fInvalidateRecord = TRUE;
203 if (WinSendMsg(hwndCnr,
204 CM_INSERTRECORD,
205 MPFROMP(pci), MPFROMP(&ri)) && ullTotalBytes) {
206 dcd->ullTotalBytes += ullTotalBytes;
207 PostMsg(hwndCnr, UM_RESCAN, MPVOID, MPVOID);
208 if (pci->attrFile & FILE_DIRECTORY)
209 Stubby(hwndCnr, pci);
210 }
211 }
212 }
213 else if (ffb.attrFile & FILE_DIRECTORY) {
214
215 /* check all parts and insert as required */
216 CHAR *p, temp;
217 PCNRITEM pciParent = NULL, pciT;
218
219 p = strchr(filename, '\\');
220 if (p) {
221 while (p && *p) {
222 if (p < filename + 3)
223 p++;
224 temp = *p;
225 *p = 0;
226 pciT = FindCnrRecord(hwndCnr,
227 filename, NULL, partial, FALSE, TRUE);
228 if (!pciT || (INT) pciT == -1) {
229 pci = WinSendMsg(hwndCnr,
230 CM_ALLOCRECORD,
231 MPFROMLONG(EXTRA_RECORD_BYTES),
232 MPFROMLONG(1));
233 if (pci) {
234
235 RECORDINSERT ri;
236
237 *ffb.achName = 0;
238 FillInRecordFromFFB(hwndCnr,
239 pci, filename, &ffb, partial, dcd);
240 if (strlen(pci->pszFileName) < 4)
241 SelectDriveIcon(pci);
242 memset(&ri, 0, sizeof(RECORDINSERT));
243 ri.cb = sizeof(RECORDINSERT);
244 ri.pRecordOrder = (PRECORDCORE) CMA_END;
245 ri.pRecordParent = (PRECORDCORE) pciParent;
246 ri.zOrder = (USHORT) CMA_TOP;
247 ri.cRecordsInsert = 1;
248 ri.fInvalidateRecord = TRUE;
249 if (WinSendMsg(hwndCnr,
250 CM_INSERTRECORD, MPFROMP(pci), MPFROMP(&ri))) {
251 Flesh(hwndCnr, pci);
252 *p = temp;
253 pci = FindCnrRecord(hwndCnr,
254 filename, pciT, partial, FALSE, TRUE);
255 if (pci)
256 goto Update;
257 }
258 }
259 }
260 else {
261 pciParent = pciT;
262 if (!(pciT->rc.flRecordAttr & CRA_EXPANDED)) {
263 Flesh(hwndCnr, pciT);
264 *p = temp;
265 pci = FindCnrRecord(hwndCnr,
266 filename, pciT, partial, FALSE, TRUE);
267 if (pci)
268 goto Update;
269 }
270 }
271 *p = temp;
272 p = strchr(p + ((temp == '\\') ? 1 : 0), '\\');
273 }
274 }
275 pci = WinSendMsg(hwndCnr,
276 CM_ALLOCRECORD,
277 MPFROMLONG(EXTRA_RECORD_BYTES), MPFROMLONG(1));
278 if (pci) {
279
280 RECORDINSERT ri;
281 ULONGLONG ullTotalBytes;
282
283 *ffb.achName = 0;
284 ullTotalBytes = FillInRecordFromFFB(hwndCnr,
285 pci,
286 filename, &ffb, partial, dcd);
287 if (strlen(pci->pszFileName) < 4)
288 SelectDriveIcon(pci);
289 memset(&ri, 0, sizeof(RECORDINSERT));
290 ri.cb = sizeof(RECORDINSERT);
291 ri.pRecordOrder = (PRECORDCORE) CMA_END;
292 ri.pRecordParent = (PRECORDCORE) pciParent;
293 ri.zOrder = (USHORT) CMA_TOP;
294 ri.cRecordsInsert = 1;
295 ri.fInvalidateRecord = TRUE;
296 if (WinSendMsg(hwndCnr,
297 CM_INSERTRECORD,
298 MPFROMP(pci), MPFROMP(&ri)) && ullTotalBytes) {
299 if (dcd->type == DIR_FRAME) {
300 dcd->ullTotalBytes += ullTotalBytes;
301 }
302 Stubby(hwndCnr, pci);
303 }
304 }
305 }
306 }
307 }
308 else if ((pci = FindCnrRecord(hwndCnr,
309 filename,
310 (PCNRITEM) NULL,
311 partial,
312 FALSE,
313 TRUE)) !=
314 NULL && (INT) pci != -1 && strlen(pci->pszFileName) > 3) {
315 /* file doesn't exist; delete record */
316#ifdef DEBUG
317 found = TRUE;
318 deleted = TRUE;
319#endif
320 if (!dcd)
321 dcd = INSTDATA(hwndCnr);
322 if (pci->rc.flRecordAttr & CRA_SELECTED)
323 WinSendMsg(hwndCnr,
324 CM_SETRECORDEMPHASIS,
325 MPFROMP(pci), MPFROM2SHORT(FALSE, CRA_SELECTED));
326 if (dcd->type == DIR_FRAME)
327 dcd->ullTotalBytes -= pci->cbFile + pci->easize;
328 RemoveCnrItems(hwndCnr, pci, 1, CMA_FREE | CMA_INVALIDATE);
329 pci = NULL;
330 PostMsg(hwndCnr, UM_RESCAN, MPVOID, MPVOID);
331 }
332#ifdef DEBUG
333 {
334 char s[CCHMAXPATH + 80];
335
336 sprintf(s, "%s:%s%s%s%s%s", filename, (existed) ? " Existed" : "",
337 (updated) ? " Updated" : "", (added) ? " Added" : "",
338 (deleted) ? " Deleted" : "", (found) ? " Found" : "");
339 WinSetWindowText(WinQueryWindow(hwndMain, QW_PARENT), s);
340 }
341#endif
342 return pci;
343}
344
345BOOL UpdateCnrList(HWND hwndCnr, CHAR ** filename, INT howmany, BOOL partial,
346 DIRCNRDATA * dcd)
347{
348 PCNRITEM pci, *pciList = NULL;
349 FILEFINDBUF4L ffb;
350 HDIR hDir;
351 ULONG nm = (ULONG) howmany;
352 INT x;
353 INT numlist = 0;
354 INT numremain;
355 BOOL repos = FALSE;
356 BOOL ret = FALSE;
357 APIRET status;
358
359 if (!dcd)
360 dcd = INSTDATA(hwndCnr);
361 if (!dcd) {
362 Runtime_Error2(pszSrcFile, __LINE__, IDS_NODATATEXT);
363 return ret;
364 }
365 if (!filename || !howmany || !filename[0])
366 return ret;
367 {
368 CNRINFO cnri;
369
370 memset(&cnri, 0, sizeof(CNRINFO));
371 cnri.cb = sizeof(CNRINFO);
372 WinSendMsg(hwndCnr,
373 CM_QUERYCNRINFO, MPFROMP(&cnri), MPFROMLONG(sizeof(CNRINFO)));
374 numremain = cnri.cRecords;
375 }
376 pciList = xmalloc(sizeof(PCNRITEM) * howmany, pszSrcFile, __LINE__);
377 if (pciList) {
378 for (x = 0; filename[x] && x < howmany; x++) {
379 if (IsFullName(filename[x])) {
380 if (driveflags[toupper(*filename[x]) - 'A'] & DRIVE_NOTWRITEABLE)
381 /* ignore non-writeable drives */
382 continue;
383 }
384 hDir = HDIR_CREATE;
385 status = xDosFindFirst(filename[x],
386 &hDir,
387 FILE_NORMAL | FILE_DIRECTORY |
388 FILE_ARCHIVED | FILE_READONLY |
389 FILE_HIDDEN | FILE_SYSTEM,
390 &ffb, sizeof(ffb), &nm, FIL_QUERYEASIZEL);
391 if (!status) {
392 /* file exists */
393 DosFindClose(hDir);
394 // if(dcd->type == TREE_FRAME && !(ffb.attrFile & FILE_DIRECTORY))
395 // continue;
396 if (dcd->type == DIR_FRAME && *dcd->directory) {
397
398 CHAR *p, temp;
399
400 p = strrchr(filename[x], '\\');
401 if (p) {
402 if (p < filename[x] + 3)
403 p++;
404 temp = *p;
405 *p = 0;
406 if (stricmp(filename[x], dcd->directory)) {
407 *p = temp;
408 continue;
409 }
410 *p = temp;
411 }
412 else
413 continue;
414 }
415 ret = TRUE;
416 pci = FindCnrRecord(hwndCnr,
417 filename[x],
418 (PCNRITEM) NULL, partial, FALSE, TRUE);
419 if (pci) {
420 /* update record? */
421 if ((!fForceUpper && !fForceLower &&
422 strcmp(pci->pszFileName, filename[x])) ||
423 pci->cbFile != ffb.cbFile || pci->attrFile != ffb.attrFile ||
424 pci->easize != CBLIST_TO_EASIZE(ffb.cbList) ||
425 pci->date.day != ffb.fdateLastWrite.day ||
426 pci->date.month != ffb.fdateLastWrite.month ||
427 pci->date.year != ffb.fdateLastWrite.year + 1980 ||
428 pci->time.seconds != ffb.ftimeLastWrite.twosecs * 2 ||
429 pci->time.minutes != ffb.ftimeLastWrite.minutes ||
430 pci->time.hours != ffb.ftimeLastWrite.hours ||
431 pci->ladate.day != ffb.fdateLastAccess.day ||
432 pci->ladate.month != ffb.fdateLastAccess.month ||
433 pci->ladate.year != ffb.fdateLastAccess.year + 1980 ||
434 pci->latime.seconds != ffb.ftimeLastAccess.twosecs * 2 ||
435 pci->latime.minutes != ffb.ftimeLastAccess.minutes ||
436 pci->latime.hours != ffb.ftimeLastAccess.hours) {
437 /* changed; update */
438 pciList[numlist++] = pci;
439 *ffb.achName = 0;
440 ffb.cchName = 0;
441 FillInRecordFromFFB(hwndCnr,
442 pci, filename[x], &ffb, partial, dcd);
443 if (IsRoot(pci->pszFileName))
444 SelectDriveIcon(pci);
445 WinSendMsg(hwndCnr,
446 CM_SETRECORDEMPHASIS,
447 MPFROMP(pci),
448 MPFROM2SHORT(FALSE, CRA_SELECTED | CRA_CURSORED));
449 }
450 }
451 else {
452 /* add record */
453 if (dcd->type == DIR_FRAME) {
454 RECORDINSERT ri;
455 ULONGLONG ullTotalBytes;
456
457 pci = WinSendMsg(hwndCnr,
458 CM_ALLOCRECORD,
459 MPFROMLONG(EXTRA_RECORD_BYTES), MPFROMLONG(1));
460 if (pci) {
461 ret = TRUE;
462 *ffb.achName = 0;
463 ullTotalBytes = FillInRecordFromFFB(hwndCnr,
464 pci,
465 filename[x],
466 &ffb, partial, dcd);
467 if (strlen(pci->pszFileName) < 4)
468 SelectDriveIcon(pci);
469 memset(&ri, 0, sizeof(RECORDINSERT));
470 ri.cb = sizeof(RECORDINSERT);
471 ri.pRecordOrder = (PRECORDCORE) CMA_END;
472 ri.pRecordParent = (PRECORDCORE) NULL;
473 ri.zOrder = (USHORT) CMA_TOP;
474 ri.cRecordsInsert = 1;
475 ri.fInvalidateRecord = FALSE;
476 if (WinSendMsg(hwndCnr,
477 CM_INSERTRECORD, MPFROMP(pci), MPFROMP(&ri))) {
478 if (ullTotalBytes) {
479 dcd->ullTotalBytes += ullTotalBytes;
480 numremain++;
481 }
482 repos = TRUE;
483 if (pci->attrFile & FILE_DIRECTORY)
484 Stubby(hwndCnr, pci);
485 }
486 else
487 FreeCnrItem(hwndCnr, pci);
488 }
489 }
490 else if (ffb.attrFile & FILE_DIRECTORY) {
491 /* check all parts and insert as required */
492 CHAR *p, temp;
493 PCNRITEM pciParent = NULL, pciT;
494
495 p = strchr(filename[x], '\\');
496 if (p) {
497 while (p && *p) {
498 if (p < filename[x] + 3)
499 p++;
500 temp = *p;
501 *p = 0;
502 pciT = FindCnrRecord(hwndCnr,
503 filename[x], NULL, partial, FALSE, TRUE);
504 if (!pciT || (INT) pciT == -1) {
505 pci = WinSendMsg(hwndCnr,
506 CM_ALLOCRECORD,
507 MPFROMLONG(EXTRA_RECORD_BYTES),
508 MPFROMLONG(1));
509 if (pci) {
510
511 RECORDINSERT ri;
512 ULONGLONG ullTotalBytes;
513
514 ret = TRUE;
515 *ffb.achName = 0;
516 ullTotalBytes = FillInRecordFromFFB(hwndCnr,
517 pci,
518 filename[x],
519 &ffb, partial, dcd);
520 if (strlen(pci->pszFileName) < 4)
521 SelectDriveIcon(pci);
522 memset(&ri, 0, sizeof(RECORDINSERT));
523 ri.cb = sizeof(RECORDINSERT);
524 ri.pRecordOrder = (PRECORDCORE) CMA_END;
525 ri.pRecordParent = (PRECORDCORE) pciParent;
526 ri.zOrder = (USHORT) CMA_TOP;
527 ri.cRecordsInsert = 1;
528 ri.fInvalidateRecord = FALSE;
529 if (WinSendMsg(hwndCnr,
530 CM_INSERTRECORD,
531 MPFROMP(pci), MPFROMP(&ri))) {
532 if (ullTotalBytes) {
533 numremain++;
534 if (dcd->type == DIR_FRAME)
535 dcd->ullTotalBytes += ullTotalBytes;
536 }
537 repos = TRUE;
538 }
539 else
540 FreeCnrItem(hwndCnr, pci);
541 }
542 }
543 else
544 pciParent = pciT;
545 *p = temp;
546 p = strchr(p + ((temp == '\\') ? 1 : 0), '\\');
547 }
548 }
549 {
550 pci = WinSendMsg(hwndCnr,
551 CM_ALLOCRECORD,
552 MPFROMLONG(EXTRA_RECORD_BYTES),
553 MPFROMLONG(1));
554 if (pci) {
555
556 RECORDINSERT ri;
557 ULONGLONG ullTotalBytes;
558
559 ret = TRUE;
560 *ffb.achName = 0;
561 ullTotalBytes = FillInRecordFromFFB(hwndCnr,
562 pci,
563 filename[x],
564 &ffb, partial, dcd);
565 if (strlen(pci->pszFileName) < 4)
566 SelectDriveIcon(pci);
567 memset(&ri, 0, sizeof(RECORDINSERT));
568 ri.cb = sizeof(RECORDINSERT);
569 ri.pRecordOrder = (PRECORDCORE) CMA_END;
570 ri.pRecordParent = (PRECORDCORE) pciParent;
571 ri.zOrder = (USHORT) CMA_TOP;
572 ri.cRecordsInsert = 1;
573 ri.fInvalidateRecord = FALSE;
574 if (WinSendMsg(hwndCnr,
575 CM_INSERTRECORD, MPFROMP(pci), MPFROMP(&ri))) {
576 if (ullTotalBytes) {
577 numremain++;
578 if (dcd->type == DIR_FRAME)
579 dcd->ullTotalBytes += ullTotalBytes;
580 }
581 repos = TRUE;
582 Stubby(hwndCnr, pci);
583 }
584 else
585 FreeCnrItem(hwndCnr, pci);
586 }
587 }
588 }
589 }
590 }
591 else if ((pci = FindCnrRecord(hwndCnr,
592 filename[x],
593 (PCNRITEM) NULL,
594 partial,
595 FALSE,
596 TRUE)) != NULL &&
597 (INT) pci != -1 && !IsRoot(pci->pszFileName)) {
598 /* file doesn't exist; delete record */
599 if (pci->rc.flRecordAttr & CRA_SELECTED)
600 WinSendMsg(hwndCnr,
601 CM_SETRECORDEMPHASIS,
602 MPFROMP(pci), MPFROM2SHORT(FALSE, CRA_SELECTED));
603 if (dcd->type == DIR_FRAME)
604 dcd->ullTotalBytes -= (pci->cbFile + pci->easize);
605 // 02 Aug 07 SHL rc check was wrong
606 if (RemoveCnrItems(hwndCnr, pci, 1,
607 CMA_FREE |
608 numremain == 1 ? CMA_INVALIDATE : 0) != -1) {
609 numremain--;
610 repos = TRUE;
611 }
612 }
613 } // for x
614 }
615 if (repos || (pciList && numlist)) {
616 QUERYRECORDRECT qrr;
617 RECTL rCnr, rCItem;
618
619 pci = WinSendMsg(hwndCnr,
620 CM_QUERYRECORDEMPHASIS,
621 MPFROMLONG(CMA_FIRST), MPFROMLONG(CRA_CURSORED));
622 if (pci && (INT) pci != -1) {
623 memset(&qrr, 0, sizeof(QUERYRECORDRECT));
624 qrr.cb = sizeof(QUERYRECORDRECT);
625 qrr.pRecord = (PRECORDCORE) pci;
626 qrr.fRightSplitWindow = FALSE;
627 qrr.fsExtent = CMA_TEXT;
628 if (!WinSendMsg(hwndCnr,
629 CM_QUERYRECORDRECT, MPFROMP(&rCItem), MPFROMP(&qrr)))
630 qrr.cb = 0;
631 }
632 if (pciList && numlist && !repos) {
633 WinSendMsg(hwndCnr,
634 CM_INVALIDATERECORD,
635 MPFROMP(pciList),
636 MPFROM2SHORT(numlist,
637 (repos ? CMA_NOREPOSITION :
638 CMA_REPOSITION | CMA_ERASE)));
639 }
640 if (repos)
641 WinSendMsg(hwndCnr,
642 CM_INVALIDATERECORD,
643 MPVOID, MPFROM2SHORT(0, CMA_ERASE | CMA_REPOSITION));
644 if (pci && (INT) pci != -1 && qrr.cb) {
645 WinSendMsg(hwndCnr,
646 CM_QUERYVIEWPORTRECT,
647 MPFROMP(&rCnr), MPFROM2SHORT(CMA_WINDOW, (SHORT) FALSE));
648 WinSendMsg(hwndCnr,
649 CM_SCROLLWINDOW,
650 MPFROMSHORT(CMA_VERTICAL),
651 MPFROMLONG(rCnr.yTop - rCItem.yTop));
652 }
653 }
654 PostMsg(hwndCnr, UM_RESCAN, MPVOID, MPVOID);
655 if (pciList) {
656 free(pciList);
657 DosPostEventSem(CompactSem);
658 }
659 return ret;
660}
661
662#pragma alloc_text(UPDATECNR,UpdateCnrRecord,UpdateCnrList)
Note: See TracBrowser for help on using the repository browser.