source: trunk/dll/update.c@ 1844

Last change on this file since 1844 was 1830, checked in by Gregg Young, 10 years ago

PMPrintf support #if 0-ed

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