examples/xep0047.lua
author Myhailo Danylenko <isbear@ukrpost.net>
Mon, 23 Mar 2009 02:00:57 +0200
changeset 54 b53355736057
parent 42 18d801679feb
permissions -rw-r--r--
Avatar
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
5
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     1
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     2
receiving_files = {}
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     3
ibb_block_size  = 4096
42
18d801679feb Old ibb updates
Myhailo Danylenko <isbear@ukrpost.net>
parents: 38
diff changeset
     4
local ibb_sid = 0
5
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     5
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     6
ibb_incoming_iq_handler = lm.message_handler.new ( 
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     7
	function ( conn, mess )
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     8
		local id   = mess:attribute ( 'id' )
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     9
		local from = mess:attribute ( 'from' )
38
1f141d9a081a IBB uses user connection, optimization
Myhailo Danylenko <isbear@ukrpost.net>
parents: 34
diff changeset
    10
1f141d9a081a IBB uses user connection, optimization
Myhailo Danylenko <isbear@ukrpost.net>
parents: 34
diff changeset
    11
		local open = mess:child ( 'open' )
1f141d9a081a IBB uses user connection, optimization
Myhailo Danylenko <isbear@ukrpost.net>
parents: 34
diff changeset
    12
		if open and open:attribute ( 'xmlns' ) == 'http://jabber.org/protocol/ibb' then
1f141d9a081a IBB uses user connection, optimization
Myhailo Danylenko <isbear@ukrpost.net>
parents: 34
diff changeset
    13
			local sid  = open:attribute ( 'sid' )
5
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    14
			if not receiving_files[sid] then
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    15
				local buffer = ''
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    16
				receiving_files[sid] = { from = from, status = 'pending' }
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    17
				receiving_files[sid].accept =
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    18
					function ( name )
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    19
						main.print_info ( from, string.format ( "Receiving stream from %s, id %s", from, sid ) )
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    20
						conn:send ( lm.message.create { to = from, mtype = 'iq-result', id = id } )
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    21
						receiving_files[sid].name = name
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    22
						receiving_files[sid].status = 'accepted'
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    23
					end
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    24
				receiving_files[sid].reject =
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    25
					function ()
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    26
						conn:send (
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    27
							lm.message.create { to = from, mtype = 'iq-error', id = id,
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    28
								error = { code = '405', type = 'cancel',
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    29
									['not-allowed'] = { xmlns = 'urn:ietf:params:xml:ns:xmpp-stanzas' }
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    30
								}
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    31
							} )
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    32
						receiving_files[sid].status = 'rejected'
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    33
					end
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    34
				print ( 'You have a new bytestream to receive. To save it use /ibb accept ' .. sid .. ' filename' )
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    35
			else
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    36
				conn:send (
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    37
					lm.message.create { to = from, mtype = 'iq-error', id = id,
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    38
						error = { code = '409', type = 'cancel',
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    39
							conflict = { xmlns = 'urn:ietf:params:xml:ns:xmpp-stanzas' }
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    40
						}
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    41
					} )
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    42
			end
38
1f141d9a081a IBB uses user connection, optimization
Myhailo Danylenko <isbear@ukrpost.net>
parents: 34
diff changeset
    43
			return true
1f141d9a081a IBB uses user connection, optimization
Myhailo Danylenko <isbear@ukrpost.net>
parents: 34
diff changeset
    44
		end
1f141d9a081a IBB uses user connection, optimization
Myhailo Danylenko <isbear@ukrpost.net>
parents: 34
diff changeset
    45
1f141d9a081a IBB uses user connection, optimization
Myhailo Danylenko <isbear@ukrpost.net>
parents: 34
diff changeset
    46
		local qdata = mess:child ( 'data' )
1f141d9a081a IBB uses user connection, optimization
Myhailo Danylenko <isbear@ukrpost.net>
parents: 34
diff changeset
    47
		if qdata and qdata:attribute ( 'xmlns' ) == 'http://jabber.org/protocol/ibb' then
1f141d9a081a IBB uses user connection, optimization
Myhailo Danylenko <isbear@ukrpost.net>
parents: 34
diff changeset
    48
			local sid  = qdata:attribute ( 'sid' )
1f141d9a081a IBB uses user connection, optimization
Myhailo Danylenko <isbear@ukrpost.net>
parents: 34
diff changeset
    49
			local seq  = qdata:attribute ( 'seq' )
5
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    50
			if receiving_files[sid] and from == receiving_files[sid].from and not receiving_files[sid][tonumber(seq)+1] then
38
1f141d9a081a IBB uses user connection, optimization
Myhailo Danylenko <isbear@ukrpost.net>
parents: 34
diff changeset
    51
				local data = qdata:value ()
5
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    52
				main.print_info ( from, string.format ( " - stream part %s, id %s, %d bytes", seq, sid, data:len() ) )
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    53
				conn:send ( lm.message.create { to = from, mtype = 'iq-result', id = id } )
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    54
				receiving_files[sid][tonumber(seq)+1] = data
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    55
			else
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    56
				receiving_files[sid] = nil -- invalidate session
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    57
				conn:send (
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    58
					lm.message.create { to = from, mtype = 'iq-error', id = id,
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    59
						error = { code = '409', type = 'cancel',
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    60
							conflict = { xmlns = 'urn:ietf:params:xml:ns:xmpp-stanzas' }
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    61
						}
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    62
					} )
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    63
			end
38
1f141d9a081a IBB uses user connection, optimization
Myhailo Danylenko <isbear@ukrpost.net>
parents: 34
diff changeset
    64
			return true
1f141d9a081a IBB uses user connection, optimization
Myhailo Danylenko <isbear@ukrpost.net>
parents: 34
diff changeset
    65
		end
1f141d9a081a IBB uses user connection, optimization
Myhailo Danylenko <isbear@ukrpost.net>
parents: 34
diff changeset
    66
1f141d9a081a IBB uses user connection, optimization
Myhailo Danylenko <isbear@ukrpost.net>
parents: 34
diff changeset
    67
		local close = mess:child ( 'close' )
1f141d9a081a IBB uses user connection, optimization
Myhailo Danylenko <isbear@ukrpost.net>
parents: 34
diff changeset
    68
		if close and close:attribute ( 'xmlns' ) == 'http://jabber.org/protocol/ibb' then
1f141d9a081a IBB uses user connection, optimization
Myhailo Danylenko <isbear@ukrpost.net>
parents: 34
diff changeset
    69
			local sid  = close:attribute ( 'sid' )
5
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    70
			if receiving_files[sid] and from == receiving_files[sid].from then
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    71
				main.print_info ( from, "Done with stream id " .. sid )
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    72
				conn:send ( lm.message.create { to = from, mtype = 'iq-result', id = id } )
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    73
				local decoder = io.popen ( string.format ( "base64 -d -i >%q", receiving_files[sid].name ), "w" )
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    74
				if not decoder then
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    75
					main.print_info ( from, "Error opening decoder" )
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    76
				else
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    77
					for i, v in ipairs ( receiving_files[sid] ) do
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    78
						decoder:write ( v )
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    79
					end
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    80
					decoder:close ()
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    81
				end
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    82
			else
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    83
				receiving_files[sid] = nil -- invalidate session
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    84
				conn:send (
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    85
					lm.message.create { to = from, mtype = 'iq-error', id = id,
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    86
						error = { code = '409', type = 'cancel',
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    87
							conflict = { xmlns = 'urn:ietf:params:xml:ns:xmpp-stanzas' }
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    88
						}
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    89
					} )
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    90
			end
38
1f141d9a081a IBB uses user connection, optimization
Myhailo Danylenko <isbear@ukrpost.net>
parents: 34
diff changeset
    91
			return true
5
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    92
		end
38
1f141d9a081a IBB uses user connection, optimization
Myhailo Danylenko <isbear@ukrpost.net>
parents: 34
diff changeset
    93
1f141d9a081a IBB uses user connection, optimization
Myhailo Danylenko <isbear@ukrpost.net>
parents: 34
diff changeset
    94
		return false
5
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    95
	end )
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    96
42
18d801679feb Old ibb updates
Myhailo Danylenko <isbear@ukrpost.net>
parents: 38
diff changeset
    97
