/* ----------------------------------------------------------------------------
 * This file was automatically generated by SWIG (http://www.swig.org).
 * Version 2.0.4
 *
 * 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 Callback {
  private long swigCPtr;
  protected boolean swigCMemOwn;

  public Callback(long cPtr, boolean cMemoryOwn) {
    swigCMemOwn = cMemoryOwn;
    swigCPtr = cPtr;
  }

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

  protected void finalize() {
    delete();
  }

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

  protected void swigDirectorDisconnect() {
    swigCMemOwn = false;
    delete();
  }

  public void swigReleaseOwnership() {
    swigCMemOwn = false;
    sflphoneserviceJNI.Callback_change_ownership(this, swigCPtr, false);
  }

  public void swigTakeOwnership() {
    swigCMemOwn = true;
    sflphoneserviceJNI.Callback_change_ownership(this, swigCPtr, true);
  }

  public void on_incoming_call(String arg1, String arg2, String arg3) {
    if (getClass() == Callback.class) sflphoneserviceJNI.Callback_on_incoming_call(swigCPtr, this, arg1, arg2, arg3); else sflphoneserviceJNI.Callback_on_incoming_callSwigExplicitCallback(swigCPtr, this, arg1, arg2, arg3);
  }

  public Callback() {
    this(sflphoneserviceJNI.new_Callback(), true);
    sflphoneserviceJNI.Callback_director_connect(this, swigCPtr, swigCMemOwn, true);
  }

}
