-- IN-BAND REGISTRATION (XEP-0077)
-- library
local iq = require 'lm.iq'
local x_data = require 'lm.x_data'
local form_field = require 'lm.form_field'
--
local F = { }
local M = { }
M.__index = M
function F.new ( args )
local form = {
xmlns = 'jabber:iq:register',
ftype = args.type or 'form',
registered = args.registered,
-- XXX title
instructions = args.instructions,
x_data = args.x_data,
f = { },
}
setmetatable ( form, M )
return form
end
function F.parse ( query )
local instructions = query:child ( 'instructions' )
if instructions then
instructions = instructions:value ()
end
local registered
if query:child ( 'registered' ) then
registered = true
end
local x = query:child ( 'x' )
if x and x:attribute ( 'xmlns' ) == 'jabber:x:data' then
return F.new { type = 'form', registered = registered, instructions = instructions, x_data = x_data.parse ( x ) }
end
local form = F.new { type = 'form', registered = registered, instructions = instructions }
local field = query:child ()
while field do
local name = field:name ()
if name ~= 'instructions' and name ~= 'registered' then
form:add ( name, { type = 'text-single', value = field:value () or '' } )
end
field = field:next ()
end
return form
end
function M.type ( form )
return form.ftype
end
function M.desc ( form )
if form.x_data then
return form.x_data:desc ()
else
return form.title, form.instructions
end
end
function M.format ( form, root, format_as )
local ft = format_as or form:type ()
if form.x_data then
root.query = form.x_data:format ( { xmlns = 'jabber:iq:register' }, ft )
else
root.query = { xmlns = 'jabber:iq:register' }
for index, field in form:fields () do
root.query[field:name ()] = { field:value () }
end
end
if ft == 'form' then
local title, instructions = form:desc ()
if instructions then
root.query.instructions = { instructions }
end
if form.registered then
root.query.registered = { }
end
end
return root
end
function M.fields ( form )
if form.x_data then
return form.x_data:fields ()
else
return ipairs ( form.f )
end
end
function M.add ( form, name, fld )
if form.x_data then
return form.x_data:add ( name, fld )
else
fld.var = name
fld.index = #form.f + 1
if not fld.type then
fld.type = 'text-single'
end
local obj = form_field.new ( fld )
table.insert ( form.f, obj )
form.f[name] = obj
return obj
end
end
function M.field ( form, name )
if form.x_data then
return form.x_data:field ( name )
else
return form.f[name]
end
end
function F.register ( conn, to, success, fail )
iq.send ( conn, to, 'get',
{
query = { xmlns = 'jabber:iq:register' },
},
function ( mess )
local query = mess:child ( 'query' )
if query and query:attribute ( 'xmlns' ) == 'jabber:iq:register' then
success ( F.parse ( query ),
function ( form, success, fail )
iq.send ( conn, to, 'set', form:format ( { }, 'submit' ), success , fail )
end,
function ( form, success, fail )
success ()
end )
end
end, fail )
end
function F.unregister ( conn, to, success, fail )
iq.send ( conn, to, 'set',
{
query = { xmlns = 'jabber:iq:register',
remove = { },
},
},
function ( mess )
success ()
end,
function ( mesg, mess )
local query = mess:child ( 'query' )
if query and query:attribute ( 'xmlns' ) == 'jabber:iq:register' then
success ( F.parse ( query ),
function ( form, success, fail )
iq.send ( conn, to, 'set', form:format ( { }, 'submit' ), success, fail )
end,
function ( form, success, fail )
success ()
end )
else
fail ( mesg )
end
end )
end
return F
-- vim: se ts=4: --