1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
|
#include "stdafx.h"
#include "Test.h"
namespace storm {
namespace server {
Test::Test(Connection *c) : conn(c) {
start = c->symbol(S("start"));
stop = c->symbol(S("stop"));
sum = c->symbol(S("sum"));
send = c->symbol(S("send"));
echo = c->symbol(S("echo"));
}
void Test::clear() {
sumResult = 0;
}
SExpr *Test::onMessage(SExpr *msg) {
Cons *cell = msg->asCons();
Symbol *kind = cell->first->asSym();
if (!kind) {
return null;
} else if (*start == *kind) {
clear();
} else if (*stop == *kind) {
return onStop(cell->rest);
} else if (*sum == *kind) {
return onSum(cell->rest);
} else if (*send == *kind) {
return onSend(cell->rest);
} else if (*echo == *kind) {
return onEcho(cell->rest);
}
return null;
}
SExpr *Test::onStop(SExpr *msg) {
if (sumResult > 0)
return list(engine(), 2, sum, new (this) Number(sumResult));
return null;
}
SExpr *Test::onSum(SExpr *msg) {
while (msg) {
SExpr *at = next(msg);
if (Number *n = as<Number>(at)) {
sumResult += n->v;
} else if (String *s = as<String>(at)) {
for (Str::Iter i = s->v->begin(), end = s->v->end(); i != end; ++i) {
sumResult += i.v().codepoint();
}
}
}
return null;
}
SExpr *Test::onSend(SExpr *msg) {
Nat times = next(msg)->asNum()->v;
SExpr *send = next(msg);
SExpr *pad = next(msg);
for (nat i = 0; i < times; i++) {
conn->send(send);
if (String *s = as<String>(pad)) {
conn->textOut->write(s->v);
conn->textOut->flush();
}
}
return list(engine(), 1, stop);
}
SExpr *Test::onEcho(SExpr *msg) {
return cons(engine(), echo, null);
}
}
}
|