OSDN Git Service

no bone
[nethackexpress/trunk.git] / sys / share / nhlan.c
1 /*      SCCS Id: @(#)nhlan.c    3.4     1999/11/21      */
2 /* Copyright (c) Michael Allison, 1997                  */
3 /* NetHack may be freely redistributed.  See license for details. */
4
5 /*
6  * Currently shared by the following ports:
7  *      WIN32
8  *
9  * The code in here is used to take advantage of added features
10  * that might be available in a Local Area Network environment.
11  *
12  *      Network Username of player
13  *      Mail
14  * Futures
15  *      Shared bones
16  *              To implement this: code, data files, and configuration
17  *              files need to be separated from writeable files such
18  *              as level files, bones files, and save files.
19  *
20  */
21
22 #include "hack.h"
23 #include <ctype.h>
24
25 #ifdef LAN_FEATURES
26
27 #ifdef LAN_MAIL
28 /* Port specific code needs to implement these routines for LAN_MAIL */
29 extern char *FDECL(get_username, (int *));
30 extern boolean NDECL(mail_check);
31 extern boolean FDECL(mail_fetch, (struct lan_mail_struct *)); 
32 extern void FDECL(mail_init, (char *));
33 extern void NDECL(mail_finish);
34
35 struct lan_mail_struct mailmessage;
36 #endif /* LAN_MAIL */
37
38
39 void init_lan_features()
40 {
41         lan_username();
42 #ifdef LAN_MAIL
43         lan_mail_init();
44 #endif
45 #ifdef LAN_SHARED_BONES
46 #endif
47 }
48 /*
49  * The get_lan_username() call is a required call, since some of
50  * the other LAN features depend on a unique username being available.
51  *
52  */
53 char lusername[MAX_LAN_USERNAME];
54 int lusername_size = MAX_LAN_USERNAME;
55
56 char *lan_username()
57 {
58         char *lu;
59         lu = get_username(&lusername_size);
60         if (lu) {
61          Strcpy(lusername, lu);
62          return lusername;
63         } else return (char *)0;
64 }
65
66 # ifdef LAN_MAIL
67 #if 0
68 static void
69 mail_by_pline(msg)
70 struct lan_mail_struct *msg;
71 {
72         long    size;
73
74         for (size = 0; size < qt_msg->size; size += (long)strlen(in_line)) {
75             (void) dlb_fgets(in_line, 80, msg_file);
76             convert_line();
77             pline(out_line);
78         }
79
80 }
81 #endif /* 0 */
82
83 static void
84 mail_by_window(msg)
85 struct lan_mail_struct *msg;
86 {
87         char buf[BUFSZ];
88         winid datawin = create_nhwindow(NHW_TEXT);
89         char *get, *put;
90         int ccount = 0;
91         
92         get = msg->body;
93         put = buf;
94         while (*get) {
95              if (ccount > 79) {
96                 *put = '\0';
97                 putstr(datawin, 0, buf);
98                 put = buf;
99                 ccount = 0;
100              }
101              if (*get == '\r') {
102                 get++;
103              } else if (*get == '\n') { 
104                 *put = '\0';
105                 putstr(datawin, 0, buf);
106                 put = buf;
107                 get++;
108                 ccount = 0;
109              } else if (!isprint(*get)) {
110                 get++;
111              } else {
112                 *put++ = *get++;
113                 ccount++;
114              }
115         }
116         *put = '\0';
117         putstr(datawin, 0, buf);
118         putstr(datawin, 0, "");        
119         display_nhwindow(datawin, TRUE);
120         destroy_nhwindow(datawin);
121 }
122
123 /* this returns TRUE if there is mail ready to be read */
124 boolean lan_mail_check()
125 {
126         if (flags.biff) {
127                 if (mail_check()) return TRUE;
128         }
129         return FALSE;
130 }
131
132 void lan_mail_read(otmp)
133 struct obj *otmp;
134 {
135         if (flags.biff) {
136                 (void) mail_fetch(&mailmessage);
137                 /* after a successful fetch iflags.lan_mail_fetched
138                  * should be TRUE.  If it isn't then we don't
139                  * trust the contents of mailmessage.  This
140                  * ensures that things work correctly across
141                  * save/restores where mailmessage isn't
142                  * saved (nor should it be since it may be
143                  * way out of context by then).
144                  */
145                  if (iflags.lan_mail_fetched) {
146                     if (mailmessage.body_in_ram) {
147                         mail_by_window(&mailmessage);
148                         return;
149                     }
150                  }
151         }
152         pline_The("text has faded and is no longer readable.");
153 }
154
155 void lan_mail_init()
156 {
157         if (!flags.biff) return;
158         (void) mail_init(lusername);
159 }
160
161 void lan_mail_finish()
162 {
163         if (iflags.lan_mail)
164                 (void) mail_finish();
165 }
166
167 /* If ever called, the underlying mail system ran into trouble
168  * and wants us to cease bothering it immediately.
169  * Don't call mail_finish() because the underlying mail system
170  * may already be unavailable. Just clean up the NetHack side
171  * of things to prevent a crash.
172  */
173 void lan_mail_terminate()
174 {
175         /* Step 1. Clear iflags.lan_mail to indicate "not inited" */
176         iflags.lan_mail = FALSE;
177
178         /* Step 2. Clear iflags.lan_mail_fetched */
179         iflags.lan_mail_fetched = FALSE;
180
181         /* Once having gotten to this point, the only
182            way to resume NetHack mail features again is
183            to Save/Quit game, or for the user to clear
184            iflags.biff and then set it once again,
185            which triggers mail initialization */
186 }
187
188 # endif /*LAN_MAIL*/
189
190 #endif /*LAN_FEATURES*/
191 /*nhlan.c*/