2 * @file config_controller.c
4 * @brief Implementation of config_controller_t.
9 * Copyright (C) 2007 Martin Willi
10 * Hochschule fuer Technik Rapperswil
12 * This program is free software; you can redistribute it and/or modify it
13 * under the terms of the GNU General Public License as published by the
14 * Free Software Foundation; either version 2 of the License, or (at your
15 * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
17 * This program is distributed in the hope that it will be useful, but
18 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
19 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
23 #include "config_controller.h"
24 #include "../manager.h"
25 #include "../gateway.h"
32 typedef struct private_config_controller_t private_config_controller_t
;
35 * private data of the task manager
37 struct private_config_controller_t
{
42 config_controller_t
public;
51 * read XML of a peerconfig element and fill template
53 static void process_peerconfig(private_config_controller_t
*this,
54 enumerator_t
*e
, request_t
*r
)
57 enumerator_t
*e1
, *e2
, *e3
;
58 char *name
, *value
, *config
= "", *child
= "";
60 while (e
->enumerate(e
, &xml
, &name
, &value
))
62 if (streq(name
, "name"))
66 else if (streq(name
, "ikeconfig"))
68 e1
= xml
->children(xml
);
69 while (e1
->enumerate(e1
, &xml
, &name
, &value
))
71 if (streq(name
, "local") || streq(name
, "remote"))
73 r
->setf(r
, "peercfgs.%s.ikecfg.%s=%s", config
, name
, value
);
78 else if (streq(name
, "childconfiglist"))
80 e1
= xml
->children(xml
);
81 while (e1
->enumerate(e1
, &xml
, &name
, &value
))
83 if (streq(name
, "childcfg"))
87 e2
= xml
->children(xml
);
88 while (e2
->enumerate(e2
, &xml
, &name
, &value
))
90 if (streq(name
, "name"))
94 else if (streq(name
, "local") || streq(name
, "remote"))
96 e3
= xml
->children(xml
);
97 while (e3
->enumerate(e3
, &xml
, &name
, &value
))
99 if (streq(name
, "network"))
101 r
->setf(r
, "peercfgs.%s.childcfgs.%s.%s.%d=%s",
102 config
, child
, name
, ++num
, value
);
115 r
->setf(r
, "peercfgs.%s.%s=%s", config
, name
, value
);
120 static void list(private_config_controller_t
*this, request_t
*r
)
124 enumerator_t
*e1
, *e2
;
127 gateway
= this->manager
->select_gateway(this->manager
, 0);
128 e1
= gateway
->query_configlist(gateway
);
131 r
->set(r
, "title", "Error");
132 r
->set(r
, "error", "querying the gateway failed");
133 r
->render(r
, "templates/error.cs");
137 r
->set(r
, "title", "Configuration overview");
139 while (e1
->enumerate(e1
, &xml
, &name
, &value
))
141 if (streq(name
, "peerconfig"))
143 e2
= xml
->children(xml
);
144 process_peerconfig(this, e2
, r
);
150 r
->render(r
, "templates/config/list.cs");
155 * Implementation of controller_t.get_name
157 static char* get_name(private_config_controller_t
*this)
163 * Implementation of controller_t.handle
165 static void handle(private_config_controller_t
*this,
166 request_t
*request
, char *action
)
168 if (!this->manager
->logged_in(this->manager
))
170 return request
->redirect(request
, "auth/login");
172 if (this->manager
->select_gateway(this->manager
, 0) == NULL
)
174 return request
->redirect(request
, "gateway/list");
178 if (streq(action
, "list"))
180 return list(this, request
);
183 return request
->redirect(request
, "config/list");
187 * Implementation of controller_t.destroy
189 static void destroy(private_config_controller_t
*this)
197 controller_t
*config_controller_create(context_t
*context
, void *param
)
199 private_config_controller_t
*this = malloc_thing(private_config_controller_t
);
201 this->public.controller
.get_name
= (char*(*)(controller_t
*))get_name
;
202 this->public.controller
.handle
= (void(*)(controller_t
*,request_t
*,char*,char*,char*,char*,char*))handle
;
203 this->public.controller
.destroy
= (void(*)(controller_t
*))destroy
;
205 this->manager
= (manager_t
*)context
;
207 return &this->public.controller
;