%module(directors="1") pjsua2 // // Suppress few warnings // #pragma SWIG nowarn=312 // 312: nested struct (in types.h, sip_auth.h) // // Header section // %{ #include "pjsua2.hpp" using namespace std; using namespace pj; %} #ifdef SWIGPYTHON %feature("director:except") { if( $error != NULL ) { PyObject *ptype, *pvalue, *ptraceback; PyErr_Fetch( &ptype, &pvalue, &ptraceback ); PyErr_Restore( ptype, pvalue, ptraceback ); PyErr_Print(); //Py_Exit(1); } } #endif #ifdef SWIGCSHARP %typemap(throws, canthrow=1) pj::Error { SWIG_CSharpSetPendingException(SWIG_CSharpApplicationException, (std::string("C++ pj::Error:\n") + $1.info(true).c_str()).c_str()); return $null; } #endif // Allow C++ exceptions to be handled in Java #ifdef SWIGJAVA %typemap(throws, throws="java.lang.Exception") pj::Error { jclass excep = jenv->FindClass("java/lang/Exception"); if (excep) jenv->ThrowNew(excep, $1.info(true).c_str()); return $null; } // Force the Error Java class to extend java.lang.Exception %typemap(javabase) pj::Error "java.lang.Exception"; %typemap(javacode) pj::Error %{ // Override getMessage() public String getMessage() { return getTitle(); } // Disable serialization (check ticket #1868) private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException { throw new java.io.NotSerializableException("Check ticket #1868!"); } private void readObject(java.io.ObjectInputStream in) throws java.io.IOException { throw new java.io.NotSerializableException("Check ticket #1868!"); } %} #endif // Constants from PJSIP libraries #ifdef SWIGJAVA %include "enumtypeunsafe.swg" %javaconst(1); #endif %include "symbols.i" // // Classes that can be extended in the target language // %feature("director") LogWriter; %feature("director") Endpoint; %feature("director") Account; %feature("director") Call; %feature("director") Buddy; %feature("director") FindBuddyMatch; %feature("director") AudioMediaPlayer; // // STL stuff. // %include "std_string.i" %include "std_vector.i" %template(StringVector) std::vector; %template(IntVector) std::vector; // // Ignore stuffs in pjsua2 // %ignore fromPj; %ignore toPj; %import "pj/config_site.h" %import "pjsua2/config.hpp" // // Now include the API itself. // %include "pjsua2/types.hpp" %ignore pj::ContainerNode::op; %ignore pj::ContainerNode::data; %ignore container_node_op; %ignore container_node_internal_data; %include "pjsua2/persistent.hpp" %include "pjsua2/siptypes.hpp" %template(SipHeaderVector) std::vector; %template(AuthCredInfoVector) std::vector; %template(SrtpCryptoVector) std::vector; %template(SipMultipartPartVector) std::vector; %template(BuddyVector) std::vector; %template(BuddyVector2) std::vector; %template(AudioMediaVector) std::vector; %template(AudioMediaVector2) std::vector; %template(VideoMediaVector) std::vector; %template(ToneDescVector) std::vector; %template(ToneDigitVector) std::vector; %template(ToneDigitMapVector) std::vector; %template(AudioDevInfoVector) std::vector; %template(AudioDevInfoVector2) std::vector; %template(CodecInfoVector) std::vector; %template(CodecInfoVector2) std::vector; %template(VideoDevInfoVector) std::vector; %template(VideoDevInfoVector2) std::vector; %template(CodecFmtpVector) std::vector; %template(MediaFormatAudioVector) std::vector; %template(MediaFormatVideoVector) std::vector; %template(CallMediaInfoVector) std::vector; %template(RtcpFbCapVector) std::vector; %template(SslCertNameVector) std::vector; %ignore pj::WindowHandle::display; %ignore pj::WindowHandle::window; /* pj::WindowHandle::setWindow() receives Surface object */ #if defined(SWIGJAVA) && defined(__ANDROID__) %{ #if defined(PJMEDIA_HAS_VIDEO) && PJMEDIA_HAS_VIDEO!=0 # include #else # define ANativeWindow_fromSurface(a,b) NULL #endif %} %typemap(in) jobject surface { $1 = ($input? (jobject)ANativeWindow_fromSurface(jenv, $input): NULL); } %extend pj::WindowHandle { void setWindow(jobject surface) { $self->window = surface; } } #else %extend pj::WindowHandle { void setWindow(long long hwnd) { $self->window = (void*)hwnd; } } #endif %include "pjsua2/media.hpp" %include "pjsua2/presence.hpp" %include "pjsua2/account.hpp" %include "pjsua2/call.hpp" %ignore pj::JsonDocument::allocElement; %ignore pj::JsonDocument::getPool; %include "pjsua2/json.hpp" // Try force Java GC before destroying the lib: // - to avoid late destroy of PJ objects by GC // - to avoid destruction of PJ objects from a non-registered GC thread #ifdef SWIGJAVA %rename(libDestroy_) pj::Endpoint::libDestroy; %typemap(javacode) pj::Endpoint %{ public void libDestroy(long prmFlags) throws java.lang.Exception { Runtime.getRuntime().gc(); libDestroy_(prmFlags); } public void libDestroy() throws java.lang.Exception { Runtime.getRuntime().gc(); libDestroy_(); } %} #endif %include "pjsua2/endpoint.hpp"