]> git.stg.codes - stg.git/blob - projects/stargazer/plugins/other/userstat/datathread.h
Merge branch 'master' into full-month-stats
[stg.git] / projects / stargazer / plugins / other / userstat / datathread.h
1 #ifndef __DATATHREAD_H__
2 #define __DATATHREAD_H__
3
4 #include <map>
5 #include <string>
6
7 #include <expat.h>
8 #include <pthread.h>
9
10 #include "common.h"
11 #include "../../../users.h"
12
13 uint32_t n2l(unsigned char * c)
14 {
15     uint32_t t = *c++ << 24;
16     t += *c++ << 16;
17     t += *c++ << 8;
18     t += *c;
19     return t;
20 }
21
22 void l2n(uint32_t t, unsigned char * c)
23 {
24     *c++ = t >> 24 & 0x000000FF;
25     *c++ = t >> 16 & 0x000000FF;
26     *c++ = t >> 8 & 0x000000FF;
27     *c++ = t & 0x000000FF;
28 }
29
30 typedef std::map<std::string, std::string> PV_LIST;
31
32 class DataThread {
33 public:
34     DataThread();
35     ~DataThread();
36
37     void SetUsers(USERS * u) { users = u; };
38     void SetStore(BASE_STORE * s) { store = s; };
39
40     bool isDone() const { return done; };
41
42     bool Handle(int s);
43
44     friend void DTXMLStart(void * data, const char * name, const char ** attr);
45     friend void DTXMLEnd(void * data, const char * name);
46 private:
47     pthread_t tid;
48     USERS * users;
49     BASE_STORE * store;
50     int sock;
51     bool done;
52     struct Request {
53         PV_LIST conf;
54         PV_LIST stat;
55         std::string login;
56         bool isOk;
57         bool isBad;
58     } request;
59     PV_LIST * pvList;
60     char * data;
61     int32_t dataSize;
62
63     std::string login;
64     user_iter uit;
65
66     XML_Parser xmlParser;
67
68     static void * Run(void * self);
69
70     bool ReadRequest();
71     bool DecodeRequest();
72     bool ParseRequest();
73     bool MakeAnswer();
74
75     bool MakeConf();
76     bool MakeStat();
77     bool SendAnswer();
78
79     void Cleanup();
80
81     void ParseTag(const std::string & name, const char ** attr);
82 };
83
84 void DTXMLStart(void * data, const char * name, const char ** attr);
85 void DTXMLEnd(void * data, const char * name);
86
87 #endif