diff options
Diffstat (limited to 'mono/InterfaceProxy.cs')
| -rw-r--r-- | mono/InterfaceProxy.cs | 86 | 
1 files changed, 86 insertions, 0 deletions
| diff --git a/mono/InterfaceProxy.cs b/mono/InterfaceProxy.cs new file mode 100644 index 00000000..6ccc9636 --- /dev/null +++ b/mono/InterfaceProxy.cs @@ -0,0 +1,86 @@ +namespace DBus +{ +  using System; +  using System.Collections; +  using System.Reflection; +   +  internal class InterfaceProxy +  { +    private static Hashtable interfaceProxies = new Hashtable(); +    private Hashtable methods = null; + +    private string interfaceName; + +    private InterfaceProxy(Type type)  +    { +      object[] attributes = type.GetCustomAttributes(typeof(InterfaceAttribute), true); +      InterfaceAttribute interfaceAttribute = (InterfaceAttribute) attributes[0]; +      this.interfaceName = interfaceAttribute.InterfaceName; +      AddMethods(type); +    } + +    private void AddMethods(Type type) +    { +      this.methods = new Hashtable(); +      foreach (MethodInfo method in type.GetMethods(BindingFlags.Public |  +						    BindingFlags.Instance |  +						    BindingFlags.DeclaredOnly)) { +	object[] attributes = method.GetCustomAttributes(typeof(MethodAttribute), true); +	if (attributes.GetLength(0) > 0) { +	  methods.Add(GetKey(method), method); +	} +      } +    } +     + +    public static InterfaceProxy GetInterface(Type type)  +    { +      if (!interfaceProxies.Contains(type)) { +	interfaceProxies[type] = new InterfaceProxy(type); +      } + +      return (InterfaceProxy) interfaceProxies[type]; +    } + +    public bool HasMethod(string key)  +    { +      return this.Methods.Contains(key); +    } +     +    public MethodInfo GetMethod(string key) +    { +      return (MethodInfo) this.Methods[key]; +    } + +    private string GetKey(MethodInfo method)  +    { +      ParameterInfo[] pars = method.GetParameters(); +      string key = method.Name + " "; +       +      foreach (ParameterInfo par in pars) { +	if (!par.IsOut) { +	  Type dbusType = Arguments.MatchType(par.ParameterType); +	  key += Arguments.GetCode(dbusType); +	} +      } + +      return key; +    } + +    public Hashtable Methods +    { +      get { +	return this.methods; +      } +    } +     +    public string InterfaceName +    { +      get { +	return this.interfaceName; +      } +    } +  } +} + +     | 
