add subscribe to conf event api

This commit is contained in:
Benjamin Reis 2017-08-01 13:28:41 +02:00
parent 8f64595659
commit cc49b6f53a
14 changed files with 14974 additions and 9 deletions

View file

@ -38,6 +38,9 @@ set(LINPHONE_PRIVATE_HEADER_FILES
../src/object/object.h
../src/object/singleton.h
../src/utils/general.h
../src/conference/conference-listener.h
../src/conference/conference-event-package.h
../src/conference/conference-info.hxx
bellesip_sal/sal_impl.h
carddav.h
conference_private.h
@ -122,7 +125,12 @@ set(LINPHONE_SOURCE_FILES_C
xmlrpc.c
vtables.c
)
set(LINPHONE_SOURCE_FILES_CXX conference.cc)
set(LINPHONE_SOURCE_FILES_CXX
conference.cc
../src/conference/conference-event-package.cpp
../src/conference/conference-info.cxx
)
set(LINPHONE_INCLUDE_DIRS ${LINPHONE_INCLUDE_DIRS} /Users/reisbenjamin/xsd-4.0.0-i686-macosx/libxsd /usr/local/Cellar/xerces-c/3.1.4/include)
if(ANDROID)
list(APPEND LINPHONE_SOURCE_FILES_CXX linphonecore_jni.cc)
set_source_files_properties(linphonecore_jni.cc PROPERTIES COMPILE_DEFINITIONS "USE_JAVAH")
@ -158,6 +166,7 @@ set(LIBS
${MEDIASTREAMER2_LIBRARIES}
${ORTP_LIBRARIES}
${XML2_LIBRARIES}
/usr/local/Cellar/xerces-c/3.1.4/lib/libxerces-c.dylib
)
if(WIN32 AND NOT CMAKE_SYSTEM_NAME STREQUAL "WindowsStore")
list(APPEND LIBS "Ws2_32")

View file

@ -45,6 +45,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#include "mediastreamer2/msjpegwriter.h"
#include "mediastreamer2/msogl.h"
#include "mediastreamer2/msvolume.h"
#include "conference/conference-event-package.h"
#ifdef INET6
#ifndef _WIN32
@ -2115,12 +2116,23 @@ static void linphone_core_internal_notify_received(LinphoneCore *lc, LinphoneEve
linphone_friend_list_notify_presence_received(list, lev, body);
friendLists = friendLists->next;
}
} else if (strcmp(notified_event, "Conference") == 0) {
LinphonePrivate::Conference::ConferenceEventPackage *cep = reinterpret_cast<LinphonePrivate::Conference::ConferenceEventPackage *>(linphone_event_get_user_data(lev));
if(cep) {
ms_message("notify event for conference %s", cep->getConfId().c_str());
cep->notifyReceived((char *) linphone_content_get_buffer(body));
}
}
}
static void linphone_core_internal_subscription_state_changed(LinphoneCore *lc, LinphoneEvent *lev, LinphoneSubscriptionState state) {
if (strcasecmp(linphone_event_get_name(lev), "Presence") == 0) {
linphone_friend_list_subscription_state_changed(lc, lev, state);
} else if (strcmp(linphone_event_get_name(lev), "Conference") == 0) {
LinphonePrivate::Conference::ConferenceEventPackage *cep = reinterpret_cast<LinphonePrivate::Conference::ConferenceEventPackage *>(linphone_event_get_user_data(lev));
if(cep) {
}
}
}

View file

@ -0,0 +1,101 @@
/*
* conference-event-package.cpp
* Copyright (C) 2017 Belledonne Communications SARL
*
* 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, see <http://www.gnu.org/licenses/>.
*/
#include "conference-event-package.h"
#include "conference-info.hxx"
#include "private.h"
using namespace std;
using namespace conference_info;
using namespace LinphonePrivate;
class LinphonePrivate::Conference::ConferenceEventPackagePrivate : public ObjectPrivate {
public:
LinphoneCore *lc;
ConferenceListener *listener;
LinphoneAddress *confAddr;
string confId;
LinphoneEvent *lev;
};
Conference::ConferenceEventPackage::ConferenceEventPackage(LinphoneCore *lc, ConferenceListener *listener, LinphoneAddress *confAddr) : Object(new Conference::ConferenceEventPackagePrivate) {
L_D(ConferenceEventPackage);
xercesc::XMLPlatformUtils::Initialize();
d->lc = lc;
d->listener = listener;
d->confAddr = confAddr;
linphone_address_ref(confAddr);
d->lev = NULL;
}
Conference::ConferenceEventPackage::~ConferenceEventPackage() {
L_D(ConferenceEventPackage);
xercesc::XMLPlatformUtils::Terminate();
linphone_address_unref(d->confAddr);
if(d->lev) linphone_event_unref(d->lev);
}
void Conference::ConferenceEventPackage::subscribe(string confId) {
L_D(ConferenceEventPackage);
d->confId = confId;
d->lev = linphone_core_create_subscribe(d->lc, d->confAddr, "Conference", 600);
linphone_event_ref(d->lev);
linphone_event_set_internal(d->lev, TRUE);
linphone_event_set_user_data(d->lev, this);
linphone_event_add_custom_header(d->lev, "Conf-id", d->confId.c_str()); // TODO : ???
linphone_event_send_subscribe(d->lev, NULL);
}
void Conference::ConferenceEventPackage::unsubscribe() {
L_D(ConferenceEventPackage);
linphone_event_terminate(d->lev);
}
void Conference::ConferenceEventPackage::notifyReceived(const char *xmlBody) {
L_D(ConferenceEventPackage);
istringstream data(xmlBody);
unique_ptr<Conference_type> confInfo = parseConference_info(data, xml_schema::Flags::dont_validate);
if(strcmp(confInfo->getEntity().c_str(), linphone_address_as_string(d->confAddr)) == 0) {
for (const auto &user : confInfo->getUsers()->getUser()) {
LinphoneAddress *addr = linphone_core_interpret_url(d->lc, user.getEntity()->c_str());
if(user.getState() == "deleted") {
d->listener->participantRemoved(addr);
} else {
bool isAdmin = false;
if(user.getRoles()) {
for (const auto &entry : user.getRoles()->getEntry()) {
if (entry == "admin") {
isAdmin = true;
break;
}
}
}
if(user.getState() == "full") {
d->listener->participantAdded(addr);
}
d->listener->participantSetAdmin(addr, isAdmin);
}
linphone_address_unref(addr);
}
}
}
string Conference::ConferenceEventPackage::getConfId() {
L_D(ConferenceEventPackage);
return d->confId;
}

View file

