Skip to content

Commit

Permalink
moved static methods; return full object addresses instead of the ins…
Browse files Browse the repository at this point in the history
…tance id
  • Loading branch information
flosse committed Jan 12, 2012
1 parent f92342d commit 881979e
Show file tree
Hide file tree
Showing 3 changed files with 222 additions and 221 deletions.
6 changes: 3 additions & 3 deletions joap/spec/strophe.joap.spec.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -135,7 +135,7 @@ describe "strophe.joap loading", ->
.c("add").c("newAddress").t("User@example.org/markus")
@c._dataRecv createRequest(res)
server.add "User", {name: "foo", pass: 2}, (iq, err, instanceId) ->
(expect instanceId).toEqual "markus"
(expect instanceId).toEqual "User@example.org/markus"

it "can edit an instance", ->
spyon @c, "send", (iq) =>
Expand Down Expand Up @@ -211,8 +211,8 @@ describe "strophe.joap loading", ->

server.search "User", (iq, err, result) ->
(expect typeof iq).toEqual "object"
(expect result[0]).toEqual "id0"
(expect result[1]).toEqual "id2"
(expect result[0]).toEqual "Class@service.example.com/id0"
(expect result[1]).toEqual "Class@service.example.com/id2"

it "can send a describe request a class", ->
spyon @c, "send", (iq) =>
Expand Down
166 changes: 84 additions & 82 deletions joap/strophe.joap.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,83 @@
# Copyright 2012 (c) Markus Kohlhase <mail@markus-kohlhase.de>

JOAP_NS = "jabber:iq:joap"

# Private static members

conn = null

onError = (cb=->) -> (iq) ->
err = iq.getElementsByTagName("error")[0]
if err?
code = err.getAttribute("code") * 1
msg = err.textContent
msg = "JOAP server is unavailable" if code is 503
cb iq, new JOAPError msg, code
else
cb iq, new JOAPError "Unknown error"

addXMLAttributes = (iq, attrs) ->
if typeof attrs is "object"
for k,v of attrs
iq.c("attribute")
.c("name").t(k).up()
.cnode(conn.rpc._convertToXML v).up().up()

parseAttributes = (iq) ->
attrs = iq.getElementsByTagName("attribute")
data = {}
for a in attrs
key = a.getElementsByTagName("name")[0].textContent
data[key] = conn.rpc._convertFromXML a.getElementsByTagName("value")[0]
data

parseNewAddress = (iq) ->
address = iq.getElementsByTagName("newAddress")[0].textContent

parseSearch = (iq) ->
items = iq.getElementsByTagName("item")
(i.textContent for i in items)

parseAttributeDescription = (d) ->
name: d.getElementsByTagName("name")[0]?.textContent
type: d.getElementsByTagName("type")[0]?.textContent
desc: parseDesc d.getElementsByTagName("desc")

parseMethodDescription = (d) ->
name: d.getElementsByTagName("name")[0]?.textContent
returnType: d.getElementsByTagName("returnType")[0]?.textContent
desc: parseDesc d.getElementsByTagName("desc")

parseDesc = (desc) ->
res = {}
if desc instanceof NodeList
for c in desc
res[c.getAttribute "xml:lang"] = c.textContent
else
res.desc[desc.getAttribute "xml:lang"] = desc.textContent
res

parseDescription = (iq) ->
result = desc: {}, attributes: {}, methods: {}, classes: []
describe = iq.getElementsByTagName("describe")[0]
for c in describe.childNodes
switch c.tagName.toLowerCase()
when "desc"
result.desc[c.getAttribute "xml:lang"] = c.textContent
when "attributedescription"
ad = parseAttributeDescription c
result.attributes[ad.name] = ad
when "methoddescription"
md = parseMethodDescription c
result.methods[md.name] = md
when "superclass"
result.superclass = c.textContent
when "timestamp"
result.timestamp = c.textContent
when "class"
classes.push = c.textContent
result

class JOAPError extends Error

constructor: (@message, @code)->
Expand All @@ -13,84 +88,11 @@ class Server

constructor: (@service) ->

@onError: (cb=->) -> (iq) ->
err = iq.getElementsByTagName("error")[0]
if err?
code = err.getAttribute("code") * 1
msg = err.textContent
msg = "JOAP server is unavailable" if code is 503
cb iq, new JOAPError msg, code
else
cb iq, new JOAPError "Unknown error"

