Ejemplo n.º 1
0
        public bool TryCopyTo(byte[] buffer, int offset, out int count)
        {
            IntPtr          ptr    = IntPtr.Zero;
            osip_message_t *native = ToNative();

            try
            {
                int length;
                if (NativeMethods.osip_message_to_str(native, &ptr, &length) < 0 ||
                    buffer.Length - offset < length)
                {
                    count = 0;
                    return(false);
                }

                Marshal.Copy(ptr, buffer, offset, length);
                count = length;
                return(true);
            }
            finally
            {
                NativeMethods.osip_message_free(native);
                Marshal.FreeHGlobal(ptr);
            }
        }
Ejemplo n.º 2
0
        private static ErrorCode TryParseCore(IntPtr ptr, ulong length, out SipMessage message)
        {
            osip_message_t *native = null;

            try
            {
                ErrorCode errorCode = NativeMethods.osip_message_init(&native);
                if (!errorCode.EnsureSuccess())
                {
                    message = null;
                    return(errorCode);
                }

                errorCode = NativeMethods.osip_message_parse(native, ptr, length);
                if (!errorCode.EnsureSuccess())
                {
                    message = null;
                    return(errorCode);
                }

                message = native->status_code == 0
                    ? FromNative <SipRequest>(native)
                    : (SipMessage)FromNative <SipResponse>(native);
                return(errorCode);
            }
            finally
            {
                NativeMethods.osip_message_free(native);
            }
        }
Ejemplo n.º 3
0
        public T DeepClone <T>() where T : SipMessage, new ()
        {
            osip_message_t *native = ToNative();

            try
            {
                return(FromNative <T>(native));
            }
            finally
            {
                NativeMethods.osip_message_free(native);
            }
        }
Ejemplo n.º 4
0
        public override string ToString()
        {
            IntPtr          ptr    = IntPtr.Zero;
            osip_message_t *native = ToNative();

            try
            {
                int length;
                NativeMethods.osip_message_to_str(native, &ptr, &length).ThrowOnError();
                return(Marshal.PtrToStringAnsi(ptr));
            }
            finally
            {
                NativeMethods.osip_message_free(native);
                Marshal.FreeHGlobal(ptr);
            }
        }
