source: trunk/gsdl/src/w32server/locate.cpp@ 4642

Last change on this file since 4642 was 4642, checked in by sjboddie, 21 years ago

Added command line arguments to server.exe so the GLI can tell it to use
an alternative config file.

  • Property svn:executable set to *
  • Property svn:keywords set to Author Date Id Revision
File size: 6.4 KB
Line 
1/**********************************************************************
2 *
3 * locate.cpp
4 * Copyright (C) 1996
5 *
6 * A component of the fnord webserver written by [email protected].
7 *
8 * Altered for use with the Greenstone digital library software by the
9 * New Zealand Digital Library Project at the University of Waikato,
10 * New Zealand.
11 *
12 * This program is free software; you can redistribute it and/or modify
13 * it under the terms of the GNU General Public License as published by
14 * the Free Software Foundation; either version 2 of the License, or
15 * (at your option) any later version.
16 *
17 * This program is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 * GNU General Public License for more details.
21 *
22 * You should have received a copy of the GNU General Public License
23 * along with this program; if not, write to the Free Software
24 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
25 *
26 *********************************************************************/
27
28#include "text_t.h"
29#include <windows.h>
30#include <stdio.h>
31#include "locate.h"
32#include "settings.h"
33
34/* The following values are inserted or used by FNORD.CPP */
35HWND GSDL_Window;
36int line_spacing;
37RECT text_rect;
38
39
40static FILE *log_file=NULL;
41
42static int location_found=0;
43text_t data_location;
44
45void set_location(text_t possible)
46{
47 if (location_found != 0) return;
48 if (!possible.empty()) {
49 data_location = possible;
50 if (*(data_location.end()-1) != '\\') {
51 data_location.push_back('\\');
52 }
53 location_found = 1;
54 }
55}
56
57void find_location(void)
58{
59 if (location_found != 0) return;
60
61 char here[MAX_FILENAME_SIZE];
62 char *send;
63
64 if (GetModuleFileName(NULL,here,MAX_FILENAME_SIZE) <= 0) {
65 // failed
66 data_location.clear();
67 } else {
68 send = strrchr(here,'\\');
69 if (send != NULL) {
70 send++;
71 } else {
72 send = strchr(here,':');
73 if (send != NULL) {
74 send++;
75 } else {
76 send = here;
77 }
78 }
79 }
80 *send = 0;
81 data_location.setcstr(here);
82 location_found = 1;
83}
84
85void open_log_file()
86{
87 if (log_file != NULL) fclose(log_file);
88 log_file = fopen(gsdl_log_name, "a");
89 if (log_file != NULL) {
90 fprintf (log_file, "\n\n-----------\n");
91 fprintf (log_file, "log started\n");
92 fprintf (log_file, "-----------\n\n");
93 }
94}
95
96void close_log_file()
97{
98 if (log_file != NULL) {
99 fclose(log_file);
100 log_file = NULL;
101 }
102}
103
104#define CONSOLE_BUFFER_SIZE 2048
105char console_buffer[CONSOLE_BUFFER_SIZE];
106char *next_console, *last_console;
107int console_top, console_y;
108
109void activate_console(void)
110{
111 gsdl_show_console = 1;
112 next_console = console_buffer;
113 *next_console = 0;
114 last_console = next_console;
115 console_y = console_top = text_rect.top +
116 (text_rect.bottom - text_rect.top + 1) % line_spacing / 2;
117 InvalidateRect(GSDL_Window,NULL,TRUE);
118}
119
120void deactivate_console(void)
121{
122 gsdl_show_console = 0;
123 InvalidateRect(GSDL_Window,NULL,TRUE);
124}
125
126void refresh_console(HDC dc)
127{
128 int loc; char *b, *e;
129 loc = console_top;
130 for (e = console_buffer;;) {
131 b = e;
132 while (*e >= ' ') e++;
133 TextOut(dc,0,loc,b,e-b);
134 loc += line_spacing;
135 if (*e == 0) break;
136 e++;
137 if (*e == 0) break;
138 }
139}
140
141void scroll(HDC dc, int nbits)
142{
143 RECT scroll, clip, update;
144
145 scroll.left = clip.left = text_rect.left;
146 scroll.right = clip.right = text_rect.right;
147 clip.top = console_top;
148 clip.bottom = text_rect.bottom;
149 scroll.top = clip.top + nbits;
150 scroll.bottom = text_rect.bottom;
151 ScrollDC(dc,0,-nbits,&scroll,&clip,NULL,&update);
152 FillRect(dc,&update, (HBRUSH)GetStockObject(WHITE_BRUSH));
153}
154
155int remove_line()
156{
157 char *bin, *bout;
158 bin = bout = console_buffer;
159 while (*bin >= ' ') bin++;
160 if (*bin != 0) {
161 bin++;
162 if (*bin != 0) {
163 while (*bin != 0) *bout++ = *bin++;
164 *bout = *bin;
165 last_console -= (bin - bout);
166 next_console = bout;
167 return line_spacing;
168 }
169 }
170 next_console = console_buffer;
171 *next_console = 0;
172 last_console = next_console;
173 return 0;
174}
175
176void display_line(HDC dc, char *line, int nch)
177{
178 int scroll_needed = 0;
179 while (next_console + nch + 1
180 > console_buffer + CONSOLE_BUFFER_SIZE)
181 scroll_needed += remove_line();
182 console_y -= scroll_needed;
183 if (*last_console == '\n') {
184 console_y += line_spacing;
185 if (console_y + line_spacing > text_rect.bottom) {
186 scroll_needed += remove_line();
187 console_y -= line_spacing;
188 }
189 last_console = next_console;
190 }
191 if (scroll_needed != 0) scroll(dc, scroll_needed);
192 while (nch-- > 0) *next_console++ = *line++;
193 TextOut(dc,0,console_y,last_console,next_console-last_console);
194 *next_console = *line;
195 if (*next_console != 0) {
196 last_console = next_console;
197 next_console++;
198 *next_console = 0;
199 }
200}
201
202void display_text(HDC dc, char *buffer)
203{
204 char *bl, *bp;
205 for (bl = buffer;;) {
206 for (bp = bl;;) {
207 if (*bp == '\t') *bp = ' ';
208 if (*bp < ' ') break;
209 bp++;
210 }
211 if (*bp != 0) *bp = '\n';
212 display_line(dc, bl, bp-bl);
213 if (*bp == 0) break;
214 bl = bp+1;
215 if (*bl == 0) break;
216 }
217}
218
219void log_message(char *msg)
220{
221 if (log_file != NULL) {
222 fprintf(log_file,"%s",msg);
223 fflush(log_file);
224 }
225 if (gsdl_show_console) {
226 char buffer[1024]; HDC dc;
227 sprintf(buffer,"%s",msg);
228 dc = GetDC(GSDL_Window);
229 display_text(dc,buffer);
230 ReleaseDC(GSDL_Window,dc);
231 }
232}
233
234void log_message_N(char*msg, int n)
235{
236 if (log_file != NULL) {
237 int len = 0;
238 while (len < n) {
239 fputc (msg[len], log_file);
240 len++;
241 }
242 fflush(log_file);
243 }
244
245 // these messages are not send to the console
246 if (gsdl_show_console) {
247 HDC dc;
248 dc = GetDC(GSDL_Window);
249 display_text(dc,"message only written to log file\n");
250 ReleaseDC(GSDL_Window,dc);
251 }
252}
253
254void LogCriticalError(char *cderr, char *Msg)
255{
256 char MsgBoxStr[200];
257
258 strcpy(MsgBoxStr, "Critical Error Number ");
259 strcat(MsgBoxStr, cderr);
260 strcat(MsgBoxStr, "\n");
261 strcat(MsgBoxStr, Msg);
262 strcat(MsgBoxStr, "\nGreenstone Digital Library software\nshutting down");
263 MessageBox(GSDL_Window, MsgBoxStr, "Greenstone Digital Library Software",
264 MB_OK | MB_ICONERROR);
265 PostMessage(GSDL_Window, WM_DESTROY, 0, 0);
266}
267
268
269/* returns second-first taking into account wrap around */
270DWORD DiffTickCounts (DWORD first, DWORD second)
271{
272 if (second >= first) return (second-first);
273 return (MAXDWORD-first+1+second);
274}
Note: See TracBrowser for help on using the repository browser.