mono/Elements.cs
author hallski <hallski>
Sun, 10 Sep 2006 22:09:45 +0000
changeset 175 5e665ffe3e9c
parent 84 7ae7b690aa89
permissions -rw-r--r--
2006-09-11 Mikael Hallendal <micke@imendio.com> * Release 1.0.5

using System;
using System.Runtime.InteropServices;

namespace Loudmouth {

    public class Element  {
	protected IntPtr _obj;
	
	public enum ElementType {
	    MESSAGE,
	    PRESENCE,
	    IQ,
	    STREAM,
	    STREAM_ERROR,
	    UNKNOWN
	}
	
	public enum ElementSubType {
	    NOT_SET = -10,
	    AVAILABLE = -1,
	    NORMAL = 0,
	    CHAT,
	    GROUPCHAT,
	    HEADLINE,
	    UNAVAILABLE,
	    PROBE,
	    SUBSCRIBE,
	    UNSUBSCRIBE,
	    SUBSCRIBED,
	    UNSUBSCRIBED,
	    GET,
	    SET,
	    RESULT,
	    ERROR
	}

	public ElementType Kind {
	    get {
		return (ElementType) lm_message_get_type(this._obj);
	    }
	}
	
	public string this[string data] {
	    get {
		ElementNode node = this.GetNode ();
		return node[data];
	    }
	    set {
		ElementNode node = this.GetNode();
		node[data] = value;
	    }
	}
	
	protected Element (IntPtr obj) 
	{
	    this._obj = obj;
	}

	protected Element (string to, ElementType type) 
	{
	    _obj = lm_message_new (to, type);
	}
	
	protected Element (string to, ElementType type, ElementSubType sub) 
	{
	    _obj = lm_message_new_with_sub_type (to, type, sub);
	}
	
	protected ElementSubType GetElementSubType () 
	{
	    return lm_message_get_sub_type (this._obj);
	}

	public ElementNode GetNode () 
	{
	    return new ElementNode(lm_message_get_node (this._obj));
	}

	public IntPtr GetObject ()
	{
	    return _obj;
	}
	
	public override string ToString () 
	{
	    return "<Element: " + this.Kind + ":" + this.GetElementSubType() + ">";
	}

	public static Element CreateElement (IntPtr obj)
	{
	    switch (lm_message_get_type(obj)) {
		case (int)Element.ElementType.MESSAGE:
		    return new Message(obj);
		case (int)Element.ElementType.PRESENCE:
		    return new Presence(obj);
		case (int)Element.ElementType.IQ:
		    return new IQ(obj);
	    }
	    return null;
	}
 
	[DllImport ("libloudmouth-1.so")]
	    private static extern int lm_message_get_type (IntPtr obj);
	[DllImport ("libloudmouth-1.so")]
	    private static extern IntPtr lm_message_new (string to, ElementType type);
	[DllImport ("libloudmouth-1.so")]
	    private static extern IntPtr lm_message_new_with_sub_type (string to, ElementType type, ElementSubType sub);
	[DllImport ("libloudmouth-1.so")]
	    private static extern ElementSubType lm_message_get_sub_type (IntPtr obj);
	[DllImport ("libloudmouth-1.so")]
	    private static extern IntPtr lm_message_get_node (IntPtr obj);
   }
  
    public class Message : Element {
	public MessageType Type {
	    get {
		return (MessageType) this.GetElementSubType ();
	    }
	}
	public string Body {
	    get {
		ElementNode node = this.GetNode().FindChild("body");
		if (node == null) {
		    return null;
		}
		return node.Value;
	    }
	    set {
		this.GetNode().AddChild("body", value);
	    }
	}
	
	public enum MessageType {
	    NORMAL     = Element.ElementSubType.NOT_SET,
	    CHAT       = Element.ElementSubType.CHAT,
	    GROUPCHAT  = Element.ElementSubType.GROUPCHAT,
	    HEADLINE   = Element.ElementSubType.HEADLINE
	}

	public Message (IntPtr obj) : base (obj) 
	{
	}
	
	public Message (string to) : base (to, Element.ElementType.MESSAGE, Element.ElementSubType.NOT_SET) 
	{
	}
	
	public Message (string to, MessageType type) : base (to, Element.ElementType.MESSAGE, (Element.ElementSubType) type) 
	{
	}
    }

    public class Presence : Element {
	public enum PresenceType {
	    AVAILABLE    = Element.ElementSubType.AVAILABLE,
	    UNAVAILABLE  = Element.ElementSubType.UNAVAILABLE,
	    PROBE        = Element.ElementSubType.PROBE, 
	    SUBSCRIBE    = Element.ElementSubType.SUBSCRIBE, 
	    UNSUBSCRIBE  = Element.ElementSubType.UNSUBSCRIBE,
	    SUBSCRIBED   = Element.ElementSubType.SUBSCRIBED,
	    UNSUBSCRIBED = Element.ElementSubType.UNSUBSCRIBED, 
	}

	public Presence (IntPtr obj) : base (obj) 
	{
	}

	public Presence () : base (null, Element.ElementType.PRESENCE, Element.ElementSubType.AVAILABLE) 
	{
	}
		    
	public Presence (PresenceType type) : base (null, Element.ElementType.PRESENCE, (Element.ElementSubType) type) 
	{
	}
	
	public Presence (string to) : base (to, Element.ElementType.PRESENCE) 
	{
	}
	
	public Presence (string to, PresenceType type) : base (to, Element.ElementType.PRESENCE, (Element.ElementSubType) type) 
	{
	}
    }

    public class IQ : Element {

	public string XMLNs {
	    get {
		ElementNode qNode = this.GetNode().FindChild("query");
		if (qNode != null) {
		    return qNode["xmlns"];
		}
		return "";
	    }
	    set {
		ElementNode qNode = this.GetNode().FindChild("query");
		if (qNode == null) {
		    qNode = this.GetNode().AddChild("query", null);
		}
		
		qNode["xmlns"] = value;
	    }
	}
	
	public enum IQType {
	    GET    = Element.ElementSubType.GET,
	    SET    = Element.ElementSubType.SET,
	    RESULT = Element.ElementSubType.RESULT
	}

	public IQ (IntPtr obj) : base (obj) 
	{
	}

	public IQ () : base (null, Element.ElementType.IQ, Element.ElementSubType.GET) 
	{
	}
	
	public IQ (string to) : base (to, Element.ElementType.IQ, Element.ElementSubType.GET) 
	{
	}
	
	public IQ (string to, IQType type) : base (to, Element.ElementType.IQ, (Element.ElementSubType) type) 
	{
	}

	public IQ (IQType type) : base (null, Element.ElementType.IQ, (Element.ElementSubType) type) 
	{
	}
    }
}