Produits  
  Services et Conseils  
  Fiches Technique  
  SipXTapi avec .Net  
  transformNode en .Net  
  Blowfish et le CF  
  MD5 et le CF  
  Compression HTTP et le CF  
 
 

  Fiches Technique  


Utilisation de sipXtapi avec .Net

read the English version

Définition de la classe d'interop
Interop sur les callback
Quelques liens utiles...

Le SDK sipXtapi est une API écrite en C pour de la voie sur IP. En particulier, sipXtapi fournit une interface générique au dessus de SIP (Session Initiation Protocol), RFC 3261, et RTP (real-time Transport Protocol), RFC 1889.

Alors que les protocoles SIP et RTP fournissent l'infrastructure de notification et de transport, sipXtapi inclus aussi bien d'autres protocoles et implémentation standard nécessaire à la voie sur IP.

Définition de la classe d'interop

La définition des types énumérés et l'encapsulation des méthodes ne pose aucun problème particulier :

using System;
using System.Runtime.InteropServices;

namespace sipXtapi.Interop
{
    /// <summary>
    /// 
    /// </summary>
    public enum SIPX_RESULT : int
    {
        SIPX_RESULT_SUCCESS = 0,      // Success
        SIPX_RESULT_FAILURE,          // Generic Failure
        SIPX_RESULT_NOT_IMPLEMENTED,  // Method/API not implemented
        SIPX_RESULT_OUT_OF_MEMORY,    // Unable to allocate enough memory 
                                      // to perform operation
        SIPX_RESULT_INVALID_ARGS,     // Invalid arguments; bad handle, 
                                      // argument out of range, etc.
        SIPX_RESULT_BAD_ADDRESS,      // Invalid SIP address
        SIPX_RESULT_OUT_OF_RESOURCES, // Out of resources
    }
    /// <summary>
    /// 
    /// </summary>
    public enum SIPX_LOG_LEVEL : int
    {
        LOG_LEVEL_DEBUG = 0, ///< debug-level messages
        LOG_LEVEL_INFO,      ///< informational messages
        LOG_LEVEL_NOTICE,    ///< normal, but significant, 
                             /// conditions
        LOG_LEVEL_WARNING,   ///< warning conditions
        LOG_LEVEL_ERR,       ///< error conditions
        LOG_LEVEL_CRIT,      ///< critical conditions
        LOG_LEVEL_ALERT,     ///< action must be taken 
                             /// immediately
        LOG_LEVEL_EMERG,     ///< system is unusable
    }

    ...

    /// <summary>
    /// 
    /// </summary>
    public sealed class sipXtapi
    {
        private const string DLLNAME = "sipXtapi.dll";

        // Default UDP port
        public const int DEFAULT_UDP_PORT        = 5060;
        ...
        // Bind to all interfaces
        public const string DEFAULT_BIND_ADDRESS = "0.0.0.0";
    
        private sipXtapi()
        {
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="result"></param>
        public static 
        void CheckResult(SIPX_RESULT result)
        {
            if (result == SIPX_RESULT.SIPX_RESULT_SUCCESS)
                return;

            throw new sipXtapi.SIPException(result);
        }

        [DllImport(DLLNAME)]
        public static extern 
        SIPX_RESULT sipxInitialize(ref IntPtr instance, 
            int udpPort, 
            int tcpPort, 
            int tlsPort, 
            int rtpPortStart, 
            int maxConnections, 
            string identity, 
            string szBindToAddr);

        [DllImport(DLLNAME)]
        public static extern 
        SIPX_RESULT sipxUnInitialize(IntPtr instance);

        ...
    }
}

Interop sur les callback

Le seul problème que l'on peut rencontrer concerne les callback qui sont en convention C pour les appels. Or, il n'est pas possible d'utiliser un attribut pour modifier la convention d'appel.

L'astuce consiste donc a écrire la déclaration des callback dans un fichier a part, qui sera compilé comme un assembly séparé.

using System;

namespace sipXtapi.Interop.Delegates
{
	public delegate void EventCallBackDelegate(UInt32 hCall, 
	    UInt32 hLine, 
	    Int32 eMajor, 
	    Int32 eMinor, 
	    IntPtr userData);
	public delegate void LineCallBackDelegate(UInt32 hLine, 
	    Int32 eMajor, 
	    IntPtr userData);
}

Ensuite, il faut compiler le fichier et le désassembler :

c:\sipXtapi.net>csc /target:library sipXtapi.delegates.cs¶
¶
c:\sipXtapi.net>ildasm /all sipXtapi.delegates.dll /out=sipXtapi.delegate
s.il¶
// WARNING: Created Win32 resource file sipXtapi.delegates.res¶

Puis, il faut ajouter la convention d'appel C au niveau des méthodes Invoke :

.namespace sipXtapi.Interop.Delegates
{
  .class /*02000002*/ public auto ansi sealed EventCallBackDelegate
    extends [mscorlib/* 23000001 */]System.MulticastDelegate/* 01000001 */
  {
    .method /*06000001*/ public hidebysig specialname rtspecialname 
       instance void  .ctor(object 'object',
                            native int 'method') runtime managed
    // SIG: 20 02 01 1C 18
    {
    } // end of method EventCallBackDelegate::.ctor

    .method /*06000002*/ public hidebysig virtual 
      instance void 
      modopt([mscorlib]System.Runtime.CompilerServices.CallConvCdecl)
      Invoke(unsigned int32 hCall,
                            unsigned int32 hLine,
                            int32 eMajor,
                            int32 eMinor,
                            native int userData) runtime managed
    // SIG: 20 05 01 09 09 08 08 18
    {
    } // end of method EventCallBackDelegate::Invoke
    ...
}

Enfin, il ne reste plus qu'à ré-assembler le fichier :

c:\sipXtapi.net>ilasm /dll /quiet sipXtapi.delegates.il¶
¶
Assembling 'sipXtapi.delegates.il' , no listing file, to DLL --> 'sipXtap
i.delegates.DLL'¶
Source file is ANSI¶
¶
Operation completed successfully¶

Il n'est pas obligatoire de déclarer les callback dans un assembly séparé. C'est juste plus pratique car, comme ce fichier change moins, il n'est pas nécessaire de répéter les étapes manuelles à chaque compilation.

Quelques liens utiles...

SIPfoundry
Tout ce qu'il y a à savoir sur SIP...
Télécharger la DLL sipXtapi
Ce dossier contient les dernières versions de la DLL.
Télécharger le source
taille : 419 Ko, dernière modification : 04/07/2005
Nous contacter
Vous avez des remarques, des questions ? N'hésitez pas à nous contacter.

les informations fournies ici le sont en tant que telles, sans aucune garantie d'aucune sorte.
Copyright © FlowGroup SAS, 2002-2005