15#define RESIPROCATE_SUBSYSTEM Subsystem::DUM
27 mSubscriber(req.header(h_From).uri().
getAor()),
37 mDum.mServerSubscriptions.insert(DialogUsageManager::ServerSubscriptions::value_type(key,
this));
42 DebugLog(<<
"ServerSubscription::~ServerSubscription");
46 std::pair<DialogUsageManager::ServerSubscriptions::iterator,DialogUsageManager::ServerSubscriptions::iterator> subs;
47 subs =
mDum.mServerSubscriptions.equal_range(key);
48 for (DialogUsageManager::ServerSubscriptions::iterator i=subs.first; i!=subs.second; ++i)
50 if (i->second ==
this)
52 mDum.mServerSubscriptions.erase(i);
57 mDialog.mServerSubscriptions.remove(
this);
74std::shared_ptr<SipMessage>
79 throw UsageUseException(
"mLastResponse is not set, likely trying to respond a 2nd time", __FILE__, __LINE__);
88std::shared_ptr<SipMessage>
93 throw UsageUseException(
"Must reject with a code greater than or equal to 300", __FILE__, __LINE__);
97 throw UsageUseException(
"mLastResponse is not set, likely trying to respond a 2nd time", __FILE__, __LINE__);
117 if (msg->isResponse())
127 if(msg->exists(h_Expires))
136 throw UsageUseException(
"2xx to a Subscribe MUST contain an Expires header", __FILE__, __LINE__);
142 terminateSubscription(handler);
147 if (shouldDestroyAfterSendingFailure(*msg))
150 terminateSubscription(handler);
164 terminateSubscription(handler);
170ServerSubscription::shouldDestroyAfterSendingFailure(
const SipMessage& msg)
226 DebugLog( <<
"ServerSubscription::dispatch: " << msg.
brief());
242 int errorResponseCode = 0;
243 handler->
getExpires(msg,mExpires,errorResponseCode);
244 if (errorResponseCode >= 400)
247 auto response =
reject(errorResponseCode);
251 response->header(h_MinExpires).value() = handler->
getMinExpires();
280 else if (!invSession.
isValid())
308 DebugLog(<<
"onNewSubscription called");
311 else if (!invSession.
isValid())
313 DebugLog(<<
"onNewSubscriptionFromRefer called");
343 terminateSubscription(handler);
352 DebugLog( <<
"ServerSubscription::TransactionTermination: " << msg.
brief());
360 DebugLog( <<
"ServerSubscription::UsageTermination: " << msg.
brief());
362 terminateSubscription(handler);
370ServerSubscription::makeNotifyExpires()
378ServerSubscription::makeNotify()
388 mLastRequest->header(h_SubscriptionState).remove(p_expires);
417 mLastRequest->header(h_SubscriptionState).param(p_retryAfter) = retryAfter;
443std::shared_ptr<SipMessage>
451std::shared_ptr<SipMessage>
479 strm <<
"ServerSubscription " << mSubscriber;
#define resip_assert(x)
This file needs to work for both C and C++ code.
static Data getAor(const Data &filename, const Security::PEMType &pemType)
dcm! – update contact in dialog if required
std::shared_ptr< SipMessage > mLastResponse
const Data & getEventType() const noexcept
SubscriptionState mSubscriptionState
const Data & getId() const noexcept
const Data & getDocumentKey() const noexcept
std::shared_ptr< SipMessage > mLastRequest
BaseUsageHandle getBaseHandle() const
DialogUsageManager & mDum
Base class for all SIP body types.
An alternative to std::string, encapsulates an arbitrary buffer of bytes.
bool empty() const noexcept
Checks whether the Data is empty.
ServerSubscriptionHandler * getServerSubscriptionHandler(const Data &eventType)
std::shared_ptr< MasterProfile > & getMasterProfile()
AppDialogHandle getAppDialog() const
virtual void send(std::shared_ptr< SipMessage > msg)
dcm! – kill typedef std::list<DialogId> DialogIdSet;
void makeRequest(SipMessage &request, MethodTypes method, bool incrementCSeq=true)
void makeResponse(SipMessage &response, const SipMessage &request, int responseCode)
static void getResponseCodeReason(int responseCode, Data &reason)
Returns the default reason string for a particular response code.
static FailureMessageEffect determineFailureMessageEffect(const SipMessage &response, const std::set< int > *additionalTransactionTerminatingResponses=NULL)
virtual Brief brief() const
return a facet for brief encoding of message
virtual void onNewSubscription(ServerSubscriptionHandle, const SipMessage &sub)=0
virtual void onFlowTerminated(ServerSubscriptionHandle)
Called when a TCP or TLS flow to the server has terminated.
virtual void onExpiredByClient(ServerSubscriptionHandle, const SipMessage &sub, SipMessage ¬ify)
virtual void onNewSubscriptionFromRefer(ServerSubscriptionHandle, const SipMessage &sub)
virtual void onRefresh(ServerSubscriptionHandle, const SipMessage &sub)
virtual bool hasMinExpires() const
virtual void onNotifyAccepted(ServerSubscriptionHandle, const SipMessage &msg)
virtual void onExpired(ServerSubscriptionHandle, SipMessage ¬ify)
virtual uint32_t getMinExpires() const
virtual void onNotifyRejected(ServerSubscriptionHandle, const SipMessage &msg)
virtual void onError(ServerSubscriptionHandle, const SipMessage &msg)
virtual void onReadyToSend(ServerSubscriptionHandle, SipMessage &msg)
virtual void onTerminated(ServerSubscriptionHandle)=0
virtual void getExpires(const SipMessage &msg, uint32_t &expires, int &errorResponseCode)
Default behavior is to use the expires value in the SipMessage, if it exists.
void dispatch(const SipMessage &msg) override
std::shared_ptr< SipMessage > neutralNotify()
void setSubscriptionState(SubscriptionState state)
ServerSubscriptionHandle getHandle() const
std::shared_ptr< SipMessage > update(const Contents *document)
EncodeStream & dump(EncodeStream &strm) const override
virtual void flowTerminated()
std::shared_ptr< SipMessage > accept(int statusCode=202)
void send(std::shared_ptr< SipMessage > msg) override
std::shared_ptr< SipMessage > reject(int responseCode)
virtual void onReadyToSend(SipMessage &msg) override
virtual ~ServerSubscription()
ServerSubscription(const ServerSubscription &)=delete
Handle< ServerSubscription > ServerSubscriptionHandle
Represents a SIP message.
bool isRequest() const
Returns true if message is a request, false otherwise.
const RequestLine & header(const RequestLineType &l) const
Returns the RequestLine. This is only valid for request messages.
static uint64_t getTimeSecs()
Returns the current clock time in seconds.
dcm! – add UnusedChecking(_enum) below;
StatusLineType h_StatusLine
const Data & getTerminateReasonString(TerminateReason state)
RequestLineType h_RequestLine
const Data & getSubscriptionStateString(SubscriptionState state)