//
// BindingHelper.cs: Utility methods to make creating
//   element bindings by hand an easier task
//
// Authors:
//   Aaron Bockover (abockover@novell.com)
//
// Copyright (C) 2006 Novell, Inc.
//

using System;
using GLib;

namespace Gst {
  public static class BindingHelper {
    public static Delegate AddProxySignalDelegate (Element element, string signal,
        DynamicSignalHandler baseHandler, Delegate existingHandler, Delegate addHandler) {
      if (existingHandler == null) {
        element.Connect (signal, baseHandler);
      }

      return Delegate.Combine (existingHandler, addHandler);
    }

    public static Delegate RemoveProxySignalDelegate (Element element, string signal,
        DynamicSignalHandler baseHandler, Delegate existingHandler, Delegate removeHandler) {
      Delegate temp_delegate = Delegate.Remove (existingHandler, removeHandler);
      if (temp_delegate == null) {
        element.Disconnect (signal, baseHandler);
      }

      return temp_delegate;
    }

    public static void InvokeProxySignalDelegate (Delegate raiseDelegate, Type type,
        object o, GLib.SignalArgs args) {
      if (!type.IsSubclassOf (typeof (GLib.SignalArgs))) {
        throw new ArgumentException ("Args type must derive SignalArgs");
      }

      if (raiseDelegate != null) {
        GLib.SignalArgs new_args = (GLib.SignalArgs) Activator.CreateInstance (type);
        new_args.RetVal = args.RetVal;
        new_args.Args = args.Args;

        raiseDelegate.DynamicInvoke (new object [] { o, new_args });
      }
    }
  }
}