Lines Matching refs:toc
29 /* tocutil.c -- internal routines for toc stuff. */
32 #include "toc.h"
42 Toc toc;
43 toc = XtNew(TocRec);
44 bzero((char *)toc, (int) sizeof(TocRec));
45 toc->msgs = (Msg *) NULL;
46 toc->seqlist = (Sequence *) NULL;
47 toc->validity = unknown;
48 return toc;
52 /* Returns TRUE if the scan file for the given toc is out of date. */
54 int TUScanFileOutOfDate(Toc toc)
56 return LastModifyDate(toc->path) > toc->lastreaddate;
61 * for this toc.
64 void TUCheckSequenceMenu(Toc toc)
85 for (j=0; j < toc->num_scrns; j++) {
86 scrn = toc->scrn[j];
108 if (! TocGetSeqNamed(toc, XtName(children[i])))
114 for (i=1; i < toc->numsequences; i++)
115 if (! XtNameToWidget(menu, toc->seqlist[i]->name))
116 XtCreateManagedWidget(toc->seqlist[i]->name, smeBSBObjectClass,
121 name = toc->viewedseq->name;
125 TocSetSelectedSequence(toc, toc->viewedseq);
129 void TUScanFileForToc(Toc toc)
133 if (toc) {
134 TUGetFullFolderInfo(toc);
135 if (toc->num_scrns) scrn = toc->scrn[0];
138 snprintf(str, sizeof(str), "Rescanning %s", toc->foldername);
143 argv[1] = TocMakeFolderName(toc);
148 DoCommand(argv, (char *) NULL, toc->scanfile);
152 toc->needslabelupdate = True;
153 toc->validity = valid;
154 toc->curmsg = NULL; /* Get cur msg somehow! %%% */
160 int TUGetMsgPosition(Toc toc, Msg msg)
168 h = toc->nummsgs - 1;
171 if (toc->msgs[m]->msgid > msgid)
176 if (toc->msgs[l] == msg) return l;
177 if (toc->msgs[h] == msg) return h;
180 for (l = 0; l < toc->nummsgs; l++) {
181 if (msgid == toc->msgs[l]->msgid) return l;
194 Toc toc;
196 toc = scrn->toc;
197 if (toc == NULL)
200 if (toc->stopupdate) {
201 toc->needslabelupdate = TRUE;
204 snprintf(str, sizeof(str), "%s:%s", toc->foldername,
205 toc->viewedseq->name);
206 toc->needslabelupdate = FALSE;
213 /* A major toc change has occurred; redisplay it. (This also should work even
218 Toc toc;
221 toc = scrn->toc;
222 if (toc) {
223 if (toc->stopupdate) {
224 toc->needsrepaint = TRUE;
229 if (toc->force_reset || source != toc->source) {
230 XawTextSetSource(scrn->tocwidget, toc->source,
232 toc->force_reset = False; /* %%% temporary */
234 TocSetCurMsg(toc, TocGetCurMsg(toc));
236 TUCheckSequenceMenu(toc);
237 toc->needsrepaint = FALSE;
245 void TULoadSeqLists(Toc toc)
251 if (toc->viewedseq) (void) strcpy(viewed, toc->viewedseq->name);
253 if (toc->selectseq) (void) strcpy(selected, toc->selectseq->name);
255 for (i = 0; i < toc->numsequences; i++) {
256 seq = toc->seqlist[i];
261 toc->numsequences = 1;
262 toc->seqlist = (Sequence *) XtRealloc((char *) toc->seqlist,
264 seq = toc->seqlist[0] = XtNew(SequenceRec);
267 toc->viewedseq = seq;
268 toc->selectseq = seq;
269 snprintf(str, sizeof(str), "%s/.mh_sequences", toc->path);
279 toc->numsequences++;
280 toc->seqlist = XtReallocArray(toc->seqlist,
281 toc->numsequences, sizeof(Sequence));
282 seq = toc->seqlist[toc->numsequences - 1] =
285 seq->mlist = StringToMsgList(toc, ptr2 + 1);
287 toc->viewedseq = seq;
291 toc->selectseq = seq;
305 void TURefigureWhatsVisible(Toc toc)
311 Sequence seq = toc->viewedseq;
313 oldcurmsg = toc->curmsg;
314 TocSetCurMsg(toc, (Msg)NULL);
318 for (i = 0; i < toc->nummsgs; i++) {
319 msg = toc->msgs[i];
331 TURefigureTocPositions(toc);
334 toc->curmsg = TocMsgAfter(toc, oldcurmsg);
335 if (toc->curmsg == NULL)
336 toc->curmsg = TocMsgBefore(toc, oldcurmsg);
337 } else toc->curmsg = oldcurmsg;
339 for (i=0 ; i<toc->num_scrns ; i++)
340 TURedisplayToc(toc->scrn[i]);
341 } else TocSetCurMsg(toc, oldcurmsg);
342 for (i=0 ; i<toc->num_scrns ; i++)
343 TUResetTocLabel(toc->scrn[i]);
347 /* (Re)load the toc from the scanfile. If reloading, this makes efforts to
356 void TULoadTocFile(Toc toc)
369 TocStopUpdate(toc);
370 toc->lastreaddate = LastModifyDate(toc->scanfile);
371 if (toc->curmsg) {
372 origcurmsgid = toc->curmsg->msgid;
373 TocSetCurMsg(toc, (Msg)NULL);
375 fid = FOpenAndCheck(toc->scanfile, "r");
376 maxmsgs = orignummsgs = toc->nummsgs;
378 toc->nummsgs = 0;
379 origmsgs = toc->msgs;
380 toc->msgs = XtMallocArray((Cardinal) maxmsgs, sizeof(Msg));
385 toc->msgs[toc->nummsgs++] = msg = XtNew(MsgRec);
387 msg->toc = toc;
410 if (toc->nummsgs >= maxmsgs) {
412 toc->msgs = XtReallocArray(toc->msgs, maxmsgs, sizeof(Msg));
421 toc->length = toc->origlength = toc->lastPos = position;
422 toc->msgs = XtReallocArray(toc->msgs, toc->nummsgs, sizeof(Msg));
424 if ( (toc->source == NULL) && ( toc->num_scrns > 0 ) ) {
427 XtSetArg(args[0], XtNtoc, toc);
428 toc->source = XtCreateWidget("tocSource", tocSourceWidgetClass,
429 toc->scrn[0]->tocwidget,
434 if (msg && msg->toc == toc) {
435 for (j=0 ; j<toc->nummsgs ; j++) {
436 if (SeemsIdentical(toc->msgs[j], msg)) {
437 msg->position = toc->msgs[j]->position;
439 ptr = toc->msgs[j]->buf;
440 l = toc->msgs[j]->length;
441 *(toc->msgs[j]) = *msg;
442 toc->msgs[j]->buf = ptr;
443 toc->msgs[j]->length = l;
444 scrnList[i]->msg = toc->msgs[j];
448 if (j >= toc->nummsgs) {
457 TocSetCurMsg(toc, curmsg);
458 TULoadSeqLists(toc);
459 TocStartUpdate(toc);
463 void TUSaveTocFile(Toc toc)
470 if (toc->stopupdate) {
471 toc->needscachesave = TRUE;
476 for (i = 0; i < toc->nummsgs; i++) {
477 msg = toc->msgs[i];
479 fid = myopen(toc->scanfile, O_RDWR, 0666);
490 if (fid < 0 && toc->length != toc->origlength)
491 fid = myopen(toc->scanfile, O_RDWR, 0666);
493 (void) ftruncate(fid, toc->length);
495 toc->origlength = toc->length;
497 toc->needscachesave = FALSE;
498 toc->lastreaddate = LastModifyDate(toc->scanfile);
505 Toc toc = (Toc)client_data;
510 TUScanFileForToc(toc);
511 TULoadTocFile(toc);
513 for (i=0 ; i<toc->num_scrns ; i++)
514 TURedisplayToc(toc->scrn[i]);
522 void TUEnsureScanIsValidAndOpen(Toc toc, Boolean delay)
524 if (toc) {
525 TUGetFullFolderInfo(toc);
526 if (TUScanFileOutOfDate(toc)) {
528 UpdateScanFile((XtPointer)toc);
534 int fid = myopen(toc->scanfile, O_RDWR|O_CREAT, 0666);
538 (XtPointer)toc);
541 if (toc->source == NULL)
542 TULoadTocFile(toc);
550 void TURefigureTocPositions(Toc toc)
556 for (i=0; i<toc->nummsgs ; i++) {
557 msg = toc->msgs[i];
562 toc->lastPos = position;
563 toc->length = length;
568 /* Make sure we've loaded ALL the folder info for this toc, including its
571 void TUGetFullFolderInfo(Toc toc)
573 if (! toc->scanfile) {
574 if (! toc->path) {
576 XtAsprintf(&toc->path, "%s/%s", app_resources.mail_path,
577 toc->foldername);
579 XtAsprintf(&toc->scanfile, "%s/.xmhcache", toc->path);
580 toc->lastreaddate = LastModifyDate(toc->scanfile);
581 if (TUScanFileOutOfDate(toc))
582 toc->validity = invalid;
584 toc->validity = valid;
585 TULoadTocFile(toc);
590 /* Append a message to the end of the toc. It has the given scan line. This
594 Msg TUAppendToc(Toc toc, const char *ptr)
599 TUGetFullFolderInfo(toc);
600 if (toc->validity != valid)
603 if (toc->nummsgs > 0)
604 msgid = toc->msgs[toc->nummsgs - 1]->msgid + 1;
607 (toc->nummsgs)++;
608 toc->msgs = XtReallocArray(toc->msgs, toc->nummsgs, sizeof(Msg));
609 toc->msgs[toc->nummsgs - 1] = msg = XtNew(MsgRec);
611 msg->toc = toc;
618 msg->position = toc->lastPos;
623 if (toc->viewedseq == toc->seqlist[0]) {
625 toc->lastPos += msg->length;
629 toc->length += msg->length;
630 if ( (msg->visible) && (toc->source != NULL) )
631 TSourceInvalid(toc, msg->position, msg->length);
632 TUSaveTocFile(toc);