@ -0,0 +1,51 @@
/*
* conference-event-package.h
* Copyright (C) 2017 Belledonne Communications SARL
*
* 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, see <http://www.gnu.org/licenses/>.
*/
#ifndef _CONFERENCE_EVENT_PACKAGE_H_
#define _CONFERENCE_EVENT_PACKAGE_H_
#include <string>
#include "object/object.h"
#include "conference-listener.h"
#include "linphone/core.h"
namespace LinphonePrivate {
namespace Conference {
class ConferenceEventPackagePrivate;
// -------------------------------------------------------------------------
// ConferenceEventPackage.
// -------------------------------------------------------------------------
class ConferenceEventPackage : public Object {
public:
ConferenceEventPackage(LinphoneCore *lc, ConferenceListener *listener, LinphoneAddress *confAddr);
~ConferenceEventPackage();
void subscribe(std::string confId);
void notifyReceived(const char *xmlBody);
void unsubscribe();
std::string getConfId();
private:
L_DECLARE_PRIVATE(ConferenceEventPackage);
L_DISABLE_COPY(ConferenceEventPackage);
};
}
}
#endif // ifndef _CONFERENCE_EVENT_PACKAGE_H_

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,387 @@
<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema
targetNamespace="urn:ietf:params:xml:ns:conference-info"
xmlns:tns="urn:ietf:params:xml:ns:conference-info"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns="urn:ietf:params:xml:ns:conference-info"
elementFormDefault="qualified"
attributeFormDefault="unqualified">
<!--
This imports the xml:language definition
-->
<xs:import namespace="http://www.w3.org/XML/1998/namespace"
schemaLocation="http://www.w3.org/2001/03/xml.xsd"/>
<!--
CONFERENCE ELEMENT
-->
<xs:element name="conference-info" type="conference-type"/>
<!--
CONFERENCE TYPE
-->
<xs:complexType name="conference-type">
<xs:sequence>
<xs:element name="conference-description"
type="conference-description-type" minOccurs="0"/>
<xs:element name="host-info"
type="host-type" minOccurs="0"/>
<xs:element name="conference-state"
type="conference-state-type" minOccurs="0"/>
<xs:element name="users"
type="users-type" minOccurs="0"/>
<xs:element name="sidebars-by-ref"
type="uris-type" minOccurs="0"/>
<xs:element name="sidebars-by-val"
type="sidebars-by-val-type" minOccurs="0"/>
<xs:any namespace="##other" processContents="lax"
minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="entity"
type="xs:anyURI" use="required"/>
<xs:attribute name="state"
type="state-type" use="optional" default="full"/>
<xs:attribute name="version"
type="xs:unsignedInt" use="optional"/>
<xs:anyAttribute namespace="##other" processContents="lax"/>
</xs:complexType>
<!--
STATE TYPE
-->
<xs:simpleType name="state-type">
<xs:restriction base="xs:string">
<xs:enumeration value="full"/>
<xs:enumeration value="partial"/>
<xs:enumeration value="deleted"/>
</xs:restriction>
</xs:simpleType>
<!--
CONFERENCE DESCRIPTION TYPE
-->
<xs:complexType name="conference-description-type">
<xs:sequence>
<xs:element name="display-text"
type="xs:string" minOccurs="0"/>
<xs:element name="subject"
type="xs:string" minOccurs="0"/>
<xs:element name="free-text"
type="xs:string" minOccurs="0"/>
<xs:element name="keywords"
type="keywords-type" minOccurs="0"/>
<xs:element name="conf-uris"
type="uris-type" minOccurs="0"/>
<xs:element name="service-uris"
type="uris-type" minOccurs="0"/>
<xs:element name="maximum-user-count"
type="xs:unsignedInt" minOccurs="0"/>
<xs:element name="available-media"
type="conference-media-type" minOccurs="0"/>
<xs:any namespace="##other" processContents="lax"
minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:anyAttribute namespace="##other" processContents="lax"/>
</xs:complexType>
<!--
HOST TYPE
-->
<xs:complexType name="host-type">
<xs:sequence>
<xs:element name="display-text" type="xs:string"
minOccurs="0"/>
<xs:element name="web-page" type="xs:anyURI"
minOccurs="0"/>
<xs:element name="uris" type="uris-type"
minOccurs="0"/>
<xs:any namespace="##other" processContents="lax"
minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:anyAttribute namespace="##other" processContents="lax"/>
</xs:complexType>
<!--
CONFERENCE STATE TYPE
-->
<xs:complexType name="conference-state-type">
<xs:sequence>
<xs:element name="user-count" type="xs:unsignedInt"
minOccurs="0"/>
<xs:element name="active" type="xs:boolean"
minOccurs="0"/>
<xs:element name="locked" type="xs:boolean"
minOccurs="0"/>
<xs:any namespace="##other" processContents="lax"
minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:anyAttribute namespace="##other" processContents="lax"/>
</xs:complexType>
<!--
CONFERENCE MEDIA TYPE
-->
<xs:complexType name="conference-media-type">
<xs:sequence>
<xs:element name="entry" type="conference-medium-type"
maxOccurs="unbounded"/>
</xs:sequence>
<xs:anyAttribute namespace="##other" processContents="lax"/>
</xs:complexType>
<!--
CONFERENCE MEDIUM TYPE
-->
<xs:complexType name="conference-medium-type">
<xs:sequence>
<xs:element name="display-text" type="xs:string"
minOccurs="0"/>
<xs:element name="type" type="xs:string"/>
<xs:element name="status" type="media-status-type"
minOccurs="0"/>
<xs:any namespace="##other" processContents="lax"
minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="label" type="xs:string"
use="required"/>
<xs:anyAttribute namespace="##other" processContents="lax"/>
</xs:complexType>
<!--
URIs TYPE
-->
<xs:complexType name="uris-type">
<xs:sequence>
<xs:element name="entry" type="uri-type"
maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="state" type="state-type"
use="optional" default="full"/>
<xs:anyAttribute namespace="##other" processContents="lax"/>
</xs:complexType>
<!--
URI TYPE
-->
<xs:complexType name="uri-type">
<xs:sequence>
<xs:element name="uri" type="xs:anyURI"/>
<xs:element name="display-text" type="xs:string"
minOccurs="0"/>
<xs:element name="purpose" type="xs:string"
minOccurs="0"/>
<xs:element name="modified" type="execution-type"
minOccurs="0"/>
<xs:any namespace="##other" processContents="lax"
minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:anyAttribute namespace="##other" processContents="lax"/>
</xs:complexType>
<!--
KEYWORDS TYPE
-->
<xs:simpleType name="keywords-type">
<xs:list itemType="xs:string"/>
</xs:simpleType>
<!--
USERS TYPE
-->
<xs:complexType name="users-type">
<xs:sequence>
<xs:element name="user" type="user-type"
minOccurs="0" maxOccurs="unbounded"/>
<xs:any namespace="##other" processContents="lax"
minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="state" type="state-type"
use="optional" default="full"/>
<xs:anyAttribute namespace="##other" processContents="lax"/>
</xs:complexType>
<!--
USER TYPE
-->
<xs:complexType name="user-type">
<xs:sequence>
<xs:element name="display-text" type="xs:string"
minOccurs="0"/>
<xs:element name="associated-aors" type="uris-type"
minOccurs="0"/>
<xs:element name="roles" type="user-roles-type"
minOccurs="0"/>
<xs:element name="languages" type="user-languages-type"
minOccurs="0"/>
<xs:element name="cascaded-focus" type="xs:anyURI"
minOccurs="0"/>
<xs:element name="endpoint" type="endpoint-type"
minOccurs="0" maxOccurs="unbounded"/>
<xs:any namespace="##other" processContents="lax"
minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="entity" type="xs:anyURI"/>
<xs:attribute name="state" type="state-type"
use="optional" default="full"/>
<xs:anyAttribute namespace="##other" processContents="lax"/>
</xs:complexType>
<!--
USER ROLES TYPE
-->
<xs:complexType name="user-roles-type">
<xs:sequence>
<xs:element name="entry" type="xs:string"
maxOccurs="unbounded"/>
</xs:sequence>
<xs:anyAttribute namespace="##other" processContents="lax"/>
</xs:complexType>
<!--
USER LANGUAGES TYPE
-->
<xs:simpleType name="user-languages-type">
<xs:list itemType="xs:language"/>
</xs:simpleType>
<!--
ENDPOINT TYPE
-->
<xs:complexType name="endpoint-type">
<xs:sequence>
<xs:element name="display-text" type="xs:string"
minOccurs="0"/>
<xs:element name="referred" type="execution-type"
minOccurs="0"/>
<xs:element name="status" type="endpoint-status-type"
minOccurs="0"/>
<xs:element name="joining-method" type="joining-type"
minOccurs="0"/>
<xs:element name="joining-info"
type="execution-type"
minOccurs="0"/>
<xs:element name="disconnection-method"
type="disconnection-type"
minOccurs="0"/>
<xs:element name="disconnection-info"
type="execution-type"
minOccurs="0"/>
<xs:element name="media" type="media-type"
minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="call-info" type="call-type"
minOccurs="0"/>
<xs:any namespace="##other" processContents="lax"
minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="entity" type="xs:string"/>
<xs:attribute name="state" type="state-type"
use="optional" default="full"/>
<xs:anyAttribute namespace="##other" processContents="lax"/>
</xs:complexType>
<!--
ENDPOINT STATUS TYPE
-->
<xs:simpleType name="endpoint-status-type">
<xs:restriction base="xs:string">
<xs:enumeration value="pending"/>
<xs:enumeration value="dialing-out"/>
<xs:enumeration value="dialing-in"/>
<xs:enumeration value="alerting"/>
<xs:enumeration value="on-hold"/>
<xs:enumeration value="connected"/>
<xs:enumeration value="muted-via-focus"/>
<xs:enumeration value="disconnecting"/>
<xs:enumeration value="disconnected"/>
</xs:restriction>
</xs:simpleType>
<!--
JOINING TYPE
-->
<xs:simpleType name="joining-type">
<xs:restriction base="xs:string">
<xs:enumeration value="dialed-in"/>
<xs:enumeration value="dialed-out"/>
<xs:enumeration value="focus-owner"/>
</xs:restriction>
</xs:simpleType>
<!--
DISCONNECTION TYPE
-->
<xs:simpleType name="disconnection-type">
<xs:restriction base="xs:string">
<xs:enumeration value="departed"/>
<xs:enumeration value="booted"/>
<xs:enumeration value="failed"/>
<xs:enumeration value="busy"/>
</xs:restriction>
</xs:simpleType>
<!--
EXECUTION TYPE
-->
<xs:complexType name="execution-type">
<xs:sequence>
<xs:element name="when" type="xs:dateTime"
minOccurs="0"/>
<xs:element name="reason" type="xs:string"
minOccurs="0"/>
<xs:element name="by" type="xs:anyURI"
minOccurs="0"/>
</xs:sequence>
<xs:anyAttribute namespace="##other" processContents="lax"/>
</xs:complexType>
<!--
CALL TYPE
-->
<xs:complexType name="call-type">
<xs:choice>
<xs:element name="sip" type="sip-dialog-id-type"/>
<xs:any namespace="##other" processContents="lax"
minOccurs="0" maxOccurs="unbounded"/>
</xs:choice>
<xs:anyAttribute namespace="##other" processContents="lax"/>
</xs:complexType>
<!--
SIP DIALOG ID TYPE
-->
<xs:complexType name="sip-dialog-id-type">
<xs:sequence>
<xs:element name="display-text" type="xs:string"
minOccurs="0"/>
<xs:element name="call-id" type="xs:string"/>
<xs:element name="from-tag" type="xs:string"/>
<xs:element name="to-tag" type="xs:string"/>
<xs:any namespace="##other" processContents="lax"
minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:anyAttribute namespace="##other" processContents="lax"/>
</xs:complexType>
<!--
MEDIA TYPE
-->
<xs:complexType name="media-type">
<xs:sequence>
<xs:element name="display-text" type="xs:string"
minOccurs="0"/>
<xs:element name="type" type="xs:string"
minOccurs="0"/>
<xs:element name="label" type="xs:string"
minOccurs="0"/>
<xs:element name="src-id" type="xs:string"
minOccurs="0"/>
<xs:element name="status" type="media-status-type"
minOccurs="0"/>
<xs:any namespace="##other" processContents="lax"
minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="id" type="xs:string"
use="required"/>
<xs:anyAttribute namespace="##other" processContents="lax"/>
</xs:complexType>
<!--
MEDIA STATUS TYPE
-->
<xs:simpleType name="media-status-type">
<xs:restriction base="xs:string">
<xs:enumeration value="recvonly"/>
<xs:enumeration value="sendonly"/>
<xs:enumeration value="sendrecv"/>
<xs:enumeration value="inactive"/>
</xs:restriction>
</xs:simpleType>
<!--
SIDEBARS BY VAL TYPE
-->
<xs:complexType name="sidebars-by-val-type">
<xs:sequence>
<xs:element name="entry" type="conference-type"
minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="state" type="state-type"
use="optional" default="full"/>
<xs:anyAttribute namespace="##other" processContents="lax"/>
</xs:complexType>
</xs:schema>

