1 //
2 // aegis - project change supervisor
3 // Copyright (C) 2004-2006, 2008, 2012 Peter Miller
4 //
5 // This program is free software; you can redistribute it and/or modify
6 // it under the terms of the GNU General Public License as published
7 // by the Free Software Foundation; either version 3 of the License, or
8 // (at your option) any later version.
9 //
10 // This program is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 // General Public License for more details.
14 //
15 // You should have received a copy of the GNU General Public License
16 // along with this program. If not, see <http://www.gnu.org/licenses/>.
17 //
18
19 #include <common/ac/assert.h>
20
21 #include <common/mem.h>
22 #include <libaegis/os.h>
23
24 #include <aecvsserver/file_info.h>
25 #include <aecvsserver/response/error.h>
26 #include <aecvsserver/response/e.h>
27 #include <aecvsserver/response/m.h>
28 #include <aecvsserver/response/ok.h>
29 #include <aecvsserver/server/private.h>
30
31
32 void
server_run(server_ty * sp)33 server_run(server_ty *sp)
34 {
35 assert(sp);
36 assert(sp->vptr);
37 assert(sp->vptr->run);
38 sp->vptr->run(sp);
39 }
40
41
42 void
server_delete(server_ty * sp)43 server_delete(server_ty *sp)
44 {
45 assert(sp);
46 assert(sp->vptr);
47 if (sp->vptr->destructor)
48 sp->vptr->destructor(sp);
49 sp->vptr = 0;
50 sp->np = 0;
51 mem_free(sp);
52 }
53
54
55 void
server_response_queue(server_ty * sp,response * rp)56 server_response_queue(server_ty *sp, response *rp)
57 {
58 sp->np->response_queue(rp);
59 }
60
61
62 void
server_response_flush(server_ty * sp)63 server_response_flush(server_ty *sp)
64 {
65 sp->np->response_flush();
66 }
67
68
69 bool
server_getline(server_ty * sp,nstring & result)70 server_getline(server_ty *sp, nstring &result)
71 {
72 return sp->np->getline(result);
73 }
74
75
76 void
server_ok(server_ty * sp)77 server_ok(server_ty *sp)
78 {
79 assert(sp);
80 server_response_queue(sp, new response_ok());
81 }
82
83
84 void
server_error(server_ty * sp,const char * fmt,...)85 server_error(server_ty *sp, const char *fmt, ...)
86 {
87 assert(sp);
88 assert(fmt);
89 va_list ap;
90 va_start(ap, fmt);
91 string_ty *msg = str_vformat(fmt, ap);
92 va_end(ap);
93
94 server_response_queue(sp, new response_error(msg));
95 }
96
97
98 void
server_e(server_ty * sp,const char * fmt,...)99 server_e(server_ty *sp, const char *fmt, ...)
100 {
101 assert(sp);
102 assert(fmt);
103 va_list ap;
104 va_start(ap, fmt);
105 string_ty *msg = str_vformat(fmt, ap);
106 va_end(ap);
107
108 server_response_queue(sp, new response_e(msg));
109 }
110
111
112 void
server_m(server_ty * sp,const char * fmt,...)113 server_m(server_ty *sp, const char *fmt, ...)
114 {
115 assert(sp);
116 assert(fmt);
117 va_list ap;
118 va_start(ap, fmt);
119 string_ty *msg = str_vformat(fmt, ap);
120 va_end(ap);
121
122 server_response_queue(sp, new response_m(msg));
123 }
124
125
126 int
server_root_required(server_ty * sp,const char * caption)127 server_root_required(server_ty *sp, const char *caption)
128 {
129 int root_required;
130
131 assert(sp);
132 assert(caption);
133 root_required = !sp->np->get_is_rooted();
134 if (root_required)
135 server_error(sp, "%s: must send Root request first", caption);
136 return root_required;
137 }
138
139
140 int
server_directory_required(server_ty * sp,const char * caption)141 server_directory_required(server_ty *sp, const char *caption)
142 {
143 assert(sp);
144 assert(caption);
145 bool bad = !sp->np->curdir_is_set();
146 if (bad)
147 server_error(sp, "%s: must send Directory request first", caption);
148 return bad;
149 }
150
151
152 void
server_argument(server_ty * sp,string_ty * arg)153 server_argument(server_ty *sp, string_ty *arg)
154 {
155 assert(sp);
156 assert(sp->np);
157 sp->np->argument(arg);
158 }
159
160
161 void
server_argumentx(server_ty * sp,string_ty * arg)162 server_argumentx(server_ty *sp, string_ty *arg)
163 {
164 assert(sp);
165 assert(sp->np);
166 sp->np->argumentx(arg);
167 }
168
169
170 void
server_accumulator_reset(server_ty * sp)171 server_accumulator_reset(server_ty *sp)
172 {
173 sp->np->accumulator_reset();
174 }
175
176
177 file_info_ty *
server_file_info_find(server_ty * sp,string_ty * server_side,int auto_alloc)178 server_file_info_find(server_ty *sp, string_ty *server_side, int auto_alloc)
179 {
180 return sp->np->file_info_find(server_side, auto_alloc);
181 }
182
183
184 void
server_updating_verbose(server_ty * sp,string_ty * client_side)185 server_updating_verbose(server_ty *sp, string_ty *client_side)
186 {
187 string_ty *dir = os_dirname_relative(client_side);
188 if
189 (
190 // this is a string, not a bool
191 !sp->np->get_updating_verbose()
192 ||
193 !str_equal(dir, sp->np->get_updating_verbose())
194 )
195 {
196 server_e(sp, "Updating %s", dir->str_text);
197 sp->np->set_updating_verbose(dir);
198 }
199 str_free(dir);
200 }
201
202
203 string_ty *
server_directory_calc_client_side(server_ty * sp,string_ty * server_side)204 server_directory_calc_client_side(server_ty *sp, string_ty *server_side)
205 {
206 const char *start;
207 const char *end;
208 const char *slash;
209
210 start = server_side->str_text;
211 end = start + server_side->str_length;
212 slash = end;
213 while (slash > start)
214 {
215 --slash;
216 if (*slash == '/')
217 {
218 string_ty *ss;
219 directory_ty *dp;
220
221 ss = str_n_from_c(start, end - start);
222 dp = sp->np->directory_find_server_side(ss);
223 str_free(ss);
224 if (dp)
225 {
226 string_ty *tmp;
227 string_ty *cs;
228
229 tmp = str_n_from_c(slash, end - slash);
230 cs = str_catenate(dp->client_side, tmp);
231 str_free(tmp);
232 return cs;
233 }
234 }
235 }
236 return str_copy(server_side);
237 }
238
239
240 // vim: set ts=8 sw=4 et :
241