Установка функции обработчика C из Swift - PullRequest
0 голосов
/ 12 февраля 2020

Я использую Baresip в своем проекте Swift для реализации функций SIP:

import Foundation

    enum SipError: Error {
        case libre
        case config
        case stack
        case modules
        case userAgent
        case call
    }

    final class CallController {

        required init?(agent: inout OpaquePointer?) throws {
            guard libre_init() == 0 else { throw SipError.libre }

            // Initialize dynamic modules.
            mod_init()

            // Make configure file.
            if let path = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first {
                conf_path_set(path)
            }
            guard conf_configure() == 0 else { throw SipError.config }

            // Initialize the SIP stack.
            guard ua_init("SIP", 1, 1, 1, 0) == 0 else { throw SipError.stack }

            // Load modules.
            guard conf_modules() == 0 else { throw SipError.modules }

            let addr = "sip:7003:789@192.168.123.103;transport=udp;answermode=manual"

            // Start user agent.
            guard ua_alloc(&agent, addr) == 0 else { throw SipError.userAgent }

            uag_event_register(ua_event_handler, NULL)

            // Make an outgoing call.
            guard ua_connect(agent, nil, nil, "sip:7002@192.168.123.103", nil, VIDMODE_OFF) == 0 else { throw SipError.call }

            // Start the main loop.
            re_main(nil)
        }

        func close(agent: OpaquePointer) {
            mem_deref(UnsafeMutablePointer(agent))
            ua_close()
            mod_close()

            // Close and check for memory leaks.
            libre_close()
            tmr_debug()
            mem_debug()
        }

    }

Чтобы иметь возможность отслеживать события вызова, мне нужно реализовать функцию обработчика с таким определением:

typedef void()  ua_event_h(struct ua *ua, enum ua_event ev, struct call *call, const char *prm, void *arg)

В C это делается так:

static void ua_event_handler(struct ua *ua, enum ua_event ev,
                     struct call *call, const char *prm, void *arg)
{
    //Handle events
    re_printf("ua event: %s\n", uag_event_str(ev));
}

uag_event_register(ua_event_handler, NULL); 

Однако я не знаю, какие типы данных мне следует использовать в Swift вместо C типов данных если я хочу написать ту же функцию в Swift. Буду признателен, если кто-нибудь поможет мне понять, как я должен это делать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...