git » sdk » compiled » tree

[compiled] / snikket / JID.hx

package snikket;

@:expose
class JID {
	public final node : Null<String>;
	public final domain : String;
	public final resource : Null<String>;

	public function new(?node:String, domain:String, ?resource:String) {
		this.node = node == null ? null :
			StringTools.replace(StringTools.replace(StringTools.replace(
			StringTools.replace(StringTools.replace(StringTools.replace(
			StringTools.replace(StringTools.replace(StringTools.replace(
			StringTools.replace(StringTools.replace(StringTools.replace(
			StringTools.replace(StringTools.replace(StringTools.replace(
			StringTools.replace(StringTools.replace(StringTools.replace(
				StringTools.replace(StringTools.trim(node),
				"\\5c", "\\5c5c"),
				"\\20", "\\5c20"),
				"\\22", "\\5c22"),
				"\\26", "\\5c26"),
				"\\27", "\\5c27"),
				"\\2f", "\\5c2f"),
				"\\3a", "\\5c3a"),
				"\\3c", "\\5c3c"),
				"\\3e", "\\5c3e"),
				"\\40", "\\5c40"),
				" ", "\\20"),
				'"', "\\22"),
				"&", "\\26"),
				"'", "\\27"),
				"/", "\\2f"),
				":", "\\3a"),
				"<", "\\3c"),
				">", "\\3e"),
				"@", "\\40");
		this.domain = domain;
		this.resource = resource;
	}

	public static function parse(jid:String):JID {
		var resourceDelimiter = jid.indexOf("/");
		var nodeDelimiter = jid.indexOf("@");
		if(resourceDelimiter > 0 && nodeDelimiter >= resourceDelimiter) {
			nodeDelimiter = -1;
		}
		return new JID(
			(nodeDelimiter>0)?jid.substr(0, nodeDelimiter):null,
			jid.substring((nodeDelimiter == -1)?0:nodeDelimiter+1, (resourceDelimiter == -1)?jid.length+1:resourceDelimiter),
			(resourceDelimiter == -1)?null:jid.substring(resourceDelimiter+1)
		);
	}

	public function asBare():JID {
		return new JID(this.node, this.domain);
	}

	public function withResource(resource: String): JID {
		return new JID(this.node, this.domain, resource);
	}

	public function isValid():Bool {
		return domain.indexOf(".") >= 0;
	}

	public function isDomain():Bool {
		return node == null;
	}

	public function isBare():Bool {
		return resource == null;
	}

	public function equals(rhs:JID):Bool {
		return (
			this.node == rhs.node &&
			this.domain == rhs.domain &&
			this.resource == rhs.resource
		);
	}

	public function asString():String {
		return (
			(this.node != null ? this.node + "@" : "") +
			this.domain +
			(this.resource != null ? "/" + this.resource : "")
		);
	}
}