]> sjero.net Git - linphone/blob - java/common/org/linphone/core/LinphoneCore.java
Merge branch 'master' of git.sv.gnu.org:/srv/git/linphone
[linphone] / java / common / org / linphone / core / LinphoneCore.java
1 /*
2 LinphoneCore.java
3 Copyright (C) 2010  Belledonne Communications, Grenoble, France
4
5 This program is free software; you can redistribute it and/or
6 modify it under the terms of the GNU General Public License
7 as published by the Free Software Foundation; either version 2
8 of the License, or (at your option) any later version.
9
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 GNU General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
18 */
19 package org.linphone.core;
20
21
22 import java.util.List;
23 import java.util.Vector;
24
25 /**
26  * Linphone core main object created by method {@link LinphoneCoreFactory#createLinphoneCore(LinphoneCoreListener, String, String, Object)}.    
27  *
28  */
29
30 public interface LinphoneCore {
31         /**
32          * linphone core states
33          */
34         static public class GlobalState {
35                 @SuppressWarnings("unchecked")
36                 static private Vector values = new Vector();
37                 /**
38                  * Off
39                  */
40                 static public GlobalState GlobalOff = new GlobalState(0,"GlobalOff");       
41                 /**
42                  * Startup
43                  */
44                 static public GlobalState GlobalStartup = new GlobalState(1,"GlobalStartup");
45                 /**
46                  * On
47                  */
48                 static public GlobalState GlobalOn = new GlobalState(2,"GlobalOn");
49                 /**
50                  * Shutdown
51                  */
52                 static public GlobalState GlobalShutdown = new GlobalState(3,"GlobalShutdown");
53
54                 private final int mValue;
55                 private final String mStringValue;
56
57                 @SuppressWarnings("unchecked")
58                 private GlobalState(int value,String stringValue) {
59                         mValue = value;
60                         values.addElement(this);
61                         mStringValue=stringValue;
62                 }
63                 public static GlobalState fromInt(int value) {
64
65                         for (int i=0; i<values.size();i++) {
66                                 GlobalState state = (GlobalState) values.elementAt(i);
67                                 if (state.mValue == value) return state;
68                         }
69                         throw new RuntimeException("state not found ["+value+"]");
70                 }
71                 public String toString() {
72                         return mStringValue;
73                 }
74         }
75         /**
76          * Describes proxy registration states.
77          *
78          */
79         static public class RegistrationState {
80                 @SuppressWarnings("unchecked")
81                 private static Vector values = new Vector();
82                 /**
83                  * None
84                  */
85                 public static RegistrationState RegistrationNone = new RegistrationState(0,"RegistrationNone");       
86                 /**
87                  * In Progress
88                  */
89                 public static RegistrationState RegistrationProgress  = new RegistrationState(1,"RegistrationProgress");
90                 /**
91                  * Ok
92                  */
93                 public static RegistrationState RegistrationOk = new RegistrationState(2,"RegistrationOk");
94                 /**
95                  * Cleared
96                  */
97                 public static RegistrationState RegistrationCleared = new RegistrationState(3,"RegistrationCleared");
98                 /**
99                  * Failed
100                  */
101                 public static RegistrationState RegistrationFailed = new RegistrationState(4,"RegistrationFailed");
102                 private final int mValue;
103                 private final String mStringValue;
104
105                 @SuppressWarnings("unchecked")
106                 private RegistrationState(int value,String stringValue) {
107                         mValue = value;
108                         values.addElement(this);
109                         mStringValue=stringValue;
110                 }
111                 public static RegistrationState fromInt(int value) {
112
113                         for (int i=0; i<values.size();i++) {
114                                 RegistrationState state = (RegistrationState) values.elementAt(i);
115                                 if (state.mValue == value) return state;
116                         }
117                         throw new RuntimeException("state not found ["+value+"]");
118                 }
119                 public String toString() {
120                         return mStringValue;
121                 }
122         }
123         /**
124          * Describes firewall policy.
125          *
126          */
127         static public class FirewallPolicy {
128                 @SuppressWarnings("unchecked")
129                 static private Vector values = new Vector();
130                 /**
131                  * No firewall is assumed.
132                  */
133                 static public FirewallPolicy NoFirewall = new FirewallPolicy(0,"NoFirewall");       
134                 /**
135                  * Use NAT address (discouraged)
136                  */
137                 static public FirewallPolicy UseNatAddress  = new FirewallPolicy(1,"UseNatAddress");
138                 /**
139                  * Use stun server to discover RTP addresses and ports.
140                  */
141                 static public FirewallPolicy UseStun = new FirewallPolicy(2,"UseStun");
142                 
143                 private final int mValue;
144                 private final String mStringValue;
145
146                 @SuppressWarnings("unchecked")
147                 private FirewallPolicy(int value,String stringValue) {
148                         mValue = value;
149                         values.addElement(this);
150                         mStringValue=stringValue;
151                 }
152                 public static FirewallPolicy fromInt(int value) {
153
154                         for (int i=0; i<values.size();i++) {
155                                 FirewallPolicy state = (FirewallPolicy) values.elementAt(i);
156                                 if (state.mValue == value) return state;
157                         }
158                         throw new RuntimeException("state not found ["+value+"]");
159                 }
160                 public String toString() {
161                         return mStringValue;
162                 }
163                 public int value(){
164                         return mValue;
165                 }
166         }
167         
168         /**
169          * Signaling transports ports.
170          */
171         static public class Transports {
172                 public int udp;
173                 public int tcp;
174                 public int tls;
175                 
176                 public Transports() {};
177                 public Transports(Transports t) {
178                         this.udp = t.udp;
179                         this.tcp = t.tcp;
180                         this.tls = t.tls;
181                 }
182         }
183         /**
184          *      EC Calibrator Status
185          */
186         static public class EcCalibratorStatus {
187                 @SuppressWarnings("unchecked")
188                 static private Vector values = new Vector();
189                 /**
190                  * Calibration in progress
191                  */
192                 static public EcCalibratorStatus InProgress = new EcCalibratorStatus(0,"InProgress");       
193                 /**
194                  * Calibration done
195                  */
196                 static public EcCalibratorStatus Done  = new EcCalibratorStatus(1,"Done");
197                 /**
198                  * Calibration in progress
199                  */
200                 static public EcCalibratorStatus Failed = new EcCalibratorStatus(2,"Failed");
201
202                 private final int mValue;
203                 private final String mStringValue;
204
205                 @SuppressWarnings("unchecked")
206                 private EcCalibratorStatus(int value,String stringValue) {
207                         mValue = value;
208                         values.addElement(this);
209                         mStringValue=stringValue;
210                 }
211                 public static EcCalibratorStatus fromInt(int value) {
212
213                         for (int i=0; i<values.size();i++) {
214                                 EcCalibratorStatus status = (EcCalibratorStatus) values.elementAt(i);
215                                 if (status.mValue == value) return status;
216                         }
217                         throw new RuntimeException("status not found ["+value+"]");
218                 }
219                 public String toString() {
220                         return mStringValue;
221                 }
222                 public int value(){
223                         return mValue;
224                 }
225         }
226         /**
227          * clear all added proxy configs
228          */
229         public void clearProxyConfigs();
230         /**
231          * Add a proxy configuration. This will start registration on the proxy, if registration is enabled.
232          * @param proxyCfg
233          * @throws LinphoneCoreException
234          */
235         public void addProxyConfig(LinphoneProxyConfig proxyCfg) throws LinphoneCoreException;
236         /**
237          * Sets the default proxy.
238          *<br>
239          * This default proxy must be part of the list of already entered {@link LinphoneProxyConfig}. 
240          * Toggling it as default will make LinphoneCore use the identity associated with the proxy configuration in all incoming and outgoing calls.
241          * @param proxyCfg 
242          */
243         public void setDefaultProxyConfig(LinphoneProxyConfig proxyCfg);
244         
245         /**
246          * get he default proxy configuration, that is the one used to determine the current identity.
247          * @return null if no default proxy config 
248          */
249         public LinphoneProxyConfig getDefaultProxyConfig() ;
250         
251         /**
252          * clear all the added auth info
253          */
254         void clearAuthInfos();
255         /**
256          * Adds authentication information to the LinphoneCore.
257          * <br>This information will be used during all SIP transacations that require authentication.
258          * @param info
259          */
260         void addAuthInfo(LinphoneAuthInfo info);
261         
262         /**
263          * Build an address according to the current proxy config. In case destination is not a sip address, the default proxy domain is automatically appended
264          * @param destination
265          * @return
266          * @throws If no LinphoneAddress can be built from destination
267          */
268         public LinphoneAddress interpretUrl(String destination) throws LinphoneCoreException;
269         
270         /**
271          * Starts a call given a destination. Internally calls {@link #interpretUrl(String)} then {@link #invite(LinphoneAddress)}.
272          * @param uri
273          */
274         public LinphoneCall invite(String destination)throws LinphoneCoreException;
275         /**
276          * Initiates an outgoing call given a destination LinphoneAddress
277          *<br>The LinphoneAddress can be constructed directly using linphone_address_new(), or created by linphone_core_interpret_url(). The application doesn't own a reference to the returned LinphoneCall object. Use linphone_call_ref() to safely keep the LinphoneCall pointer valid within your application.
278          * @param to the destination of the call (sip address).
279          * @return LinphoneCall
280          * @throws LinphoneCoreException
281          */
282         public LinphoneCall invite(LinphoneAddress to)throws LinphoneCoreException;
283         /**
284          * Terminates a call.
285          * @param aCall to be terminated
286          */
287         public void terminateCall(LinphoneCall aCall);
288         /**
289          * Returns The LinphoneCall the current call if one is in call
290          *
291         **/
292         public LinphoneCall getCurrentCall(); 
293         
294         /**
295          * get current call remote address in case of in/out call
296          * @return null if no call engaged yet
297          */
298         public LinphoneAddress getRemoteAddress();
299         /**
300          *  
301          * @return  TRUE if there is a call running or pending.
302          */
303         public boolean isIncall();
304         /**
305          * 
306          * @return Returns true if in incoming call is pending, ie waiting for being answered or declined.
307          */
308         public boolean isInComingInvitePending();
309         /**
310          * Main loop function. It is crucial that your application call it periodically.
311          *
312          *      #iterate() performs various backgrounds tasks:
313          * <li>receiving of SIP messages
314          * <li> handles timers and timeout
315          * <li> performs registration to proxies
316          * <li> authentication retries The application MUST call this function from periodically, in its main loop. 
317          * <br> Be careful that this function must be call from the same thread as other liblinphone methods. In not the case make sure all liblinphone calls are serialized with a mutex.
318
319          */
320         public void iterate();
321         /**
322          * Accept an incoming call.
323          *
324          * Basically the application is notified of incoming calls within the
325          * {@link LinphoneCoreListener#inviteReceived(LinphoneCore, String)} listener.
326          * The application can later respond positively to the call using
327          * this method.
328          * @throws LinphoneCoreException 
329          */
330         public void acceptCall(LinphoneCall aCall) throws LinphoneCoreException;
331         
332         
333         /**
334          * @return a list of LinphoneCallLog 
335          */
336         @SuppressWarnings("unchecked")
337         public List getCallLogs();
338         
339         /**
340          * This method is called by the application to notify the Linphone core library when network is reachable.
341          * Calling this method with true trigger Linphone to initiate a registration process for all proxy
342          * configuration with parameter register set to enable.
343          * This method disable the automatic registration mode. It means you must call this method after each network state changes
344          * @param network state  
345          *
346          */
347         public void setNetworkReachable(boolean isReachable);
348         /**
349          * 
350          * @return if false, there is no network connection.
351          */
352         public boolean isNetworkReachable();
353         /**
354          * destroy linphone core and free all underlying resources
355          */
356         public void destroy();
357         /**
358          * Allow to control play level before entering  sound card:  
359          * @param level in db
360          */
361         public void setPlaybackGain(float gain);
362         /**
363          * get play level before entering  sound card:  
364          * @return level in db
365          */
366         public float getPlaybackGain();
367         /**
368          * set play level
369          * @param level [0..100]
370          */
371         public void setPlayLevel(int level);
372         /**
373          * get playback level [0..100];
374          * -1 if not cannot be determined
375          * @return
376          */
377         public int getPlayLevel();
378         /**
379          *  Mutes or unmutes the local microphone.
380          * @param isMuted
381          */
382         void muteMic(boolean isMuted);
383         /**
384          * 
385          * @return true is mic is muted
386          */
387         boolean isMicMuted();
388         
389         /**
390          * Initiate a dtmf signal if in call
391          * @param number
392          */
393         void sendDtmf(char number);
394         /**
395          * Initiate a dtmf signal to the speaker if not in call.
396          * Sending of the DTMF is done in another function.
397          * @param number
398          * @param duration in ms , -1 for unlimited
399          */
400         void playDtmf(char number,int duration);
401         /**
402          * stop current dtmf
403          */
404         void stopDtmf();
405         
406         /**
407          * remove all call logs
408          */
409         void clearCallLogs();
410         /***
411          * get payload type  from mime type an clock rate
412          * 
413          * return null if not found
414          */
415         PayloadType findPayloadType(String mime,int clockRate); 
416         /**
417          * not implemented yet
418          * @param pt
419          * @param enable
420          * @throws LinphoneCoreException
421          */
422         void enablePayloadType(PayloadType pt, boolean enable) throws LinphoneCoreException;
423         /**
424          * Enables or disable echo cancellation.
425          * @param enable
426          */
427         void enableEchoCancellation(boolean enable);
428         /**
429          * get EC status 
430          * @return true if echo cancellation is enabled.
431          */
432         boolean isEchoCancellationEnabled();
433         /**
434          * @param transports used for signaling (TCP, UDP and TLS)
435          */
436         void setSignalingTransportPorts(Transports transports);
437         /**
438          * @return transports used for signaling (TCP, UDP, TLS)
439          */
440         Transports getSignalingTransportPorts();
441         /**
442          * not implemented
443          * @param value
444          */
445         void enableSpeaker(boolean value);
446         /**
447          * not implemented
448          * @return
449          */
450         boolean isSpeakerEnabled();
451         /**
452          * add a friend to the current buddy list, if subscription attribute is set, a SIP SUBSCRIBE message is sent.
453          * @param lf LinphoenFriend to add
454          * @throws LinphoneCoreException
455          */
456         void addFriend(LinphoneFriend lf) throws LinphoneCoreException;
457
458         /**
459          * Set my presence status
460          * @param minute_away how long in away
461          * @param status sip uri used to redirect call in state LinphoneStatusMoved
462          */
463         void setPresenceInfo(int minute_away,String alternative_contact, OnlineStatus status);
464         /**
465          * Create a new chat room for messaging from a sip uri like sip:joe@sip.linphone.org
466          * @param to    destination address for messages 
467          *
468          * @return {@link LinphoneChatRoom} where messaging can take place.
469          */
470         LinphoneChatRoom createChatRoom(String to);
471         
472         void setVideoWindow(Object w);
473         void setPreviewWindow(Object w);
474         /**
475          * Enables video globally.
476          *
477          * 
478          * This function does not have any effect during calls. It just indicates #LinphoneCore to
479          * initiate future calls with video or not. The two boolean parameters indicate in which
480          * direction video is enabled. Setting both to false disables video entirely.
481          *
482          * @param vcap_enabled indicates whether video capture is enabled
483          * @param display_enabled indicates whether video display should be shown
484          *
485         **/
486         void enableVideo(boolean vcap_enabled, boolean display_enabled);
487         /**
488          * Returns TRUE if video is enabled, FALSE otherwise.
489          *      
490          ***/
491         boolean isVideoEnabled();
492         
493         /**
494          * Specify a STUN server to help firewall traversal.
495          * @param stun_server Stun server address and port, such as stun.linphone.org or stun.linphone.org:3478
496          */
497         void setStunServer(String stun_server);
498         /**
499          * @return stun server address if previously set.
500          */
501         String getStunServer();
502         
503         /**
504          * Sets policy regarding workarounding NATs
505          * @param pol one of the FirewallPolicy members.
506         **/
507         void setFirewallPolicy(FirewallPolicy pol);
508         /**
509          * @return previously set firewall policy.
510          */
511         FirewallPolicy getFirewallPolicy();
512
513         LinphoneCall inviteAddressWithParams(LinphoneAddress destination, LinphoneCallParams params) throws LinphoneCoreException ;
514         
515         int updateCall(LinphoneCall call, LinphoneCallParams params);
516
517         LinphoneCallParams createDefaultCallParameters();
518
519         /**
520          * Sets the path to a wav file used for ringing.
521          *
522          * @param path The file must be a wav 16bit linear. Local ring is disabled if null
523          */
524         void setRing(String path);
525         /**
526          * gets the path to a wav file used for ringing.
527          *
528          * @param null if not set
529          */
530         String getRing();
531         
532         /**
533          * Sets file or folder containing trusted root CAs
534          *
535          * @param path path to file with multiple PEM certif or to folder with multiple PEM files
536          */     
537         void setRootCA(String path);
538         
539         void setUploadBandwidth(int bw);
540
541         void setDownloadBandwidth(int bw);
542         
543         /**
544          * Sets audio packetization interval suggested for remote end.
545          * @param ptime packetization interval in milliseconds
546          */
547         void setDownloadPtime(int ptime);
548         
549         /**
550          * Sets audio packetization interval sent to remote end.
551          * @param ptime packetization interval in milliseconds
552          */
553         void setUploadPtime(int ptime);
554
555         void setPreferredVideoSize(VideoSize vSize);
556         
557         VideoSize getPreferredVideoSize();
558         
559         /**
560          * Returns the currently supported audio codecs, as PayloadType elements
561          * @return
562          */
563         PayloadType[] getAudioCodecs();
564         /**
565          * Returns the currently supported video codecs, as PayloadType elements
566          * @return
567          */
568         PayloadType[] getVideoCodecs();
569         /**
570          * enable signaling keep alive. small udp packet sent periodically to keep udp NAT association
571          */
572         void enableKeepAlive(boolean enable);
573         /**
574          * get keep elive mode
575          * @return true if enable
576          */
577         boolean isKeepAliveEnabled();
578         /**
579          * Start an echo calibration of the sound devices, in order to find adequate settings for the echo canceler automatically.
580          * status is notified to {@link LinphoneCoreListener#ecCalibrationStatus(EcCalibratorStatus, int, Object)}
581          * @param User object
582          * @throws LinphoneCoreException if operation is still in progress;
583         **/
584         void startEchoCalibration(Object data) throws LinphoneCoreException;
585
586         void enableIpv6(boolean enable);
587         void adjustSoftwareVolume(int i);
588         
589         boolean pauseCall(LinphoneCall call);
590         boolean resumeCall(LinphoneCall call);
591         boolean pauseAllCalls();
592         
593         void setZrtpSecretsCache(String file);
594         public void enableEchoLimiter(boolean val);
595
596 }