Articles technique
Utilisation de sipXtapi avec .Net
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 voix 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¶
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 418 Ko, dernière modification 06/08/2013 | |
Nous contacter Vous avez des remarques, des questions ? N'hésitez pas à nous contacter. |