Yate
|
00001 /* 00002 * yatesip.h 00003 * Yet Another SIP Stack 00004 * This file is part of the YATE Project http://YATE.null.ro 00005 * 00006 * Yet Another Telephony Engine - a fully featured software PBX and IVR 00007 * Copyright (C) 2004-2006 Null Team 00008 * 00009 * This program is free software; you can redistribute it and/or modify 00010 * it under the terms of the GNU General Public License as published by 00011 * the Free Software Foundation; either version 2 of the License, or 00012 * (at your option) any later version. 00013 * 00014 * This program is distributed in the hope that it will be useful, 00015 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00016 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00017 * GNU General Public License for more details. 00018 * 00019 * You should have received a copy of the GNU General Public License 00020 * along with this program; if not, write to the Free Software 00021 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. 00022 */ 00023 00024 #ifndef __YATESIP_H 00025 #define __YATESIP_H 00026 00027 #include <yateclass.h> 00028 #include <yatemime.h> 00029 00030 #ifdef _WINDOWS 00031 00032 #ifdef LIBYSIP_EXPORTS 00033 #define YSIP_API __declspec(dllexport) 00034 #else 00035 #ifndef LIBYSIP_STATIC 00036 #define YSIP_API __declspec(dllimport) 00037 #endif 00038 #endif 00039 00040 #endif /* _WINDOWS */ 00041 00042 #ifndef YSIP_API 00043 #define YSIP_API 00044 #endif 00045 00049 namespace TelEngine { 00050 00054 extern YSIP_API TokenDict* SIPResponses; 00055 00056 class SIPEngine; 00057 class SIPEvent; 00058 00059 class YSIP_API SIPParty : public RefObject 00060 { 00061 public: 00062 SIPParty(); 00063 SIPParty(bool reliable); 00064 virtual ~SIPParty(); 00065 virtual void transmit(SIPEvent* event) = 0; 00066 virtual const char* getProtoName() const = 0; 00067 virtual bool setParty(const URI& uri) = 0; 00068 inline const String& getLocalAddr() const 00069 { return m_local; } 00070 inline const String& getPartyAddr() const 00071 { return m_party; } 00072 inline int getLocalPort() const 00073 { return m_localPort; } 00074 inline int getPartyPort() const 00075 { return m_partyPort; } 00076 inline bool isReliable() const 00077 { return m_reliable; } 00078 protected: 00079 bool m_reliable; 00080 bool m_init; 00081 String m_local; 00082 String m_party; 00083 int m_localPort; 00084 int m_partyPort; 00085 }; 00086 00093 class YSIP_API SIPMessage : public RefObject 00094 { 00095 public: 00099 SIPMessage(const SIPMessage& original); 00100 00104 SIPMessage(const char* _method, const char* _uri, const char* _version = "SIP/2.0"); 00105 00109 SIPMessage(SIPParty* ep, const char* buf, int len = -1); 00110 00114 SIPMessage(const SIPMessage* message, int _code, const char* _reason = 0); 00115 00119 SIPMessage(const SIPMessage* original, const SIPMessage* answer); 00120 00124 virtual ~SIPMessage(); 00125 00130 static SIPMessage* fromParsing(SIPParty* ep, const char* buf, int len = -1); 00131 00135 void complete(SIPEngine* engine, const char* user = 0, const char* domain = 0, const char* dlgTag = 0); 00136 00144 bool copyHeader(const SIPMessage* message, const char* name, const char* newName = 0); 00145 00153 int copyAllHeaders(const SIPMessage* message, const char* name, const char* newName = 0); 00154 00159 inline SIPParty* getParty() const 00160 { return m_ep; } 00161 00166 void setParty(SIPParty* ep = 0); 00167 00171 inline bool isValid() const 00172 { return m_valid; } 00173 00177 inline bool isAnswer() const 00178 { return m_answer; } 00179 00184 inline bool isOutgoing() const 00185 { return m_outgoing; } 00186 00191 inline bool isACK() const 00192 { return m_ack; } 00193 00198 inline bool isReliable() const 00199 { return m_ep ? m_ep->isReliable() : false; } 00200 00204 inline int getCSeq() const 00205 { return m_cseq; } 00206 00212 const MimeHeaderLine* getHeader(const char* name) const; 00213 00219 const MimeHeaderLine* getLastHeader(const char* name) const; 00220 00226 int countHeaders(const char* name) const; 00227 00234 const NamedString* getParam(const char* name, const char* param) const; 00235 00241 const String& getHeaderValue(const char* name) const; 00242 00249 const String& getParamValue(const char* name, const char* param) const; 00250 00256 inline void addHeader(const char* name, const char* value = 0) 00257 { header.append(new MimeHeaderLine(name,value)); } 00258 00263 inline void addHeader(MimeHeaderLine* line) 00264 { header.append(line); } 00265 00270 void clearHeaders(const char* name); 00271 00275 inline void setHeader(const char* name, const char* value = 0) 00276 { clearHeaders(name); addHeader(name,value); } 00277 00287 MimeAuthLine* buildAuth(const String& username, const String& password, 00288 const String& meth, const String& uri, bool proxy = false) const; 00289 00295 MimeAuthLine* buildAuth(const SIPMessage& original) const; 00296 00302 inline void setAutoAuth(const char* username = 0, const char* password = 0) 00303 { m_authUser = username; m_authPass = password; } 00304 00309 inline const String& getAuthUsername() const 00310 { return m_authUser; } 00311 00316 inline const String& getAuthPassword() const 00317 { return m_authPass; } 00318 00323 ObjList* getRoutes() const; 00324 00329 void addRoutes(const ObjList* routes); 00330 00334 const DataBlock& getBuffer() const; 00335 00339 const String& getHeaders() const; 00340 00344 void setBody(MimeBody* newbody = 0); 00345 00349 String version; 00350 00354 String method; 00355 00359 String uri; 00360 00364 int code; 00365 00369 String reason; 00370 00374 ObjList header; 00375 00380 MimeBody* body; 00381 00382 protected: 00383 bool parse(const char* buf, int len); 00384 bool parseFirst(String& line); 00385 SIPParty* m_ep; 00386 bool m_valid; 00387 bool m_answer; 00388 bool m_outgoing; 00389 bool m_ack; 00390 int m_cseq; 00391 mutable String m_string; 00392 mutable DataBlock m_data; 00393 String m_authUser; 00394 String m_authPass; 00395 private: 00396 SIPMessage(); // no, thanks 00397 }; 00398 00403 class YSIP_API SIPDialog : public String 00404 { 00405 public: 00409 SIPDialog(); 00410 00415 SIPDialog(const SIPDialog& original); 00416 00421 explicit SIPDialog(const SIPMessage& message); 00422 00427 inline explicit SIPDialog(const String& callid) 00428 : String(callid) 00429 { } 00430 00436 SIPDialog& operator=(const SIPDialog& original); 00437 00443 SIPDialog& operator=(const SIPMessage& message); 00444 00450 SIPDialog& operator=(const String& callid); 00451 00458 bool matches(const SIPDialog& other, bool ignoreURIs) const; 00459 00465 inline bool operator==(const SIPDialog& other) const 00466 { return matches(other,false); } 00467 00473 inline bool operator!=(const SIPDialog& other) const 00474 { return !matches(other,false); } 00475 00481 inline bool operator&=(const SIPDialog& other) const 00482 { return matches(other,true); } 00483 00489 inline bool operator|=(const SIPDialog& other) const 00490 { return !matches(other,true); } 00491 00497 inline const String& fromURI(bool outgoing) const 00498 { return outgoing ? localURI : remoteURI; } 00499 00505 inline const String& fromTag(bool outgoing) const 00506 { return outgoing ? localTag : remoteTag; } 00507 00513 inline const String& toURI(bool outgoing) const 00514 { return outgoing ? remoteURI : localURI; } 00515 00521 inline const String& toTag(bool outgoing) const 00522 { return outgoing ? remoteTag : localTag; } 00523 00527 String localURI; 00528 00532 String localTag; 00533 00537 String remoteURI; 00538 00542 String remoteTag; 00543 }; 00544 00549 class YSIP_API SIPTransaction : public RefObject 00550 { 00551 public: 00555 enum State { 00556 // Invalid state - before constructor or after destructor 00557 Invalid, 00558 00559 // Initial state - after the initial message was inserted 00560 Initial, 00561 00562 // Trying state - got the message but no decision made yet 00563 Trying, 00564 00565 // Process state - while locally processing the event 00566 Process, 00567 00568 // Retrans state - retransmits latest message until getting ACK 00569 Retrans, 00570 00571 // Finish state - transmits the last message on client retransmission 00572 Finish, 00573 00574 // Cleared state - removed from engine, awaiting destruction 00575 Cleared 00576 }; 00577 00581 enum Processed { 00582 // Not matched at all 00583 NoMatch, 00584 00585 // Belongs to another dialog - probably result of a fork 00586 NoDialog, 00587 00588 // Matched to transaction/dialog and processed 00589 Matched 00590 }; 00591 00599 SIPTransaction(SIPMessage* message, SIPEngine* engine, bool outgoing = true); 00600 00606 SIPTransaction(const SIPTransaction& original, const String& tag); 00607 00611 virtual ~SIPTransaction(); 00612 00616 static const char* stateName(int state); 00617 00622 inline int getState() const 00623 { return m_state; } 00624 00629 inline bool isActive() const 00630 { return (Invalid < m_state) && (m_state < Finish); } 00631 00635 inline const SIPMessage* initialMessage() const 00636 { return m_firstMessage; } 00637 00641 inline const SIPMessage* latestMessage() const 00642 { return m_lastMessage; } 00643 00647 inline const SIPMessage* recentMessage() const 00648 { return m_lastMessage ? m_lastMessage : m_firstMessage; } 00649 00653 inline SIPEngine* getEngine() const 00654 { return m_engine; } 00655 00660 inline bool isOutgoing() const 00661 { return m_outgoing; } 00662 00667 inline bool isIncoming() const 00668 { return !m_outgoing; } 00669 00674 inline bool isInvite() const 00675 { return m_invite; } 00676 00681 inline bool isReliable() const 00682 { return m_firstMessage ? m_firstMessage->isReliable() : false; } 00683 00687 inline const String& getMethod() const 00688 { return m_firstMessage ? m_firstMessage->method : String::empty(); } 00689 00693 inline const String& getURI() const 00694 { return m_firstMessage ? m_firstMessage->uri : String::empty(); } 00695 00700 inline const String& getBranch() const 00701 { return m_branch; } 00702 00707 inline const String& getCallID() const 00708 { return m_callid; } 00709 00714 inline const String& getDialogTag() const 00715 { return m_tag; } 00716 00721 void setDialogTag(const char* tag = 0); 00722 00727 inline void setTransmit() 00728 { m_transmit = true; } 00729 00730 00738 void requestAuth(const String& realm, const String& domain, bool stale, bool proxy = false); 00739 00748 int authUser(String& user, bool proxy = false, GenObject* userData = 0); 00749 00758 virtual Processed processMessage(SIPMessage* message, const String& branch); 00759 00765 virtual void processMessage(SIPMessage* message); 00766 00775 virtual SIPEvent* getEvent(bool pendingOnly = false); 00776 00783 bool setResponse(int code, const char* reason = 0); 00784 00788 void setResponse(SIPMessage* message); 00789 00794 inline int getResponseCode() const 00795 { return m_response; } 00796 00800 inline void setUserData(void* data) 00801 { m_private = data; } 00802 00806 inline void* getUserData() const 00807 { return m_private; } 00808 00809 protected: 00815 SIPTransaction(SIPTransaction& original, SIPMessage* answer); 00816 00820 virtual void destroyed(); 00821 00827 bool tryAutoAuth(SIPMessage* answer); 00828 00836 virtual SIPEvent* getClientEvent(int state, int timeout); 00837 00845 virtual SIPEvent* getServerEvent(int state, int timeout); 00846 00853 virtual void processClientMessage(SIPMessage* message, int state); 00854 00861 virtual void processServerMessage(SIPMessage* message, int state); 00862 00868 bool changeState(int newstate); 00869 00874 void setLatestMessage(SIPMessage* message = 0); 00875 00881 void setPendingEvent(SIPEvent* event = 0, bool replace = false); 00882 00887 inline bool isPendingEvent() const 00888 { return (m_pending != 0); } 00889 00895 void setTimeout(u_int64_t delay = 0, unsigned int count = 1); 00896 00897 bool m_outgoing; 00898 bool m_invite; 00899 bool m_transmit; 00900 int m_state; 00901 int m_response; 00902 unsigned int m_timeouts; 00903 u_int64_t m_delay; 00904 u_int64_t m_timeout; 00905 SIPMessage* m_firstMessage; 00906 SIPMessage* m_lastMessage; 00907 SIPEvent* m_pending; 00908 SIPEngine* m_engine; 00909 String m_branch; 00910 String m_callid; 00911 String m_tag; 00912 void *m_private; 00913 }; 00914 00919 class YSIP_API SIPEvent 00920 { 00921 friend class SIPTransaction; 00922 public: 00923 00924 SIPEvent() 00925 : m_message(0), m_transaction(0), m_state(SIPTransaction::Invalid) 00926 { } 00927 00928 SIPEvent(SIPMessage* message, SIPTransaction* transaction = 0); 00929 00930 ~SIPEvent(); 00931 00936 inline SIPEngine* getEngine() const 00937 { return m_transaction ? m_transaction->getEngine() : 0; } 00938 00943 inline SIPMessage* getMessage() const 00944 { return m_message; } 00945 00950 inline SIPTransaction* getTransaction() const 00951 { return m_transaction; } 00952 00957 inline bool isOutgoing() const 00958 { return m_message && m_message->isOutgoing(); } 00959 00964 inline bool isIncoming() const 00965 { return m_message && !m_message->isOutgoing(); } 00966 00970 inline SIPParty* getParty() const 00971 { return m_message ? m_message->getParty() : 0; } 00972 00976 inline void* getUserData() const 00977 { return m_transaction ? m_transaction->getUserData() : 0; } 00978 00982 inline int getState() const 00983 { return m_state; } 00984 00989 inline bool isActive() const 00990 { return (SIPTransaction::Invalid < m_state) && (m_state < SIPTransaction::Finish); } 00991 00992 protected: 00993 SIPMessage* m_message; 00994 SIPTransaction* m_transaction; 00995 int m_state; 00996 }; 00997 01002 class YSIP_API SIPEngine : public DebugEnabler, public Mutex 01003 { 01004 public: 01008 SIPEngine(const char* userAgent = 0); 01009 01013 virtual ~SIPEngine(); 01014 01020 virtual bool buildParty(SIPMessage* message) = 0; 01021 01034 virtual bool checkUser(const String& username, const String& realm, const String& nonce, 01035 const String& method, const String& uri, const String& response, 01036 const SIPMessage* message, GenObject* userData); 01037 01046 virtual bool checkAuth(bool noUser, const SIPMessage* message, GenObject* userData); 01047 01057 int authUser(const SIPMessage* message, String& user, bool proxy = false, GenObject* userData = 0); 01058 01066 SIPTransaction* addMessage(SIPParty* ep, const char* buf, int len = -1); 01067 01074 SIPTransaction* addMessage(SIPMessage* message); 01075 01083 SIPEvent *getEvent(); 01084 01090 bool process(); 01091 01098 virtual void processEvent(SIPEvent *event); 01099 01106 virtual SIPTransaction* forkInvite(SIPMessage* answer, SIPTransaction* trans); 01107 01114 virtual u_int64_t getUserTimeout() const; 01115 01122 u_int64_t getTimer(char which, bool reliable = false) const; 01123 01128 inline unsigned int getMaxForwards() const 01129 { return m_maxForwards; } 01130 01134 inline const String& getUserAgent() const 01135 { return m_userAgent; } 01136 01140 inline int getNextCSeq() 01141 { return ++m_cseq; } 01142 01147 inline bool lazyTrying() const 01148 { return m_lazyTrying; } 01149 01154 inline void lazyTrying(bool lazy100) 01155 { m_lazyTrying = lazy100; } 01156 01161 void nonceGet(String& nonce); 01162 01168 long nonceAge(const String& nonce); 01169 01180 static void buildAuth(const String& username, const String& realm, const String& passwd, 01181 const String& nonce, const String& method, const String& uri, String& response); 01182 01190 static void buildAuth(const String& hash_a1, const String& nonce, const String& hash_a2, 01191 String& response); 01192 01198 bool isAllowed(const char* method) const; 01199 01204 void addAllowed(const char* method); 01205 01210 inline const String& getAllowed() const 01211 { return m_allowed; } 01212 01217 inline void remove(SIPTransaction* transaction) 01218 { lock(); m_transList.remove(transaction,false); unlock(); } 01219 01224 inline void append(SIPTransaction* transaction) 01225 { lock(); m_transList.append(transaction); unlock(); } 01226 01231 inline void insert(SIPTransaction* transaction) 01232 { lock(); m_transList.insert(transaction); unlock(); } 01233 01234 protected: 01238 ObjList m_transList; 01239 01240 u_int64_t m_t1; 01241 u_int64_t m_t4; 01242 unsigned int m_maxForwards; 01243 int m_cseq; 01244 bool m_lazyTrying; 01245 String m_userAgent; 01246 String m_allowed; 01247 String m_nonce; 01248 String m_nonce_secret; 01249 u_int32_t m_nonce_time; 01250 Mutex m_nonce_mutex; 01251 }; 01252 01253 } 01254 01255 #endif /* __YATESIP_H */ 01256 01257 /* vi: set ts=8 sw=4 sts=4 noet: */