summaryrefslogtreecommitdiff
path: root/src/tests/rot13.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/tests/rot13.cpp')
-rw-r--r--src/tests/rot13.cpp80
1 files changed, 80 insertions, 0 deletions
diff --git a/src/tests/rot13.cpp b/src/tests/rot13.cpp
new file mode 100644
index 0000000..e677440
--- /dev/null
+++ b/src/tests/rot13.cpp
@@ -0,0 +1,80 @@
1#include "bu/protocol.h"
2#include "bu/multiserver.h"
3#include "bu/client.h"
4#include "bu/filter.h"
5
6using namespace Bu;
7
8class Rot13Filter : public Filter
9{
10public:
11 Rot13Filter( Stream &next ) :
12 Filter( next )
13 {
14 }
15
16 virtual ~Rot13Filter()
17 {
18 }
19
20 virtual void start()
21 {
22 }
23
24 virtual size_t stop()
25 {
26 return 0;
27 }
28
29 virtual size_t read( void *pBuf, size_t nBytes )
30 {
31 return rNext.read( pBuf, nBytes );
32 }
33
34 virtual size_t write( const void *pBuf, size_t nBytes )
35 {
36 const char *cBuf = (const char *)pBuf;
37 char *buf = new char[nBytes];
38 for( size_t j = 0; j < nBytes; j++ )
39 {
40 if( cBuf[j] >= 'a' && cBuf[j] <= 'z' )
41 buf[j] = (cBuf[j]-'a'+13)%26+'a';
42 else if( cBuf[j] >= 'A' && cBuf[j] <= 'Z' )
43 buf[j] = (cBuf[j]-'A'+13)%26+'A';
44 else
45 buf[j] = cBuf[j];
46 }
47 rNext.write( buf, nBytes );
48 delete[] buf;
49 return nBytes;
50 }
51};
52
53class Rot13Protocol : public Protocol
54{
55public:
56 void onNewConnection( Bu::Client *pClient )
57 {
58 pClient->pushFilter<Rot13Filter>();
59 }
60
61 void onNewData( Bu::Client *pClient )
62 {
63 pClient->write( pClient->getInput().getStr(), pClient->getInputSize() );
64 pClient->seek( pClient->getInputSize() );
65 }
66};
67
68int main()
69{
70 MultiServer xSrv;
71
72 xSrv.setTimeout( 5 );
73 xSrv.addProtocol( genProtocol<Rot13Protocol>, 9999 );
74
75 for(;;)
76 xSrv.scan();
77
78 return 0;
79}
80