View file

@ -0,0 +1,41 @@
/*
* conference-listener.h
* Copyright (C) 2017 Belledonne Communications SARL
*
* 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, see <http://www.gnu.org/licenses/>.
*/
#ifndef _CONFERENCE_LISTENER_H_
#define _CONFERENCE_LISTENER_H_
#include "linphone/core.h"
namespace LinphonePrivate {
namespace Conference {
// -------------------------------------------------------------------------
// ConferenceListener.
// -------------------------------------------------------------------------
class ConferenceListener {
public:
//virtual ~ConferenceListener() = 0;
virtual void conferenceCreated(LinphoneAddress *confAddress) = 0;
virtual void conferenceTerminated(LinphoneAddress *confAddress) = 0;
virtual void participantAdded(LinphoneAddress *addr) = 0;
virtual void participantRemoved(LinphoneAddress *addr) = 0;
virtual void participantSetAdmin(LinphoneAddress *addr, bool isAdmin) = 0;
};
}
}
#endif // ifndef _CONFERENCE_LISTENER_H_

503
src/conference/xml.hxx Normal file
View file

@ -0,0 +1,503 @@
// Copyright (c) 2005-2014 Code Synthesis Tools CC
//
// This program was generated by CodeSynthesis XSD, an XML Schema to
// C++ data binding compiler.
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License version 2 as
// published by the Free Software Foundation.
//
// 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
//
// In addition, as a special exception, Code Synthesis Tools CC gives
// permission to link this program with the Xerces-C++ library (or with
// modified versions of Xerces-C++ that use the same license as Xerces-C++),
// and distribute linked combinations including the two. You must obey
// the GNU General Public License version 2 in all respects for all of
// the code used other than Xerces-C++. If you modify this copy of the
// program, you may extend this exception to your version of the program,
// but you are not obligated to do so. If you do not wish to do so, delete
// this exception statement from your version.
//
// Furthermore, Code Synthesis Tools CC makes a special exception for
// the Free/Libre and Open Source Software (FLOSS) which is described
// in the accompanying FLOSSE file.
//
#ifndef CXX_USERS_REISBENJAMIN_DEVELOPPEMENT_FLEXISIP_PRIVATE_SRC_XML_XML_HXX
#define CXX_USERS_REISBENJAMIN_DEVELOPPEMENT_FLEXISIP_PRIVATE_SRC_XML_XML_HXX
#ifndef XSD_CXX11
#define XSD_CXX11
#endif
#ifndef XSD_USE_CHAR
#define XSD_USE_CHAR
#endif
#ifndef XSD_CXX_TREE_USE_CHAR
#define XSD_CXX_TREE_USE_CHAR
#endif
// Begin prologue.
//
//
// End prologue.
#include <xsd/cxx/config.hxx>
#if (XSD_INT_VERSION != 4000000L)
#error XSD runtime version mismatch
#endif
#include <xsd/cxx/pre.hxx>
#include <xsd/cxx/xml/char-utf8.hxx>
#include <xsd/cxx/tree/exceptions.hxx>
#include <xsd/cxx/tree/elements.hxx>
#include <xsd/cxx/tree/types.hxx>
#include <xsd/cxx/xml/error-handler.hxx>
#include <xsd/cxx/xml/dom/auto-ptr.hxx>
#include <xsd/cxx/tree/parsing.hxx>
#include <xsd/cxx/tree/parsing/byte.hxx>
#include <xsd/cxx/tree/parsing/unsigned-byte.hxx>
#include <xsd/cxx/tree/parsing/short.hxx>
#include <xsd/cxx/tree/parsing/unsigned-short.hxx>
#include <xsd/cxx/tree/parsing/int.hxx>
#include <xsd/cxx/tree/parsing/unsigned-int.hxx>
#include <xsd/cxx/tree/parsing/long.hxx>
#include <xsd/cxx/tree/parsing/unsigned-long.hxx>
#include <xsd/cxx/tree/parsing/boolean.hxx>
#include <xsd/cxx/tree/parsing/float.hxx>
#include <xsd/cxx/tree/parsing/double.hxx>
#include <xsd/cxx/tree/parsing/decimal.hxx>
#include <xsd/cxx/xml/dom/serialization-header.hxx>
#include <xsd/cxx/tree/serialization.hxx>
#include <xsd/cxx/tree/serialization/byte.hxx>
#include <xsd/cxx/tree/serialization/unsigned-byte.hxx>
#include <xsd/cxx/tree/serialization/short.hxx>
#include <xsd/cxx/tree/serialization/unsigned-short.hxx>
#include <xsd/cxx/tree/serialization/int.hxx>
#include <xsd/cxx/tree/serialization/unsigned-int.hxx>
#include <xsd/cxx/tree/serialization/long.hxx>
#include <xsd/cxx/tree/serialization/unsigned-long.hxx>
#include <xsd/cxx/tree/serialization/boolean.hxx>
#include <xsd/cxx/tree/serialization/float.hxx>
#include <xsd/cxx/tree/serialization/double.hxx>
#include <xsd/cxx/tree/serialization/decimal.hxx>
#include <xsd/cxx/tree/std-ostream-operators.hxx>
namespace xml_schema
{
// anyType and anySimpleType.
//
typedef ::xsd::cxx::tree::type Type;
typedef ::xsd::cxx::tree::simple_type< char, Type > SimpleType;
typedef ::xsd::cxx::tree::type Container;
// 8-bit
//
typedef signed char Byte;
typedef unsigned char UnsignedByte;
// 16-bit
//
typedef short Short;
typedef unsigned short UnsignedShort;
// 32-bit
//
typedef int Int;
typedef unsigned int UnsignedInt;
// 64-bit
//
typedef long long Long;
typedef unsigned long long UnsignedLong;
// Supposed to be arbitrary-length integral types.
//
typedef long long Integer;
typedef long long NonPositiveInteger;
typedef unsigned long long NonNegativeInteger;
typedef unsigned long long PositiveInteger;
typedef long long NegativeInteger;
// Boolean.
//
typedef bool Boolean;
// Floating-point types.
//
typedef float Float;
typedef double Double;
typedef double Decimal;
// String types.
//
typedef ::xsd::cxx::tree::string< char, SimpleType > String;
typedef ::xsd::cxx::tree::normalized_string< char, String > NormalizedString;
typedef ::xsd::cxx::tree::token< char, NormalizedString > Token;
typedef ::xsd::cxx::tree::name< char, Token > Name;
typedef ::xsd::cxx::tree::nmtoken< char, Token > Nmtoken;
typedef ::xsd::cxx::tree::nmtokens< char, SimpleType, Nmtoken > Nmtokens;
typedef ::xsd::cxx::tree::ncname< char, Name > Ncname;
typedef ::xsd::cxx::tree::language< char, Token > Language;
// ID/IDREF.
//
typedef ::xsd::cxx::tree::id< char, Ncname > Id;
typedef ::xsd::cxx::tree::idref< char, Ncname, Type > Idref;
typedef ::xsd::cxx::tree::idrefs< char, SimpleType, Idref > Idrefs;
// URI.
//
typedef ::xsd::cxx::tree::uri< char, SimpleType > Uri;
// Qualified name.
//
typedef ::xsd::cxx::tree::qname< char, SimpleType, Uri, Ncname > Qname;
// Binary.
//
typedef ::xsd::cxx::tree::buffer< char > Buffer;
typedef ::xsd::cxx::tree::base64_binary< char, SimpleType > Base64Binary;
typedef ::xsd::cxx::tree::hex_binary< char, SimpleType > HexBinary;
// Date/time.
//
typedef ::xsd::cxx::tree::time_zone TimeZone;
typedef ::xsd::cxx::tree::date< char, SimpleType > Date;
typedef ::xsd::cxx::tree::date_time< char, SimpleType > DateTime;
typedef ::xsd::cxx::tree::duration< char, SimpleType > Duration;
typedef ::xsd::cxx::tree::gday< char, SimpleType > Gday;
typedef ::xsd::cxx::tree::gmonth< char, SimpleType > Gmonth;
typedef ::xsd::cxx::tree::gmonth_day< char, SimpleType > GmonthDay;
typedef ::xsd::cxx::tree::gyear< char, SimpleType > Gyear;
typedef ::xsd::cxx::tree::gyear_month< char, SimpleType > GyearMonth;
typedef ::xsd::cxx::tree::time< char, SimpleType > Time;
// Entity.
//
typedef ::xsd::cxx::tree::entity< char, Ncname > Entity;
typedef ::xsd::cxx::tree::entities< char, SimpleType, Entity > Entities;
typedef ::xsd::cxx::tree::content_order ContentOrder;
// Namespace information and list stream. Used in
// serialization functions.
//
typedef ::xsd::cxx::xml::dom::namespace_info< char > NamespaceInfo;
typedef ::xsd::cxx::xml::dom::namespace_infomap< char > NamespaceInfomap;
typedef ::xsd::cxx::tree::list_stream< char > ListStream;
typedef ::xsd::cxx::tree::as_double< Double > AsDouble;
typedef ::xsd::cxx::tree::as_decimal< Decimal > AsDecimal;
typedef ::xsd::cxx::tree::facet Facet;
// Flags and properties.
//
typedef ::xsd::cxx::tree::flags Flags;
typedef ::xsd::cxx::tree::properties< char > Properties;
// Parsing/serialization diagnostics.
//
typedef ::xsd::cxx::tree::severity Severity;
typedef ::xsd::cxx::tree::error< char > Error;
typedef ::xsd::cxx::tree::diagnostics< char > Diagnostics;
// Exceptions.
//
typedef ::xsd::cxx::tree::exception< char > Exception;
typedef ::xsd::cxx::tree::bounds< char > Bounds;
typedef ::xsd::cxx::tree::duplicate_id< char > DuplicateId;
typedef ::xsd::cxx::tree::parsing< char > Parsing;
typedef ::xsd::cxx::tree::expected_element< char > ExpectedElement;
typedef ::xsd::cxx::tree::unexpected_element< char > UnexpectedElement;
typedef ::xsd::cxx::tree::expected_attribute< char > ExpectedAttribute;
typedef ::xsd::cxx::tree::unexpected_enumerator< char > UnexpectedEnumerator;
typedef ::xsd::cxx::tree::expected_text_content< char > ExpectedTextContent;
typedef ::xsd::cxx::tree::no_prefix_mapping< char > NoPrefixMapping;
typedef ::xsd::cxx::tree::serialization< char > Serialization;
// Error handler callback interface.
//
typedef ::xsd::cxx::xml::error_handler< char > ErrorHandler;
// DOM interaction.
//
namespace dom
{
// Automatic pointer for DOMDocument.
//
using ::xsd::cxx::xml::dom::unique_ptr;
#ifndef XSD_CXX_TREE_TREE_NODE_KEY__XML_SCHEMA
#define XSD_CXX_TREE_TREE_NODE_KEY__XML_SCHEMA
// DOM user data key for back pointers to tree nodes.
//
const XMLCh* const treeNodeKey = ::xsd::cxx::tree::user_data_keys::node;
#endif
}
}
// Forward declarations.
//
namespace namespace_
{
class Lang;
class Space;
class Lang_member;
}
#include <memory> // ::std::unique_ptr
#include <limits> // std::numeric_limits
#include <algorithm> // std::binary_search
#include <utility> // std::move
#include <xsd/cxx/xml/char-utf8.hxx>
#include <xsd/cxx/tree/exceptions.hxx>
#include <xsd/cxx/tree/elements.hxx>
#include <xsd/cxx/tree/containers.hxx>
#include <xsd/cxx/tree/list.hxx>
#include <xsd/cxx/xml/dom/parsing-header.hxx>
#include <xsd/cxx/tree/containers-wildcard.hxx>
namespace namespace_
{
class Lang: public ::xml_schema::String
{
public:
Lang (const char* v);
Lang (const ::std::string& v);
Lang (const ::xercesc::DOMElement& e,
::xml_schema::Flags f = 0,
::xml_schema::Container* c = 0);
Lang (const ::xercesc::DOMAttr& a,
::xml_schema::Flags f = 0,
::xml_schema::Container* c = 0);
Lang (const ::std::string& s,
const ::xercesc::DOMElement* e,
::xml_schema::Flags f = 0,
::xml_schema::Container* c = 0);
Lang (const Lang& x,
::xml_schema::Flags f = 0,
::xml_schema::Container* c = 0);
virtual Lang*
_clone (::xml_schema::Flags f = 0,
::xml_schema::Container* c = 0) const;
};
class Space: public ::xml_schema::Ncname
{
public:
enum Value
{
default_,
preserve
};
Space (Value v);
Space (const char* v);
Space (const ::std::string& v);
Space (const ::xml_schema::Ncname& v);
Space (const ::xercesc::DOMElement& e,
::xml_schema::Flags f = 0,
::xml_schema::Container* c = 0);
Space (const ::xercesc::DOMAttr& a,
::xml_schema::Flags f = 0,
::xml_schema::Container* c = 0);
Space (const ::std::string& s,
const ::xercesc::DOMElement* e,
::xml_schema::Flags f = 0,
::xml_schema::Container* c = 0);
Space (const Space& x,
::xml_schema::Flags f = 0,
::xml_schema::Container* c = 0);
virtual Space*
_clone (::xml_schema::Flags f = 0,
::xml_schema::Container* c = 0) const;
Space&
operator= (Value v);
virtual
operator Value () const
{
return _xsd_Space_convert ();
}
protected:
Value
_xsd_Space_convert () const;
public:
static const char* const _xsd_Space_literals_[2];
static const Value _xsd_Space_indexes_[2];
};
class Lang_member: public ::xml_schema::String
{
public:
enum Value
{
empty
};
Lang_member (Value v);
Lang_member (const char* v);
Lang_member (const ::std::string& v);
Lang_member (const ::xml_schema::String& v);
Lang_member (const ::xercesc::DOMElement& e,
::xml_schema::Flags f = 0,
::xml_schema::Container* c = 0);
Lang_member (const ::xercesc::DOMAttr& a,
::xml_schema::Flags f = 0,
::xml_schema::Container* c = 0);
Lang_member (const ::std::string& s,
const ::xercesc::DOMElement* e,
::xml_schema::Flags f = 0,
::xml_schema::Container* c = 0);
Lang_member (const Lang_member& x,
::xml_schema::Flags f = 0,
::xml_schema::Container* c = 0);
virtual Lang_member*
_clone (::xml_schema::Flags f = 0,
::xml_schema::Container* c = 0) const;
Lang_member&
operator= (Value v);
virtual
operator Value () const
{
return _xsd_Lang_member_convert ();
}
protected:
Value
_xsd_Lang_member_convert () const;
public:
static const char* const _xsd_Lang_member_literals_[1];
static const Value _xsd_Lang_member_indexes_[1];
};
}
#include <iosfwd>
namespace namespace_
{
::std::ostream&
operator<< (::std::ostream&, const Lang&);
::std::ostream&
operator<< (::std::ostream&, Space::Value);
::std::ostream&
operator<< (::std::ostream&, const Space&);
::std::ostream&
operator<< (::std::ostream&, Lang_member::Value);
::std::ostream&
operator<< (::std::ostream&, const Lang_member&);
}
#include <iosfwd>
#include <xercesc/sax/InputSource.hpp>
#include <xercesc/dom/DOMDocument.hpp>
#include <xercesc/dom/DOMErrorHandler.hpp>
namespace namespace_
{
}
#include <iosfwd>
#include <xercesc/dom/DOMDocument.hpp>
#include <xercesc/dom/DOMErrorHandler.hpp>
#include <xercesc/framework/XMLFormatter.hpp>
#include <xsd/cxx/xml/dom/auto-ptr.hxx>
namespace namespace_
{
void
operator<< (::xercesc::DOMElement&, const Lang&);
void
operator<< (::xercesc::DOMAttr&, const Lang&);
void
operator<< (::xml_schema::ListStream&,
const Lang&);
void
operator<< (::xercesc::DOMElement&, const Space&);
void
operator<< (::xercesc::DOMAttr&, const Space&);
void
operator<< (::xml_schema::ListStream&,
const Space&);
void
operator<< (::xercesc::DOMElement&, const Lang_member&);
void
operator<< (::xercesc::DOMAttr&, const Lang_member&);
void
operator<< (::xml_schema::ListStream&,
const Lang_member&);
}
#include <xsd/cxx/post.hxx>
// Begin epilogue.
//
//
// End epilogue.
#endif // CXX_USERS_REISBENJAMIN_DEVELOPPEMENT_FLEXISIP_PRIVATE_SRC_XML_XML_HXX

