Я использую 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. Буду признателен, если кто-нибудь поможет мне понять, как я должен это делать.