385: def register_presence_filter
386: @connection.add_filter("presenceAvailableFilter") do |element|
387: if element.element_tag=="presence"
388: type = element.attr_type
389: type = nil if type.nil?
390: case type
391: when nil, "available"
392: element.consume_element
393: from = JID.new(element.attr_from)
394: rItem = @roster[from]
395: show = element.show.element_data
396: show = "chat" unless show
397: status = element.status.element_data
398: status = "" unless status
399: if rItem
400: resource = rItem[from.resource]
401: if resource
402: resource.update(show, status)
403: else
404: rItem.add(from.resource, show, status)
405: end
406: end
407: when "unavailable"
408: element.consume_element
409: from = JID.new(element.attr_from)
410: rItem = @roster[from]
411: resource = rItem.delete(from.resource) if rItem
412: when "subscribe", "unsubscribe", "subscribed", "unsubscribed"
413: element.consume_element
414: from = JID.new(element.attr_from)
415: break unless @subscriptionHandler
416: if @subscriptionHandler.kind_of? Proc
417: @subscriptionHandler.call(Subscription.new(self, type.intern, from, id))
418: else
419: @subscriptionHandler.send(Subscription.new(self, type.intern, from, id))
420: end
421: end
422: end
423: end
424: end