function ibb_send_file ( conn, to, name, id )
10
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 8
diff changeset
    98
	if not to then
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 8
diff changeset
    99
		to = main.full_jid ()
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 8
diff changeset
   100
	elseif not to:match ( "/" ) then
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 8
diff changeset
   101
		to = main.full_jid ( to )
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 8
diff changeset
   102
	end
42
18d801679feb Old ibb updates
Myhailo Danylenko <isbear@ukrpost.net>
parents: 38
diff changeset
   103
	local sid = id
18d801679feb Old ibb updates
Myhailo Danylenko <isbear@ukrpost.net>
parents: 38
diff changeset
   104
	if not sid then -- XXX: move out of here?
18d801679feb Old ibb updates
Myhailo Danylenko <isbear@ukrpost.net>
parents: 38
diff changeset
   105
		ibb_sid = ibb_sid + 1
18d801679feb Old ibb updates
Myhailo Danylenko <isbear@ukrpost.net>
parents: 38
diff changeset
   106
		sid = 'ibb_' .. ibb_sid
18d801679feb Old ibb updates
Myhailo Danylenko <isbear@ukrpost.net>
parents: 38
diff changeset
   107
	end
5
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   108
	conn:send (
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   109
		lm.message.create { to = to, mtype = 'iq-set',
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   110
			open = { sid = sid, ['block-size'] = ibb_block_size, xmlns = 'http://jabber.org/protocol/ibb' }
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   111
		},
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   112
		function ( conn, message )
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   113
			if message:child ( 'error' ) then
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   114
				main.print_info ( to, "Stream request refused: " .. message:child( 'error' ):children():name () )
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   115
			else
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   116
				main.print_info ( to, "Stream accepted, starting sequence" )
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   117
				local buffer = ''
42
18d801679feb Old ibb updates
Myhailo Danylenko <isbear@ukrpost.net>
parents: 38
diff changeset
   118
				main.bgread ( string.format ( 'base64 -w 0 %q', name ), -- FIXME: stream reader function? XXX: then we need in-place base64 encoder.
5
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   119
					function ( data )
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   120
						if data then
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   121
							buffer = buffer .. data
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   122
							return true
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   123
						else
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   124
							local seq = 0
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   125
							local msgbuf = buffer:sub ( 1, ibb_block_size )
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   126
							buffer = buffer:sub ( ibb_block_size + 1 )
42
18d801679feb Old ibb updates
Myhailo Danylenko <isbear@ukrpost.net>
parents: 38
diff changeset
   127
							local function handler ( conn, mess )
18d801679feb Old ibb updates
Myhailo Danylenko <isbear@ukrpost.net>
parents: 38
diff changeset
   128
								local mtype, smtype = mess:type ()
18d801679feb Old ibb updates
Myhailo Danylenko <isbear@ukrpost.net>
parents: 38
diff changeset
   129
								if smtype == 'error' then
5
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   130
									main.print_info ( to, "Stream error, transfer ceased at seq = " .. seq .. ": " .. message:child( 'error' ):children():name () )
42
18d801679feb Old ibb updates
Myhailo Danylenko <isbear@ukrpost.net>
parents: 38
diff changeset
   131
								elseif smtype == 'result' then
5
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   132
									main.print_info ( to, " - acquired seq = " .. seq )
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   133
									seq = seq + 1
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   134
									if buffer:len () == 0 then
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   135
										conn:send (
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   136
											lm.message.create { to = to, mtype = 'iq-set',
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   137
												close = { sid = sid, xmlns = 'http://jabber.org/protocol/ibb' }
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   138
											},
42
18d801679feb Old ibb updates
Myhailo Danylenko <isbear@ukrpost.net>
parents: 38
diff changeset
   139
											function ( conn, mess )
18d801679feb Old ibb updates
Myhailo Danylenko <isbear@ukrpost.net>
parents: 38
diff changeset
   140
												local mtype, smtype = mess:type ()
18d801679feb Old ibb updates
Myhailo Danylenko <isbear@ukrpost.net>
parents: 38
diff changeset
   141
												if smtype == 'error' then
18d801679feb Old ibb updates
Myhailo Danylenko <isbear@ukrpost.net>
parents: 38
diff changeset
   142
													main.print_info ( to, "Error at closing stream: " .. mess:child( 'error' ):children():name () )
18d801679feb Old ibb updates
Myhailo Danylenko <isbear@ukrpost.net>
parents: 38
diff changeset
   143
												elseif smtype == 'result' then
18d801679feb Old ibb updates
Myhailo Danylenko <isbear@ukrpost.net>
parents: 38
diff changeset
   144
													main.print_info ( to, "File successfully transferred" )
5
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   145
												else
42
18d801679feb Old ibb updates
Myhailo Danylenko <isbear@ukrpost.net>
parents: 38
diff changeset
   146
													print ( 'Weird response for close of ibb stream: ' .. mess:xml () )
18d801679feb Old ibb updates
Myhailo Danylenko <isbear@ukrpost.net>
parents: 38
diff changeset
   147
													return false
5
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   148
												end
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   149
												return true
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   150
											end )
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   151
									else
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   152
										local msgbuf = buffer:sub ( 1, ibb_block_size )
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   153
										buffer = buffer:sub ( ibb_block_size )
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   154
										conn:send (
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   155
											lm.message.create { to = to, mtype = 'iq-set',
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   156
												data = { sid = sid, xmlns = 'http://jabber.org/protocol/ibb', seq = seq,
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   157
													msgbuf
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   158
												}
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   159
											},
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   160
											handler )
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   161
									end
42
18d801679feb Old ibb updates
Myhailo Danylenko <isbear@ukrpost.net>
parents: 38
diff changeset
   162
								else
18d801679feb Old ibb updates
Myhailo Danylenko <isbear@ukrpost.net>
parents: 38
diff changeset
   163
									print ( 'Weird response for ibb block: ' .. mess:xml () )
18d801679feb Old ibb updates
Myhailo Danylenko <isbear@ukrpost.net>
parents: 38
diff changeset
   164
									return false
5
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   165
								end
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   166
								return true
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   167
							end
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   168
							conn:send (
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   169
								lm.message.create { to = to, mtype = 'iq-set',
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   170
									data = { sid = sid, xmlns = 'http://jabber.org/protocol/ibb', seq = seq,
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   171
										msgbuf
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   172
									}
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   173
								},
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   174
								handler )
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   175
							return false
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   176
						end
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   177
					end )
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   178
			end
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   179
			return true
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   180
		end )
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   181
end
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   182
7
eb6d89bf1fbf Commands and init improvements
Myhailo Danylenko <isbear@ukrpost.net>
parents: 5
diff changeset
   183
