00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef _SIP_CLIENT_HH
00022 #define _SIP_CLIENT_HH
00023
00024 #ifndef _MEDIA_SESSION_HH
00025 #include "MediaSession.hh"
00026 #endif
00027 #ifndef _NET_ADDRESS_HH
00028 #include "NetAddress.hh"
00029 #endif
00030 #ifndef _DIGEST_AUTHENTICATION_HH
00031 #include "DigestAuthentication.hh"
00032 #endif
00033
00034
00035 enum inviteClientState { Calling, Proceeding, Completed, Terminated };
00036
00037 class SIPClient: public Medium {
00038 public:
00039 static SIPClient* createNew(UsageEnvironment& env,
00040 unsigned char desiredAudioRTPPayloadFormat,
00041 char const* mimeSubtype = NULL,
00042 int verbosityLevel = 0,
00043 char const* applicationName = NULL);
00044
00045 void setProxyServer(unsigned proxyServerAddress,
00046 portNumBits proxyServerPortNum);
00047
00048 void setClientStartPortNum(portNumBits clientStartPortNum) {
00049 fClientStartPortNum = clientStartPortNum;
00050 }
00051
00052 char* invite(char const* url, Authenticator* authenticator = NULL);
00053
00054
00055 char* inviteWithPassword(char const* url,
00056 char const* username, char const* password);
00057
00058
00059
00060
00061 Boolean sendACK();
00062 Boolean sendBYE();
00063
00064 static Boolean parseSIPURL(UsageEnvironment& env, char const* url,
00065 NetAddress& address, portNumBits& portNum);
00066
00067 static Boolean parseSIPURLUsernamePassword(char const* url,
00068 char*& username,
00069 char*& password);
00070
00071 unsigned inviteStatus() const { return fInviteStatusCode; }
00072
00073 protected:
00074 virtual ~SIPClient();
00075
00076 private:
00077 SIPClient(UsageEnvironment& env,
00078 unsigned char desiredAudioRTPPayloadFormat,
00079 char const* mimeSubtype,
00080 int verbosityLevel,
00081 char const* applicationName);
00082
00083
00084 void reset();
00085
00086
00087 char* invite1(Authenticator* authenticator);
00088 Boolean processURL(char const* url);
00089 Boolean sendINVITE();
00090 static void inviteResponseHandler(void* clientData, int mask);
00091 void doInviteStateMachine(unsigned responseCode);
00092 void doInviteStateTerminated(unsigned responseCode);
00093 TaskToken fTimerA, fTimerB, fTimerD;
00094 static void timerAHandler(void* clientData);
00095 static void timerBHandler(void* clientData);
00096 static void timerDHandler(void* clientData);
00097 unsigned const fT1;
00098 unsigned fTimerALen;
00099 unsigned fTimerACount;
00100
00101
00102 char* createAuthenticatorString(Authenticator const* authenticator,
00103 char const* cmd, char const* url);
00104 Boolean sendRequest(char const* requestString, unsigned requestLength);
00105 unsigned getResponseCode();
00106 unsigned getResponse(char*& responseBuffer, unsigned responseBufferSize);
00107 Boolean parseResponseCode(char const* line, unsigned& responseCode);
00108
00109 private:
00110
00111 unsigned char fDesiredAudioRTPPayloadFormat;
00112 char* fMIMESubtype;
00113 unsigned fMIMESubtypeSize;
00114 int fVerbosityLevel;
00115 unsigned fCSeq;
00116 char const* fApplicationName;
00117 unsigned fApplicationNameSize;
00118 char const* fOurAddressStr;
00119 unsigned fOurAddressStrSize;
00120 portNumBits fOurPortNum;
00121 Groupsock* fOurSocket;
00122 char* fUserAgentHeaderStr;
00123 unsigned fUserAgentHeaderStrSize;
00124
00125
00126 char const* fURL;
00127 unsigned fURLSize;
00128 struct in_addr fServerAddress;
00129 portNumBits fServerPortNum;
00130 portNumBits fClientStartPortNum;
00131 unsigned fCallId, fFromTag;
00132 char const* fToTagStr;
00133 unsigned fToTagStrSize;
00134 Authenticator fValidAuthenticator;
00135 char const* fUserName;
00136 unsigned fUserNameSize;
00137
00138 char* fInviteSDPDescription;
00139 char* fInviteCmd;
00140 unsigned fInviteCmdSize;
00141 Authenticator* fWorkingAuthenticator;
00142 inviteClientState fInviteClientState;
00143 char fEventLoopStopFlag;
00144 unsigned fInviteStatusCode;
00145
00146 };
00147
00148 #endif