Initial import of the CDE 2.1.30 sources from the Open Group.
[oweals/cde.git] / cde / programs / dtmail / dtmailpr / mailbox.C
1 /* $XConsortium: mailbox.C /main/4 1996/04/21 19:44:02 drk $ */
2
3 /*
4  *+SNOTICE
5  *
6  *      $:$
7  *
8  *      RESTRICTED CONFIDENTIAL INFORMATION:
9  *      
10  *      The information in this document is subject to special
11  *      restrictions in a confidential disclosure agreement between
12  *      HP, IBM, Sun, USL, SCO and Univel.  Do not distribute this
13  *      document outside HP, IBM, Sun, USL, SCO, or Univel without
14  *      Sun's specific written approval.  This document and all copies
15  *      and derivative works thereof must be returned or destroyed at
16  *      Sun's request.
17  *
18  *      Copyright 1994 Sun Microsystems, Inc.  All rights reserved.
19  *
20  *+ENOTICE
21  */
22
23 #include <stdio.h>
24 #include "dmx.hh"
25
26
27 DmxMailbox::DmxMailbox (void)
28 {
29         mbox = NULL;
30         newMessages = 0;
31         messageCount = 0;
32         firstNew = 0;
33         name = NULL;
34 }
35
36 void
37 DmxMailbox::loadMessages (void)
38 {
39         DtMailEnv               env;
40         boolean_t       moreMessages = B_TRUE;
41
42         // open the mailbox
43         // (O_RDONLY for now)
44         mbox->open (env,        /* DtMailEnv */
45                     DTM_FALSE,  /* auto_create */
46                     O_RDONLY,   /* open(2) flag */ 
47                     (mode_t) 0, /* create(2) mode */
48                     DTM_FALSE,  /* lock_flag */
49                     DTM_TRUE    /* auto_parse */
50           );
51
52         if (handleError (env, "open mailbox") == B_TRUE)
53                 exit (1);
54
55         // get the first message handle
56         DtMailMessageHandle     first = NULL, next = NULL, prev = NULL;
57         DtMailHeaderRequest     request;
58         DtMailHeaderLine        hdrline;
59         int                     i = 1;
60         DtMail::Message         *m = NULL;      // temporary
61
62         createHeaderRequest (request);
63
64         first = mbox->getFirstMessageSummary (env, request, hdrline);
65
66         if (handleError (env, "get first msg summary") == B_TRUE)
67                 exit (1);
68
69         if (first == NULL)
70         {
71                 fprintf (stderr,
72                         "loadMessages: error w/1st message...exiting.\n");
73                 exit (1);
74         }
75
76         // this makes hash of the caching strategy, but oh well....
77         m = mbox->getMessage (env, first);
78         if (handleError (env, "get first msg") == B_TRUE)
79                 exit (1);
80         msg [i].setMessage (m);
81         
82         prev = first;
83
84         msg [i].setHandle (first);
85         msg [i].setHeader (hdrline);
86
87         while (moreMessages == B_TRUE)
88         {
89                 next = mbox->getNextMessageSummary (env, prev,
90                                                 request, hdrline);
91
92                 if (next == NULL)
93                 {
94                         moreMessages = B_FALSE;
95                         if (handleError (env, "msgLoop") == B_TRUE)
96                                 exit (1);
97                         break; // break out if error
98                 } else {
99                         i++;    
100                         msg [i].setHandle (next);
101                         msg [i].setHeader (hdrline);
102                 }
103                 
104                 prev = next;
105         }       
106
107         messageCount = i;
108
109
110         // fill in the remaining message structures .. temporary, honest!
111         for (int j = 1; j <= messageCount; j++)
112         {
113                 m = mbox->getMessage (env, msg [j].msgHandle);
114                 if (handleError (env, "getMessage loop") == B_TRUE)
115                 {
116                         printf ("fatal error...bailing...\n");
117                         exit (1);
118                 }       
119                 msg [j].setMessage (m);
120
121                 char    tmp [100];
122                 sprintf (tmp, "%d", j);         // ick
123                 msg [j].setInfo (tmp);
124
125                 msg[j].getFlags ();
126                 if (msg[j].isNew == B_TRUE)
127                 {
128                         newMessages++;
129                         if (firstNew == 0)
130                         {
131                                 firstNew = j;
132                         }
133                 }
134
135         }
136
137         // no new messages -- start with first message in mailbox
138         if (firstNew == 0)
139                 firstNew = 1;
140                 
141         // free header request structure
142         int k;
143         // this assumes that you have allocated all of the possible headers
144         // in the enum DmxHeaders -- a bad assumption, but currently true
145         for (k = 0; k < DMXNUMHDRS; k++)
146         {
147                 free (request.header_name [k]);
148         }
149         delete request.header_name;
150         
151         return;
152 }
153
154 void
155 DmxMailbox::createHeaderRequest (DtMailHeaderRequest &request)
156 {
157         // set up default headers
158         request.number_of_names = DMXNUMHDRS;
159         request.header_name = new (char* [DMXNUMHDRS]);
160         request.header_name[DMXFROM] = strdup(DtMailMessageSender);
161         request.header_name[DMXSUBJ] = strdup(DtMailMessageSubject);
162         request.header_name[DMXDATE] = strdup(DtMailMessageReceivedTime);
163         request.header_name[DMXCLENGTH] = strdup(DtMailMessageContentLength);
164         request.header_name[DMXSTATUS] = strdup(DtMailMessageStatus);
165         request.header_name[DMXTO] = strdup(DtMailMessageTo);
166         request.header_name[DMXV3CHARSET] = strdup(DtMailMessageV3charset);
167         request.header_name[DMXCONTENTTYPE] = strdup(DtMailMessageContentType);
168
169         return;
170 }
171
172 void
173 DmxMailbox::printMailboxInfo (void)
174 {
175         if (newMessages > 0)
176         {
177                 printf ("\"%s\": %d messages %d new\n",
178                 name, messageCount, newMessages);
179         } else {
180                 printf ("\"%s\": %d messages\n",
181                 name, messageCount);
182         }
183
184         return;
185 }