@addXMLAttributes: (iq, attrs) ->
if typeof attrs is "object"
for k,v of attrs
iq.c("attribute")
.c("name").t(k).up()
.cnode(conn.rpc._convertToXML v).up().up()

@parseAttributes: (iq) ->
attrs = iq.getElementsByTagName("attribute")
data = {}
for a in attrs
key = a.getElementsByTagName("name")[0].textContent
data[key] = conn.rpc._convertFromXML a.getElementsByTagName("value")[0]
data

@parseNewAddress: (iq) ->
address = iq.getElementsByTagName("newAddress")[0].textContent
address.split("/")[1]

@parseSearch: (iq) ->
items = iq.getElementsByTagName("item")
(i.textContent.split('/')[1] for i in items)

@parseAttributeDescription: (d) ->
name: d.getElementsByTagName("name")[0]?.textContent
type: d.getElementsByTagName("type")[0]?.textContent
desc: Server.parseDesc d.getElementsByTagName("desc")

@parseMethodDescription: (d) ->
name: d.getElementsByTagName("name")[0]?.textContent
returnType: d.getElementsByTagName("returnType")[0]?.textContent
desc: Server.parseDesc d.getElementsByTagName("desc")

@parseDesc: (desc) ->
res = {}
if desc instanceof NodeList
for c in desc
res[c.getAttribute "xml:lang"] = c.textContent
else
res.desc[desc.getAttribute "xml:lang"] = desc.textContent
res

@parseDescription: (iq) ->
result = desc: {}, attributes: {}, methods: {}, classes: []
describe = iq.getElementsByTagName("describe")[0]
for c in describe.childNodes
switch c.tagName.toLowerCase()
when "desc"
result.desc[c.getAttribute "xml:lang"] = c.textContent
when "attributedescription"
ad = Server.parseAttributeDescription c
result.attributes[ad.name] = ad
when "methoddescription"
md = Server.parseMethodDescription c
result.methods[md.name] = md
when "superclass"
result.superclass = c.textContent
when "timestamp"
result.timestamp = c.textContent
when "class"
classes.push = c.textContent
result

sendRequest: (type, clazz, cb, opt={}) ->
iq = @createIq type, clazz, opt.instance
opt.beforeSend? iq
success = (res) -> cb? res, null, opt.onResult?(res)
conn.sendIQ iq, success, Server.onError(cb)
conn.sendIQ iq, success, onError(cb)

createIq: (type, clazz, instance) ->
iqType = "set"
Expand All @@ -114,35 +116,35 @@ class Server
instance = null
@sendRequest "describe", clazz, cb,
instance: instance
onResult: Server.parseDescription
onResult: parseDescription

add: (clazz, attrs, cb) ->
cb = attrs if typeof attrs is "function"
@sendRequest "add", clazz, cb,
beforeSend: (iq) -> Server.addXMLAttributes iq, attrs
onResult: Server.parseNewAddress
beforeSend: (iq) -> addXMLAttributes iq, attrs
onResult: parseNewAddress

read: (clazz, instance, limits, cb) ->
cb = limits if typeof limits is "function"
@sendRequest "read", clazz, cb,
instance: instance
beforeSend: (iq) -> if limits instanceof Array
iq.c("name").t(l).up() for l in limits
onResult: Server.parseAttributes
onResult: parseAttributes

edit: (clazz, instance, attrs, cb) -> @sendRequest "edit", clazz, cb,
instance: instance
beforeSend: (iq) -> Server.addXMLAttributes iq, attrs
onResult: Server.parseAttributes
beforeSend: (iq) -> addXMLAttributes iq, attrs
onResult: parseAttributes

delete: (clazz, instance, cb) -> @sendRequest "delete", clazz, cb,
instance: instance

search: (clazz, attrs, cb) ->
cb = attrs if typeof attrs is "function"
@sendRequest "search", clazz, cb,
beforeSend: (iq) -> Server.addXMLAttributes iq, attrs
onResult: Server.parseSearch
beforeSend: (iq) -> addXMLAttributes iq, attrs
onResult: parseSearch

Strophe.addConnectionPlugin 'joap', do ->

Expand Down
Loading

0 comments on commit 881979e

Please sign in to comment.