View file

@ -192,6 +192,10 @@ set(SOURCE_FILES_C
video_tester.c
)
set(SOURCE_FILES_CXX
confeventpackage_tester.cpp
)
set(SOURCE_FILES_OBJC )
if(APPLE)
if (IOS)
@ -200,6 +204,7 @@ if(APPLE)
endif()
bc_apply_compile_flags(SOURCE_FILES_C STRICT_OPTIONS_CPP STRICT_OPTIONS_C)
bc_apply_compile_flags(SOURCE_FILES_C_CXX STRICT_OPTIONS_CPP STRICT_OPTIONS_CXX)
bc_apply_compile_flags(SOURCE_FILES_OBJC STRICT_OPTIONS_CPP STRICT_OPTIONS_OBJC)
if(MSVC)
@ -222,7 +227,7 @@ endif()
# on mobile platforms, we compile the tester as a library so that we can link with it directly from native applications
if(ANDROID OR IOS)
add_library(linphonetester SHARED ${SOURCE_FILES_C})
add_library(linphonetester SHARED ${SOURCE_FILES_C} ${SOURCE_FILES_CXX})
target_include_directories(linphonetester PUBLIC ${BCTOOLBOX_TESTER_INCLUDE_DIRS})
target_link_libraries(linphonetester ${LINPHONE_LIBS_FOR_TOOLS} ${OTHER_LIBS_FOR_TESTER})
if(IOS)
@ -243,7 +248,7 @@ if(ANDROID OR IOS)
PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ
)
elseif(CMAKE_SYSTEM_NAME STREQUAL "WindowsStore")
add_library(linphone_tester_static STATIC ${SOURCE_FILES_C})
add_library(linphone_tester_static STATIC ${SOURCE_FILES_C} ${SOURCE_FILES_CXX})
target_include_directories(linphone_tester_static PUBLIC ${BCTOOLBOX_TESTER_INCLUDE_DIRS})
target_link_libraries(linphone_tester_static ${LINPHONE_LIBS_FOR_TOOLS} ${OTHER_LIBS_FOR_TESTER})
@ -277,9 +282,9 @@ endif()
if (NOT ANDROID AND NOT CMAKE_SYSTEM_NAME STREQUAL "WindowsStore")
if(IOS)
set_source_files_properties(${IOS_RESOURCES_FILES} PROPERTIES MACOSX_PACKAGE_LOCATION Resources)
add_executable(liblinphone_tester MACOSX_BUNDLE ${IOS_RESOURCES_FILES} ${SOURCE_FILES_C} ${SOURCE_FILES_OBJC})
add_executable(liblinphone_tester MACOSX_BUNDLE ${IOS_RESOURCES_FILES} ${SOURCE_FILES_C} ${SOURCE_FILES_CXX} ${SOURCE_FILES_OBJC})
else()
add_executable(liblinphone_tester ${SOURCE_FILES_C} ${SOURCE_FILES_OBJC})
add_executable(liblinphone_tester ${SOURCE_FILES_C} ${SOURCE_FILES_CXX} ${SOURCE_FILES_OBJC})
endif()
set_target_properties(liblinphone_tester PROPERTIES LINK_FLAGS "${LINPHONE_LDFLAGS}")
set_target_properties(liblinphone_tester PROPERTIES LINKER_LANGUAGE CXX)
@ -312,4 +317,4 @@ if (NOT ANDROID AND NOT CMAKE_SYSTEM_NAME STREQUAL "WindowsStore")
install(FILES ${IMAGE_FILES} DESTINATION "${CMAKE_INSTALL_DATADIR}/liblinphone_tester/images")
install(FILES ${VCARD_FILES} DESTINATION "${CMAKE_INSTALL_DATADIR}/liblinphone_tester/vcards")
endif()
endif()
endif()

