1 //  This may look like C code, but it is really -*- C++ -*-
2 
3 //  ------------------------------------------------------------------
4 //  The Goldware Library
5 //  Copyright (C) 1990-1999 Odinn Sorensen
6 //  ------------------------------------------------------------------
7 //  This library is free software; you can redistribute it and/or
8 //  modify it under the terms of the GNU Library General Public
9 //  License as published by the Free Software Foundation; either
10 //  version 2 of the License, or (at your option) any later version.
11 //
12 //  This library is distributed in the hope that it will be useful,
13 //  but WITHOUT ANY WARRANTY; without even the implied warranty of
14 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15 //  Library General Public License for more details.
16 //
17 //  You should have received a copy of the GNU Library General Public
18 //  License along with this program; if not, write to the Free
19 //  Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
20 //  MA 02111-1307, USA
21 //  ------------------------------------------------------------------
22 //  $Id: gmoxbbs3.cpp,v 1.9 2006/05/14 11:45:05 ssianky Exp $
23 //  ------------------------------------------------------------------
24 //  AdeptXBBS messagebase engine.
25 //  ------------------------------------------------------------------
26 
27 
28 //  ------------------------------------------------------------------
29 
30 #include <gmemdbg.h>
31 #include <gdbgtrk.h>
32 #include <gstrall.h>
33 
34 #include <gmoxbbs.h>
35 
36 
37 //  ------------------------------------------------------------------
38 
load_message(int __mode,gmsg * __msg,XbbsHdr & __hdr)39 int XbbsArea::load_message(int __mode, gmsg* __msg, XbbsHdr& __hdr) {
40 
41   // Setup some local variables for speed
42   int _fhdata = data->fhdata;
43   uint _reln = Msgn->ToReln(__msg->msgno);
44 
45   // Load the message header
46   memset(&__hdr, 0, sizeof(XbbsHdr));
47   lseekset(_fhdata, (_reln-1)*sizeof(XbbsHdr));
48   read(_fhdata, &__hdr, sizeof(XbbsHdr));
49 
50   // Convert header
51 
52   strcpy(__msg->by, __hdr.from);
53   strcpy(__msg->to, __hdr.to);
54   strcpy(__msg->re, __hdr.subj);
55 
56   __msg->orig.zone  = __msg->oorig.zone  = __hdr.origaddr.zone;
57   __msg->orig.net   = __msg->oorig.net   = __hdr.origaddr.net;
58   __msg->orig.node  = __msg->oorig.node  = __hdr.origaddr.node;
59   __msg->orig.point = __msg->oorig.point = __hdr.origaddr.point;
60 
61   __msg->dest.zone  = __msg->odest.zone  = __hdr.destaddr.zone;
62   __msg->dest.net   = __msg->odest.net   = __hdr.destaddr.net;
63   __msg->dest.node  = __msg->odest.node  = __hdr.destaddr.node;
64   __msg->dest.point = __msg->odest.point = __hdr.destaddr.point;
65 
66   __msg->written = FidoTimeToUnix(__hdr.date);
67   __msg->received = __hdr.timerecv;
68 
69   if(__hdr.indate[2])
70   {
71     struct tm t;
72     t.tm_year   = __hdr.indate[0]+89;
73     t.tm_mon    = __hdr.indate[1]-1;
74     t.tm_mday   = __hdr.indate[2];
75     t.tm_hour   = t.tm_min = t.tm_sec = 0;
76     t.tm_isdst  = -1;
77     time32_t a  = gmktime(&t);
78     struct tm tp; ggmtime(&tp, &a);
79     tp.tm_isdst = -1;
80     time32_t b  = gmktime(&tp);
81     __msg->arrived = a + a - b;
82   }
83 
84   __msg->cost      = __hdr.cost;
85   __msg->timesread = __hdr.timesread;
86 
87   __msg->txtstart  = __hdr.start;
88   __msg->txtlength = __hdr.length;
89 
90   // Convert fflag attributes
91   __msg->attr.pvt(__hdr.fflags & FFLAGS_MSGPRIVATE);
92   __msg->attr.cra(__hdr.fflags & FFLAGS_MSGCRASH);
93   __msg->attr.rcv(__hdr.fflags & FFLAGS_MSGREAD);
94   __msg->attr.snt(__hdr.fflags & FFLAGS_MSGSENT);
95   __msg->attr.att(__hdr.fflags & FFLAGS_MSGFILE);
96   __msg->attr.trs(__hdr.fflags & FFLAGS_MSGFWD);
97   __msg->attr.orp(__hdr.fflags & FFLAGS_MSGORPHAN);
98   __msg->attr.k_s(__hdr.fflags & FFLAGS_MSGKILL);
99   __msg->attr.loc(__hdr.fflags & FFLAGS_MSGLOCAL);
100   __msg->attr.frq(__hdr.fflags & FFLAGS_MSGFRQ);
101   __msg->attr.rrq(__hdr.fflags & FFLAGS_MSGRRQ);
102   __msg->attr.rrc(__hdr.fflags & FFLAGS_MSGCPT);
103   __msg->attr.arq(__hdr.fflags & FFLAGS_MSGARQ);
104   __msg->attr.urq(__hdr.fflags & FFLAGS_MSGURQ);
105 
106   // Convert xflag attributes
107   __msg->attr.del(__hdr.xflags & XFLAGS_MSGDELETED);
108   __msg->attr.ano(__hdr.xflags & XFLAGS_MSGANON);
109   __msg->attr.ume(__hdr.xflags & XFLAGS_MSGECHO);
110   __msg->attr.umn(__hdr.xflags & XFLAGS_MSGNET);
111   __msg->attr.fsc(__hdr.xflags & XFLAGS_MSGSCANNED);
112   __msg->attr.lok(__hdr.xflags & XFLAGS_MSGKEEP);
113   __msg->attr.trt(__hdr.xflags & XFLAGS_MSGTREATED);
114   __msg->attr.lzs(__hdr.xflags & XFLAGS_MSGPACKED);
115   __msg->attr.gsc(__hdr.xflags & XFLAGS_MSGGSCAN);
116   __msg->attr.rsc(__hdr.xflags & XFLAGS_MSGRSCAN);
117   __msg->attr.arc(__hdr.xflags & XFLAGS_MSGARCHIVED);
118   __msg->attr.tag(__hdr.xflags & XFLAGS_MSGTAGGED);
119 
120   // Set the unsent attribute
121   #if 0
122   if(isnet())
123     __msg->attr.uns((__msg->attr.loc() and not __msg->attr.snt()) or (__hdr.xflags & XFLAGS_MSGNET));
124   else
125     __msg->attr.uns(__hdr.xflags & XFLAGS_MSGECHO);
126   #endif
127 
128   if(isnet() or isecho())
129     __msg->attr.uns(not (__hdr.xflags & XFLAGS_MSGSCANNED));
130 
131   __msg->adeptxbbs.iflags = __hdr.iflags;
132   __msg->adeptxbbs.oflags = __hdr.oflags;
133 
134   // If message text is requested
135   if(__mode & GMSG_TXT) {
136 
137     // Get length of message text
138     uint _txtlen = __hdr.length;
139 
140     // Allocate space for the message text
141     __msg->txt = (char*)throw_calloc(1, _txtlen+256);
142 
143     // Read the message text
144     lseekset(data->fhtext, __hdr.start);
145     read(data->fhtext, __msg->txt, _txtlen);
146   }
147 
148   GFTRK(0);
149 
150   // Success
151   return true;
152 }
153 
154 
155 //  ------------------------------------------------------------------
156 
load_hdr(gmsg * __msg)157 int XbbsArea::load_hdr(gmsg* __msg) {
158 
159   GFTRK("XbbsLoadHdr");
160 
161   XbbsHdr _hdr;
162   return load_message(GMSG_HDR, __msg, _hdr);
163 }
164 
165 
166 //  ------------------------------------------------------------------
167 
load_msg(gmsg * __msg)168 int XbbsArea::load_msg(gmsg* __msg) {
169 
170   GFTRK("XbbsLoadMsg");
171 
172   XbbsHdr _hdr;
173   return load_message(GMSG_HDRTXT, __msg, _hdr);
174 }
175 
176 
177 //  ------------------------------------------------------------------
178 
179