main.command ( 'ibb',
5
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   184
	function ( args )
24
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 10
diff changeset
   185
		local action = args[1]
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 10
diff changeset
   186
		if action == 'send' then
5
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   187
			local who
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   188
			if args.t then
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   189
				who = args.t
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   190
			else
10
73f4c12b6ffb Full jid accessor
Myhailo Danylenko <isbear@ukrpost.net>
parents: 8
diff changeset
   191
				who = main.full_jid ()
5
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   192
			end
38
1f141d9a081a IBB uses user connection, optimization
Myhailo Danylenko <isbear@ukrpost.net>
parents: 34
diff changeset
   193
			ibb_send_file ( lm.connection.bless ( main.connection () ), who, args[2] )
24
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 10
diff changeset
   194
		elseif action == 'accept' then
5
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   195
			local id = args[2]
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   196
			if receiving_files[id] then
24
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 10
diff changeset
   197
				receiving_files[id].accept ( args[3] )
5
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   198
			end
24
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 10
diff changeset
   199
		elseif action == 'reject' then
5
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   200
			local id = args[2]
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   201
			if receiving_files[id] then
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   202
				receiving_files[id].reject ()
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   203
			end
24
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 10
diff changeset
   204
		elseif action == 'del' then
5
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   205
			local id = args[2]
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   206
			receiving_files[id] = nil
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   207
		else
24
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 10
diff changeset
   208
			local text = ''
5
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   209
			for sid, data in pairs ( receiving_files ) do
24
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 10
diff changeset
   210
				text = text .. '\n' ..  sid .. ': ' .. ( data.name or '(not set)' ) .. ' [' .. data.status .. ']'
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 10
diff changeset
   211
			end
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 10
diff changeset
   212
			if text ~= '' then
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 10
diff changeset
   213
				print ( 'List of incoming streams:' .. text )
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 10
diff changeset
   214
			else
25552b21d3fb Arguments parsing
Myhailo Danylenko <isbear@ukrpost.net>
parents: 10
diff changeset
   215
				print ( 'No streams' )
5
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   216
			end
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   217
		end
34
8206d7cb1447 Args auto-parsing, use main.binding
Myhailo Danylenko <isbear@ukrpost.net>
parents: 27
diff changeset
   218
	end, true, { "send", "accept", "reject", "del" } )
