json server for js
[public/pos.git] / database / gen-cpp / PosBookie_server.skeleton.cpp
1 // This autogenerated skeleton file illustrates how to build a server.
2 // You should copy it to another filename to avoid overwriting it.
3
4 #include "PosBookie.h"
5 #include <thrift/protocol/TBinaryProtocol.h>
6 #include <thrift/server/TSimpleServer.h>
7 #include <thrift/transport/TServerSocket.h>
8 #include <thrift/transport/TBufferTransports.h>
9 #include <thrift/transport/THttpServer.h>
10
11 #include "Pos.h"
12 #include <thrift/protocol/TJSONProtocol.h>
13 #include <thrift/transport/TSocket.h>
14 #include <thrift/transport/TTransportUtils.h>
15
16 #include "salt_store.h"
17 #include "sha1.h"
18 #include <stdio.h>
19
20 #include "ConfigFile.h"
21
22 using namespace ::apache::thrift;
23 using namespace ::apache::thrift::protocol;
24 using namespace ::apache::thrift::transport;
25 using namespace ::apache::thrift::server;
26
27 using boost::shared_ptr;
28
29 using namespace  ::posbookie;
30 using namespace  ::pos;
31
32 class PosBookieHandler : virtual public PosBookieIf {
33
34   shared_ptr<TTransport> socket;
35   shared_ptr<TTransport> transport;
36   shared_ptr<TProtocol> protocol;
37   PosClient * client;
38
39   SaltStore * saltStore;
40
41   std::string getAuthString() {
42     std::string s;
43     this->client->getSalt(s);
44     return SHA1Hash(s+"PSK").toHex();
45   }
46
47  public:
48   PosBookieHandler(char* serverHost, int serverPort, SaltStore* saltStore)
49   {
50     socket = shared_ptr<TTransport>(new TSocket(serverHost, serverPort));
51     transport = shared_ptr<TTransport>(new TFramedTransport(socket));
52     protocol = shared_ptr<TProtocol>(new TBinaryProtocol(transport));
53     client = new PosClient(protocol);
54         this->saltStore = saltStore;
55
56     try {
57           transport->open();
58       this->client->ping();
59     } catch(...) {
60       fprintf(stderr, "Failed to contact server '%s:%d'!\n", serverHost, serverPort);
61       abort();
62     }
63   }
64
65   void ping() { }
66
67   void getSalt(std::string& _return) {
68     _return = this->saltStore->getSalt();
69   }
70
71   E_PURCHASE_STATUS::type purchaseItems(const std::string& auth, const std::string& dataToHash, const std::vector<int64_t> & upcs) {
72     if(saltStore->consumeKey(auth)) {
73       try {
74         int32_t total_price = 0;
75         std::vector<int64_t>::const_iterator i;
76         for(i = upcs.begin(); i != upcs.end(); i++) {
77           total_price += this->getUPCPrice(*i);
78         }
79
80         int32_t accountBalance = this->client->getHashAccountBalance(dataToHash);
81         if(accountBalance > total_price) {
82           this->client->doTransactionOnHash(this->getAuthString(), dataToHash, total_price * -1);
83           return E_PURCHASE_STATUS::EPS_SUCCESS;
84         }
85
86         return E_PURCHASE_STATUS::EPS_NOMONEY;
87       } catch(...) {
88         return E_PURCHASE_STATUS::EPS_FAIL;
89       }
90     }
91
92     return E_PURCHASE_STATUS::EPS_FAIL;
93   }
94
95   int32_t getUPCPrice(const int64_t upc) {
96     return this->client->getUPCPrice(upc);
97   }
98
99   int32_t getStock(const int64_t upc) {
100     return this->client->getStock(upc);
101   }
102
103 };
104
105 int main(int argc, char **argv) {
106   if(argc != 2) {
107     printf("usage: posbookie <configFile>\n");
108     exit(1);
109   }
110
111   ConfigFile conf(argv[1]);
112
113   const char* server_host;
114   int server_port;
115   int listen_port;
116   SaltStore * saltStore;
117
118   try {
119     server_host = conf.read<std::string>("server_host", "localhost").c_str();
120     server_port = conf.read<int>("server_port", 9090);
121     listen_port = conf.read<int>("listen_port", 9091);
122     saltStore = new SaltStore(
123       conf.read<uint64_t>("key_lifetime", 120),
124       conf.read<size_t>("salt_size", 256),
125       conf.read<std::string>("secret")
126       );
127   } catch(ConfigFile::file_not_found & e) {
128     fprintf(stderr, "Could not open configuration file '%s'!\n", e.filename.c_str());
129     abort();
130   } catch(ConfigFile::key_not_found & e) {
131     fprintf(stderr, "Could not find required configuration key '%s'!\n", e.key.c_str());
132     abort();
133   }
134   
135   shared_ptr<PosBookieHandler> handler(new PosBookieHandler((char*)server_host, server_port, saltStore));
136   shared_ptr<TProcessor> processor(new PosBookieProcessor(handler));
137   shared_ptr<TServerTransport> serverTransport(new TServerSocket(listen_port));
138   shared_ptr<TTransportFactory> transportFactory(new THttpServerTransportFactory());
139   shared_ptr<TProtocolFactory> protocolFactory(new TJSONProtocolFactory());
140
141   TSimpleServer server(processor, serverTransport, transportFactory, protocolFactory);
142
143   server.serve();
144
145   delete saltStore;
146   return 0;
147 }
148