|
Fiches TechniqueUtilisation de sipXtapi avec .Net
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'interopLa 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 callbackLe 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...
les informations fournies ici le sont en tant que telles, sans aucune garantie d'aucune sorte. Copyright © FlowGroup SAS, 2002-2005 |