Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
On the protocol level, removing a published category instance from a publication is equivalent to republishing the category instance as a time-bound instance with the expiration time set to zero. The following example is a SIP message sent to the server when a SERVICE request to delete the publication of a note category instance is submitted.
SERVICE sip:adamb@contoso.com SIP/2.0
FROM: <sip:adamb@contoso.com>;epid=6C801B691B;tag=ff76c3f124
TO: <sip:adamb@contoso.com>;epid=6C801B691B
CSEQ: 7 SERVICE
CALL-ID: 68f271a55a574ac197afccabe755d56b
MAX-FORWARDS: 70
VIA: SIP/2.0/TLS 192.168.0.199:25849;branch=z9hG4bKb2809a28
AUTHORIZATION: NTLM realm="SIP Communications Service",targetname="tuk-ocdr1-03.contoso.com",response="0100000000000000815295211eb3dd60",crand="f99070ee",cnum="11",opaque="5431637F",qop="auth"
CONTACT: <sip:adamb@contoso.com;opaque=user:epid:gAXJXq9AgVCiWynxdwgUSwAA;gruu>;text;audio;video;image
CONTENT-LENGTH: 249
SUPPORTED: gruu-10
USER-AGENT: RTCC/4.0.0.0 PresPub
CONTENT-TYPE: application/msrtc-category-publish+xml
<publish xmlns="https://schemas.microsoft.com/2006/09/sip/rich-presence">
<publications uri="sip:adamb@contoso.com">
<publication categoryName="note" instance="1" container="100" version="0" expireType="time" expires="0" />
</publications>
</publish>
As with presence publications, removing a category instance from a publication can also be grammar-based or grammar-free. The SIP request in the example above originates from a grammar-free deletion of the publication.
On the API level, presence deletion can be exposed in a set of methods dedicated to this particular type of operations. In UCMA, the deletion is implemented as the asynchronous programming pattern of BeginDeletePresence/EndDeletePresence. For grammar-free presence deletion, the BeginDeletePresence takes a collection of PresenceCategory objects in its input. For grammar-based presence deletion, the BeginDeletePresence method takes a collection of PresenceCategoryWithMetaData object in its input. These are illustrated in the following code snippets.
public void RequestGrammarBasedPresencePublicationRemoval(string categoryName)
{
CustomPresenceCategory category = new CustomPresenceCategory(categoryName, string.Empty /* null */);
PresenceCategory[] categories = new PresenceCategory[] { category };
_localPresence.BeginDeletePresence(categories, CallbackOnDeletePresenceReturned, _localPresence);
}
public void RequestGrammarFreePresencePublicationRemoval(string catName, long instanceId, int containerId)
{
PresenceCategoryWithMetaData[] categories = new PresenceCategoryWithMetaData[] {
new PresenceCategoryWithMetaData(catName, instanceId, containerId) };
_localPresence.BeginDeletePresence(categories, CallbackOnDeletePresenceReturned, _localPresence);
}
void CallbackOnDeletePresenceReturned(IAsyncResult result)
{
try
{
if (_localPresence == result.AsyncState as LocalOwnerPresence)
{
_localPresence.EndDeletePresence(result);
if (OnDeletePresenceCompleted != null)
RaiseEvent(OnDeletePresenceCompleted, this,
new AsyncOpStatusEventArgs(AsyncOpStatus.OK, null));
}
}
catch (Exception ex)
{
if (OnDeletePresenceCompleted != null)
RaiseEvent(OnDeletePresenceCompleted, this,
new AsyncOpStatusEventArgs(AsyncOpStatus.Error, ex));
}
}
In addition to calling BeginDeletePresence/EndDeletePresence, a UCMA can also implement the presence deletion as a publication of time-bound category instances with the expiration time set to zero. The following code example provides an illustration of this.
public void RequestGrammarFreePresencePublicationToDeletePresenceCategory(string catName, long instanceId, int containerId)
{
PresenceCategoryWithMetaData pcm = new PresenceCategoryWithMetaData(catName, instanceId, containerId);
pcm.ExpiryPolicy = ExpiryPolicy.Time;
pcm.Expires = 0;
this.RequestGrammarFreePresencePublication(new PresenceCategoryWithMetaData[] { pcm });
}