View file

@ -0,0 +1,717 @@
/*
liblinphone_tester - liblinphone test suite
Copyright (C) 2013 Belledonne Communications SARL
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 2 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, see <http://www.gnu.org/licenses/>.
*/
#include <map>
#include <string>
#include "linphone/core.h"
#include "private.h"
#include "liblinphone_tester.h"
#include "conference/conference-listener.h"
#include "conference/conference-event-package.h"
using namespace LinphonePrivate;
using namespace std;
static const char *first_notify = \
"<?xml version=\"1.0\" encoding=\"UTF-8\"?> "\
" <conference-info"\
" xmlns=\"urn:ietf:params:xml:ns:conference-info\""\
" entity=\"%s\""\
" state=\"full\" version=\"1\">"\
" <!--"\
" CONFERENCE INFO"\
" -->"\
" <conference-description>"\
" <subject>Agenda: This month's goals</subject>"\
" <service-uris>"\
" <entry>"\
" <uri>http://sharepoint/salesgroup/</uri>"\
" <purpose>web-page</purpose>"\
" </entry>"\
" </service-uris>"\
" </conference-description>"\
" <!--"\
" CONFERENCE STATE"\
" -->"\
" <conference-state>"\
" <user-count>33</user-count>"\
" </conference-state>"\
" <!--"\
" USERS"\
" -->"\
" <users>"\
" <user entity=\"sip:bob@example.com\" state=\"full\">"\
" <display-text>Bob Hoskins</display-text>"\
" <!--"\
" ENDPOINTS"\
" -->"\
" <endpoint entity=\"sip:bob@pc33.example.com\">"\
" <display-text>Bob's Laptop</display-text>"\
" <status>disconnected</status>"\
" <disconnection-method>departed</disconnection-method>"\
" <disconnection-info>"\
" <when>2005-03-04T20:00:00Z</when>"\
" <reason>bad voice quality</reason>"\
" <by>sip:mike@example.com</by>"\
" </disconnection-info>"\
" <!--"\
" MEDIA"\
" -->"\
" <media id=\"1\">"\
" <display-text>main audio</display-text>"\
" <type>audio</type>"\
" <label>34567</label>"\
" <src-id>432424</src-id>"\
" <status>sendrecv</status>"\
" </media>"\
" </endpoint>"\
" </user>"\
" <!--"\
" USER"\
" -->"\
" <user entity=\"sip:alice@example.com\" state=\"full\">"\
" <display-text>Alice</display-text>"\
" <roles>"\
" <entry>admin</entry>"\
" <entry>participant</entry>"\
" </roles>"\
" <!--"\
" ENDPOINTS"\
" -->"\
" <endpoint entity=\"sip:4kfk4j392jsu@example.com;grid=433kj4j3u\">"\
" <status>connected</status>"\
" <joining-method>dialed-out</joining-method>"\
" <joining-info>"\
" <when>2005-03-04T20:00:00Z</when>"\
" <by>sip:mike@example.com</by>"\
" </joining-info>"\
" <!--"\
" MEDIA"\
" -->"\
" <media id=\"1\">"\
" <display-text>main audio</display-text>"\
" <type>audio</type>"\
" <label>34567</label>"\
" <src-id>534232</src-id>"\
" <status>sendrecv</status>"\
" </media>"\
" </endpoint>"\
" </user>"\
" </users>"\
" </conference-info>";
static const char *participant_added_notify = \
"<?xml version=\"1.0\" encoding=\"UTF-8\"?> "\
" <conference-info"\
" xmlns=\"urn:ietf:params:xml:ns:conference-info\""\
" entity=\"%s\""\
" state=\"full\" version=\"1\">"\
" <!--"\
" CONFERENCE INFO"\
" -->"\
" <conference-description>"\
" <subject>Agenda: This month's goals</subject>"\
" <service-uris>"\
" <entry>"\
" <uri>http://sharepoint/salesgroup/</uri>"\
" <purpose>web-page</purpose>"\
" </entry>"\
" </service-uris>"\
" </conference-description>"\
" <!--"\
" CONFERENCE STATE"\
" -->"\
" <conference-state>"\
" <user-count>33</user-count>"\
" </conference-state>"\
" <!--"\
" USERS"\
" -->"\
" <users>"\
" <user entity=\"sip:frank@example.com\" state=\"full\">"\
" <display-text>Bob Hoskins</display-text>"\
" <!--"\
" ENDPOINTS"\
" -->"\
" <endpoint entity=\"sip:frank@pc33.example.com\">"\
" <display-text>Frank's Laptop</display-text>"\
" <status>disconnected</status>"\
" <disconnection-method>departed</disconnection-method>"\
" <disconnection-info>"\
" <when>2005-03-04T20:00:00Z</when>"\
" <reason>bad voice quality</reason>"\
" <by>sip:mike@example.com</by>"\
" </disconnection-info>"\
" <!--"\
" MEDIA"\
" -->"\
" <media id=\"1\">"\
" <display-text>main audio</display-text>"\
" <type>audio</type>"\
" <label>34567</label>"\
" <src-id>432424</src-id>"\
" <status>sendrecv</status>"\
" </media>"\
" </endpoint>"\
" </user>"\
" </users>"\
" </conference-info>";
static const char *participant_not_added_notify = \
"<?xml version=\"1.0\" encoding=\"UTF-8\"?> "\
" <conference-info"\
" xmlns=\"urn:ietf:params:xml:ns:conference-info\""\
" entity=\"%s\""\
" state=\"full\" version=\"1\">"\
" <!--"\
" CONFERENCE INFO"\
" -->"\
" <conference-description>"\
" <subject>Agenda: This month's goals</subject>"\
" <service-uris>"\
" <entry>"\
" <uri>http://sharepoint/salesgroup/</uri>"\
" <purpose>web-page</purpose>"\
" </entry>"\
" </service-uris>"\
" </conference-description>"\
" <!--"\
" CONFERENCE STATE"\
" -->"\
" <conference-state>"\
" <user-count>33</user-count>"\
" </conference-state>"\
" <!--"\
" USERS"\
" -->"\
" <users>"\
" <user entity=\"sip:frank@example.com\" state=\"partial\">"\
" <display-text>Bob Hoskins</display-text>"\
" <!--"\
" ENDPOINTS"\
" -->"\
" <endpoint entity=\"sip:frank@pc33.example.com\">"\
" <display-text>Frank's Laptop</display-text>"\
" <status>disconnected</status>"\
" <disconnection-method>departed</disconnection-method>"\
" <disconnection-info>"\
" <when>2005-03-04T20:00:00Z</when>"\
" <reason>bad voice quality</reason>"\
" <by>sip:mike@example.com</by>"\
" </disconnection-info>"\
" <!--"\
" MEDIA"\
" -->"\
" <media id=\"1\">"\
" <display-text>main audio</display-text>"\
" <type>audio</type>"\
" <label>34567</label>"\
" <src-id>432424</src-id>"\
" <status>sendrecv</status>"\
" </media>"\
" </endpoint>"\
" </user>"\
" </users>"\
" </conference-info>";
static const char *participant_deleted_notify = \
"<?xml version=\"1.0\" encoding=\"UTF-8\"?> "\
" <conference-info"\
" xmlns=\"urn:ietf:params:xml:ns:conference-info\""\
" entity=\"%s\""\
" state=\"full\" version=\"1\">"\
" <!--"\
" CONFERENCE INFO"\
" -->"\
" <conference-description>"\
" <subject>Agenda: This month's goals</subject>"\
" <service-uris>"\
" <entry>"\
" <uri>http://sharepoint/salesgroup/</uri>"\
" <purpose>web-page</purpose>"\
" </entry>"\
" </service-uris>"\
" </conference-description>"\
" <!--"\
" CONFERENCE STATE"\
" -->"\
" <conference-state>"\
" <user-count>33</user-count>"\
" </conference-state>"\
" <!--"\
" USERS"\
" -->"\
" <users>"\
" <user entity=\"sip:bob@example.com\" state=\"deleted\">"\
" <display-text>Bob Hoskins</display-text>"\
" <!--"\
" ENDPOINTS"\
" -->"\
" <endpoint entity=\"sip:bob@pc33.example.com\">"\
" <display-text>Bob's Laptop</display-text>"\
" <status>disconnected</status>"\
" <disconnection-method>departed</disconnection-method>"\
" <disconnection-info>"\
" <when>2005-03-04T20:00:00Z</when>"\
" <reason>bad voice quality</reason>"\
" <by>sip:mike@example.com</by>"\
" </disconnection-info>"\
" <!--"\
" MEDIA"\
" -->"\
" <media id=\"1\">"\
" <display-text>main audio</display-text>"\
" <type>audio</type>"\
" <label>34567</label>"\
" <src-id>432424</src-id>"\
" <status>sendrecv</status>"\
" </media>"\
" </endpoint>"\
" </user>"\
" </users>"\
" </conference-info>";
static const char *participant_admined_notify = \
"<?xml version=\"1.0\" encoding=\"UTF-8\"?> "\
" <conference-info"\
" xmlns=\"urn:ietf:params:xml:ns:conference-info\""\
" entity=\"%s\""\
" state=\"full\" version=\"1\">"\
" <!--"\
" CONFERENCE INFO"\
" -->"\
" <conference-description>"\
" <subject>Agenda: This month's goals</subject>"\
" <service-uris>"\
" <entry>"\
" <uri>http://sharepoint/salesgroup/</uri>"\
" <purpose>web-page</purpose>"\
" </entry>"\
" </service-uris>"\
" </conference-description>"\
" <!--"\
" CONFERENCE STATE"\
" -->"\
" <conference-state>"\
" <user-count>33</user-count>"\
" </conference-state>"\
" <!--"\
" USERS"\
" -->"\
" <users>"\
" <user entity=\"sip:bob@example.com\" state=\"partial\">"\
" <display-text>Bob Hoskins</display-text>"\
" <roles>"\
" <entry>participant</entry>"\
" <entry>admin</entry>"\
" </roles>"\
" <!--"\
" ENDPOINTS"\
" -->"\
" <endpoint entity=\"sip:bob@pc33.example.com\">"\
" <display-text>Bob's Laptop</display-text>"\
" <status>disconnected</status>"\
" <disconnection-method>departed</disconnection-method>"\
" <disconnection-info>"\
" <when>2005-03-04T20:00:00Z</when>"\
" <reason>bad voice quality</reason>"\
" <by>sip:mike@example.com</by>"\
" </disconnection-info>"\
" <!--"\
" MEDIA"\
" -->"\
" <media id=\"1\">"\
" <display-text>main audio</display-text>"\
" <type>audio</type>"\
" <label>34567</label>"\
" <src-id>432424</src-id>"\
" <status>sendrecv</status>"\
" </media>"\
" </endpoint>"\
" </user>"\
" </users>"\
" </conference-info>";
static const char *participant_unadmined_notify = \
"<?xml version=\"1.0\" encoding=\"UTF-8\"?> "\
" <conference-info"\
" xmlns=\"urn:ietf:params:xml:ns:conference-info\""\
" entity=\"%s\""\
" state=\"full\" version=\"1\">"\
" <!--"\
" CONFERENCE INFO"\
" -->"\
" <conference-description>"\
" <subject>Agenda: This month's goals</subject>"\
" <service-uris>"\
" <entry>"\
" <uri>http://sharepoint/salesgroup/</uri>"\
" <purpose>web-page</purpose>"\
" </entry>"\
" </service-uris>"\
" </conference-description>"\
" <!--"\
" CONFERENCE STATE"\
" -->"\
" <conference-state>"\
" <user-count>33</user-count>"\
" </conference-state>"\
" <!--"\
" USERS"\
" -->"\
" <users>"\
" <user entity=\"sip:alice@example.com\" state=\"partial\">"\
" <display-text>Alice Hoskins</display-text>"\
" <roles>"\
" <entry>participant</entry>"\
" </roles>"\
" <!--"\
" ENDPOINTS"\
" -->"\
" <endpoint entity=\"sip:alice@pc33.example.com\">"\
" <display-text>Alice's Laptop</display-text>"\
" <status>disconnected</status>"\
" <disconnection-method>departed</disconnection-method>"\
" <disconnection-info>"\
" <when>2005-03-04T20:00:00Z</when>"\
" <reason>bad voice quality</reason>"\
" <by>sip:mike@example.com</by>"\
" </disconnection-info>"\
" <!--"\
" MEDIA"\
" -->"\
" <media id=\"1\">"\
" <display-text>main audio</display-text>"\
" <type>audio</type>"\
" <label>34567</label>"\
" <src-id>432424</src-id>"\
" <status>sendrecv</status>"\
" </media>"\
" </endpoint>"\
" </user>"\
" </users>"\
" </conference-info>";
static const char *bobUri = "sip:bob@example.com";
static const char *aliceUri = "sip:alice@example.com";
static const char *frankUri = "sip:frank@example.com";
static const char *confUri = "sips:conf233@example.com";
void linphone_conf_event_notify(LinphoneEvent *lev) {
LinphoneContent* content = linphone_core_create_content(lev->lc);
const char* uri = linphone_address_as_string_uri_only((LinphoneAddress*)sal_op_get_to_address(lev->op));
char notify[strlen(first_notify) + strlen(uri)];
snprintf(notify, sizeof(notify), first_notify, uri);
linphone_content_set_buffer(content,notify,strlen(notify));
linphone_event_notify(lev, content);
linphone_content_unref(content);
}
class ConferenceEventTester : public Conference::ConferenceListener {
public:
Conference::ConferenceEventPackage *cep;
map<string, int> *participants;
ConferenceEventTester(LinphoneCore *lc, LinphoneAddress *confAddr);
~ConferenceEventTester();
void conferenceCreated(LinphoneAddress *confAddress);
void conferenceTerminated(LinphoneAddress *confAddress);
void participantAdded(LinphoneAddress *addr);
void participantRemoved(LinphoneAddress *addr);
void participantSetAdmin(LinphoneAddress *addr, bool isAdmin);
};
ConferenceEventTester::~ConferenceEventTester() {
this->cep->~ConferenceEventPackage();
}
ConferenceEventTester::ConferenceEventTester(LinphoneCore *lc, LinphoneAddress *confAddr) {
this->cep = new Conference::ConferenceEventPackage(lc, this, confAddr);
this->participants = new map<string, int>;
}
void ConferenceEventTester::conferenceCreated(LinphoneAddress *confAddress) {}
void ConferenceEventTester::conferenceTerminated(LinphoneAddress *confAddress){}
void ConferenceEventTester::participantAdded(LinphoneAddress *addr) {
this->participants->insert(pair<string, int>(linphone_address_as_string(addr),0));
}
void ConferenceEventTester::participantRemoved(LinphoneAddress *addr){
this->participants->erase(linphone_address_as_string(addr));
}
void ConferenceEventTester::participantSetAdmin(LinphoneAddress *addr, bool isAdmin){
const char *addrAsString = linphone_address_as_string(addr);
if(this->participants->find(addrAsString) != this->participants->end()) {
this->participants->erase(addrAsString);
this->participants->insert(pair<string, int>(addrAsString, isAdmin ? 1 : 0));
}
}
void first_notify_parsing(void){
LinphoneCoreManager* marie = linphone_core_manager_new("marie_rc");
LinphoneAddress *confAddress = linphone_core_interpret_url(marie->lc, confUri);
ConferenceEventTester *tester = new ConferenceEventTester(marie->lc, confAddress);
LinphoneAddress *bobAddr = linphone_core_interpret_url(marie->lc, bobUri);
LinphoneAddress *aliceAddr = linphone_core_interpret_url(marie->lc, aliceUri);
char notify[strlen(first_notify) + strlen(confUri)];
snprintf(notify, sizeof(notify), first_notify, confUri);
tester->cep->notifyReceived(notify);
BC_ASSERT_EQUAL(tester->participants->size(), 2, int, "%d");
BC_ASSERT_TRUE(tester->participants->find(linphone_address_as_string(bobAddr)) != tester->participants->end());
BC_ASSERT_TRUE(tester->participants->find(linphone_address_as_string(aliceAddr)) != tester->participants->end());
BC_ASSERT_TRUE(tester->participants->find(linphone_address_as_string(bobAddr))->second == 0);
BC_ASSERT_TRUE(tester->participants->find(linphone_address_as_string(aliceAddr))->second == 1);
linphone_address_unref(bobAddr);
linphone_address_unref(aliceAddr);
linphone_address_unref(confAddress);
tester->ConferenceEventTester::~ConferenceEventTester();
linphone_core_manager_destroy(marie);
}
void first_notify_parsing_wrong_conf(void){
LinphoneCoreManager* marie = linphone_core_manager_new("marie_rc");
LinphoneAddress *confAddress = linphone_core_interpret_url(marie->lc, "sips:conf322@example.com");
ConferenceEventTester *tester = new ConferenceEventTester(marie->lc, confAddress);
LinphoneAddress *bobAddr = linphone_core_interpret_url(marie->lc, bobUri);
LinphoneAddress *aliceAddr = linphone_core_interpret_url(marie->lc, aliceUri);
char notify[strlen(first_notify) + strlen(confUri)];
snprintf(notify, sizeof(notify), first_notify, confUri);
tester->cep->notifyReceived(notify);
BC_ASSERT_EQUAL(tester->participants->size(), 0, int, "%d");
BC_ASSERT_FALSE(tester->participants->find(linphone_address_as_string(bobAddr)) != tester->participants->end());
BC_ASSERT_FALSE(tester->participants->find(linphone_address_as_string(aliceAddr)) != tester->participants->end());
linphone_address_unref(bobAddr);
linphone_address_unref(aliceAddr);
linphone_address_unref(confAddress);
tester->ConferenceEventTester::~ConferenceEventTester();
linphone_core_manager_destroy(marie);
}
void participant_added_parsing(void){
LinphoneCoreManager* marie = linphone_core_manager_new("marie_rc");
LinphoneAddress *confAddress = linphone_core_interpret_url(marie->lc, confUri);
ConferenceEventTester *tester = new ConferenceEventTester(marie->lc, confAddress);
LinphoneAddress *bobAddr = linphone_core_interpret_url(marie->lc, bobUri);
LinphoneAddress *aliceAddr = linphone_core_interpret_url(marie->lc, aliceUri);
LinphoneAddress *frankAddr = linphone_core_interpret_url(marie->lc, frankUri);
char notify[strlen(first_notify) + strlen(confUri)];
char notify_added[strlen(participant_added_notify) + strlen(confUri)];
snprintf(notify, sizeof(notify), first_notify, confUri);
tester->cep->notifyReceived(notify);
BC_ASSERT_EQUAL(tester->participants->size(), 2, int, "%d");
BC_ASSERT_TRUE(tester->participants->find(linphone_address_as_string(bobAddr)) != tester->participants->end());
BC_ASSERT_TRUE(tester->participants->find(linphone_address_as_string(aliceAddr)) != tester->participants->end());
BC_ASSERT_TRUE(tester->participants->find(linphone_address_as_string(bobAddr))->second == 0);
BC_ASSERT_TRUE(tester->participants->find(linphone_address_as_string(aliceAddr))->second == 1);
snprintf(notify_added, sizeof(notify_added), participant_added_notify, confUri);
tester->cep->notifyReceived(notify_added);
BC_ASSERT_EQUAL(tester->participants->size(), 3, int, "%d");
BC_ASSERT_TRUE(tester->participants->find(linphone_address_as_string(frankAddr)) != tester->participants->end());
BC_ASSERT_TRUE(tester->participants->find(linphone_address_as_string(frankAddr))->second == 0);
linphone_address_unref(bobAddr);
linphone_address_unref(aliceAddr);
linphone_address_unref(frankAddr);
linphone_address_unref(confAddress);
tester->ConferenceEventTester::~ConferenceEventTester();
linphone_core_manager_destroy(marie);
}
void participant_not_added_parsing(void){
LinphoneCoreManager* marie = linphone_core_manager_new("marie_rc");
LinphoneAddress *confAddress = linphone_core_interpret_url(marie->lc, confUri);
ConferenceEventTester *tester = new ConferenceEventTester(marie->lc, confAddress);
LinphoneAddress *bobAddr = linphone_core_interpret_url(marie->lc, bobUri);
LinphoneAddress *aliceAddr = linphone_core_interpret_url(marie->lc, aliceUri);
LinphoneAddress *frankAddr = linphone_core_interpret_url(marie->lc, frankUri);
char notify[strlen(first_notify) + strlen(confUri)];
char notify_not_added[strlen(participant_not_added_notify) + strlen(confUri)];
snprintf(notify, sizeof(notify), first_notify, confUri);
tester->cep->notifyReceived(notify);
BC_ASSERT_EQUAL(tester->participants->size(), 2, int, "%d");
BC_ASSERT_TRUE(tester->participants->find(linphone_address_as_string(bobAddr)) != tester->participants->end());
BC_ASSERT_TRUE(tester->participants->find(linphone_address_as_string(aliceAddr)) != tester->participants->end());
BC_ASSERT_TRUE(tester->participants->find(linphone_address_as_string(bobAddr))->second == 0);
BC_ASSERT_TRUE(tester->participants->find(linphone_address_as_string(aliceAddr))->second == 1);
snprintf(notify_not_added, sizeof(notify_not_added), participant_not_added_notify, confUri);
tester->cep->notifyReceived(notify_not_added);
BC_ASSERT_EQUAL(tester->participants->size(), 2, int, "%d");
BC_ASSERT_FALSE(tester->participants->find(linphone_address_as_string(frankAddr)) != tester->participants->end());
linphone_address_unref(bobAddr);
linphone_address_unref(aliceAddr);
linphone_address_unref(frankAddr);
linphone_address_unref(confAddress);
tester->ConferenceEventTester::~ConferenceEventTester();
linphone_core_manager_destroy(marie);
}
void participant_deleted_parsing(void){
LinphoneCoreManager* marie = linphone_core_manager_new("marie_rc");
LinphoneAddress *confAddress = linphone_core_interpret_url(marie->lc, confUri);
ConferenceEventTester *tester = new ConferenceEventTester(marie->lc, confAddress);
LinphoneAddress *bobAddr = linphone_core_interpret_url(marie->lc, bobUri);
LinphoneAddress *aliceAddr = linphone_core_interpret_url(marie->lc, aliceUri);
char notify[strlen(first_notify) + strlen(confUri)];
char notify_deleted[strlen(participant_deleted_notify) + strlen(confUri)];
snprintf(notify, sizeof(notify), first_notify, confUri);
tester->cep->notifyReceived(notify);
BC_ASSERT_EQUAL(tester->participants->size(), 2, int, "%d");
BC_ASSERT_TRUE(tester->participants->find(linphone_address_as_string(bobAddr)) != tester->participants->end());
BC_ASSERT_TRUE(tester->participants->find(linphone_address_as_string(aliceAddr)) != tester->participants->end());
BC_ASSERT_TRUE(tester->participants->find(linphone_address_as_string(bobAddr))->second == 0);
BC_ASSERT_TRUE(tester->participants->find(linphone_address_as_string(aliceAddr))->second == 1);
snprintf(notify_deleted, sizeof(notify_deleted), participant_deleted_notify, confUri);
tester->cep->notifyReceived(notify_deleted);
BC_ASSERT_EQUAL(tester->participants->size(), 1, int, "%d");
BC_ASSERT_FALSE(tester->participants->find(linphone_address_as_string(bobAddr)) != tester->participants->end());
linphone_address_unref(bobAddr);
linphone_address_unref(aliceAddr);
linphone_address_unref(confAddress);
tester->ConferenceEventTester::~ConferenceEventTester();
linphone_core_manager_destroy(marie);
}
void participant_admined_parsing(void){
LinphoneCoreManager* marie = linphone_core_manager_new("marie_rc");
LinphoneAddress *confAddress = linphone_core_interpret_url(marie->lc, confUri);
ConferenceEventTester *tester = new ConferenceEventTester(marie->lc, confAddress);
LinphoneAddress *bobAddr = linphone_core_interpret_url(marie->lc, bobUri);
LinphoneAddress *aliceAddr = linphone_core_interpret_url(marie->lc, aliceUri);
char notify[strlen(first_notify) + strlen(confUri)];
char notify_admined[strlen(participant_admined_notify) + strlen(confUri)];
snprintf(notify, sizeof(notify), first_notify, confUri);
tester->cep->notifyReceived(notify);
BC_ASSERT_EQUAL(tester->participants->size(), 2, int, "%d");
BC_ASSERT_TRUE(tester->participants->find(linphone_address_as_string(bobAddr)) != tester->participants->end());
BC_ASSERT_TRUE(tester->participants->find(linphone_address_as_string(aliceAddr)) != tester->participants->end());
BC_ASSERT_TRUE(tester->participants->find(linphone_address_as_string(bobAddr))->second == 0);
BC_ASSERT_TRUE(tester->participants->find(linphone_address_as_string(aliceAddr))->second == 1);
snprintf(notify_admined, sizeof(notify_admined), participant_admined_notify, confUri);
tester->cep->notifyReceived(notify_admined);
BC_ASSERT_EQUAL(tester->participants->size(), 2, int, "%d");
BC_ASSERT_TRUE(tester->participants->find(linphone_address_as_string(bobAddr)) != tester->participants->end());
BC_ASSERT_TRUE(tester->participants->find(linphone_address_as_string(bobAddr))->second == 1);
linphone_address_unref(bobAddr);
linphone_address_unref(aliceAddr);
linphone_address_unref(confAddress);
tester->ConferenceEventTester::~ConferenceEventTester();
linphone_core_manager_destroy(marie);
}
void participant_unadmined_parsing(void){
LinphoneCoreManager* marie = linphone_core_manager_new("marie_rc");
LinphoneAddress *confAddress = linphone_core_interpret_url(marie->lc, confUri);
ConferenceEventTester *tester = new ConferenceEventTester(marie->lc, confAddress);
LinphoneAddress *bobAddr = linphone_core_interpret_url(marie->lc, bobUri);
LinphoneAddress *aliceAddr = linphone_core_interpret_url(marie->lc, aliceUri);
char notify[strlen(first_notify) + strlen(confUri)];
char notify_unadmined[strlen(participant_unadmined_notify) + strlen(confUri)];
snprintf(notify, sizeof(notify), first_notify, confUri);
tester->cep->notifyReceived(notify);
BC_ASSERT_EQUAL(tester->participants->size(), 2, int, "%d");
BC_ASSERT_TRUE(tester->participants->find(linphone_address_as_string(bobAddr)) != tester->participants->end());
BC_ASSERT_TRUE(tester->participants->find(linphone_address_as_string(aliceAddr)) != tester->participants->end());
BC_ASSERT_TRUE(tester->participants->find(linphone_address_as_string(bobAddr))->second == 0);
BC_ASSERT_TRUE(tester->participants->find(linphone_address_as_string(aliceAddr))->second == 1);
snprintf(notify_unadmined, sizeof(notify_unadmined), participant_unadmined_notify, confUri);
tester->cep->notifyReceived(notify_unadmined);
BC_ASSERT_EQUAL(tester->participants->size(), 2, int, "%d");
BC_ASSERT_TRUE(tester->participants->find(linphone_address_as_string(aliceAddr)) != tester->participants->end());
BC_ASSERT_TRUE(tester->participants->find(linphone_address_as_string(aliceAddr))->second == 0);
linphone_address_unref(bobAddr);
linphone_address_unref(aliceAddr);
linphone_address_unref(confAddress);
tester->ConferenceEventTester::~ConferenceEventTester();
linphone_core_manager_destroy(marie);
}
void send_subscribe_receive_first_notify(void){
LinphoneCoreManager* marie = linphone_core_manager_new("marie_rc");
LinphoneCoreManager* pauline = linphone_core_manager_new(transport_supported(LinphoneTransportTls) ? "pauline_rc" : "pauline_tcp_rc");
ConferenceEventTester *tester = new ConferenceEventTester(marie->lc, pauline->identity);
LinphoneAddress *bobAddr = linphone_core_interpret_url(marie->lc, bobUri);
LinphoneAddress *aliceAddr = linphone_core_interpret_url(marie->lc, aliceUri);
string confId("conf233");
BC_ASSERT_TRUE(wait_for_until(marie->lc,pauline->lc,&marie->stat.number_of_LinphoneRegistrationOk,1,1000));
BC_ASSERT_TRUE(wait_for_until(marie->lc,pauline->lc,&pauline->stat.number_of_LinphoneRegistrationOk,1,1000));
tester->cep->subscribe(confId);
BC_ASSERT_TRUE(wait_for_until(marie->lc,pauline->lc,&pauline->stat.number_of_LinphoneSubscriptionIncomingReceived,1,1000));
BC_ASSERT_TRUE(wait_for_until(marie->lc,pauline->lc,&pauline->stat.number_of_LinphoneSubscriptionActive,1,3000));
wait_for_until(marie->lc,pauline->lc,&marie->stat.number_of_NotifyReceived,1,3000);
BC_ASSERT_EQUAL(tester->participants->size(), 2, int, "%d");
BC_ASSERT_TRUE(tester->participants->find(linphone_address_as_string(bobAddr)) != tester->participants->end());
BC_ASSERT_TRUE(tester->participants->find(linphone_address_as_string(aliceAddr)) != tester->participants->end());
BC_ASSERT_TRUE(tester->participants->find(linphone_address_as_string(bobAddr))->second == 0);
BC_ASSERT_TRUE(tester->participants->find(linphone_address_as_string(aliceAddr))->second == 1);
tester->cep->unsubscribe();
BC_ASSERT_TRUE(wait_for_until(marie->lc,pauline->lc,&pauline->stat.number_of_LinphoneSubscriptionTerminated,1,1000));
linphone_address_unref(bobAddr);
linphone_address_unref(aliceAddr);
tester->ConferenceEventTester::~ConferenceEventTester();
linphone_core_manager_destroy(marie);
linphone_core_manager_destroy(pauline);
}
test_t conf_event_tests[] = {
TEST_NO_TAG("First notify parsing", first_notify_parsing),
TEST_NO_TAG("First notify parsing wrong conf", first_notify_parsing_wrong_conf),
TEST_NO_TAG("Participant added", participant_added_parsing),
TEST_NO_TAG("Participant not added", participant_not_added_parsing),
TEST_NO_TAG("Participant deleted", participant_deleted_parsing),
TEST_NO_TAG("Participant admined", participant_admined_parsing),
TEST_NO_TAG("Participant unadmined", participant_unadmined_parsing),
TEST_NO_TAG("Send subscribe receive first notify", send_subscribe_receive_first_notify)
};
test_suite_t conf_event_test_suite = {"Conf event package", NULL, NULL, liblinphone_tester_before_each, liblinphone_tester_after_each,
sizeof(conf_event_tests) / sizeof(conf_event_tests[0]), conf_event_tests};