5
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   219
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   220
commands_help['ibb'] = "[[-t target_jid] send filename | accept sid filename | reject sid filename | del sid]\n\nRequests, accepts or rejects sending file via in-band bytestream."
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   221
8
fc9060b9b7cc Completion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 7
diff changeset
   222
hooks_d['hook-post-connect'].xep0047 =
fc9060b9b7cc Completion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 7
diff changeset
   223
	function ( args )
fc9060b9b7cc Completion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 7
diff changeset
   224
		lm.connection.bless( main.connection () ):handler ( ibb_incoming_iq_handler, 'iq', 'normal' )
fc9060b9b7cc Completion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 7
diff changeset
   225
		ibb_handler_registered = true
fc9060b9b7cc Completion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 7
diff changeset
   226
		hooks_d['hook-post-connect'].xep0047 = nil
fc9060b9b7cc Completion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 7
diff changeset
   227
		hooks_d['hook-quit'].xep0047 =
fc9060b9b7cc Completion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 7
diff changeset
   228
			function ( args )
fc9060b9b7cc Completion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 7
diff changeset
   229
				if ibb_handler_registered then
fc9060b9b7cc Completion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 7
diff changeset
   230
					lm.connection.bless( main.connection () ):handler ( ibb_incoming_iq_handler, 'iq' )
fc9060b9b7cc Completion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 7
diff changeset
   231
				end
fc9060b9b7cc Completion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 7
diff changeset
   232
			end
fc9060b9b7cc Completion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 7
diff changeset
   233
	end
fc9060b9b7cc Completion
Myhailo Danylenko <isbear@ukrpost.net>
parents: 7
diff changeset
   234
38
1f141d9a081a IBB uses user connection, optimization
Myhailo Danylenko <isbear@ukrpost.net>
parents: 34
diff changeset
   235
main.add_feature ( 'http://jabber.org/protocol/ibb' )
1f141d9a081a IBB uses user connection, optimization
Myhailo Danylenko <isbear@ukrpost.net>
parents: 34
diff changeset
   236
5
cba039bd6f13 Included sample configuration into package
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   237
-- vim: se ts=4: --