source: trunk/dll/update.c@ 1856

Last change on this file since 1856 was 1856, checked in by Steven Levine, 10 years ago

Rework Flesh/Stubby etc. to avoid running on thread 1
Should be ready for release after spurious traps resolved
DbgMsg calls retained - delete/disable before release

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