/* ----------------------------------------------------------------------------
 * This file was automatically generated by SWIG (http://www.swig.org).
 * Version 2.0.8
 *
 * Do not make changes to this file unless you know what you are doing--modify
 * the SWIG interface file instead.
 * ----------------------------------------------------------------------------- */

package com.savoirfairelinux.sflphone.client;

public class ManagerImpl {
  private long swigCPtr;
  protected boolean swigCMemOwn;

  protected ManagerImpl(long cPtr, boolean cMemoryOwn) {
    swigCMemOwn = cMemoryOwn;
    swigCPtr = cPtr;
  }

  protected static long getCPtr(ManagerImpl obj) {
    return (obj == null) ? 0 : obj.swigCPtr;
  }

  protected void finalize() {
    delete();
  }

  public synchronized void delete() {
    if (swigCPtr != 0) {
      if (swigCMemOwn) {
        swigCMemOwn = false;
        sflphoneserviceJNI.delete_ManagerImpl(swigCPtr);
      }
      swigCPtr = 0;
    }
  }

  public void init(String config_file) {
    sflphoneserviceJNI.ManagerImpl_init(swigCPtr, this, config_file);
  }

  public void setPath(String path) {
    sflphoneserviceJNI.ManagerImpl_setPath(swigCPtr, this, path);
  }

  public boolean outgoingCall(String arg0, String arg1, String arg2, String arg3) {
    return sflphoneserviceJNI.ManagerImpl_outgoingCall__SWIG_0(swigCPtr, this, arg0, arg1, arg2, arg3);
  }

  public boolean outgoingCall(String arg0, String arg1, String arg2) {
    return sflphoneserviceJNI.ManagerImpl_outgoingCall__SWIG_1(swigCPtr, this, arg0, arg1, arg2);
  }

  public void refuseCall(String id) {
    sflphoneserviceJNI.ManagerImpl_refuseCall(swigCPtr, this, id);
  }

  public boolean answerCall(String id) {
    return sflphoneserviceJNI.ManagerImpl_answerCall(swigCPtr, this, id);
  }

  public void hangupCall(String id) {
    sflphoneserviceJNI.ManagerImpl_hangupCall(swigCPtr, this, id);
  }

  public ManagerImpl() {
    this(sflphoneserviceJNI.new_ManagerImpl(), true);
  }

}
