class QWebChannel

Attributes

execCallbacks[RW]
execId[RW]

Example:

>> #!/usr/bin/env ruby
>> 
>> require 'websocket-eventmachine-client'
>> require 'QWebChannel'
>> 
>> $core={}
>> 
>> $showReceivedMessageFromServer=Proc.new do |messageFromServer|
>>     puts "Received message from server: #{messageFromServer}"
>> end #$showReceivedMessageFromServer=Proc.new do |messageFromServer|
>> 
>> EM.run do
>>     ws = WebSocket::EventMachine::Client.connect(:uri => 'ws://localhost:12345')
>> 
>>     ws.onopen do
>>         qWebChannel = QWebChannel.new(ws) do |channel|
>>             $core=channel.objects['core']
>>             
>>             puts "Connected to WebChannel, ready to send/receive messages!"
>>             
>>             puts "Sending message 'hello from client' to the server."
>>             $core.receiveText('hello from client') #Call the "receiveText" slot on the server side.
>> 
>>             $core['sendText'].connect($showReceivedMessageFromServer) #Connect to the "sendText" signal on the server side.
>>         end #qWebChannel = QWebChannel.new(ws) do |channel|
>>     end #ws.onopen do
>> 
>>     ws.onclose do |code, reason|
>>         puts "Disconnected with status code: #{code}"
>>         EM.stop
>>     end
>> end #EM.run do
>>
objects[RW]
transport[RW]

Public Class Methods

new(websocket) { |self| ... } click to toggle source
# File lib/QWebChannel.rb, line 125
    def initialize(websocket, &block)
        @index = nil #索引对象。
        @execId=0
        @execCallbacks={}
        @objects={}
        
        @transport=websocket
        @channel = self
        
        
        @transport.onmessage do |msg, type|
#             puts "Received message: #{msg}"
            
            puts "msg type: #{msg.class}"
            
            data =msg.to_s
            
            puts "data: #{data}"
            
            if (data.is_a?(String))
                data=JSON.parse(data)
            end
            
            puts "type: #{data.class}"
            
            case(data['type'])
            when QWebChannelMessageTypes::SIGNAL
                @channel.handleSignal(data)
            when QWebChannelMessageTypes::RESPONSE
                @channel.handleResponse(data)
            when QWebChannelMessageTypes::PROPERTYUPDATE
                @channel.handlePropertyUpdate(data)
            else
                puts("Invalid message arrived: #{data}")
            end
        end
        
        @channel.exec({'type' => QWebChannelMessageTypes::INIT}) do |data|
            puts "data type: #{data.class}"
            puts "data content: #{data}"
            
            data.each do |objectName, objectContent|
                puts "objectName type: #{objectName.class}"

                object=QObject.new(objectName, data[objectName], @channel)
            end
            
            @channel.objects.each do |objectName, objectObject| #一个个地解析出属性。
                @channel.objects[objectName].unwrapProperties()
            end #@channel.objects.each do |objectName, objectObject| #一个个地解析出属性。
            
            
#             puts "Self: #{self}"
            yield(self)
            
            
            @channel.exec({ "type" => QWebChannelMessageTypes::IDLE})
        end #@channel.exec({'type' => QWebChannelMessageTypes::INIT}) do |data|
    end

Public Instance Methods

exec(data, &block) click to toggle source
# File lib/QWebChannel.rb, line 83
def exec(data, &block)
    if !(block_given?)
        @channel.send(data)
        return
    end
    
    @channel.execId=@channel.execId+1
    data['id']=@channel.execId
            
    puts "data id: #{data['id']}"

    @channel.execCallbacks[data['id']]=block
    @channel.send(data)
end
handlePropertyUpdate(message) click to toggle source
# File lib/QWebChannel.rb, line 112
def handlePropertyUpdate(message)
    message['data'].each do |data| #一个个数据地处理。
        object= @channel.objects[data['object']] #获取发生变更的对象。
        
        if (object) #对象存在。
            object.propertyUpdate(data['signals'], data['properties']) #更新属性。
        else #对象不存在。
        end #if (object) #对象存在。
    end #message['data'].each do |data| #一个个数据地处理。
    
    @channel.exec({ 'type' => QWebChannelMessageTypes::IDLE })
end
handleResponse(message) click to toggle source
# File lib/QWebChannel.rb, line 98
def handleResponse(message)
    @channel.execCallbacks[message['id']].call(message['data'])
    
    @channel.execCallbacks[message['id']]=nil
end
handleSignal(message) click to toggle source
# File lib/QWebChannel.rb, line 104
def handleSignal(message)
    object=@channel.objects[message['object']]
    
    if (object)
        object.signalEmitted(message['signal'], message['args'])
    end
end
send(data) click to toggle source
# File lib/QWebChannel.rb, line 73
def send(data)
    if ( !(   data.is_a?(String) ) )
        data=Oj.dump(data)
    end
    
    puts "Sending: #{data}"
    
    @channel.transport.send(data)
end