#ifndef __DATATHREAD_H__
#define __DATATHREAD_H__
#include <map>
#include <string>
#include <expat.h>
#include <pthread.h>
#include "common.h"
#include "../../../users.h"
uint32_t n2l(unsigned char * c)
{
uint32_t t = *c++ << 24;
t += *c++ << 16;
t += *c++ << 8;
t += *c;
return t;
}
void l2n(uint32_t t, unsigned char * c)
{
*c++ = t >> 24 & 0x000000FF;
*c++ = t >> 16 & 0x000000FF;
*c++ = t >> 8 & 0x000000FF;
*c++ = t & 0x000000FF;
}
typedef std::map<std::string, std::string> PV_LIST;
class DataThread {
public:
DataThread();
~DataThread();
void SetUsers(USERS * u) { users = u; };
void SetStore(BASE_STORE * s) { store = s; };
bool isDone() const { return done; };
bool Handle(int s);
friend void DTXMLStart(void * data, const char * name, const char ** attr);
friend void DTXMLEnd(void * data, const char * name);
private:
pthread_t tid;
USERS * users;
BASE_STORE * store;
int sock;
bool done;
struct Request {
PV_LIST conf;
PV_LIST stat;
std::string login;
bool isOk;
bool isBad;
} request;
PV_LIST * pvList;
char * data;
int32_t dataSize;
std::string login;
user_iter uit;
XML_Parser xmlParser;
static void * Run(void * self);
bool ReadRequest();
bool DecodeRequest();
bool ParseRequest();
bool MakeAnswer();
bool MakeConf();
bool MakeStat();
bool SendAnswer();
void Cleanup();
void ParseTag(const std::string & name, const char ** attr);
};
void DTXMLStart(void * data, const char * name, const char ** attr);
void DTXMLEnd(void * data, const char * name);
#endif