Hallo Gemeinde, hallo Rainer. ;)
Xcode treibt mich gerade in den Wahnsinn. Ich muss für die PJSIP Library(1) einen Wrapper basteln, der idealerweise unter iOS und Android gleichermaßen funktioniert.
Also dachte ich mir 'Marco, schreib den allgemeinen Kram in C und kapsel das Ganze dann in wenige spezifische Wrapper.'
Nun stelle ich fest, dass die eigene Implementierung des SIP User Agents in der Library nicht meinen Ansprüchen genügt. Beziehungsweise den Ansprüchen der Gegenstelle.
Also mag ich mir einen eigenen User Agent bauen.
Und dort hapert es bereits ganz früh. Ich muss zur Erstellung eines Endpunkts (dem Herzstück des Ganzen) zunächst einen Memory Pool erstellen lassen, der mich bei der Speicherverwaltung unterstützt.
Die Funktion zur Erstellung des Pools schiebt ein generiertes struct in eine via Pointer übergebene Adresse.
Mein erster Ansatz war völlig naiv und führte natürlich zu einem EXC_BAD_ACCESS:
--
pj_caching_pool * internalCachingPool; // EXC_BAD_ACCESS, da Speicheradresse nicht initialisiert
pj_caching_pool_init(&internalCachingPool, &pj_pool_factory_default_policy, 1000);
--
Mein zweiter Ansatz hingegen führt zu einem "Variable has incomplete type 'pj_caching_pool' (aka 'struct pj_caching_pool')"
--
pj_caching_pool internalCachingPool = NULL; // Xcode Fehler, da offenbar unpassende Zuweisung.
pj_caching_pool_init(&internalCachingPool, &pj_pool_factory_default_policy, 1000);
--
Schlussendlich konnte ich in diesem speziellen Fall durch Zuhilfenahme der Informationen aus dem Header den Fehler loswerden.
--
pj_caching_pool internalCachingPool = {NULL, NULL, 0, 0, NULL, NULL, NULL, NULL, NULL};
pj_caching_pool_init(&internalCachingPool, &pj_pool_factory_default_policy, 1000);
--
Nur beim pjsip_endpoint bekomme ich es offenbar nicht hin die Struktur nachzubilden.
Die Struktur dessen versteckt sich in der sip_endpoint.c und selbst wenn ich die 15 Pointer innerhalb der Struktur auf NULL setze bekomme ich weiterhin die 'incomplete type' Fehlermeldung.
--
// Auszug aus der sip_endpoint.c
/**
* The SIP endpoint.
*/
struct pjsip_endpoint
{
pj_pool_t *pool;
pj_mutex_t *mutex;
pj_pool_factory *pf;
pj_str_t name;
pj_timer_heap_t *timer_heap;
pjsip_tpmgr *transport_mgr;
pj_ioqueue_t *ioqueue;
pj_status_t ioq_last_err;
pjsip_resolver_t *resolver;
pj_rwmutex_t *mod_mutex;
pjsip_module *modules[PJSIP_MAX_MODULE];
pjsip_module module_list;
pjsip_hdr cap_hdr;
pjsip_hdr req_hdr;
exit_cb exit_cb_list;
};
// Meine Zuweisung mit dem Fehler
pjsip_endpoint endpoint = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL};
--
Ich könnte jetzt anfangen die einzelnen Werte anzupassen. Also statt NULL als name ein {"unnamed", 7} einzutragen etc.pp.
Allerdings frage ich mich ernsthaft, ob es da eine einfachere Möglichkeit gibt.
Hat da jemand einen Tipp/eine Idee für mich?
Gruß
Marco