DBus server classes for contacts and presence, cleaner debug presence output

parent e9ab5571
......@@ -18,4 +18,4 @@ int fetchData( MemKey *key, MemData *data )
int putData( MemKey *key, MemData *data )
{
return 0;
}
\ No newline at end of file
}
......@@ -308,11 +308,11 @@ select_active_input_audio_device()
/**
* Select the input audio plugin by calling the server
*/
static void
select_input_audio_plugin(GtkWidget* widget, gpointer data)
{
//static void
//select_input_audio_plugin(GtkWidget* widget, gpointer data)
//{
//dbus_set_audio_manager("");
}
//}
/**
* Select the output audio plugin by calling the server
......
......@@ -80,29 +80,17 @@ There is NO WARRANTY, to the extent permitted by law.\n\n");
* Every dbus signal has to have a marshaller. To generate a new marshaller function,
* add its signature to the marshaller.list. Then run :
* <pre>glib-genmarshal --body --g-fatal-warnings marshaller.list > marshaller.c
*glib-genmarshal --header --g-fatal-warnings marshaller.list > marshaller.h </pre>
*
* glib-genmarshal --header --g-fatal-warnings marshaller.list > marshaller.h</pre>
* to get the generated marshallers.
* Just before connecting to the dbus signal, register the marshaller with:
* dbus_g_object_register_marshaller().
*/
/** @file callmanager-glue.h
* @brief CallManager dbus API.
* This file is generated by dbus-binding-tool using the server's
* callmanager-introspec.xml:
* <pre> dbus-binding-tool --mode=glib-client "../../src/dbus/callmanager-introspec.xml" > callmanager-glue.h</pre>
* This file dbus calls wrapper functions to simplify access to dbus API.
*
*/
/** @file configurationmanager-glue.h
* @brief ConfigurationManager dbus API.
* This file is generated by dbus-binding-tool using the server's
* configurationmanager-introspec.xml:
/** @file callmanager-glue.h, configurationmanager-glue.h, contactmanager-glue.h
* @brief CallManager, ConfigurationManager and ContactManager dbus APIs.
* These files are generated by dbus-binding-tool using the server's files named *-introspec.xml:
* <pre>dbus-binding-tool --mode=glib-client "../../src/dbus/callmanager-introspec.xml" > callmanager-glue.h</pre>
* <pre>dbus-binding-tool --mode=glib-client "../../src/dbus/configurationmanager-introspec.xml" > configurationmanager-glue.h</pre>
*
* This file dbus calls wrapper functions to simplify access to dbus API.
*
* <pre>dbus-binding-tool --mode=glib-client "../../src/dbus/contactmanager-introspec.xml" > contactmanager-glue.h</pre>
* These files dbus call wrapper functions to simplify access to dbus API.
*/
......@@ -5,8 +5,9 @@ EXTRA_DIST = *.xml README
noinst_LTLIBRARIES = libdbus.la
libdbus_la_SOURCES = \
callmanager.cpp \
callmanager.cpp \
configurationmanager.cpp \
contactmanager.cpp \
instance.cpp \
dbusmanagerimpl.cpp
......@@ -19,6 +20,8 @@ noinst_HEADERS = \
callmanager.h \
configurationmanager.h \
configurationmanager-glue.h \
contactmanager.h \
contactmanager-glue.h \
instance.h \
instance-glue.h \
dbusmanager.h \
......@@ -32,4 +35,3 @@ service_DATA = $(service_in_files:.service.in=.service)
# Rule to make the service file with bindir expanded
$(service_DATA): $(service_in_files) Makefile
sed -e "s|bindir|$(prefix)/bin|" $<> $@
......@@ -4,5 +4,7 @@ To build a new dbus interface:
2. Generate the glue.h header by running "dbusxx-xml2cpp file.xml --adaptor=file.h"
3. Inheritate from that glue.h class in your code.
Example with configurationManager:
Examples:
dbusxx-xml2cpp callmanager-introspec.xml --adaptor=callmanager-glue.h
dbusxx-xml2cpp configurationmanager-introspec.xml --adaptor=configurationmanager-glue.h
dbusxx-xml2cpp contactmanager-introspec.xml --adaptor=contactmanager-glue.h
/*
* This file was automatically generated by dbusxx-xml2cpp; DO NOT EDIT!
*/
#ifndef __dbusxx__contactmanager_glue_h__ADAPTOR_MARSHAL_H
#define __dbusxx__contactmanager_glue_h__ADAPTOR_MARSHAL_H
#include <dbus-c++/dbus.h>
namespace org {
namespace sflphone {
namespace SFLphone {
class ContactManager
: public ::DBus::InterfaceAdaptor
{
public:
ContactManager()
: ::DBus::InterfaceAdaptor("org.sflphone.SFLphone.ContactManager")
{
register_method(ContactManager, getContacts, _getContacts_stub);
register_method(ContactManager, setContacts, _setContacts_stub);
register_method(ContactManager, setPresence, _setPresence_stub);
register_method(ContactManager, setContactPresence, _setContactPresence_stub);
}
::DBus::IntrospectedInterface* const introspect() const
{
static ::DBus::IntrospectedArgument getContacts_args[] =
{
{ "accountID", "s", true },
{ "details", "a{ss}", false },
{ 0, 0, 0 }
};
static ::DBus::IntrospectedArgument setContacts_args[] =
{
{ "accountID", "s", true },
{ "details", "a{ss}", true },
{ 0, 0, 0 }
};
static ::DBus::IntrospectedArgument setPresence_args[] =
{
{ "accountID", "s", true },
{ "presence", "s", true },
{ "additionalInfo", "s", true },
{ 0, 0, 0 }
};
static ::DBus::IntrospectedArgument setContactPresence_args[] =
{
{ "accountID", "s", true },
{ "presence", "s", true },
{ "additionalInfo", "s", true },
{ 0, 0, 0 }
};
static ::DBus::IntrospectedMethod ContactManager_methods[] =
{
{ "getContacts", getContacts_args },
{ "setContacts", setContacts_args },
{ "setPresence", setPresence_args },
{ "setContactPresence", setContactPresence_args },
{ 0, 0 }
};
static ::DBus::IntrospectedMethod ContactManager_signals[] =
{
{ 0, 0 }
};
static ::DBus::IntrospectedProperty ContactManager_properties[] =
{
{ 0, 0, 0, 0 }
};
static ::DBus::IntrospectedInterface ContactManager_interface =
{
"org.sflphone.SFLphone.ContactManager",
ContactManager_methods,
ContactManager_signals,
ContactManager_properties
};
return &ContactManager_interface;
}
public:
/* properties exposed by this interface, use
* property() and property(value) to get and set a particular property
*/
public:
/* methods exported by this interface,
* you will have to implement them in your ObjectAdaptor
*/
virtual std::map< ::DBus::String, ::DBus::String > getContacts( const ::DBus::String& accountID ) = 0;
virtual void setContacts( const ::DBus::String& accountID, const std::map< ::DBus::String, ::DBus::String >& details ) = 0;
virtual void setPresence( const ::DBus::String& accountID, const ::DBus::String& presence, const ::DBus::String& additionalInfo ) = 0;
virtual void setContactPresence( const ::DBus::String& accountID, const ::DBus::String& presence, const ::DBus::String& additionalInfo ) = 0;
public:
/* signal emitters for this interface
*/
private:
/* unmarshalers (to unpack the DBus message before calling the actual interface method)
*/
::DBus::Message _getContacts_stub( const ::DBus::CallMessage& call )
{
::DBus::MessageIter ri = call.reader();
::DBus::String argin1; ri >> argin1;
std::map< ::DBus::String, ::DBus::String > argout1 = getContacts(argin1);
::DBus::ReturnMessage reply(call);
::DBus::MessageIter wi = reply.writer();
wi << argout1;
return reply;
}
::DBus::Message _setContacts_stub( const ::DBus::CallMessage& call )
{
::DBus::MessageIter ri = call.reader();
::DBus::String argin1; ri >> argin1;
std::map< ::DBus::String, ::DBus::String > argin2; ri >> argin2;
setContacts(argin1, argin2);
::DBus::ReturnMessage reply(call);
return reply;
}
::DBus::Message _setPresence_stub( const ::DBus::CallMessage& call )
{
::DBus::MessageIter ri = call.reader();
::DBus::String argin1; ri >> argin1;
::DBus::String argin2; ri >> argin2;
::DBus::String argin3; ri >> argin3;
setPresence(argin1, argin2, argin3);
::DBus::ReturnMessage reply(call);
return reply;
}
::DBus::Message _setContactPresence_stub( const ::DBus::CallMessage& call )
{
::DBus::MessageIter ri = call.reader();
::DBus::String argin1; ri >> argin1;
::DBus::String argin2; ri >> argin2;
::DBus::String argin3; ri >> argin3;
setContactPresence(argin1, argin2, argin3);
::DBus::ReturnMessage reply(call);
return reply;
}
};
} } }
#endif//__dbusxx__contactmanager_glue_h__ADAPTOR_MARSHAL_H
<?xml version="1.0" ?>
<node name="/org/sflphone/SFLphone">
<interface name="org.sflphone.SFLphone.ContactManager">
<!-- Contacts related methods -->
<!-- Called by the client to get all saved contacts -->
<method name="getContacts">
<arg type="s" name="accountID" direction="in"/>
<arg type="a{ss}" name="details" direction="out"/>
</method>
<!-- Called by the client to save all local contacts -->
<method name="setContacts">
<arg type="s" name="accountID" direction="in"/>
<arg type="a{ss}" name="details" direction="in"/>
</method>
<!-- /////////////////////// -->
<!-- Presence related methods -->
<!-- Called by the client to set its new presence status -->
<method name="setPresence">
<arg type="s" name="accountID" direction="in"/>
<arg type="s" name="presence" direction="in"/>
<arg type="s" name="additionalInfo" direction="in"/>
</method>
<!-- Called by the daemon when a contact presence changes -->
<method name="setContactPresence">
<arg type="s" name="accountID" direction="in"/>
<arg type="s" name="presence" direction="in"/>
<arg type="s" name="additionalInfo" direction="in"/>
</method>
</interface>
</node>
/*
* Copyright (C) 2008 Savoir-Faire Linux inc.
* Author: Guillaume Carmel-Archambault <guillaume.carmel-archambault@savoirfairelinux.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <contactmanager.h>
#include "../manager.h"
const char* ContactManager::SERVER_PATH = "/org/sflphone/SFLphone/ContactManager";
std::map< ::DBus::String, ::DBus::String >
ContactManager::getContacts( const ::DBus::String& accountID )
{
// TODO
}
void
ContactManager::setContacts( const ::DBus::String& accountID, const std::map< ::DBus::String, ::DBus::String >& details )
{
// TODO
}
void
ContactManager::setPresence( const ::DBus::String& accountID, const ::DBus::String& presence, const ::DBus::String& additionalInfo )
{
// TODO
}
void
ContactManager::setContactPresence( const ::DBus::String& accountID, const ::DBus::String& presence, const ::DBus::String& additionalInfo )
{
// TODO
}
/*
* Copyright (C) 2008 Savoir-Faire Linux inc.
* Author: Guillaume Carmel-Archambault <guillaume.carmel-archambault@savoirfairelinux.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#ifndef CONTACTMANAGER_H
#define CONTACTMANAGER_H
#include "contactmanager-glue.h"
#include <dbus-c++/dbus.h>
class ContactManager
: public org::sflphone::SFLphone::ContactManager,
public DBus::IntrospectableAdaptor,
public DBus::ObjectAdaptor
{
public:
ContactManager(DBus::Connection& connection);
static const char* SERVER_PATH;
public:
std::map< ::DBus::String, ::DBus::String > getContacts( const ::DBus::String& accountID );
void setContacts( const ::DBus::String& accountID, const std::map< ::DBus::String, ::DBus::String >& details );
void setPresence( const ::DBus::String& accountID, const ::DBus::String& presence, const ::DBus::String& additionalInfo );
void setContactPresence( const ::DBus::String& accountID, const ::DBus::String& presence, const ::DBus::String& additionalInfo );
};
#endif//CONTACTMANAGER_H
......@@ -222,137 +222,139 @@ SIPVoIPLink::getEvent()
return;
}
_debug("> SIP Event: [cdt=%4d:%4d:%4d] type=#%03d %s \n", event->cid, event->did, event->tid, event->type, event->textinfo);
_debugMid("> SIP Event: [cdt=%4d:%4d:%4d] type=#%03d %s = ", event->cid, event->did, event->tid, event->type, event->textinfo);
switch (event->type) {
/* REGISTER related events */
case EXOSIP_REGISTRATION_NEW: /** 00 < announce new registration. */
_debug(" !EXOSIP_REGISTRATION_NEW event is not implemented\n");
_debugMid(" !EXOSIP_REGISTRATION_NEW event is not implemented\n");
break;
case EXOSIP_REGISTRATION_SUCCESS: /** 01 < user is successfully registred. */
setRegistrationState(Registered);
_debug(" !EXOSIP_REGISTRATION_SUCCES\n");// TMP
_debugMid(" !EXOSIP_REGISTRATION_SUCCES\n");
//Manager::instance().registrationSucceed(getAccountID());
break;
case EXOSIP_REGISTRATION_FAILURE: /** 02 < user is not registred. */
setRegistrationState(Error, "SIP registration failure.");
_debug(" !EXOSIP_REGISTRATION_FAILURE\n");// TMP
_debugMid(" !EXOSIP_REGISTRATION_FAILURE\n");
//Manager::instance().registrationFailed(getAccountID());
break;
case EXOSIP_REGISTRATION_REFRESHED: /** 03 < registration has been refreshed. */
_debug(" !EXOSIP_REGISTRATION_REFRESHED event is not implemented\n");
_debugMid(" !EXOSIP_REGISTRATION_REFRESHED event is not implemented\n");
break;
case EXOSIP_REGISTRATION_TERMINATED: /** 04 < UA is not registred any more. */
setRegistrationState(Unregistered, "Registration terminated by remote host");
_debug(" !EXOSIP_REGISTRATION_TERMINATED event is not implemented\n");
_debugMid(" !EXOSIP_REGISTRATION_TERMINATED event is not implemented\n");
break;
/* INVITE related events within calls */
case EXOSIP_CALL_INVITE: /** 05 < announce a new call */
SIPCallInvite(event);
_debugMid(" !EXOSIP_CALL_INVITE\n");
break;
case EXOSIP_CALL_REINVITE: /** 06 < announce a new INVITE within call */
SIPCallReinvite(event);
_debugMid(" !EXOSIP_REGISTRATION_TERMINATED event is not implemented\n");
break;
/* CALL related events */
case EXOSIP_CALL_NOANSWER: /** 07 < announce no answer within the timeout */
_debug(" !EXOSIP_CALL_NOANSWER event is not implemented\n");
_debugMid(" !EXOSIP_CALL_NOANSWER event is not implemented\n");
break;
case EXOSIP_CALL_PROCEEDING: /** 08 < announce processing by a remote app */
_debug(" !EXOSIP_CALL_PROCEEDING event is not implemented\n");
_debugMid(" !EXOSIP_CALL_PROCEEDING event is not implemented\n");
break;
case EXOSIP_CALL_RINGING: /** 09 < announce ringback */
_debug(" !EXOSIP_CALL_RINGING\n");// TMP
_debugMid(" !EXOSIP_CALL_RINGING\n");
SIPCallRinging(event);
break;
case EXOSIP_CALL_ANSWERED: /** 10 < announce start of call */
_debug(" !EXOSIP_CALL_ANSWERED\n");// TMP
_debugMid(" !EXOSIP_CALL_ANSWERED\n");
SIPCallAnswered(event);
break;
case EXOSIP_CALL_REDIRECTED: /** 11 < announce a redirection */
_debug(" !EXOSIP_CALL_REDIRECTED event is not implemented\n");
_debugMid(" !EXOSIP_CALL_REDIRECTED event is not implemented\n");
break;
case EXOSIP_CALL_REQUESTFAILURE: /** 12 < announce a request failure */
_debug(" !EXOSIP_CALL_REQUESTFAILURE");// TMP
_debugMid(" !EXOSIP_CALL_REQUESTFAILURE");
SIPCallRequestFailure(event);
break;
case EXOSIP_CALL_SERVERFAILURE: /** 13 < announce a server failure */
_debug(" !EXOSIP_CALL_SERVERFAILURE");// TMP
_debugMid(" !EXOSIP_CALL_SERVERFAILURE");
SIPCallServerFailure(event);
break;
case EXOSIP_CALL_GLOBALFAILURE: /** 14 < announce a global failure */
_debug(" !EXOSIP_CALL_GLOBALFAILURE\n");// TMP
_debugMid(" !EXOSIP_CALL_GLOBALFAILURE\n");
SIPCallServerFailure(event);
break;
case EXOSIP_CALL_ACK: /** 15 < ACK received for 200ok to INVITE */
_debug(" !EXOSIP_CALL_ACK\n");// TMP
_debugMid(" !EXOSIP_CALL_ACK\n");
SIPCallAck(event);
break;
case EXOSIP_CALL_CANCELLED: /** 16 < announce that call has been cancelled */
_debug(" !EXOSIP_CALL_CANCELLED\n");// TMP
_debugMid(" !EXOSIP_CALL_CANCELLED\n");
break;
case EXOSIP_CALL_TIMEOUT: /** 17 < announce that call has failed */
_debug(" !EXOSIP_CALL_TIMEOUT\n");// TMP
_debugMid(" !EXOSIP_CALL_TIMEOUT\n");
Manager::instance().displayError(" !EXOSIP Call Error not implemented yet");
break;
/* Request related events within calls (except INVITE) */
case EXOSIP_CALL_MESSAGE_NEW: /** 18 < announce new incoming MESSAGE. */
_debug(" !EXOSIP_CALL_MESSAGE_NEW\n");// TMP
_debugMid(" !EXOSIP_CALL_MESSAGE_NEW\n");
SIPCallMessageNew(event);
break;
case EXOSIP_CALL_MESSAGE_PROCEEDING: /** 19 < announce a 1xx for MESSAGE. */
_debug(" !EXOSIP_CALL_MESSAGE_PROCEEDING\n");// TMP
_debugMid(" !EXOSIP_CALL_MESSAGE_PROCEEDING\n");
break;
case EXOSIP_CALL_MESSAGE_ANSWERED: /** 20 < announce a 200ok */
// 200 OK
_debug(" !EXOSIP_CALL_MESSAGE_ANSWERED\n");// TMP
_debugMid(" !EXOSIP_CALL_MESSAGE_ANSWERED\n");
break;
case EXOSIP_CALL_MESSAGE_REDIRECTED: /** 21 < announce a failure. */
_debug(" !EXOSIP_CALL_MESSAGE_REDIRECTED\n");// TMP
_debugMid(" !EXOSIP_CALL_MESSAGE_REDIRECTED\n");
break;
case EXOSIP_CALL_MESSAGE_REQUESTFAILURE: /** 22 < announce a failure. */
_debug(" !EXOSIP_CALL_MESSAGE_REQUESTFAILURE\n");// TMP
_debugMid(" !EXOSIP_CALL_MESSAGE_REQUESTFAILURE\n");
break;
case EXOSIP_CALL_MESSAGE_SERVERFAILURE: /** 23 < announce a failure. */
_debug(" !EXOSIP_CALL_MESSAGE_SERVERFAILURE\n");// TMP
_debugMid(" !EXOSIP_CALL_MESSAGE_SERVERFAILURE\n");
break;
case EXOSIP_CALL_MESSAGE_GLOBALFAILURE: /** 24 < announce a failure. */
_debug(" !EXOSIP_CALL_MESSAGE_GLOBALFAILURE\n");// TMP
_debugMid(" !EXOSIP_CALL_MESSAGE_GLOBALFAILURE\n");
Manager::instance().displayError(" !EXOSIP Call Message not implemented yet");
break;
case EXOSIP_CALL_CLOSED: /** 25 < a BYE was received for this call */
_debug(" !EXOSIP_CALL_CLOSED\n");// TMP
_debugMid(" !EXOSIP_CALL_CLOSED\n");
SIPCallClosed(event);
break;
/* For both UAS & UAC events */
case EXOSIP_CALL_RELEASED: /** 26 < call context is cleared. */
_debug(" !EXOSIP_CALL_RELEASED\n");// TMP
_debugMid(" !EXOSIP_CALL_RELEASED\n");
SIPCallReleased(event);
break;
/* Response received for request outside calls */
case EXOSIP_MESSAGE_NEW: /** 27 < announce new incoming MESSAGE. */
_debug(" !EXOSIP_MESSAGE_NEW\n");// TMP
_debugMid(" !EXOSIP_MESSAGE_NEW\n");
if (event->request == NULL) { break; }
SIPMessageNew(event);
break;
case EXOSIP_MESSAGE_PROCEEDING: /** 28 < announce a 1xx for MESSAGE. */
_debug(" !EXOSIP_MESSAGE_PROCEEDING\n");// TMP
_debugMid(" !EXOSIP_MESSAGE_PROCEEDING\n");
break;
case EXOSIP_MESSAGE_ANSWERED: /** 29 < announce a 200ok */
_debug(" !EXOSIP_MESSAGE_ANSWERED\n");// TMP
_debugMid(" !EXOSIP_MESSAGE_ANSWERED\n");
break;
case EXOSIP_MESSAGE_REDIRECTED: /** 30 < announce a failure. */
_debug(" !EXOSIP_MESSAGE_REDIRECTED\n");// TMP
_debugMid(" !EXOSIP_MESSAGE_REDIRECTED\n");
Manager::instance().displayError(" !EXOSIP Message not implemented yet");
break;
case EXOSIP_MESSAGE_REQUESTFAILURE: /** 31 < announce a failure. */
_debug(" !EXOSIP_MESSAGE_REQUESTFAILURE\n");// TMP
_debugMid(" !EXOSIP_MESSAGE_REQUESTFAILURE\n");
if (event->response !=0 && event->response->status_code == SIP_METHOD_NOT_ALLOWED) {
Manager::instance().incomingMessage(getAccountID(), "Message are not allowed");
} else {
......@@ -360,80 +362,80 @@ SIPVoIPLink::getEvent()
}
break;
case EXOSIP_MESSAGE_SERVERFAILURE: /** 32 < announce a failure. */
_debug(" !EXOSIP_MESSAGE_SERVERFAILURE\n");// TMP
_debugMid(" !EXOSIP_MESSAGE_SERVERFAILURE\n");
break;
case EXOSIP_MESSAGE_GLOBALFAILURE: /** 33 < announce a failure. */
_debug(" !EXOSIP_MESSAGE_GLOBALFAILURE\n");// TMP
_debugMid(" !EXOSIP_MESSAGE_GLOBALFAILURE\n");
Manager::instance().displayError(" !EXOSIP Message not implemented yet");
break;
/* Presence and Instant Messaging */
case EXOSIP_SUBSCRIPTION_UPDATE: /** 34 < announce incoming SUBSCRIBE. */
_debug(" !EXOSIP_SUBSCRIPTION_UPDATE\n");
_debugMid(" !EXOSIP_SUBSCRIPTION_UPDATE\n");
break;
case EXOSIP_SUBSCRIPTION_CLOSED: /** 35 < announce end of subscription. */
_debug(" !EXOSIP_SUBSCRIPTION_CLOSED\n");
_debugMid(" !EXOSIP_SUBSCRIPTION_CLOSED\n");
Manager::instance().displayError(" !EXOSIP Subscription not implemented yet");
break;
case EXOSIP_SUBSCRIPTION_NOANSWER: /** 37 < announce no answer */
_debug(" !EXOSIP_SUBSCRIPTION_NOANSWER\n");
_debugMid(" !EXOSIP_SUBSCRIPTION_NOANSWER\n");
break;
case EXOSIP_SUBSCRIPTION_PROCEEDING: /** 38 < announce a 1xx */
_debug(" !EXOSIP_SUBSCRIPTION_PROCEEDING\n");
_debugMid(" !EXOSIP_SUBSCRIPTION_PROCEEDING\n");
Manager::instance().displayError(" !EXOSIP Subscription response not implemented yet");
break;
case EXOSIP_SUBSCRIPTION_ANSWERED: /** 39 < announce a 200ok */
_debug(" !EXOSIP_SUBSCRIPTION_ANSWERED\n");
_debugMid(" !EXOSIP_SUBSCRIPTION_ANSWERED\n");
eXosip_lock();
eXosip_automatic_action();
eXosip_unlock();
break;
case EXOSIP_SUBSCRIPTION_REDIRECTED: /** 40 < announce a redirection */
_debug(" !EXOSIP_SUBSCRIPTION_REDIRECTED\n");// TMP
_debugMid(" !EXOSIP_SUBSCRIPTION_REDIRECTED\n");
break;
case EXOSIP_SUBSCRIPTION_REQUESTFAILURE: /** 41 < announce a request failure */
_debug(" !EXOSIP_SUBSCRIPTION_REQUESTFAILURE\n");// TMP
_debugMid(" !EXOSIP_SUBSCRIPTION_REQUESTFAILURE\n");
break;
case EXOSIP_SUBSCRIPTION_SERVERFAILURE: /** 42 < announce a server failure */
_debug(" !EXOSIP_SUBSCRIPTION_REQUESTFAILURE\n");// TMP
_debugMid(" !EXOSIP_SUBSCRIPTION_REQUESTFAILURE\n");
break;
case EXOSIP_SUBSCRIPTION_GLOBALFAILURE: /** 43 < announce a global failure */
_debug(" !EXOSIP_SUBSCRIPTION_GLOBALFAILURE\n");// TMP
_debugMid(" !EXOSIP_SUBSCRIPTION_GLOBALFAILURE\n");
break;
case EXOSIP_SUBSCRIPTION_NOTIFY: /** 44 < announce new NOTIFY request */
_debug(" !EXOSIP_SUBSCRIPTION_NOTIFY\n");
_debugMid(" !EXOSIP_SUBSCRIPTION_NOTIFY\n");
osip_body_t* body;