View file

@ -82,7 +82,11 @@ void linphone_subscription_state_change(LinphoneCore *lc, LinphoneEvent *lev, Li
counters->number_of_LinphoneSubscriptionActive++;
if (linphone_event_get_subscription_dir(lev)==LinphoneSubscriptionIncoming){
mgr->lev=lev;
linphone_event_notify(lev,content);
if(strcmp(linphone_event_get_name(lev), "Conference") == 0) {
linphone_conf_event_notify(lev);
} else {
linphone_event_notify(lev,content);
}
}
break;
case LinphoneSubscriptionTerminated:

View file

@ -48,6 +48,7 @@ extern test_suite_t presence_test_suite;
extern test_suite_t presence_server_test_suite;
extern test_suite_t upnp_test_suite;
extern test_suite_t event_test_suite;
extern test_suite_t conf_event_test_suite;
extern test_suite_t flexisip_test_suite;
extern test_suite_t stun_test_suite;
extern test_suite_t remote_provisioning_test_suite;
@ -401,7 +402,7 @@ LinphoneAddress * linphone_core_manager_resolve(LinphoneCoreManager *mgr, const
FILE *sip_start(const char *senario, const char* dest_username, const char *passwd, LinphoneAddress* dest_addres);
void early_media_without_sdp_in_200_base( bool_t use_video, bool_t use_ice );
void linphone_conf_event_notify(LinphoneEvent *lev);
#ifdef __cplusplus
};

View file

@ -566,7 +566,7 @@ void liblinphone_tester_add_suites() {
#endif
bc_tester_add_suite(&stun_test_suite);
bc_tester_add_suite(&event_test_suite);
bc_tester_add_suite(&flexisip_test_suite);
bc_tester_add_suite(&conf_event_test_suite);
bc_tester_add_suite(&remote_provisioning_test_suite);
bc_tester_add_suite(&quality_reporting_test_suite);
bc_tester_add_suite(&log_collection_test_suite);