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