examples/vcard.lua
author Myhailo Danylenko <isbear@ukrpost.net>
Sat, 28 Mar 2009 19:43:12 +0200
changeset 67 d33ca5572e91
parent 66 542f61e113cb
child 68 742878c74b8e
permissions -rw-r--r--
Fully object forms interface (untested)
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
62
fb81aeb45e00 Vcard and Evil
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     1
fb81aeb45e00 Vcard and Evil
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     2
-- VCARD-TEMP (XEP-0054)
fb81aeb45e00 Vcard and Evil
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     3
fb81aeb45e00 Vcard and Evil
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     4
-- library
fb81aeb45e00 Vcard and Evil
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     5
67
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
     6
local iq         = require 'iq'
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
     7
local form_field = require 'form_field'
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
     8
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
     9
--
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    10
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    11
local F = { }
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    12
local M = { }
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    13
M.__index = M
62
fb81aeb45e00 Vcard and Evil
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    14
67
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    15
function F.new ( args )
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    16
	local form = {
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    17
		xmlns        = 'vcard-temp',
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    18
		ftype        = args.type or 'form',
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    19
		title        = args.title,
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    20
		instructions = args.instructions,
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    21
		f            = { },
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    22
	}
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    23
	setmetatable ( form, M )
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    24
	return form
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    25
end
62
fb81aeb45e00 Vcard and Evil
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    26
67
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    27
local function vcard_parse ( node, path, form )
62
fb81aeb45e00 Vcard and Evil
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    28
	local item = node:child ()
fb81aeb45e00 Vcard and Evil
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    29
	if item then
fb81aeb45e00 Vcard and Evil
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    30
		while item do
67
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    31
			vcard_parse ( item, ( path and path .. '/' or '' ) .. item:name (), form )
62
fb81aeb45e00 Vcard and Evil
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    32
			item = item:next ()
fb81aeb45e00 Vcard and Evil
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    33
		end
fb81aeb45e00 Vcard and Evil
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    34
	elseif path then
67
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    35
		form:add ( path, { type = 'text-single', value = node:value () } )
62
fb81aeb45e00 Vcard and Evil
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    36
	end
fb81aeb45e00 Vcard and Evil
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    37
end
fb81aeb45e00 Vcard and Evil
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    38
67
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    39
function F.parse ( card )
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    40
	local form = F.new { type = 'form' }
62
fb81aeb45e00 Vcard and Evil
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    41
	vcard_parse ( card, nil, form )
fb81aeb45e00 Vcard and Evil
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    42
	return form
fb81aeb45e00 Vcard and Evil
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    43
end
fb81aeb45e00 Vcard and Evil
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    44
67
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    45
function M.type ( form )
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    46
	return form.ftype
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    47
end
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    48
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    49
function M.desc ( form )
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    50
	return form.title, form.instructions
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    51
end
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    52
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    53
function M.format ( form, root, format_as )
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    54
	root.vCard = { xmlns = 'vcard-temp' }
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    55
	for k, field in form:fields () do
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    56
		local el = root.vCard
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    57
		for k in field:name():gmatch ( '[^/]+' ) do
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    58
			if not el[k] then
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    59
				el[k] = { }
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    60
			end
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    61
			el = el[k]
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    62
		end
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    63
		el[1] = field:value ()
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    64
	end
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    65
	return root
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    66
end
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    67
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    68
function M.fields ( form )
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    69
	return ipairs ( form.f )
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    70
end
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    71
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    72
function M.add ( form, name, fld )
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    73
	fld.var   = name
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    74
	fld.index = #form.f + 1
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    75
	local obj = form_field.new ( fld )
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    76
	table.insert ( form.f, obj )
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    77
	form.f[name] = obj
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    78
	return obj
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    79
end
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    80
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    81
function M.field ( form, name )
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    82
	return form.f[name]
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    83
end
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    84
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    85
function F.retrieve ( conn, from, success, fail )
62
fb81aeb45e00 Vcard and Evil
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    86
	iq.send ( conn, from, 'get',
fb81aeb45e00 Vcard and Evil
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    87
		{
fb81aeb45e00 Vcard and Evil
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    88
			vCard = { xmlns = 'vcard-temp' },
fb81aeb45e00 Vcard and Evil
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    89
		},
fb81aeb45e00 Vcard and Evil
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    90
		function ( mess )
fb81aeb45e00 Vcard and Evil
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    91
			local card = mess:child ( 'vCard' )
fb81aeb45e00 Vcard and Evil
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    92
			if card and card:attribute ( 'xmlns' ) == 'vcard-temp' then
67
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    93
				success ( F.parse ( mess:child ( 'vCard' ) ),
62
fb81aeb45e00 Vcard and Evil
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    94
					function ( form, success, fail )
67
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
    95
						iq.send ( conn, from, 'set', form:format ( form, { }, 'submit' ), success, fail )
62
fb81aeb45e00 Vcard and Evil
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    96
					end,
fb81aeb45e00 Vcard and Evil
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    97
					function ( form, success, fail )
fb81aeb45e00 Vcard and Evil
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    98
						success ()
fb81aeb45e00 Vcard and Evil
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    99
					end )
fb81aeb45e00 Vcard and Evil
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   100
			else
fb81aeb45e00 Vcard and Evil
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   101
				fail ( mess:xml () ) -- XXX
fb81aeb45e00 Vcard and Evil
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   102
			end
fb81aeb45e00 Vcard and Evil
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   103
		end, fail )
fb81aeb45e00 Vcard and Evil
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   104
end
fb81aeb45e00 Vcard and Evil
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   105
67
d33ca5572e91 Fully object forms interface (untested)
Myhailo Danylenko <isbear@ukrpost.net>
parents: 66
diff changeset
   106
return F
62
fb81aeb45e00 Vcard and Evil
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   107
fb81aeb45e00 Vcard and Evil
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   108
-- vim: se ts=4: --