См. документацию.00001
00002
00003
00004
00005
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
00030
00031
00032
00033
00034 typedef multimap<pair<string,string>, TagHandler<Node>::PTagHandler> TagHandelrsMapT;
00035
00036
00037 struct IQHandleD{
00038 string xmlns;
00039 string subtagName;
00040 TagHandler<TagIQ>::PTagHandler handler;
00041 };
00042
00043 typedef list<IQHandleD> IQHandelrsMapT;
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095 struct IQRespD{
00096 TagIQ result;
00097 string xmlns;
00098 string subtagName;
00099 int semID;
00100 ~IQRespD();
00101 };
00102
00103 class Protocol {
00104 public:
00105
00106
00107
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<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
00134 void handlerIQ(Node* curNodeL);
00135 void sendNodeStart(Node &stanza);
00136 void sendNodeEnd(Node &stanza);
00137
00138
00139
00140 TagHandelrsMapT tagHandlers;
00141 IQHandelrsMapT iqHandlers;
00142 pthread_t nodeThread;
00143 public:
00144 Protocol();
00145 ~Protocol();
00146
00147 void parserCreate(int sktID);
00148 Node* getCurNodeSend(){return curNodeSend;}
00149 void sendNode(Node &stanza);
00150
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();
00155 virtual void startXMLTagNodeHandler(Node *node);
00156 virtual void endXMLTagNodeHandler(Node *node);
00157
00158 void sendString(string data);
00159 void manadgeIQResp(TagIQ& st);
00160
00161 TagIQ sendIQResp(TagIQ& st, string resultXMLNS, string resultSubTagName);
00162
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
00168 };
00169
00170 #endif