# =XMPP4R - XMPP Library for Ruby
# License:: Ruby's license (see the LICENSE file) or GNU GPL, at your option.
# Website::http://home.gna.org/xmpp4r/
require 'time' # For Time#xmlschema
require 'xmpp4r/feature_negotiation/iq/feature'
module Jabber
module Bytestreams
PROFILE_FILETRANSFER = 'http://jabber.org/protocol/si/profile/file-transfer'
##
# Iq child 'si' for Stream-Initiation
class IqSi < XMPPElement
name_xmlns 'si', 'http://jabber.org/protocol/si'
force_xmlns true
def initialize(id=nil, profile=nil, mime_type=nil)
super()
self.id = id
self.profile = profile
self.mime_type = mime_type
end
##
# Session ID of this stream
def id
attributes['id']
end
##
# Set Session ID of this stream
def id=(s)
attributes['id'] = s
end
##
# MIME type of this stream
def mime_type
attributes['mime-type']
end
##
# Set MIME type of this stream
def mime_type=(s)
attributes['mime-type'] = s
end
##
# Stream profile, can indicate file-transfer
def profile
attributes['profile']
end
##
# Set stream profile
def profile=(s)
attributes['profile'] = s
end
##
# child
# result:: [IqSiFile]
def file
first_element('file')
end
##
# child
# result:: [IqFeature]
def feature
first_element('feature')
end
end
##
# File-transfer meta-information,
# may appear as in IqSi
class IqSiFile < XMPPElement
name_xmlns 'file', PROFILE_FILETRANSFER
def initialize(fname=nil, size=nil)
super()
self.fname = fname
self.size = size
end
##
# Get filename (attribute 'name')
def fname
attributes['name']
end
##
# Set filename (attribute 'name')
def fname=(s)
attributes['name'] = s
end
##
# Get MD5 hash
def hash
attributes['hash']
end
##
# Set MD5 hash
def hash=(s)
attributes['hash'] = s
end
##
# Get file date
# result:: [Time] or nil
def date
begin
Time.xmlschema(attributes['date'])
rescue ArgumentError
nil
end
end
##
# Set file date
# d:: [Time] or nil
def date=(d)
attributes['date'] = (d ? d.xmlschema : nil)
end
##
# File size in bytes
# result:: [Fixnum]
def size
(attributes['size'] =~ /^\d+$/) ? attributes['size'].to_i : nil
end
##
# Set file size
def size=(s)
attributes['size'] = s ? s.to_s : nil
end
##
# File description
def description
first_element_text('desc')
end
##
# Set file description
def description=(s)
replace_element_text('desc', s)
end
##
# child
#
# A file-transfer offer may contain this with
# no attributes set, indicating the ability to
# do ranged transfers.
# result:: [IqSiFileRange]
def range
first_element('range')
end
end
##
# Information for ranged transfers
class IqSiFileRange < XMPPElement
name_xmlns 'range', PROFILE_FILETRANSFER
def initialize(offset=nil, length=nil)
super()
self.offset = offset
self.length = length
end
##
# File offset (for continuing an interrupted transfer)
def offset
(attributes['offset'] =~ /^\d+$/) ? attributes['offset'].to_i : nil
end
##
# Set file offset
def offset=(o)
attributes['offset'] = (o ? o.to_s : nil)
end
##
# File length (if not to transfer whole file)
def length
(attributes['length'] =~ /^\d+$/) ? attributes['length'].to_i : nil
end
##
# Set file length
def length=(o)
attributes['length'] = (o ? o.to_s : nil)
end
end
end
end