Class: FSPSocket::PSocket

Inherits:
Object
  • Object
show all
Includes:
FSPSocket
Defined in:
lib/fspsocket.rb

Constant Summary collapse

@@id_count =
0

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from FSPSocket

new

Constructor Details

#initialize(*args) ⇒ PSocket

Returns a new instance of PSocket.



39
40
41
42
43
44
45
46
47
48
49
50
# File 'lib/fspsocket.rb', line 39

def initialize(*args)
  @host = Socket.gethostname
  @pid = Process.pid
  @id = [@host, @pid, @@id_count].join('_')
  @@id_count += 1
  if args.length == 1
    @block = args[0]
  end
  @sock_buf = []
  Manager.instance.add_observer self
  init_channel
end

Instance Attribute Details

#idObject (readonly)

Returns the value of attribute id.



37
38
39
# File 'lib/fspsocket.rb', line 37

def id
  @id
end

Class Method Details

.open(dst_id, block) ⇒ Object



125
126
127
128
129
130
131
132
133
134
135
# File 'lib/fspsocket.rb', line 125

def PSocket.open(dst_id, block)
  sock = PSocket.new(block)
  if (dst_id.kind_of?(Enumerable))
    dst_id.each do |item|
      sock.connect_channel([@@base, item].join(File::SEPARATOR))
    end
  else
    sock.connect_channel([@@base, dst_id].join(File::SEPARATOR))
  end
  return sock
end

.write_to(path, data) ⇒ Object



162
163
164
165
166
167
168
# File 'lib/fspsocket.rb', line 162

def PSocket.write_to(path, data)
  @@log.info "write_to #{path} #{data}"
  File::open(path, "a+") do |f|
    h = {:time=>Time.now, :data=>URI.encode(data)}
    f.puts(h.to_json)
  end    
end

Instance Method Details

#closeObject



148
149
150
151
# File 'lib/fspsocket.rb', line 148

def close
  delete_channel
  PSocket.write_to(@dst_cpath, "BYE #{@id}") 
end

#connect(dst_id) ⇒ Object

used to connect to multiple destinations



138
139
140
141
142
143
144
145
146
# File 'lib/fspsocket.rb', line 138

def connect(dst_id)
  if (dst_id.kind_of?(Enumerable))
    dst_id.each do |item|
      connect_channel([@@base, item].join(File::SEPARATOR))
    end
  else
    connect_channel([@@base, dst_id].join(File::SEPARATOR))
  end
end

#connect_channel(dst_fullpath) ⇒ Object



100
101
102
103
104
105
106
107
108
109
# File 'lib/fspsocket.rb', line 100

def connect_channel(dst_fullpath)
  # 1. create my controls channel in the other's controls dir 
  #    /socks/dstid/controls/myid
  mycpath = [dst_fullpath, :controls, @id].join(File::SEPARATOR)
  @connected << mycpath
  FileUtils.touch(mycpath)
  sleep 1 # XXX for timing purpose
  # 2. let the other know my path
  PSocket.write_to(mycpath, "HELLO #{@id}")    
end

#delete_channelObject



111
112
113
114
115
116
117
118
119
120
121
122
123
# File 'lib/fspsocket.rb', line 111

def delete_channel
  @connected.each do |path|
    if FileTest.exist? path
      File::delete path
    end
  end

  path = [@@base, @id].join(File::SEPARATOR)
  if FileTest.exist? path
    File::delete [path, :data].join(File::SEPARATOR)
    FileUtils.rm_rf path
  end    
end

#puts(data) ⇒ Object Also known as: _puts



157
158
159
160
# File 'lib/fspsocket.rb', line 157

def puts(data)
  #@@log.debug "XXX puts: #{@dpath} #{data}"
  PSocket.write_to(@dpath, data)
end

#received(&block) ⇒ Object



153
154
155
# File 'lib/fspsocket.rb', line 153

def received(&block)
  @recv_block = block
end

#update(msg) ⇒ Object

msg => path, msg => data in JSON delimited with ‘n’



71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
# File 'lib/fspsocket.rb', line 71

def update(msg)
  @@log.info "--- update #{msg}"
  # msg[1]:data part can contain more than one line
  msg[1].each_line do |item|
    h = JSON.parse(item) 
    d = h.fetch(:data.to_s) 
    ud = URI.unescape(d)
    ar = ud.split
    if ar[0] == "HELLO"
      @@log.info "---got HELLO: #{ar[1]}"
      Manager.instance.add_file([@@base, ar[1], :data].join(File::SEPARATOR))
      # XXX
      mycpath = [@@base, ar[1], :controls, @id].join(File::SEPARATOR)
      FileUtils.touch(mycpath)
      sleep 1 # XXX for timing purpose
      PSocket.write_to(mycpath, "OK #{@id}")
    elsif ar[0] == "OK"
      @@log.info "---got OK: #{ar[1]}"
      Manager.instance.add_file([@@base, ar[1], :data].join(File::SEPARATOR))
      @block.call(method(:received))    
    elsif ar[0] == "BYE"
      @@log.info "---got BYE: #{ar[1]}"
      Manager.instance.remove_file([@@base, ar[1], :data].join(File::SEPARATOR))
    else
      @recv_block.call(msg[0], ud)
    end    
  end # each
end