Ejemplo n.º 5
0
        private static T FromNative <T>(osip_message_t *native) where T : SipMessage, new ()
        {
            var message = new T
            {
                Version = Marshal.PtrToStringAnsi(native->sip_version),
                From    = native->from != osip_from_t.Null
                    ? NameAddressHeader.FromNative(native->from)
                    : null,
                To = native->to != osip_from_t.Null
                    ? NameAddressHeader.FromNative(native->to)
                    : null,
                CallId = native->call_id != osip_call_id_t.Null
                    ? CallIdHeader.FromNative(native->call_id)
                    : null,
                CSeq = native->cseq != osip_cseq_t.Null
                    ? CSeqHeader.FromNative(native->cseq)
                    : null,
                ContentType = native->content_type != osip_content_type_t.Null
                    ? ContentTypeHeader.FromNative(native->content_type)
                    : null,
                MimeVersion = native->mime_version != osip_content_length_t.Null
                    ? ContentLengthHeader.FromNative(native->mime_version)
                    : null
            };

            if (message is SipRequest request)
            {
                request.Method     = Marshal.PtrToStringAnsi(native->sip_method);
                request.RequestUri = native->req_uri != osip_uri_t.Null
                    ? SipUri.FromNative(native->req_uri)
                    : null;
            }
            else if (message is SipResponse response)
            {
                response.StatusCode   = native->status_code;
                response.ReasonPhrase = Marshal.PtrToStringAnsi(native->reason_phrase);
            }

            int size = NativeMethods.osip_list_size(&native->vias);

            for (int i = 0; i < size; i++)
            {
                osip_via_t *header = (osip_via_t *)NativeMethods.osip_list_get(&native->vias, i);
                message.Vias.Add(ViaHeader.FromNative(header));
            }

            size = NativeMethods.osip_list_size(&native->record_routes);
            for (int i = 0; i < size; i++)
            {
                osip_from_t *header = (osip_from_t *)NativeMethods.osip_list_get(&native->record_routes, i);
                message.RecordRoutes.Add(NameAddressHeader.FromNative(header));
            }

            size = NativeMethods.osip_list_size(&native->routes);
            for (int i = 0; i < size; i++)
            {
                osip_from_t *header = (osip_from_t *)NativeMethods.osip_list_get(&native->routes, i);
                message.Routes.Add(NameAddressHeader.FromNative(header));
            }

            size = NativeMethods.osip_list_size(&native->contacts);
            for (int i = 0; i < size; i++)
            {
                osip_from_t *header = (osip_from_t *)NativeMethods.osip_list_get(&native->contacts, i);
                message.Contacts.Add(NameAddressHeader.FromNative(header));
            }

            size = NativeMethods.osip_list_size(&native->authorizations);
            for (int i = 0; i < size; i++)
            {
                osip_authorization_t *header = (osip_authorization_t *)NativeMethods.osip_list_get(&native->authorizations, i);
                message.Authorizations.Add(AuthorizationHeader.FromNative(header));
            }

            size = NativeMethods.osip_list_size(&native->www_authenticates);
            for (int i = 0; i < size; i++)
            {
                osip_www_authenticate_t *header = (osip_www_authenticate_t *)NativeMethods.osip_list_get(&native->www_authenticates, i);
                message.WwwAuthenticates.Add(WwwAuthenticateHeader.FromNative(header));
            }

            size = NativeMethods.osip_list_size(&native->proxy_authenticates);
            for (int i = 0; i < size; i++)
            {
                osip_www_authenticate_t *header = (osip_www_authenticate_t *)NativeMethods.osip_list_get(&native->proxy_authenticates, i);
                message.ProxyAuthenticates.Add(WwwAuthenticateHeader.FromNative(header));
            }

            size = NativeMethods.osip_list_size(&native->proxy_authorizations);
            for (int i = 0; i < size; i++)
            {
                osip_authorization_t *header = (osip_authorization_t *)NativeMethods.osip_list_get(&native->proxy_authorizations, i);
                message.ProxyAuthorizations.Add(AuthorizationHeader.FromNative(header));
            }

            size = NativeMethods.osip_list_size(&native->call_infos);
            for (int i = 0; i < size; i++)
            {
                osip_call_info_t *header = (osip_call_info_t *)NativeMethods.osip_list_get(&native->call_infos, i);
                message.CallInfos.Add(CallInfoHeader.FromNative(header));
            }

            size = NativeMethods.osip_list_size(&native->allows);
            for (int i = 0; i < size; i++)
            {
                osip_content_length_t *header = (osip_content_length_t *)NativeMethods.osip_list_get(&native->allows, i);
                message.Allows.Add(ContentLengthHeader.FromNative(header));
            }

            size = NativeMethods.osip_list_size(&native->content_encodings);
            for (int i = 0; i < size; i++)
            {
                osip_content_length_t *header = (osip_content_length_t *)NativeMethods.osip_list_get(&native->content_encodings, i);
                message.ContentEncodings.Add(ContentLengthHeader.FromNative(header));
            }

            size = NativeMethods.osip_list_size(&native->alert_infos);
            for (int i = 0; i < size; i++)
            {
                osip_call_info_t *header = (osip_call_info_t *)NativeMethods.osip_list_get(&native->alert_infos, i);
                message.AlertInfos.Add(CallInfoHeader.FromNative(header));
            }

            size = NativeMethods.osip_list_size(&native->error_infos);
            for (int i = 0; i < size; i++)
            {
                osip_call_info_t *header = (osip_call_info_t *)NativeMethods.osip_list_get(&native->error_infos, i);
                message.ErrorInfos.Add(CallInfoHeader.FromNative(header));
            }

            size = NativeMethods.osip_list_size(&native->accepts);
            for (int i = 0; i < size; i++)
            {
                osip_content_type_t *header = (osip_content_type_t *)NativeMethods.osip_list_get(&native->accepts, i);
                message.Accepts.Add(ContentTypeHeader.FromNative(header));
            }

            size = NativeMethods.osip_list_size(&native->accept_encodings);
            for (int i = 0; i < size; i++)
            {
                osip_accept_encoding_t *header = (osip_accept_encoding_t *)NativeMethods.osip_list_get(&native->accept_encodings, i);
                message.AcceptEncodings.Add(AcceptEncodingHeader.FromNative(header));
            }

            size = NativeMethods.osip_list_size(&native->accept_languages);
            for (int i = 0; i < size; i++)
            {
                osip_accept_encoding_t *header = (osip_accept_encoding_t *)NativeMethods.osip_list_get(&native->accept_languages, i);
                message.AcceptLanguages.Add(AcceptEncodingHeader.FromNative(header));
            }

            size = NativeMethods.osip_list_size(&native->authentication_infos);
            for (int i = 0; i < size; i++)
            {
                osip_authentication_info_t *header = (osip_authentication_info_t *)NativeMethods.osip_list_get(&native->authentication_infos, i);
                message.AuthenticationInfos.Add(AuthenticationInfoHeader.FromNative(header));
            }

            size = NativeMethods.osip_list_size(&native->proxy_authentication_infos);
            for (int i = 0; i < size; i++)
            {
                osip_authentication_info_t *header = (osip_authentication_info_t *)NativeMethods.osip_list_get(&native->proxy_authentication_infos, i);
                message.ProxyAuthenticationInfos.Add(AuthenticationInfoHeader.FromNative(header));
            }

            size = NativeMethods.osip_list_size(&native->headers);
            for (int i = 0; i < size; i++)
            {
                osip_header_t *header = (osip_header_t *)NativeMethods.osip_list_get(&native->headers, i);
                message.OtherHeaders.Add(GenericHeader.FromNative(header));
            }

            size = NativeMethods.osip_list_size(&native->bodies);
            for (int i = 0; i < size; i++)
            {
                osip_body_t *header = (osip_body_t *)NativeMethods.osip_list_get(&native->bodies, i);
                message.Bodies.Add(SipBody.FromNative(header));
            }

            return(message);
        }
Ejemplo n.º 6
0
 public static extern ErrorCode osip_message_clone(osip_message_t *sip, osip_message_t **dest);
Ejemplo n.º 7
0
 public static extern ErrorCode osip_message_to_str(osip_message_t *sip, IntPtr *dest, int *message_length);
Ejemplo n.º 8
0
 public static extern ErrorCode osip_message_force_update(osip_message_t *sip);
Ejemplo n.º 9
0
 public static extern ErrorCode osip_message_parse(osip_message_t *sip, IntPtr buf, ulong length);
Ejemplo n.º 10
0
 public static extern void osip_message_free(osip_message_t *sip);