00001
00002
00003
00004
00005
00006
00007
#include "uniconfdaemonconn.h"
00008
#include "uniconfdaemon.h"
00009
#include "wvtclstring.h"
00010
00011
00012
00013
00014 UniConfDaemonConn::UniConfDaemonConn(
WvStream *_s,
const UniConf &_root) :
00015
UniClientConn(_s), root(_root)
00016 {
00017
addcallback();
00018 writecmd(EVENT_HELLO,
wvtcl_escape(
"UniConf Server ready."));
00019 }
00020
00021
00022 void UniConfDaemonConn::close()
00023 {
00024
delcallback();
00025
UniClientConn::close();
00026 }
00027
00028
00029 void UniConfDaemonConn::addcallback()
00030 {
00031
root.add_callback(
this, UniConfCallback(
this,
00032 &
UniConfDaemonConn::deltacallback),
true);
00033 }
00034
00035
00036 void UniConfDaemonConn::delcallback()
00037 {
00038
root.del_callback(
this,
true);
00039 }
00040
00041
00042 void UniConfDaemonConn::execute()
00043 {
00044
UniClientConn::execute();
00045
00046
for (;;)
00047 {
00048 UniClientConn::Command command =
readcmd();
00049
if (command == UniClientConn::NONE)
00050
break;
00051
00052
00053
WvString arg1(
readarg());
00054
WvString arg2(
readarg());
00055
switch (command)
00056 {
00057
case UniClientConn::NONE:
00058
break;
00059
00060
case UniClientConn::INVALID:
00061
do_malformed();
00062
break;
00063
00064
case UniClientConn::REQ_NOOP:
00065
do_noop();
00066
break;
00067
00068
case UniClientConn::REQ_GET:
00069
if (arg1.
isnull())
00070
do_malformed();
00071
else
00072
do_get(arg1);
00073
break;
00074
00075
case UniClientConn::REQ_SET:
00076
if (arg1.
isnull() || arg2.
isnull())
00077
do_malformed();
00078
else
00079
do_set(arg1, arg2);
00080
break;
00081
00082
case UniClientConn::REQ_REMOVE:
00083
if (arg1.
isnull())
00084
do_malformed();
00085
else
00086
do_remove(arg1);
00087
break;
00088
00089
case UniClientConn::REQ_SUBTREE:
00090
if (arg1.
isnull())
00091
do_malformed();
00092
else
00093
do_subtree(arg1);
00094
break;
00095
00096
case UniClientConn::REQ_HASCHILDREN:
00097
if (arg1.
isnull())
00098
do_malformed();
00099
else
00100
do_haschildren(arg1);
00101
break;
00102
00103
case UniClientConn::REQ_QUIT:
00104
do_quit();
00105
break;
00106
00107
case UniClientConn::REQ_HELP:
00108
do_help();
00109
break;
00110
00111
default:
00112
do_malformed();
00113
break;
00114 }
00115 }
00116 }
00117
00118
00119 void UniConfDaemonConn::do_malformed()
00120 {
00121 writefail(
"malformed request");
00122 }
00123
00124
00125 void UniConfDaemonConn::do_noop()
00126 {
00127 writeok();
00128 }
00129
00130
00131 void UniConfDaemonConn::do_reply(
WvStringParm reply)
00132 {
00133 writefail(
"unexpected reply");
00134 }
00135
00136
00137 void UniConfDaemonConn::do_get(
const UniConfKey &key)
00138 {
00139
WvString value(
root[key].get());
00140
if (value.
isnull())
00141 writefail();
00142
else
00143 writeonevalue(key, value);
00144 }
00145
00146
00147 void UniConfDaemonConn::do_set(
const UniConfKey &key,
WvStringParm value)
00148 {
00149
root[key].set(value);
00150 }
00151
00152
00153 void UniConfDaemonConn::do_remove(
const UniConfKey &key)
00154 {
00155
root[key].remove();
00156 }
00157
00158
00159 void UniConfDaemonConn::do_subtree(
const UniConfKey &key)
00160 {
00161 UniConf cfg(
root[key]);
00162
if (cfg.exists())
00163 {
00164 UniConf::Iter it(cfg);
00165
for (it.rewind(); it.next(); )
00166 writevalue(it->fullkey(), it->get());
00167 writeok();
00168 }
00169
else
00170 writefail();
00171 }
00172
00173
00174 void UniConfDaemonConn::do_haschildren(
const UniConfKey &key)
00175 {
00176
bool haschild =
root[key].haschildren();
00177
WvString msg(
"%s %s",
wvtcl_escape(key), haschild ?
"TRUE" :
"FALSE");
00178 writecmd(REPLY_CHILD, msg);
00179 }
00180
00181
00182 void UniConfDaemonConn::do_quit()
00183 {
00184 writeok();
00185
close();
00186 }
00187
00188
00189 void UniConfDaemonConn::do_help()
00190 {
00191
for (
int i = 0; i < UniClientConn::NUM_COMMANDS; ++i)
00192 writetext(UniClientConn::cmdinfos[i].description);
00193 writeok();
00194 }
00195
00196
00197 void UniConfDaemonConn::deltacallback(
const UniConf &cfg,
const UniConfKey &key)
00198 {
00199
WvString value(cfg[key].get());
00200
WvString msg;
00201
00202
UniConfKey fullkey(cfg.fullkey());
00203 fullkey.
append(key);
00204
00205
if (value.
isnull())
00206 msg =
WvString(
"%s",
wvtcl_escape(fullkey));
00207
else
00208 msg = WvString(
"%s %s",
wvtcl_escape(fullkey),
00209
wvtcl_escape(cfg[key].get()));
00210
00211 writecmd(UniClientConn::EVENT_NOTICE, msg);
00212 }