Ruby4Skype 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,415 @@
1
+ module SkypeAPI
2
+ module Object
3
+ class Stream
4
+ def initialize app, streamString
5
+ @app = app
6
+ @id = streamString
7
+ @user = SkypeAPI.user(@id.split(':')[0])
8
+ end
9
+
10
+ def to_s
11
+ @string
12
+ end
13
+
14
+ def user
15
+ @user
16
+ end
17
+
18
+ def write cmd, &block
19
+ @app.write self, cmd, block
20
+ end
21
+
22
+ def datagram cmd, &block
23
+ @app.datagram self, cmd, block
24
+ end
25
+
26
+ def read &block
27
+ @app.read self, block
28
+ end
29
+
30
+ def disconnect &block
31
+ @app.disconnect self, block
32
+ end
33
+ end
34
+
35
+ class Application < AbstractObject
36
+ OBJECT_NAME = "APPLICATION"
37
+
38
+ getter :Connectable , 'CONNECTABLE' do |str|
39
+ str.split(' ').collect{|i| SkypeAPI.user(i)}
40
+ end
41
+
42
+ getter :Connecting,'CONNECTING' do |str|
43
+ str.split(' ').collect{|i| SkypeAPI.user(i)}
44
+ end
45
+
46
+ getter :Streams, 'STREAMS' do |str|
47
+ str.split(' ').collect{|i| Stream.new(self, i)}
48
+ end
49
+
50
+ getter :Received, 'RECEIVED' do |str|
51
+ str.split(' ').collect do |i|
52
+ streamID, byte = i.split('=')
53
+ {:stream => Stream.new(self, streamID),:bytes => byte.to_i}
54
+ end
55
+ end
56
+
57
+ getter :Sending, 'SENDING' do |str|
58
+ str.split(' ').collect do |i|
59
+ streamID, byte = i.split('=')
60
+ {:stream => Stream.new(self, streamID),:bytes => byte.to_i}
61
+ end
62
+ end
63
+
64
+ def self.create id
65
+ app = new id
66
+ app.create
67
+ app
68
+ end
69
+
70
+ def create
71
+ sendEcho "CREATE APPLICATION #{@id}"
72
+ end
73
+
74
+ def connect handle
75
+ sendEcho "ALTER APPLICATION #{@id} CONNECT #{handle}"
76
+ end
77
+
78
+ def write stream, cmd
79
+ sendAlter "WRITE", "#{stream} #{cmd}"
80
+ end
81
+
82
+ def datagram stream, cmd
83
+ sendAlter "DATAGRAM", "#{stream} #{cmd}"
84
+ end
85
+
86
+ def read stream
87
+ res = sendCMD "ALTER APPLICATION #{@id} READ #{stream}"
88
+ res =~ /^ALTER APPLICATION #{@id} READ #{stream} (.*)$/
89
+ $1
90
+ end
91
+
92
+ def disconnect stream
93
+ sendEcho "ALTER APPLICATION #{@id} DISCONNECT #{stream}"
94
+ end
95
+
96
+ def delete
97
+ sendEcho "DELETE APPLICATION #{@id}"
98
+ end
99
+ end
100
+
101
+ class A2A
102
+ extend Forwardable
103
+ include SkypeAPI::ShareFunctions
104
+ def initialize appName,base
105
+ @appName = appName
106
+ @eventListener = Hash.new
107
+ @base = base
108
+ @base.addNotify /^APPLICATION #{@appName} (.+)$/,method(:receiv)
109
+ end
110
+
111
+ def_delegators :@base, :sendCMD, :sendCallBack,:sendBlock,:addNotify,:delNotify
112
+ #:attach, :wait,:polling, :attached, :attached=, :received, :received=, :sent, :sent=
113
+
114
+ def getConnectable
115
+ sendSplit "GET APPLICATION #{@appName} CONNECTABLE","APPLICATION #{@appName} CONNECTABLE"
116
+ end
117
+ def getConnecting
118
+ sendSplit "GET APPLICATION #{@appName} CONNECTING","APPLICATION #{@appName} CONNECTING"
119
+ end
120
+ def getStreams
121
+ sendSplit "GET APPLICATION #{@appName} STREAMS","APPLICATION #{@appName} STREAMS"
122
+ end
123
+ def getReceived
124
+ streamByte2hash sendSplit("GET APPLICATION #{@appName} RECEIVED","APPLICATION #{@appName} RECEIVED")
125
+ end
126
+ def getSending
127
+ streamByte2hash sendSplit("GET APPLICATION #{@appName} SENDING","APPLICATION #{@appName} SENDING")
128
+ end
129
+ def create
130
+ sendEcho "CREATE APPLICATION #{@appName}"
131
+ end
132
+ def connect handle
133
+ sendEcho "ALTER APPLICATION #{@appName} CONNECT #{handle}"
134
+ end
135
+ def write stream, cmd, &block
136
+ if block_given?
137
+ sendCMD("ALTER APPLICATION #{@appName} WRITE #{stream} #{cmd}",&block)
138
+ else
139
+ sendEcho "ALTER APPLICATION #{@appName} WRITE #{stream} #{cmd}"
140
+ end
141
+ end
142
+ def datagram stream, cmd
143
+ sendEcho "ALTER APPLICATION #{@appName} DATAGRAM #{stream} #{cmd}"
144
+ end
145
+ def read stream, &block
146
+ if block_given?
147
+ sendCMD "ALTER APPLICATION #{@appName} READ #{stream}" do |res|
148
+ res =~ /^ALTER APPLICATION #{@appName} READ #{stream} (.*)$/m
149
+ block.call $1
150
+ end
151
+ else
152
+ sendCMD "ALTER APPLICATION #{@appName} READ #{stream}"
153
+ end
154
+ end
155
+ def disconnect stream
156
+ sendEcho "ALTER APPLICATION #{@appName} DISCONNECT #{stream}"
157
+ end
158
+ def delete
159
+ sendEcho "DELETE APPLICATION #{@appName}"
160
+ delNotify /^APPLICATION #{appName} (.+)$/
161
+ end
162
+
163
+ def onEvent name,cb=Proc.new
164
+ @eventListener[name] = cb
165
+ end
166
+
167
+ def receiv res
168
+ case res
169
+ when /^CONNECTING (.+)$/m
170
+ @eventListener[:connecting].call $1.split(" ") if @eventListener[:connecting]
171
+ when /^STREAMS (.+)$/m
172
+ @eventListener[:connected].call $1.split(" ") if @eventListener[:connected]
173
+ when /^RECEIVED (.+)$/m
174
+ @eventListener[:received].call streamByte2hash($1.split(" ")) if @eventListener[:received]
175
+ when /^READ (.+?) (.+)$/m
176
+ @eventListener[:read].call $1, $2 if @eventListener[:read]
177
+ when /^DATAGRAM (.+?) (.+)$/m
178
+ @eventListener[:datagram].call $1, $2 if @eventListener[:datagram]
179
+ when /^SENDING (.+?)$/m
180
+ @eventListener[:sending].call streamByte2hash($1.split(" ")) if @eventListener[:sending]
181
+ end
182
+ end
183
+
184
+ private
185
+ def streamByte2hash arr
186
+ ret = Hash.new do |hash,key|
187
+ hash[key] = 0
188
+ end
189
+ arr.each do |streamByte|
190
+ streamByte = streamByte.split "="
191
+ ret[streamByte[0]] = streamByte[1].to_i
192
+ end
193
+ return ret
194
+ end
195
+ end
196
+
197
+ class A2AEx < A2A
198
+ TRANS_LIMIT = 65000
199
+ SPLIT_LIMIT = 65000-2
200
+
201
+ extend Forwardable
202
+ include SkypeAPI::ShareFunctions
203
+ def initialize appName,base
204
+ super
205
+ @handle2stream = Hash.new
206
+ @sndBuffer = Hash.new do |hash,key|
207
+ hash[key] = Array.new
208
+ end
209
+ @rcvBuffer = Hash.new do |hash,key|
210
+ hash[key] = Array.new
211
+ end
212
+ @created = false
213
+ end
214
+
215
+ attr_reader :created, :sndBuffer, :rcvBuffer
216
+
217
+ def getStreams
218
+ streams = super
219
+ streamTreat streams
220
+ return @handle2stream.keys
221
+ end
222
+
223
+ def getConnection
224
+ @handle2stream.keys
225
+ end
226
+
227
+ def create
228
+ super
229
+ @created = true
230
+ end
231
+
232
+ def connect handles=getConnection
233
+ handles = [handles] unless handles.class == Array
234
+ handles.each do |handle|
235
+ super handle
236
+ end
237
+ end
238
+
239
+ def connectAndWait handles
240
+ waitFlag = false
241
+ @base.addNotify /^APPLICATION #{@appName} CONNECTING $/,(Proc.new do
242
+ waitFlag = true
243
+ end)
244
+ handles = [handles] unless handles.class == Array
245
+ handles.each do |handle|
246
+ sendCMD "ALTER APPLICATION #{@appName} CONNECT #{handle}"
247
+ end
248
+
249
+ startTime = Time.now
250
+ i = 0
251
+ loop do
252
+ @base.polling
253
+ break if waitFlag or Time.now - startTime > 3
254
+ sleep 0.001
255
+ i+=1
256
+ end
257
+ @base.delNotify /^APPLICATION #{@appName} CONNECTING $/
258
+ end
259
+
260
+ def disconnect handles=getStreams
261
+ handles = [handles] unless handles.class == Array
262
+ handles.each do |h|
263
+ begin
264
+ super @handle2stream[h]
265
+ @handle2stream.delete h
266
+ rescue =>e
267
+ p e
268
+ end
269
+ end
270
+ end
271
+
272
+ def transmit cmd, handles=getConnecting
273
+ handles = [handles] unless handles == Array
274
+ handles.each do |handle|
275
+ if cmd.size > SPLIT_LIMIT
276
+ tmp = Array.new
277
+ while cmd.size > SPLIT_LIMIT
278
+ tmp.push cmd[0,SPLIT_LIMIT] + "D"
279
+ cmd = cmd[SPLIT_LIMIT,cmd.length]
280
+ end
281
+ tmp.push cmd
282
+ cmd = tmp
283
+ else
284
+ cmd = [cmd]
285
+ end
286
+ handle = [handle] unless handle.class == Array
287
+ handle.each do |h|
288
+ @sndBuffer[h].concat cmd
289
+ end
290
+ end
291
+ end
292
+
293
+ def polling
294
+ if @created
295
+ f = false
296
+ @sndBuffer.each_value do |buffer|
297
+ if buffer.length > 0
298
+ f = true
299
+ break
300
+ end
301
+ end
302
+ if f
303
+ h2b = getSending
304
+ streams = Hash.new
305
+ @sndBuffer.each do |handle,buffer|
306
+ if @handle2stream[handle]
307
+ while buffer.length > 0
308
+ if buffer[0].size + h2b[handle] < TRANS_LIMIT
309
+ h2b[handle] += buffer[0].size
310
+ write handle,buffer.shift do |res|
311
+ #do nothing
312
+ end
313
+ else
314
+ break
315
+ end
316
+ end
317
+ end
318
+ end
319
+ end
320
+ end
321
+ end
322
+
323
+ def read handle, &block
324
+ handle = @handle2stream[handle]
325
+ unless handle
326
+ raise SkypeAPIError, "Read Error nonConnecting #{handle}"
327
+ else
328
+ super
329
+ end
330
+ end
331
+
332
+ def write handle, cmd, &block
333
+ stream = @handle2stream[handle]
334
+ unless stream
335
+ raise SkypeAPIError,"Write Error nonConnecting #{handle} #{cmd}"
336
+ else
337
+ super stream, cmd, &block
338
+ end
339
+ end
340
+
341
+ def datagram handle, cmd
342
+ handle = @handle2stream[handle]
343
+ super
344
+ end
345
+
346
+ private :write, :datagram, :read
347
+
348
+ def receiv res
349
+ case res
350
+ when /^CONNECTING (.*)$/m
351
+ @eventListener[:connecting].call $1.split(" ") if @eventListener[:connecting]
352
+ when /^STREAMS (.*)$/m
353
+ streams = $1.split " "
354
+ streamTreat streams
355
+ @eventListener[:connected].call @handle2stream.keys if @eventListener[:connected]
356
+ when /^RECEIVED (.+)$/m
357
+ res = $1
358
+ res.split(" ").each do |info|
359
+ stream = info.split("=")[0]
360
+ byte = info.split("=")[1]
361
+ handle = info.split(":")[0]
362
+ read handle do |content|
363
+ if content and not content.empty?
364
+ if content.size > SPLIT_LIMIT
365
+ @rcvBuffer[handle].push content[0,content.size-1]
366
+ else
367
+ if @rcvBuffer.length > 0
368
+ @rcvBuffer[handle].push content
369
+ tmp = @rcvBuffer[handle].join ""
370
+ @rcvBuffer[handle].clear
371
+ @eventListener[:read].call handle, tmp if @eventListener[:read]
372
+ else
373
+ @eventListener[:read].call handle, content if @eventListener[:read]
374
+ end
375
+ end
376
+ end
377
+ end
378
+ end
379
+ @eventListener[:received].call streamByte2hash(res.split(" ")) if @eventListener[:received] and res
380
+ when /^READ (.+?) (.+)$/m
381
+ #@eventListener[:read].call $1.split(":")[0], $2 if @eventListener[:read]
382
+ when /^DATAGRAM (.+?) (.+)$/m
383
+ @eventListener[:datagram].call $1.split(":")[0], $2 if @eventListener[:datagram]
384
+ when /^SENDING (.+?)$/m
385
+ @eventListener[:sending].call streamByte2hash($1.split(" ")) if @eventListener[:sending]
386
+ end
387
+ end
388
+
389
+ private
390
+ def streamTreat streams
391
+ @handle2stream.each do |handle,stream|
392
+ unless streams.include? stream
393
+ @sndBuffer[handle].clear
394
+ @rcvBuffer[handle].clear
395
+ end
396
+ end
397
+ @handle2stream.clear
398
+ streams.each do |st|
399
+ @handle2stream[st.split(":")[0]] = st
400
+ end
401
+ end
402
+
403
+ def streamByte2hash arr
404
+ ret = Hash.new do |hash, key|
405
+ hash[key] = 0
406
+ end
407
+ arr.each do |streamByte|
408
+ streamByte = streamByte.split "="
409
+ ret[streamByte[0].split(":")[0]] = streamByte[1].to_i
410
+ end
411
+ return ret
412
+ end
413
+ end
414
+ end
415
+ end
@@ -0,0 +1,220 @@
1
+ module SkypeAPI
2
+ module Object
3
+ class Call < AbstractObject
4
+ OBJECT_NAME = "CALL"
5
+
6
+ def self.create *targets
7
+ targets = targets[0] if targets[0].class == Array
8
+ res = (@@skypeApi.sendOne "CALL " + targets.join(", "),"CALL").split(" ")
9
+ #return @@skypeApi.call(res[0]),res[2]
10
+ new res[0]
11
+ end
12
+
13
+ getter :Timestamp, 'TIMESTAMP' do |str|
14
+ str.to_i
15
+ end
16
+ getter :Partner, 'PARTNER_HANDLE' do |str|
17
+ @@skypeApi.user str
18
+ end
19
+ getter :PartnerDispname, 'PARTNER_DISPNAME'
20
+ getter :TargetIdentity, 'TARGET_IDENTITY'
21
+ getter :ConfID, 'CONF_ID' do |str|
22
+ str.to_i
23
+ end
24
+ getter :Type, 'TYPE'
25
+ getter :Status, 'STATUS'
26
+ getter :VideoStatus, 'VIDEO_STATUS'
27
+ getter :VideoSendStatus, 'VIDEO_SEND_STATUS'
28
+ getter :VideoReceiveStatus, 'VIDEO_RECEIVE_STATUS'
29
+ getter :FailureReason, 'FAILUREREASON' do |str|
30
+ str.to_i
31
+ end
32
+ getter :Subject, 'SUBJECT'
33
+ getter :PSTNNumber, 'PSTN_NUMBER'
34
+ getter :Duration, 'DURATION' do |str|
35
+ str.to_i
36
+ end
37
+ getter :PSTNStatus, 'PSTN_STATUS'
38
+ getter :ConfParticipantsCount, 'CONF_PARTICIPANTS_COUNT' do |str|
39
+ str.to_i
40
+ end
41
+
42
+ notice :ConfParticipant, 'CONF_PARTICIPANT' do |str|
43
+ res = str.split(' ')
44
+ res[1] = @@skypeApi.user(res[1]) if res[1]
45
+ res
46
+ end
47
+ #?
48
+ def getConfParticipant n
49
+ str = sendGet "CONF_PARTICIPANT #{n}"
50
+ array = self::V2O[:ConfParticipant].call str
51
+ array.unshift n.to_s
52
+ array
53
+ end
54
+
55
+ getter :VMDuration, 'VM_DURATION' do |str|
56
+ str.to_i
57
+ end
58
+ getter :VMAllowedDuration, 'VM_ALLOWED_DURATION' do |str|
59
+ str.to_i
60
+ end
61
+
62
+ getter :Rate, 'RATE' do |str|
63
+ str.to_i
64
+ end
65
+ getter :RateCurrency, 'RATE_CURRENCY'
66
+ getter :RatePrecision, 'RATE_PRECISION' do |str|
67
+ str.to_f #?
68
+ end
69
+
70
+ getter :Input, 'INPUT'
71
+ getter :Output, 'OUTPUT'
72
+ getter :CaptureMic, 'CAPTURE_MIC'
73
+ getter :VAAInputStatus, 'VAA_INPUT_STATUS' do |str|
74
+ str._flag
75
+ end
76
+
77
+ getter :ForwardedBy, 'FORWARDED_BY'
78
+ getter :TransferActive, 'TRANSFER_ACTIVE' do |str|
79
+ str._flag
80
+ end
81
+ getter :TransferStatus, 'TRANSFER_STATUS'
82
+ getter :TransferredBy, 'TRANSFERRED_BY'
83
+ getter :TransferredTo, 'TRANSFERRED_TO'
84
+
85
+ notice :CanTransffer, 'CAN_TRANSFER' do |str|
86
+ res = str.split ' '
87
+ res[0] = @@skypeApi.user res[0]
88
+ res[1] = res[1]._flag
89
+ res
90
+ end
91
+ def getCanTransfer user
92
+ res = sendGet "CAN_TRANSFER #{user}"
93
+ V2O[:CanTransffer].call(user.to_s + ' ' + res)
94
+ end
95
+
96
+ getter :Seen, "SEEN" do |str|
97
+ str._flag
98
+ end
99
+
100
+ #Notify?
101
+ #getter :DTMF, "DTMF" do |str|
102
+ # str.to_i
103
+ #end
104
+ #getter :JoinConference, "JOIN_CONFERENCE"
105
+ #getter :StartVideoSend, "START_VIDEO_SEND"
106
+ #getter :StopVideoSend, "STOP_VIDEO_SEND"
107
+ #getter :StartVideoReceive, "START_VIDEO_RECEIVE"
108
+ #getter :StopVideoReceive, "STOP_VIDEO_RECEIVE"
109
+
110
+ def setSeen
111
+ sendSet "SEEN"
112
+ end
113
+
114
+ def setStatus s
115
+ sendSet "STATUS", s
116
+ end
117
+
118
+ def setStatusOnHold
119
+ setStatus "ONHOLD"
120
+ end
121
+
122
+ def setStatusInprogress
123
+ setStatus "INPROGRESS"
124
+ end
125
+
126
+ def setStatusFinished
127
+ setStatus "FINISHED"
128
+ end
129
+
130
+ def setDTMF num
131
+ sendSet "DTMF #{num}"
132
+ end
133
+
134
+ def setJoinConference call
135
+ sendSet "JOIN_CONFERENCE", masterID.to_s
136
+ end
137
+
138
+ def setStartVideoSend
139
+ sendSet "START_VIDEO_SEND"
140
+ end
141
+
142
+ def setStopVideoSend
143
+ sendSet "STOP_VIDEO_SEND"
144
+ end
145
+
146
+ def setStartVideoReceive
147
+ sendSet "START_VIDEO_RECEIVE"
148
+ end
149
+
150
+ def setStopVideoReceive
151
+ sendSet "STOP_VIDEO_RECEIVE"
152
+ end
153
+
154
+ def answer
155
+ sendAlter "ANSWER"
156
+ end
157
+
158
+ def hold
159
+ sendAlter "HOLD"
160
+ end
161
+
162
+ def resume
163
+ sendAlter "RESUME"
164
+ end
165
+
166
+ def hangup
167
+ sendAlter "HANGUP"
168
+ end
169
+
170
+ def end val=''
171
+ sendAlter "END", val
172
+ end
173
+
174
+ def dtmf num
175
+ sendAlter "DTMF", num
176
+ end
177
+
178
+ def transfer *users
179
+ sendAlter "TRANSFER", users.join(', ')
180
+ end
181
+
182
+ def joinConference call
183
+ sendAlter "JOIN_CONFERENCE", call.to_s
184
+ end
185
+
186
+ def startVideoSend
187
+ sendAlter "START_VIDEO_SEND"
188
+ end
189
+
190
+ def stopVideoSend
191
+ sendAlter "STOP_VIDEO_SEND"
192
+ end
193
+
194
+ def startVideoReceive
195
+ sendAlter "START_VIDEO_RECEIVE"
196
+ end
197
+
198
+ def stopVideoReceive
199
+ sendAlter"STOP_VIDEO_RECEIVE"
200
+ end
201
+
202
+ def setInput arg
203
+ sendAlter "SET_INPUT", arg
204
+ end
205
+
206
+ def setOutput arg
207
+ sendAlter "SET_INPUT", arg
208
+ end
209
+
210
+ def setCaptureMic arg
211
+ sendAlter "SET_CAPUTURE_MIC", arg
212
+ end
213
+
214
+
215
+ def alter value
216
+ sendOne "ALTER CALL #{@id} #{value}","ALTER CALL #{@id}"
217
+ end
218
+ end
219
+ end
220
+ end