/* LinphoneCoreImpl.java Copyright (C) 2010 Belledonne Communications, Grenoble, France This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ package org.linphone.core; import android.view.SurfaceView; import java.io.File; import java.io.IOException; import java.util.Vector; class LinphoneCoreImpl implements LinphoneCore { @SuppressWarnings("unused") private final LinphoneCoreListener mListener; //to make sure to keep a reference on this object private long nativePtr = 0; private native long newLinphoneCore(LinphoneCoreListener listener,String userConfig,String factoryConfig,Object userdata); private native void iterate(long nativePtr); private native long getDefaultProxyConfig(long nativePtr); private native void setDefaultProxyConfig(long nativePtr,long proxyCfgNativePtr); private native int addProxyConfig(LinphoneProxyConfig jprtoxyCfg,long nativePtr,long proxyCfgNativePtr); private native void clearAuthInfos(long nativePtr); private native void clearProxyConfigs(long nativePtr); private native void addAuthInfo(long nativePtr,long authInfoNativePtr); private native long invite(long nativePtr,String uri); private native void terminateCall(long nativePtr, long call); private native long getRemoteAddress(long nativePtr); private native boolean isInCall(long nativePtr); private native boolean isInComingInvitePending(long nativePtr); private native void acceptCall(long nativePtr, long call); private native long getCallLog(long nativePtr,int position); private native int getNumberOfCallLogs(long nativePtr); private native void delete(long nativePtr); private native void setNetworkStateReachable(long nativePtr,boolean isReachable); private native void setPlaybackGain(long nativeptr, float gain); private native float getPlaybackGain(long nativeptr); private native void muteMic(long nativePtr,boolean isMuted); private native long interpretUrl(long nativePtr,String destination); private native long inviteAddress(long nativePtr,long to); private native long inviteAddressWithParams(long nativePtrLc,long to, long nativePtrParam); private native void sendDtmf(long nativePtr,char dtmf); private native void clearCallLogs(long nativePtr); private native boolean isMicMuted(long nativePtr); private native long findPayloadType(long nativePtr, String mime, int clockRate); private native int enablePayloadType(long nativePtr, long payloadType, boolean enable); private native void enableEchoCancellation(long nativePtr,boolean enable); private native boolean isEchoCancellationEnabled(long nativePtr); private native long getCurrentCall(long nativePtr) ; private native void playDtmf(long nativePtr,char dtmf,int duration); private native void stopDtmf(long nativePtr); private native void setVideoWindowId(long nativePtr, Object wid); private native void setPreviewWindowId(long nativePtr, Object wid); private AndroidVideoWindowImpl mVideoWindow; private AndroidVideoWindowImpl mPreviewWindow; private native void addFriend(long nativePtr,long friend); private native void setPresenceInfo(long nativePtr,int minute_away, String alternative_contact,int status); private native long createChatRoom(long nativePtr,String to); private native void enableVideo(long nativePtr,boolean vcap_enabled,boolean display_enabled); private native boolean isVideoEnabled(long nativePtr); private native void setFirewallPolicy(long nativePtr, int enum_value); private native int getFirewallPolicy(long nativePtr); private native void setStunServer(long nativePtr, String stun_server); private native String getStunServer(long nativePtr); private native long createDefaultCallParams(long nativePtr); private native int updateCall(long ptrLc, long ptrCall, long ptrParams); private native void setUploadBandwidth(long nativePtr, int bw); private native void setDownloadBandwidth(long nativePtr, int bw); private native void setPreferredVideoSize(long nativePtr, int width, int heigth); private native int[] getPreferredVideoSize(long nativePtr); private native void setRing(long nativePtr, String path); private native String getRing(long nativePtr); private native void setRootCA(long nativePtr, String path); private native long[] listVideoPayloadTypes(long nativePtr); private native long[] listAudioPayloadTypes(long nativePtr); private native void enableKeepAlive(long nativePtr,boolean enable); private native boolean isKeepAliveEnabled(long nativePtr); private native int startEchoCalibration(long nativePtr,Object data); private native int getSignalingTransportPort(long nativePtr, int code); private native void setSignalingTransportPorts(long nativePtr, int udp, int tcp, int tls); private native void enableIpv6(long nativePtr,boolean enable); private native void adjustSoftwareVolume(long nativePtr,int db); private native int pauseCall(long nativePtr, long callPtr); private native int pauseAllCalls(long nativePtr); private native int resumeCall(long nativePtr, long callPtr); private native void setUploadPtime(long nativePtr, int ptime); private native void setDownloadPtime(long nativePtr, int ptime); private native void setZrtpSecretsCache(long nativePtr, String file); LinphoneCoreImpl(LinphoneCoreListener listener, File userConfig,File factoryConfig,Object userdata) throws IOException { mListener=listener; nativePtr = newLinphoneCore(listener,userConfig.getCanonicalPath(),factoryConfig.getCanonicalPath(),userdata); } LinphoneCoreImpl(LinphoneCoreListener listener) throws IOException { mListener=listener; nativePtr = newLinphoneCore(listener,null,null,null); } protected void finalize() throws Throwable { } public synchronized void addAuthInfo(LinphoneAuthInfo info) { isValid(); addAuthInfo(nativePtr,((LinphoneAuthInfoImpl)info).nativePtr); } public synchronized LinphoneProxyConfig getDefaultProxyConfig() { isValid(); long lNativePtr = getDefaultProxyConfig(nativePtr); if (lNativePtr!=0) { return new LinphoneProxyConfigImpl(lNativePtr); } else { return null; } } public synchronized LinphoneCall invite(String uri) { isValid(); long lNativePtr = invite(nativePtr,uri); if (lNativePtr!=0) { return new LinphoneCallImpl(lNativePtr); } else { return null; } } public synchronized void iterate() { isValid(); iterate(nativePtr); } public synchronized void setDefaultProxyConfig(LinphoneProxyConfig proxyCfg) { isValid(); setDefaultProxyConfig(nativePtr,((LinphoneProxyConfigImpl)proxyCfg).nativePtr); } public synchronized void addProxyConfig(LinphoneProxyConfig proxyCfg) throws LinphoneCoreException{ isValid(); if (addProxyConfig(proxyCfg,nativePtr,((LinphoneProxyConfigImpl)proxyCfg).nativePtr) !=0) { throw new LinphoneCoreException("bad proxy config"); } } public synchronized void clearAuthInfos() { isValid(); clearAuthInfos(nativePtr); } public synchronized void clearProxyConfigs() { isValid(); clearProxyConfigs(nativePtr); } public synchronized void terminateCall(LinphoneCall aCall) { isValid(); if (aCall!=null)terminateCall(nativePtr,((LinphoneCallImpl)aCall).nativePtr); } public synchronized LinphoneAddress getRemoteAddress() { isValid(); long ptr = getRemoteAddress(nativePtr); if (ptr==0) { return null; } else { return new LinphoneAddressImpl(ptr); } } public synchronized boolean isIncall() { isValid(); return isInCall(nativePtr); } public synchronized boolean isInComingInvitePending() { isValid(); return isInComingInvitePending(nativePtr); } public synchronized void acceptCall(LinphoneCall aCall) { isValid(); acceptCall(nativePtr,((LinphoneCallImpl)aCall).nativePtr); } public synchronized Vector<LinphoneCallLog> getCallLogs() { isValid(); Vector<LinphoneCallLog> logs = new Vector<LinphoneCallLog>(); for (int i=0;i < getNumberOfCallLogs(nativePtr);i++) { logs.add(new LinphoneCallLogImpl(getCallLog(nativePtr, i))); } return logs; } public synchronized void destroy() { isValid(); delete(nativePtr); nativePtr = 0; } private void isValid() { if (nativePtr == 0) { throw new RuntimeException("object already destroyed"); } } public synchronized void setNetworkReachable(boolean isReachable) { setNetworkStateReachable(nativePtr,isReachable); } public synchronized void setPlaybackGain(float gain) { setPlaybackGain(nativePtr,gain); } public synchronized float getPlaybackGain() { return getPlaybackGain(nativePtr); } public synchronized void muteMic(boolean isMuted) { muteMic(nativePtr,isMuted); } public synchronized LinphoneAddress interpretUrl(String destination) throws LinphoneCoreException { long lAddress = interpretUrl(nativePtr,destination); if (lAddress != 0) { return new LinphoneAddressImpl(lAddress,true); } else { throw new LinphoneCoreException("Cannot interpret ["+destination+"]"); } } public synchronized LinphoneCall invite(LinphoneAddress to) throws LinphoneCoreException { long lNativePtr = inviteAddress(nativePtr,((LinphoneAddressImpl)to).nativePtr); if (lNativePtr!=0) { return new LinphoneCallImpl(lNativePtr); } else { throw new LinphoneCoreException("Unable to invite address " + to.asString()); } } public synchronized void sendDtmf(char number) { sendDtmf(nativePtr,number); } public synchronized void clearCallLogs() { clearCallLogs(nativePtr); } public synchronized boolean isMicMuted() { return isMicMuted(nativePtr); } public synchronized PayloadType findPayloadType(String mime, int clockRate) { isValid(); long playLoadType = findPayloadType(nativePtr, mime, clockRate); if (playLoadType == 0) { return null; } else { return new PayloadTypeImpl(playLoadType); } } public synchronized void enablePayloadType(PayloadType pt, boolean enable) throws LinphoneCoreException { isValid(); if (enablePayloadType(nativePtr,((PayloadTypeImpl)pt).nativePtr,enable) != 0) { throw new LinphoneCoreException("cannot enable payload type ["+pt+"]"); } } public synchronized void enableEchoCancellation(boolean enable) { isValid(); enableEchoCancellation(nativePtr, enable); } public synchronized boolean isEchoCancellationEnabled() { isValid(); return isEchoCancellationEnabled(nativePtr); } public synchronized LinphoneCall getCurrentCall() { isValid(); long lNativePtr = getCurrentCall(nativePtr); if (lNativePtr!=0) { return new LinphoneCallImpl(lNativePtr); } else { return null; } } public int getPlayLevel() { // TODO Auto-generated method stub return 0; } public void setPlayLevel(int level) { // TODO Auto-generated method stub } public void enableSpeaker(boolean value) { // TODO Auto-generated method stub } public boolean isSpeakerEnabled() { // TODO Auto-generated method stub return false; } public synchronized void playDtmf(char number, int duration) { playDtmf(nativePtr,number, duration); } public synchronized void stopDtmf() { stopDtmf(nativePtr); } public synchronized void addFriend(LinphoneFriend lf) throws LinphoneCoreException { addFriend(nativePtr,((LinphoneFriendImpl)lf).nativePtr); } public synchronized void setPresenceInfo(int minute_away, String alternative_contact, OnlineStatus status) { setPresenceInfo(nativePtr,minute_away,alternative_contact,status.mValue); } public synchronized LinphoneChatRoom createChatRoom(String to) { return new LinphoneChatRoomImpl(createChatRoom(nativePtr,to)); } public synchronized void setPreviewWindow(Object w) { if (mPreviewWindow!=null) mPreviewWindow.setListener(null); mPreviewWindow=new AndroidVideoWindowImpl((SurfaceView)w); mPreviewWindow.setListener(new AndroidVideoWindowImpl.VideoWindowListener(){ public void onSurfaceDestroyed(AndroidVideoWindowImpl vw) { setPreviewWindowId(nativePtr,null); } public void onSurfaceReady(AndroidVideoWindowImpl vw) { setPreviewWindowId(nativePtr,vw); } }); } public synchronized void setVideoWindow(Object w) { if (mVideoWindow!=null) mVideoWindow.setListener(null); mVideoWindow=new AndroidVideoWindowImpl((SurfaceView) w); mVideoWindow.setListener(new AndroidVideoWindowImpl.VideoWindowListener(){ public void onSurfaceDestroyed(AndroidVideoWindowImpl vw) { setVideoWindowId(nativePtr,null); } public void onSurfaceReady(AndroidVideoWindowImpl vw) { setVideoWindowId(nativePtr,vw); } }); } public synchronized void enableVideo(boolean vcap_enabled, boolean display_enabled) { enableVideo(nativePtr,vcap_enabled, display_enabled); } public synchronized boolean isVideoEnabled() { return isVideoEnabled(nativePtr); } public synchronized FirewallPolicy getFirewallPolicy() { return FirewallPolicy.fromInt(getFirewallPolicy(nativePtr)); } public synchronized String getStunServer() { return getStunServer(nativePtr); } public synchronized void setFirewallPolicy(FirewallPolicy pol) { setFirewallPolicy(nativePtr,pol.value()); } public synchronized void setStunServer(String stunServer) { setStunServer(nativePtr,stunServer); } public synchronized LinphoneCallParams createDefaultCallParameters() { return new LinphoneCallParamsImpl(createDefaultCallParams(nativePtr)); } public synchronized LinphoneCall inviteAddressWithParams(LinphoneAddress to, LinphoneCallParams params) throws LinphoneCoreException { long ptrDestination = ((LinphoneAddressImpl)to).nativePtr; long ptrParams =((LinphoneCallParamsImpl)params).nativePtr; long lcNativePtr = inviteAddressWithParams(nativePtr, ptrDestination, ptrParams); if (lcNativePtr!=0) { return new LinphoneCallImpl(lcNativePtr); } else { throw new LinphoneCoreException("Unable to invite with params " + to.asString()); } } public synchronized int updateCall(LinphoneCall call, LinphoneCallParams params) { long ptrCall = ((LinphoneCallImpl) call).nativePtr; long ptrParams = params!=null ? ((LinphoneCallParamsImpl)params).nativePtr : 0; return updateCall(nativePtr, ptrCall, ptrParams); } public synchronized void setUploadBandwidth(int bw) { setUploadBandwidth(nativePtr, bw); } public synchronized void setDownloadBandwidth(int bw) { setDownloadBandwidth(nativePtr, bw); } public synchronized void setPreferredVideoSize(VideoSize vSize) { setPreferredVideoSize(nativePtr, vSize.width, vSize.height); } public synchronized VideoSize getPreferredVideoSize() { int[] nativeSize = getPreferredVideoSize(nativePtr); VideoSize vSize = new VideoSize(); vSize.width = nativeSize[0]; vSize.height = nativeSize[1]; return vSize; } public synchronized void setRing(String path) { setRing(nativePtr, path); } public synchronized String getRing() { return getRing(nativePtr); } public synchronized void setRootCA(String path) { setRootCA(nativePtr, path); } public synchronized PayloadType[] getVideoCodecs() { long[] typesPtr = listVideoPayloadTypes(nativePtr); if (typesPtr == null) return null; PayloadType[] codecs = new PayloadType[typesPtr.length]; for (int i=0; i < codecs.length; i++) { codecs[i] = new PayloadTypeImpl(typesPtr[i]); } return codecs; } public synchronized PayloadType[] getAudioCodecs() { long[] typesPtr = listAudioPayloadTypes(nativePtr); if (typesPtr == null) return null; PayloadType[] codecs = new PayloadType[typesPtr.length]; for (int i=0; i < codecs.length; i++) { codecs[i] = new PayloadTypeImpl(typesPtr[i]); } return codecs; } public synchronized boolean isNetworkReachable() { throw new RuntimeException("Not implemented"); } public synchronized void enableKeepAlive(boolean enable) { enableKeepAlive(nativePtr,enable); } public synchronized boolean isKeepAliveEnabled() { return isKeepAliveEnabled(nativePtr); } public synchronized void startEchoCalibration(Object data) throws LinphoneCoreException { startEchoCalibration(nativePtr, data); } public synchronized Transports getSignalingTransportPorts() { Transports transports = new Transports(); transports.udp = getSignalingTransportPort(nativePtr, 0); transports.tcp = getSignalingTransportPort(nativePtr, 1); transports.tls = getSignalingTransportPort(nativePtr, 3); // See C struct LCSipTransports in linphonecore.h // Code is the index in the structure return transports; } public synchronized void setSignalingTransportPorts(Transports transports) { setSignalingTransportPorts(nativePtr, transports.udp, transports.tcp, transports.tls); } public synchronized void enableIpv6(boolean enable) { enableIpv6(nativePtr,enable); } public synchronized void adjustSoftwareVolume(int i) { adjustSoftwareVolume(nativePtr, i); } public synchronized boolean pauseCall(LinphoneCall call) { return 0 == pauseCall(nativePtr, ((LinphoneCallImpl) call).nativePtr); } public synchronized boolean resumeCall(LinphoneCall call) { return 0 == resumeCall(nativePtr, ((LinphoneCallImpl) call).nativePtr); } public synchronized boolean pauseAllCalls() { return 0 == pauseAllCalls(nativePtr); } public synchronized void setDownloadPtime(int ptime) { setDownloadPtime(nativePtr,ptime); } public synchronized void setUploadPtime(int ptime) { setUploadPtime(nativePtr,ptime); } public synchronized void setZrtpSecretsCache(String file) { setZrtpSecretsCache(nativePtr,file); } }