Commit 9c4cd6cd authored by Ghislain MARY's avatar Ghislain MARY

Use xsd for imdn xml handling.

parent 41259c58
......@@ -164,6 +164,8 @@ set(LINPHONE_CXX_OBJECTS_PRIVATE_HEADER_FILES
utils/payload-type-handler.h
variant/variant.h
xml/conference-info.h
xml/imdn.h
xml/linphone-imdn.h
xml/resource-lists.h
xml/xml.h
)
......@@ -286,6 +288,8 @@ set(LINPHONE_CXX_OBJECTS_SOURCE_FILES
utils/utils.cpp
variant/variant.cpp
xml/conference-info.cpp
xml/imdn.cpp
xml/linphone-imdn.cpp
xml/resource-lists.cpp
xml/xml.cpp
)
......
This diff is collapsed.
......@@ -57,7 +57,6 @@ public:
static void parse (const std::shared_ptr<ChatMessage> &chatMessage);
private:
static void parse (const std::shared_ptr<ChatMessage> &chatMessage, xmlparsing_context_t *xmlCtx);
static int timerExpired (void *data, unsigned int revents);
void send ();
......@@ -65,8 +64,6 @@ private:
void stopTimer ();
private:
static const std::string imdnPrefix;
ChatRoom *chatRoom = nullptr;
std::list<const std::shared_ptr<ChatMessage>> deliveredMessages;
std::list<const std::shared_ptr<ChatMessage>> displayedMessages;
......
......@@ -36,10 +36,11 @@
#if __clang__ || __GNUC__ >= 4
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wfloat-equal"
#endif
#if __GNUC__ > 5 || (__GNUC__ == 5 && __GNUC_MINOR__ >= 1)
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wsuggest-override"
#endif
#endif
//
// End prologue.
......@@ -54,7 +55,7 @@ namespace LinphonePrivate
namespace ConferenceInfo
{
// ConferenceType
//
//
const ConferenceType::ConferenceDescriptionOptional& ConferenceType::
getConferenceDescription () const
......@@ -376,7 +377,7 @@ namespace LinphonePrivate
// StateType
//
//
StateType::
StateType (Value v)
......@@ -413,7 +414,7 @@ namespace LinphonePrivate
StateType& StateType::
operator= (Value v)
{
static_cast< ::LinphonePrivate::Xsd::XmlSchema::String& > (*this) =
static_cast< ::LinphonePrivate::Xsd::XmlSchema::String& > (*this) =
::LinphonePrivate::Xsd::XmlSchema::String (_xsd_StateType_literals_[v]);
return *this;
......@@ -421,7 +422,7 @@ namespace LinphonePrivate
// ConferenceDescriptionType
//
//
const ConferenceDescriptionType::DisplayTextOptional& ConferenceDescriptionType::
getDisplayText () const
......@@ -707,7 +708,7 @@ namespace LinphonePrivate
// HostType
//
//
const HostType::DisplayTextOptional& HostType::
getDisplayText () const
......@@ -849,7 +850,7 @@ namespace LinphonePrivate
// ConferenceStateType
//
//
const ConferenceStateType::UserCountOptional& ConferenceStateType::
getUserCount () const
......@@ -973,7 +974,7 @@ namespace LinphonePrivate
// ConferenceMediaType
//
//
const ConferenceMediaType::EntrySequence& ConferenceMediaType::
getEntry () const
......@@ -1025,7 +1026,7 @@ namespace LinphonePrivate
// ConferenceMediumType
//
//
const ConferenceMediumType::DisplayTextOptional& ConferenceMediumType::
getDisplayText () const
......@@ -1197,7 +1198,7 @@ namespace LinphonePrivate
// UrisType
//
//
const UrisType::EntrySequence& UrisType::
getEntry () const
......@@ -1285,7 +1286,7 @@ namespace LinphonePrivate
// UriType
//
//
const UriType::UriType1& UriType::
getUri () const
......@@ -1481,7 +1482,7 @@ namespace LinphonePrivate
}
// UsersType
//
//
const UsersType::UserSequence& UsersType::
getUser () const
......@@ -1587,7 +1588,7 @@ namespace LinphonePrivate
// UserType
//
//
const UserType::DisplayTextOptional& UserType::
getDisplayText () const
......@@ -1873,7 +1874,7 @@ namespace LinphonePrivate
// UserRolesType
//
//
const UserRolesType::EntrySequence& UserRolesType::
getEntry () const
......@@ -1949,7 +1950,7 @@ namespace LinphonePrivate
}
// EndpointType
//
//
const EndpointType::DisplayTextOptional& EndpointType::
getDisplayText () const
......@@ -2325,7 +2326,7 @@ namespace LinphonePrivate
// EndpointStatusType
//
//
EndpointStatusType::
EndpointStatusType (Value v)
......@@ -2362,7 +2363,7 @@ namespace LinphonePrivate
EndpointStatusType& EndpointStatusType::
operator= (Value v)
{
static_cast< ::LinphonePrivate::Xsd::XmlSchema::String& > (*this) =
static_cast< ::LinphonePrivate::Xsd::XmlSchema::String& > (*this) =
::LinphonePrivate::Xsd::XmlSchema::String (_xsd_EndpointStatusType_literals_[v]);
return *this;
......@@ -2370,7 +2371,7 @@ namespace LinphonePrivate
// JoiningType
//
//
JoiningType::
JoiningType (Value v)
......@@ -2407,7 +2408,7 @@ namespace LinphonePrivate
JoiningType& JoiningType::
operator= (Value v)
{
static_cast< ::LinphonePrivate::Xsd::XmlSchema::String& > (*this) =
static_cast< ::LinphonePrivate::Xsd::XmlSchema::String& > (*this) =
::LinphonePrivate::Xsd::XmlSchema::String (_xsd_JoiningType_literals_[v]);
return *this;
......@@ -2415,7 +2416,7 @@ namespace LinphonePrivate
// DisconnectionType
//
//
DisconnectionType::
DisconnectionType (Value v)
......@@ -2452,7 +2453,7 @@ namespace LinphonePrivate
DisconnectionType& DisconnectionType::
operator= (Value v)
{
static_cast< ::LinphonePrivate::Xsd::XmlSchema::String& > (*this) =
static_cast< ::LinphonePrivate::Xsd::XmlSchema::String& > (*this) =
::LinphonePrivate::Xsd::XmlSchema::String (_xsd_DisconnectionType_literals_[v]);
return *this;
......@@ -2460,7 +2461,7 @@ namespace LinphonePrivate
// ExecutionType
//
//
const ExecutionType::WhenOptional& ExecutionType::
getWhen () const
......@@ -2584,7 +2585,7 @@ namespace LinphonePrivate
// CallType
//
//
const CallType::SipOptional& CallType::
getSip () const
......@@ -2666,7 +2667,7 @@ namespace LinphonePrivate
// SipDialogIdType
//
//
const SipDialogIdType::DisplayTextOptional& SipDialogIdType::
getDisplayText () const
......@@ -2838,7 +2839,7 @@ namespace LinphonePrivate
// MediaType
//
//
const MediaType::DisplayTextOptional& MediaType::
getDisplayText () const
......@@ -3070,7 +3071,7 @@ namespace LinphonePrivate
// MediaStatusType
//
//
MediaStatusType::
MediaStatusType (Value v)
......@@ -3107,7 +3108,7 @@ namespace LinphonePrivate
MediaStatusType& MediaStatusType::
operator= (Value v)
{
static_cast< ::LinphonePrivate::Xsd::XmlSchema::String& > (*this) =
static_cast< ::LinphonePrivate::Xsd::XmlSchema::String& > (*this) =
::LinphonePrivate::Xsd::XmlSchema::String (_xsd_MediaStatusType_literals_[v]);
return *this;
......@@ -3115,7 +3116,7 @@ namespace LinphonePrivate
// SidebarsByValType
//
//
const SidebarsByValType::EntrySequence& SidebarsByValType::
getEntry () const
......@@ -3208,6 +3209,15 @@ namespace LinphonePrivate
#include <xsd/cxx/xml/dom/parsing-source.hxx>
#include <xsd/cxx/tree/type-factory-map.hxx>
namespace _xsd
{
static
const ::xsd::cxx::tree::type_factory_plate< 0, char >
type_factory_plate_init;
}
namespace LinphonePrivate
{
namespace Xsd
......@@ -6779,6 +6789,15 @@ namespace LinphonePrivate
#include <ostream>
#include <xsd/cxx/tree/std-ostream-map.hxx>
namespace _xsd
{
static
const ::xsd::cxx::tree::std_ostream_plate< 0, char >
std_ostream_plate_init;
}
namespace LinphonePrivate
{
namespace Xsd
......@@ -7563,6 +7582,15 @@ namespace LinphonePrivate
#include <xsd/cxx/tree/error-handler.hxx>
#include <xsd/cxx/xml/dom/serialization-source.hxx>
#include <xsd/cxx/tree/type-serializer-map.hxx>
namespace _xsd
{
static
const ::xsd::cxx::tree::type_serializer_plate< 0, char >
type_serializer_plate_init;
}
namespace LinphonePrivate
{
namespace Xsd
......@@ -9304,8 +9332,12 @@ namespace LinphonePrivate
// Begin epilogue.
//
#if __GNUC__ > 5 || (__GNUC__ == 5 && __GNUC_MINOR__ >= 1)
#pragma GCC diagnostic pop
#endif
#if __clang__ || __GNUC__ >= 4
#pragma GCC diagnostic pop
#endif
//
// End epilogue.
......@@ -51,10 +51,11 @@
#if __clang__ || __GNUC__ >= 4
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wfloat-equal"
#endif
#if __GNUC__ > 5 || (__GNUC__ == 5 && __GNUC_MINOR__ >= 1)
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wsuggest-override"
#endif
#endif
//
// End prologue.
......@@ -240,6 +241,8 @@ namespace LinphonePrivate
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::no_type_info< char > NoTypeInfo;
typedef ::xsd::cxx::tree::not_derived< char > NotDerived;
typedef ::xsd::cxx::tree::serialization< char > Serialization;
// Error handler callback interface.
......@@ -573,7 +576,7 @@ namespace LinphonePrivate
ConferenceType&
operator= (const ConferenceType& x);
virtual
virtual
~ConferenceType ();
// Implementation.
......@@ -882,7 +885,7 @@ namespace LinphonePrivate
ConferenceDescriptionType&
operator= (const ConferenceDescriptionType& x);
virtual
virtual
~ConferenceDescriptionType ();
// Implementation.
......@@ -1030,7 +1033,7 @@ namespace LinphonePrivate
HostType&
operator= (const HostType& x);
virtual
virtual
~HostType ();
// Implementation.
......@@ -1164,7 +1167,7 @@ namespace LinphonePrivate
ConferenceStateType&
operator= (const ConferenceStateType& x);
virtual
virtual
~ConferenceStateType ();
// Implementation.
......@@ -1246,7 +1249,7 @@ namespace LinphonePrivate
ConferenceMediaType&
operator= (const ConferenceMediaType& x);
virtual
virtual
~ConferenceMediaType ();
// Implementation.
......@@ -1406,7 +1409,7 @@ namespace LinphonePrivate
ConferenceMediumType&
operator= (const ConferenceMediumType& x);
virtual
virtual
~ConferenceMediumType ();
// Implementation.
......@@ -1512,7 +1515,7 @@ namespace LinphonePrivate
UrisType&
operator= (const UrisType& x);
virtual
virtual
~UrisType ();
// Implementation.
......@@ -1674,7 +1677,7 @@ namespace LinphonePrivate
UriType&
operator= (const UriType& x);
virtual
virtual
~UriType ();
// Implementation.
......@@ -1730,7 +1733,7 @@ namespace LinphonePrivate
_clone (::LinphonePrivate::Xsd::XmlSchema::Flags f = 0,
::LinphonePrivate::Xsd::XmlSchema::Container* c = 0) const;
virtual
virtual
~KeywordsType ();
};
......@@ -1834,7 +1837,7 @@ namespace LinphonePrivate
UsersType&
operator= (const UsersType& x);
virtual
virtual
~UsersType ();
// Implementation.
......@@ -2080,7 +2083,7 @@ namespace LinphonePrivate
UserType&
operator= (const UserType& x);
virtual
virtual
~UserType ();
// Implementation.
......@@ -2168,7 +2171,7 @@ namespace LinphonePrivate
UserRolesType&
operator= (const UserRolesType& x);
virtual
virtual
~UserRolesType ();
// Implementation.
......@@ -2220,7 +2223,7 @@ namespace LinphonePrivate
_clone (::LinphonePrivate::Xsd::XmlSchema::Flags f = 0,
::LinphonePrivate::Xsd::XmlSchema::Container* c = 0) const;
virtual
virtual
~UserLanguagesType ();
};
......@@ -2513,7 +2516,7 @@ namespace LinphonePrivate
EndpointType&
operator= (const EndpointType& x);
virtual
virtual
~EndpointType ();
// Implementation.
......@@ -2828,7 +2831,7 @@ namespace LinphonePrivate
ExecutionType&
operator= (const ExecutionType& x);
virtual
virtual
~ExecutionType ();
// Implementation.
......@@ -2928,7 +2931,7 @@ namespace LinphonePrivate
CallType&
operator= (const CallType& x);
virtual
virtual
~CallType ();
// Implementation.
......@@ -3089,7 +3092,7 @@ namespace LinphonePrivate
SipDialogIdType&
operator= (const SipDialogIdType& x);
virtual
virtual
~SipDialogIdType ();
// Implementation.
......@@ -3295,7 +3298,7 @@ namespace LinphonePrivate
MediaType&
operator= (const MediaType& x);
virtual
virtual
~MediaType ();
// Implementation.
......@@ -3461,7 +3464,7 @@ namespace LinphonePrivate
SidebarsByValType&
operator= (const SidebarsByValType& x);
virtual
virtual
~SidebarsByValType ();
// Implementation.
......@@ -3708,14 +3711,14 @@ namespace LinphonePrivate
void
serializeConferenceInfo (::std::ostream& os,
const ::LinphonePrivate::Xsd::ConferenceInfo::ConferenceType& x,
const ::LinphonePrivate::Xsd::ConferenceInfo::ConferenceType& x,
const ::LinphonePrivate::Xsd::XmlSchema::NamespaceInfomap& m = ::LinphonePrivate::Xsd::XmlSchema::NamespaceInfomap (),
const ::std::string& e = "UTF-8",
::LinphonePrivate::Xsd::XmlSchema::Flags f = 0);
void
serializeConferenceInfo (::std::ostream& os,
const ::LinphonePrivate::Xsd::ConferenceInfo::ConferenceType& x,
const ::LinphonePrivate::Xsd::ConferenceInfo::ConferenceType& x,
::LinphonePrivate::Xsd::XmlSchema::ErrorHandler& eh,
const ::LinphonePrivate::Xsd::XmlSchema::NamespaceInfomap& m = ::LinphonePrivate::Xsd::XmlSchema::NamespaceInfomap (),
const ::std::string& e = "UTF-8",
......@@ -3723,7 +3726,7 @@ namespace LinphonePrivate
void
serializeConferenceInfo (::std::ostream& os,
const ::LinphonePrivate::Xsd::ConferenceInfo::ConferenceType& x,
const ::LinphonePrivate::Xsd::ConferenceInfo::ConferenceType& x,
::xercesc::DOMErrorHandler& eh,
const ::LinphonePrivate::Xsd::XmlSchema::NamespaceInfomap& m = ::LinphonePrivate::Xsd::XmlSchema::NamespaceInfomap (),
const ::std::string& e = "UTF-8",
......@@ -3734,14 +3737,14 @@ namespace LinphonePrivate
void
serializeConferenceInfo (::xercesc::XMLFormatTarget& ft,
const ::LinphonePrivate::Xsd::ConferenceInfo::ConferenceType& x,
const ::LinphonePrivate::Xsd::ConferenceInfo::ConferenceType& x,
const ::LinphonePrivate::Xsd::XmlSchema::NamespaceInfomap& m = ::LinphonePrivate::Xsd::XmlSchema::NamespaceInfomap (),
const ::std::string& e = "UTF-8",
::LinphonePrivate::Xsd::XmlSchema::Flags f = 0);
void
serializeConferenceInfo (::xercesc::XMLFormatTarget& ft,
const ::LinphonePrivate::Xsd::ConferenceInfo::ConferenceType& x,
const ::LinphonePrivate::Xsd::ConferenceInfo::ConferenceType& x,
::LinphonePrivate::Xsd::XmlSchema::ErrorHandler& eh,
const ::LinphonePrivate::Xsd::XmlSchema::NamespaceInfomap& m = ::LinphonePrivate::Xsd::XmlSchema::NamespaceInfomap (),
const ::std::string& e = "UTF-8",
......@@ -3749,7 +3752,7 @@ namespace LinphonePrivate
void
serializeConferenceInfo (::xercesc::XMLFormatTarget& ft,
const ::LinphonePrivate::Xsd::ConferenceInfo::ConferenceType& x,
const ::LinphonePrivate::Xsd::ConferenceInfo::ConferenceType& x,
::xercesc::DOMErrorHandler& eh,
const ::LinphonePrivate::Xsd::XmlSchema::NamespaceInfomap& m = ::LinphonePrivate::Xsd::XmlSchema::NamespaceInfomap (),
const ::std::string& e = "UTF-8",
......@@ -3767,7 +3770,7 @@ namespace LinphonePrivate
//
::LinphonePrivate::Xsd::XmlSchema::dom::unique_ptr< ::xercesc::DOMDocument >
serializeConferenceInfo (const ::LinphonePrivate::Xsd::ConferenceInfo::ConferenceType& x,
serializeConferenceInfo (const ::LinphonePrivate::Xsd::ConferenceInfo::ConferenceType& x,
const ::LinphonePrivate::Xsd::XmlSchema::NamespaceInfomap& m = ::LinphonePrivate::Xsd::XmlSchema::NamespaceInfomap (),
::LinphonePrivate::Xsd::XmlSchema::Flags f = 0);
......@@ -3899,6 +3902,9 @@ namespace LinphonePrivate
// Begin epilogue.
//
#if __GNUC__ > 5 || (__GNUC__ == 5 && __GNUC_MINOR__ >= 1)
#pragma GCC diagnostic pop
#endif
#if __clang__ || __GNUC__ >= 4
#pragma GCC diagnostic pop
#endif
......
#if __GNUC__ > 5 || (__GNUC__ == 5 && __GNUC_MINOR__ >= 1)
#pragma GCC diagnostic pop
#endif
#if __clang__ || __GNUC__ >= 4
#pragma GCC diagnostic pop
#endif
......@@ -51,6 +51,7 @@ def generate(name):
"--generate-serialization",
"--generate-ostream",
"--generate-detach",
"--generate-polymorphic",
"--std", "c++11",
"--type-naming", "java",
"--function-naming", "java",
......@@ -62,6 +63,7 @@ def generate(name):
"--show-sloc",
"--prologue-file", prologue_file,
"--epilogue-file", epilogue_file,
"--root-element-first",
"--type-regex", "%(?:[^ ]* )?([^,-]+)-([^,-]+)-([^,-]+)-?([^,-]*)%\\u$1\\u$2\\u$3\\u$4%",
"--type-regex", "%(?:[^ ]* )?([^,-]+)-([^,-]+)-?([^,-]*)%\\u$1\\u$2\\u$3%",
"--type-regex", "%(?:[^ ]* )?([^,-]+)-?([^,-]*)%\\u$1\\u$2%",
......@@ -90,6 +92,8 @@ def generate(name):
"--serializer-regex", "%([^-]+)-?([^-]*)%serialize\\u$1\\u$2%",
"--namespace-map", "http://www.w3.org/2001/XMLSchema=LinphonePrivate::Xsd::XmlSchema",
"--namespace-map", "urn:ietf:params:xml:ns:conference-info=LinphonePrivate::Xsd::ConferenceInfo",
"--namespace-map", "urn:ietf:params:xml:ns:imdn=LinphonePrivate::Xsd::Imdn",
"--namespace-map", "http://www.linphone.org/xsds/imdn.xsd=LinphonePrivate::Xsd::LinphoneImdn",
"--namespace-map", "urn:ietf:params:xml:ns:resource-lists=LinphonePrivate::Xsd::ResourceLists",
source_file
], shell=False)
......@@ -100,6 +104,8 @@ def generate(name):
def main(argv = None):
generate("xml")
generate("conference-info")
generate("imdn")
generate("linphone-imdn")
generate("resource-lists")
if __name__ == "__main__":
......
This diff is collapsed.
This diff is collapsed.
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified"
targetNamespace="urn:ietf:params:xml:ns:imdn"
xmlns:ns1="urn:ietf:params:xml:ns:imdn"
xmlns:ns2="http://www.linphone.org/xsds/imdn.xsd">
<xs:import namespace="http://www.linphone.org/xsds/imdn.xsd" schemaLocation="linphone-imdn.xsd"/>
<xs:element name="imdn">
<xs:complexType>
<xs:sequence>
<xs:element ref="ns1:message-id"/>
<xs:element ref="ns1:datetime"/>
<xs:sequence minOccurs="0">
<xs:element ref="ns1:recipient-uri"/>
<xs:element ref="ns1:original-recipient-uri"/>
<xs:element minOccurs="0" ref="ns1:subject"/>
</xs:sequence>
<xs:choice minOccurs="0">
<xs:element ref="ns1:delivery-notification"/>
<xs:element ref="ns1:display-notification"/>
<xs:element ref="ns1:processing-notification"/>
</xs:choice>
<xs:group ref="ns1:imdnExtension"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="message-id" type="xs:token"/>
<xs:element name="datetime" type="xs:string"/>
<xs:element name="recipient-uri" type="xs:anyURI"/>
<xs:element name="original-recipient-uri" type="xs:anyURI"/>
<xs:element name="subject" type="xs:string"/>
<xs:element name="delivery-notification">
<xs:complexType>
<xs:sequence>
<xs:element name="status">
<xs:complexType>
<xs:sequence>
<xs:choice>
<xs:element ref="ns1:delivered"/>
<xs:element ref="ns1:failed"/>
<xs:element ref="ns1:forbidden"/>
<xs:element ref="ns1:error"/>
</xs:choice>
<xs:group ref="ns1:deliveryExtension"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="delivered">
<xs:complexType/>
</xs:element>
<xs:element name="failed">
<xs:complexType/>
</xs:element>
<xs:element name="display-notification">
<xs:complexType>
<xs:sequence>
<xs:element name="status">
<xs:complexType>
<xs:sequence>
<xs:choice>
<xs:element ref="ns1:displayed"/>
<xs:element ref="ns1:forbidden"/>
<xs:element ref="ns1:error"/>
</xs:choice>
<xs:group ref="ns1:displayExtension"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="displayed">
<xs:complexType/>
</xs:element>
<xs:element name="processing-notification">
<xs:complexType>
<xs:sequence>
<xs:element name="status">
<xs:complexType>
<xs:sequence>
<xs:choice>
<xs:element ref="ns1:processed"/>
<xs:element ref="ns1:stored"/>
<xs:element ref="ns1:forbidden"/>
<xs:element ref="ns1:error"/>
</xs:choice>
<xs:group ref="ns1:processingExtension"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="processed">
<xs:complexType/>
</xs:element>
<xs:element name="stored">
<xs:complexType/>
</xs:element>
<xs:element name="forbidden">
<xs:complexType/>
</xs:element>
<xs:element name="error">
<xs:complexType/>
</xs:element>
<!--
<imdn> extension point for the extension schemas to add
new definitions with the combine="interleave" pattern.
Extension schemas should add proper cardinalities. For
example, the <zeroOrMore> cardinality should be used if
the extension is to allow multiple elements, and the
<optional> cardinality should be used if the extension
is to allow a single optional element.
-->
<xs:group name="imdnExtension">
<xs:sequence>
<xs:group minOccurs="0" maxOccurs="unbounded" ref="ns1:anyIMDN"/>
</xs:sequence>
</xs:group>
<!-- delivery-notification <status> extension point -->
<xs:group name="deliveryExtension">
<!--<xs:sequence>
<xs:group minOccurs="0" maxOccurs="unbounded" ref="ns1:anyIMDN"/>
</xs:sequence>-->
<xs:sequence>