author | Matthew Wild <mwild1@gmail.com> |
Tue, 15 Nov 2016 21:55:12 +0000 | |
changeset 2374 | 5fe483b73fd2 |
parent 830 | f160166612c2 |
permissions | -rw-r--r-- |
809 | 1 |
-- vim:sts=4 sw=4 |
2 |
||
3 |
-- Prosody IM |
|
4 |
-- Copyright (C) 2008-2010 Matthew Wild |
|
5 |
-- Copyright (C) 2008-2010 Waqas Hussain |
|
6 |
-- Copyright (C) 2012 Rob Hoelz |
|
7 |
-- |
|
8 |
-- This project is MIT/X11 licensed. Please see the |
|
9 |
-- COPYING file in the source package for more information. |
|
10 |
-- |
|
11 |
||
12 |
local st = require 'util.stanza'; |
|
13 |
||
14 |
local VCARD_NS = 'vcard-temp'; |
|
15 |
||
16 |
local builder_methods = {}; |
|
17 |
||
830
f160166612c2
Properly handle avatar/logo BINVALs
Rob Hoelz <rob@hoelz.ro>
parents:
809
diff
changeset
|
18 |
local base64_encode = require('util.encodings').base64.encode; |
f160166612c2
Properly handle avatar/logo BINVALs
Rob Hoelz <rob@hoelz.ro>
parents:
809
diff
changeset
|
19 |
|
809 | 20 |
function builder_methods:addvalue(key, value) |
21 |
self.vcard:tag(key):text(value):up(); |
|
22 |
end |
|
23 |
||
830
f160166612c2
Properly handle avatar/logo BINVALs
Rob Hoelz <rob@hoelz.ro>
parents:
809
diff
changeset
|
24 |
function builder_methods:addphotofield(tagname, format_section) |
f160166612c2
Properly handle avatar/logo BINVALs
Rob Hoelz <rob@hoelz.ro>
parents:
809
diff
changeset
|
25 |
local record = self.record; |
f160166612c2
Properly handle avatar/logo BINVALs
Rob Hoelz <rob@hoelz.ro>
parents:
809
diff
changeset
|
26 |
local format = self.format; |
f160166612c2
Properly handle avatar/logo BINVALs
Rob Hoelz <rob@hoelz.ro>
parents:
809
diff
changeset
|
27 |
local vcard = self.vcard; |
f160166612c2
Properly handle avatar/logo BINVALs
Rob Hoelz <rob@hoelz.ro>
parents:
809
diff
changeset
|
28 |
local config = format[format_section]; |
f160166612c2
Properly handle avatar/logo BINVALs
Rob Hoelz <rob@hoelz.ro>
parents:
809
diff
changeset
|
29 |
|
f160166612c2
Properly handle avatar/logo BINVALs
Rob Hoelz <rob@hoelz.ro>
parents:
809
diff
changeset
|
30 |
if not config then |
f160166612c2
Properly handle avatar/logo BINVALs
Rob Hoelz <rob@hoelz.ro>
parents:
809
diff
changeset
|
31 |
return; |
f160166612c2
Properly handle avatar/logo BINVALs
Rob Hoelz <rob@hoelz.ro>
parents:
809
diff
changeset
|
32 |
end |
f160166612c2
Properly handle avatar/logo BINVALs
Rob Hoelz <rob@hoelz.ro>
parents:
809
diff
changeset
|
33 |
|
f160166612c2
Properly handle avatar/logo BINVALs
Rob Hoelz <rob@hoelz.ro>
parents:
809
diff
changeset
|
34 |
if config.extval then |
f160166612c2
Properly handle avatar/logo BINVALs
Rob Hoelz <rob@hoelz.ro>
parents:
809
diff
changeset
|
35 |
if record[config.extval] then |
f160166612c2
Properly handle avatar/logo BINVALs
Rob Hoelz <rob@hoelz.ro>
parents:
809
diff
changeset
|
36 |
local tag = vcard:tag(tagname); |
f160166612c2
Properly handle avatar/logo BINVALs
Rob Hoelz <rob@hoelz.ro>
parents:
809
diff
changeset
|
37 |
tag:tag('EXTVAL'):text(record[config.extval]):up(); |
f160166612c2
Properly handle avatar/logo BINVALs
Rob Hoelz <rob@hoelz.ro>
parents:
809
diff
changeset
|
38 |
end |
f160166612c2
Properly handle avatar/logo BINVALs
Rob Hoelz <rob@hoelz.ro>
parents:
809
diff
changeset
|
39 |
elseif config.type and config.binval then |
f160166612c2
Properly handle avatar/logo BINVALs
Rob Hoelz <rob@hoelz.ro>
parents:
809
diff
changeset
|
40 |
if record[config.binval] then |
f160166612c2
Properly handle avatar/logo BINVALs
Rob Hoelz <rob@hoelz.ro>
parents:
809
diff
changeset
|
41 |
local tag = vcard:tag(tagname); |
f160166612c2
Properly handle avatar/logo BINVALs
Rob Hoelz <rob@hoelz.ro>
parents:
809
diff
changeset
|
42 |
tag:tag('TYPE'):text(config.type):up(); |
f160166612c2
Properly handle avatar/logo BINVALs
Rob Hoelz <rob@hoelz.ro>
parents:
809
diff
changeset
|
43 |
tag:tag('BINVAL'):text(base64_encode(record[config.binval])):up(); |
f160166612c2
Properly handle avatar/logo BINVALs
Rob Hoelz <rob@hoelz.ro>
parents:
809
diff
changeset
|
44 |
end |
f160166612c2
Properly handle avatar/logo BINVALs
Rob Hoelz <rob@hoelz.ro>
parents:
809
diff
changeset
|
45 |
else |
f160166612c2
Properly handle avatar/logo BINVALs
Rob Hoelz <rob@hoelz.ro>
parents:
809
diff
changeset
|
46 |
module:log('error', 'You have an invalid %s config section', tagname); |
f160166612c2
Properly handle avatar/logo BINVALs
Rob Hoelz <rob@hoelz.ro>
parents:
809
diff
changeset
|
47 |
return; |
f160166612c2
Properly handle avatar/logo BINVALs
Rob Hoelz <rob@hoelz.ro>
parents:
809
diff
changeset
|
48 |
end |
f160166612c2
Properly handle avatar/logo BINVALs
Rob Hoelz <rob@hoelz.ro>
parents:
809
diff
changeset
|
49 |
|
f160166612c2
Properly handle avatar/logo BINVALs
Rob Hoelz <rob@hoelz.ro>
parents:
809
diff
changeset
|
50 |
vcard:up(); |
f160166612c2
Properly handle avatar/logo BINVALs
Rob Hoelz <rob@hoelz.ro>
parents:
809
diff
changeset
|
51 |
end |
f160166612c2
Properly handle avatar/logo BINVALs
Rob Hoelz <rob@hoelz.ro>
parents:
809
diff
changeset
|
52 |
|
809 | 53 |
function builder_methods:addregularfield(tagname, format_section) |
54 |
local record = self.record; |
|
55 |
local format = self.format; |
|
56 |
local vcard = self.vcard; |
|
57 |
||
58 |
if not format[format_section] then |
|
59 |
return; |
|
60 |
end |
|
61 |
||
62 |
local tag = vcard:tag(tagname); |
|
63 |
||
64 |
for k, v in pairs(format[format_section]) do |
|
65 |
tag:tag(string.upper(k)):text(record[v]):up(); |
|
66 |
end |
|
67 |
||
68 |
vcard:up(); |
|
69 |
end |
|
70 |
||
71 |
function builder_methods:addmultisectionedfield(tagname, format_section) |
|
72 |
local record = self.record; |
|
73 |
local format = self.format; |
|
74 |
local vcard = self.vcard; |
|
75 |
||
76 |
if not format[format_section] then |
|
77 |
return; |
|
78 |
end |
|
79 |
||
80 |
for k, v in pairs(format[format_section]) do |
|
81 |
local tag = vcard:tag(tagname); |
|
82 |
||
83 |
if type(k) == 'string' then |
|
84 |
tag:tag(string.upper(k)):up(); |
|
85 |
end |
|
86 |
||
87 |
for k2, v2 in pairs(v) do |
|
88 |
if type(v2) == 'boolean' then |
|
89 |
tag:tag(string.upper(k2)):up(); |
|
90 |
else |
|
91 |
tag:tag(string.upper(k2)):text(record[v2]):up(); |
|
92 |
end |
|
93 |
end |
|
94 |
||
95 |
vcard:up(); |
|
96 |
end |
|
97 |
end |
|
98 |
||
99 |
function builder_methods:build() |
|
100 |
local record = self.record; |
|
101 |
local format = self.format; |
|
102 |
||
103 |
self:addvalue( 'VERSION', '2.0'); |
|
104 |
self:addvalue( 'FN', record[format.displayname]); |
|
105 |
self:addregularfield( 'N', 'name'); |
|
106 |
self:addvalue( 'NICKNAME', record[format.nickname]); |
|
830
f160166612c2
Properly handle avatar/logo BINVALs
Rob Hoelz <rob@hoelz.ro>
parents:
809
diff
changeset
|
107 |
self:addphotofield( 'PHOTO', 'photo'); |
809 | 108 |
self:addvalue( 'BDAY', record[format.birthday]); |
109 |
self:addmultisectionedfield('ADR', 'address'); |
|
110 |
self:addvalue( 'LABEL', nil); -- we don't support LABEL...yet. |
|
111 |
self:addmultisectionedfield('TEL', 'telephone'); |
|
112 |
self:addmultisectionedfield('EMAIL', 'email'); |
|
113 |
self:addvalue( 'JABBERID', record.jid); |
|
114 |
self:addvalue( 'MAILER', record[format.mailer]); |
|
115 |
self:addvalue( 'TZ', record[format.timezone]); |
|
116 |
self:addregularfield( 'GEO', 'geo'); |
|
117 |
self:addvalue( 'TITLE', record[format.title]); |
|
118 |
self:addvalue( 'ROLE', record[format.role]); |
|
830
f160166612c2
Properly handle avatar/logo BINVALs
Rob Hoelz <rob@hoelz.ro>
parents:
809
diff
changeset
|
119 |
self:addphotofield( 'LOGO', 'logo'); |
809 | 120 |
self:addvalue( 'AGENT', nil); -- we don't support AGENT...yet. |
121 |
self:addregularfield( 'ORG', 'org'); |
|
122 |
self:addvalue( 'CATEGORIES', nil); -- we don't support CATEGORIES...yet. |
|
123 |
self:addvalue( 'NOTE', record[format.note]); |
|
124 |
self:addvalue( 'PRODID', nil); -- we don't support PRODID...yet. |
|
125 |
self:addvalue( 'REV', record[format.rev]); |
|
126 |
self:addvalue( 'SORT-STRING', record[format.sortstring]); |
|
127 |
self:addregularfield( 'SOUND', 'sound'); |
|
128 |
self:addvalue( 'UID', record[format.uid]); |
|
129 |
self:addvalue( 'URL', record[format.url]); |
|
130 |
self:addvalue( 'CLASS', nil); -- we don't support CLASS...yet. |
|
131 |
self:addregularfield( 'KEY', 'key'); |
|
132 |
self:addvalue( 'DESC', record[format.description]); |
|
133 |
||
134 |
return self.vcard; |
|
135 |
end |
|
136 |
||
137 |
local function new_builder(params) |
|
138 |
local vcard_tag = st.stanza('vCard', { xmlns = VCARD_NS }); |
|
139 |
||
140 |
local object = { |
|
141 |
vcard = vcard_tag, |
|
142 |
__index = builder_methods, |
|
143 |
}; |
|
144 |
||
145 |
for k, v in pairs(params) do |
|
146 |
object[k] = v; |
|
147 |
end |
|
148 |
||
149 |
setmetatable(object, object); |
|
150 |
||
151 |
return object; |
|
152 |
end |
|
153 |
||
154 |
local _M = {}; |
|
155 |
||
156 |
function _M.create(params) |
|
157 |
local builder = new_builder(params); |
|
158 |
||
159 |
return builder:build(); |
|
160 |
end |
|
161 |
||
162 |
return _M; |