Protocol.h

См. документацию.
00001 /*
00002  * Protocol.h
00003  *
00004  *  Created on: 09.04.2011
00005  *      Author: nick
00006  */
00007 
00008 #ifndef PROTOCOL_H_
00009 #define PROTOCOL_H_
00010 
00011 #include "Node.h"
00012 #include <string>
00013 #include <map>
00014 #include "TagHandler.h"
00015 #include "TagIQ.h"
00016 #include <expat.h>
00017 #include <iostream>
00018 #include <sys/socket.h>
00019 #include <netinet/in.h>
00020 #include <arpa/inet.h>
00021 #include <sys/types.h>
00022 #include <sys/ipc.h>
00023 #include <sys/sem.h>
00024 #include <string.h>
00025 #include "../options.h"
00026 #define BUFFSIZE        8192
00027 using namespace std;
00028 #define debug_out
00029 //template <class Listener_T>
00030 //template <class Listener_T> class Protocol;
00031 //typedef void (Protocol<Listener_T>::*packetRecerver)(Node*);
00032 
00033 /*template  <class Listener_T>*/
00034 typedef multimap<pair<string,string>, TagHandler<Node>::PTagHandler> TagHandelrsMapT;
00035 //                                              //subtag //sub-xmlns
00036 //typedef multimap<pair<string,string>, TagHandler<TagIQ>::PTagHandler> IQHandelrsMapT;
00037 struct IQHandleD{
00038         string xmlns;
00039         string subtagName;
00040         TagHandler<TagIQ>::PTagHandler handler;
00041 };
00042 
00043 typedef list<IQHandleD> IQHandelrsMapT;
00044 /*struct IQRespDKey{
00045         string xmlns;
00046         string subtagName;
00047         string id;
00048         bool operator<(const IQRespDKey &obj2) const;*/
00049         /*bool operator==(const IQRespDKey &obj2) const;
00050         bool operator!=(const IQRespDKey &obj2) const;*/
00051         //friend bool operator<(const IQRespDKey &obj1,const IQRespDKey &obj2);
00052 //};
00053 
00054 /*      bool operator<(const IQRespDKey &obj){
00055                 return (this->id<obj.id) && (this->subtagName<obj.subtagName) &&
00056                                 (this->xmlns<obj.xmlns);
00057         }*/
00058 /*      bool operator==(const IQRespDKey& obj){
00059                 return (this->id==obj.id) && (this->subtagName==obj.subtagName) &&
00060                                 (this->xmlns==obj.xmlns);
00061         }
00062 
00063         bool operator>(const IQRespDKey& obj){
00064                 return (this->id>obj.id) && (this->subtagName>obj.subtagName) &&
00065                                 (this->xmlns>obj.xmlns);
00066         }
00067 
00068         bool operator<=(const IQRespDKey& obj){
00069                 return !(*this>obj);
00070         }
00071 
00072         bool operator!=(const IQRespDKey& obj){
00073                 return !(*this==obj);
00074         }
00075 
00076         bool operator<(const IQRespDKey& obj){
00077                 return (!(*this>obj))&&(!(*this==obj));
00078         }
00079 
00080         bool operator>=(const IQRespDKey& obj){
00081                 return (*this>obj)||(*this==obj);
00082         }*/
00083 //};
00084 //static pthread_mutex_t cs_mutex = PTHREAD_MUTEX_INITIALIZER;
00085 //static pthread_mutex_t cs_mutex1 = PTHREAD_MUTEX_INITIALIZER;
00086 
00087 //static pthread_mutex_t cs_mutexDEL = PTHREAD_MUTEX_INITIALIZER;
00088 //static pthread_mutex_t cs_mutexUNIC = PTHREAD_MUTEX_INITIALIZER;
00089 //static pthread_mutex_t cs_mutexNewNode = PTHREAD_MUTEX_INITIALIZER;
00090 //static TagHandler<TagIQ>::PTagHandler valPredIQDEL;
00091 //bool delIQPredicate(IQHandleD hd);
00092 
00093 //static pthread_mutex_t cs_mutex2 = PTHREAD_MUTEX_INITIALIZER;
00094 
00095 struct IQRespD{
00096         TagIQ result;
00097         string xmlns;
00098         string subtagName;
00099         int semID;
00100         ~IQRespD();
00101 };
00102 
00103 class Protocol/*:public TagHandler<Node>*/ {
00104 public:
00105         //typedef void (Listener_T::*packetRecerver)(Node*);
00106         //typedef void (Protocol <Listener_T>::*packetRecerver)(Node*);
00107         //typedef void (*packetRecerver)(Node*);                
00108         pthread_mutex_t cs_mutex;
00109         pthread_mutex_t cs_mutex1;
00112         pthread_mutex_t cs_mutexNewNode;
00113         pthread_mutex_t cs_mutexDEL;
00114         //
00116         pthread_mutex_t mutDelEndNodRu;
00117         unsigned int num_run_threads;
00118         pthread_cond_t cond_del_element;
00119 protected:
00120         pthread_attr_t attr;
00121         //Ответы на запросы, при запросе с ответом
00122         multimap</*IQRespDKey*/string,IQRespD> req_id;
00123 
00124         char read_Buffer[BUFFSIZE];
00125         int skt_id;
00126         XML_Parser xml_parser;
00127         int curDeph;
00128         Node* topNode;
00129         Node* curNode;
00130         Node* curNodeSend;
00131         void handlerNode(Node* curNodeL);
00132         void handlNodes(Node* curNodeL,TagHandelrsMapT::iterator begin,TagHandelrsMapT::iterator end);
00133         //void handlIQs(IQHandelrsMapT::iterator begin,IQHandelrsMapT::iterator end, TagIQ &iq);
00134         void handlerIQ(Node* curNodeL);
00135         void sendNodeStart(Node &stanza);
00136         void sendNodeEnd(Node &stanza);
00137         //Обработка стандартного содержимого  протокола, например iq тега
00138         //multimap<string,packetRecerver> listeners;
00139         //list <packetRecerver> listeners;
00140         TagHandelrsMapT tagHandlers;
00141         IQHandelrsMapT  iqHandlers;
00142         pthread_t nodeThread;
00143 public:
00144         Protocol();
00145         ~Protocol();
00146         //packetRecerver func;
00147         void parserCreate(int sktID);
00148         Node* getCurNodeSend(){return curNodeSend;}
00149         void sendNode(Node &stanza);
00150         //void addNodeListener(/*packetRecerver func*/);
00151         void addTagHandler(TagHandler<Node>::PTagHandler handler, string name="", string xmlns="");
00152         void addIQHandler(TagHandler<TagIQ>::PTagHandler handler, string xmlns="", string name=QUERY_TAG);
00153         void removeIQHandler(TagHandler<TagIQ>::PTagHandler handler);
00154         void startParsing(/*int sktID*/);
00155         virtual void startXMLTagNodeHandler(Node *node);
00156         virtual void endXMLTagNodeHandler(Node *node);
00157         //Отправка в сокет не XML содержимого
00158         void sendString(string data);
00159         void manadgeIQResp(TagIQ& st);
00160         //TagIQ sendIQResp(TagIQ& st);
00161         TagIQ sendIQResp(TagIQ& st, string resultXMLNS, string resultSubTagName);
00162         //void recevedStanza(Node* stanza){};
00163         friend void startTag(void *userData,const XML_Char *name, const XML_Char **atts);
00164         friend void endTag(void *userData,const XML_Char *name);
00165         friend void characterData (void *userData,const XML_Char *s,int len);
00166         friend void* node_threadFunc(void* clnt);
00167         //virtual void handleTag(Node &tag);
00168 };
00169 
00170 #endif /* PROTOCOL_H_ */