smsRuby 1.0.0-x86-linux

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,141 @@
1
+ require 'sms'
2
+ require 'smsruby/error'
3
+
4
+ #
5
+ # The Connection class represent the connection layer. Contains all values that
6
+ # describe an available connection that is associated with an attach phone.
7
+ # Implements methods for comunicating with the phone for send/receive messages
8
+ # and for obtain information about associated phone
9
+ #
10
+ class Connection
11
+
12
+ include Sms
13
+
14
+ # Reference the status of the current connection
15
+ attr_accessor :status
16
+ # Reference if the current connection it's allow to send, receive or both
17
+ attr_accessor :typec
18
+ # Reference the associated port for the current connection
19
+ attr_reader :port
20
+ # Represent the unique id of the current connection
21
+ attr_reader :id_connection
22
+ # Reference model of the phone attached to the current connection
23
+ attr_reader :phone_model
24
+ # Reference manufacter of the phone attached to the current connection
25
+ attr_reader :phone_manufacter
26
+ # Reference the installed software revition in the phone attached to the current connection
27
+ attr_reader :phone_revsoft
28
+ # Reference imei of the phone attached to the current connection
29
+ attr_reader :phone_imei
30
+
31
+
32
+ #
33
+ # Initialize the connection reprensented by name through businit function provided
34
+ # by the sms shared object. In the same way initialize all class attributes.
35
+ #
36
+ def initialize(name,port)
37
+ begin
38
+ if RUBY_PLATFORM =~ /(win|w)32$/
39
+ path = ENV['userprofile']+'/_gnokiirc'
40
+ elsif RUBY_PLATFORM =~ /linux/
41
+ path = ENV['HOME']+'/.gnokiirc'
42
+ end
43
+ error=businit(name, path)
44
+ error <= 0 ? (error==-500 ? (raise "The maximum number of connection has been open") : @id_connection=error.to_i*-1) : exception(error)
45
+ @port = port
46
+ @phone_model=phoneModel(@id_connection)
47
+ @phone_manufacter=phoneManufacter(@id_connection)
48
+ @phone_revsoft=phoneRevSoft(@id_connection)
49
+ @phone_imei=(phoneImei(@id_connection)).gsub(/[\s\D]/, "")
50
+ @typec='none'
51
+ @status='available'
52
+ end
53
+ end
54
+
55
+ #
56
+ # Allow to test and existing connection to verify if is still available. Return
57
+ # 0 if is still available, diferent from 0 otherwise.
58
+ #
59
+ def test
60
+ return testconn(@id_connection)
61
+ end
62
+
63
+ #
64
+ # Return the signal level of the phone asociatted with the current connection
65
+ #
66
+ def signallevel
67
+ return rf_level(@id_connection)
68
+ end
69
+
70
+ #
71
+ # Return the battery level of the phone asociatted with the current connection
72
+ #
73
+ def batterylevel
74
+ return bat_level(@id_connection)
75
+ end
76
+
77
+ #
78
+ # Terminate the current connection
79
+ #
80
+ def close
81
+ busterminate(@id_connection)
82
+ end
83
+
84
+ #
85
+ # Execute a specific function from the shared object depending of type option value
86
+ # specified in hsh. If an error occurs an exception will be thrown
87
+ #
88
+ def execute(hsh)
89
+ cmd = hsh[:type]
90
+
91
+ case cmd
92
+ when /send/
93
+ @status = 'sending'
94
+ error = 0
95
+ puts ":: Manufacter sending the message: "+@phone_manufacter.to_s+' in port: '+@port.to_s+' with id: '+@id_connection.to_s+"\n"
96
+ error= send_sms(hsh[:dst], hsh[:msj], hsh[:smsc], hsh[:report], hsh[:validity], @id_connection)
97
+ #puts ':: The return error in execute send function is: '+error.to_s+"\n"
98
+ sleep(7)
99
+ when /receive/
100
+ @status = 'receiving'
101
+ msj=[]
102
+ nmsj=0
103
+ error = get_sms(@id_connection)
104
+ error <= 0 ? number=error.to_i*-1 : exception(error)
105
+ number.times { |i|
106
+ m = get_msj(i,@id_connection)
107
+ if(m.type_sms.eql?("Inbox Message"))
108
+ msj[nmsj] = m if (m.error == 0)
109
+ nmsj+=1 if m.error ==0
110
+ end
111
+ }
112
+ return msj
113
+ end
114
+ exception(error) unless error==0
115
+ end
116
+
117
+ def type(status)
118
+ case status
119
+ when 0 then return "unread"
120
+ when 1 then return "read"
121
+ when 2 then return "sent"
122
+ when 3 then return "unsent"
123
+ end
124
+ end
125
+
126
+ #
127
+ # Throws a diferent exception depending of specified error code
128
+ #
129
+ def exception (error)
130
+ case error
131
+ when 1..9 then raise ErrorHandler::GeneralError.new(error)
132
+ when 10..15 then raise ErrorHandler::StatemachineError.new(error)
133
+ when 16..18 then raise ErrorHandler::LocationError.new(error)
134
+ when 19..21 then raise ErrorHandler::FormatError.new(error)
135
+ when 22..25 then raise ErrorHandler::CallError.new(error)
136
+ when 26..29 then raise ErrorHandler::OtherError.new(error)
137
+ when 30..35 then raise ErrorHandler::ConfigError.new(error)
138
+ end
139
+ end
140
+
141
+ end
@@ -0,0 +1,141 @@
1
+ require 'sms'
2
+ require 'smsruby/error'
3
+
4
+ #
5
+ # The Connection class represent the connection layer. Contains all values that
6
+ # describe an available connection that is associated with an attach phone.
7
+ # Implements methods for comunicating with the phone for send/receive messages
8
+ # and for obtain information about associated phone
9
+ #
10
+ class Connection
11
+
12
+ include Sms
13
+
14
+ # Reference the status of the current connection
15
+ attr_accessor :status
16
+ # Reference if the current connection it's allow to send, receive or both
17
+ attr_accessor :typec
18
+ # Reference the associated port for the current connection
19
+ attr_reader :port
20
+ # Represent the unique id of the current connection
21
+ attr_reader :id_connection
22
+ # Reference model of the phone attached to the current connection
23
+ attr_reader :phone_model
24
+ # Reference manufacter of the phone attached to the current connection
25
+ attr_reader :phone_manufacter
26
+ # Reference the installed software revition in the phone attached to the current connection
27
+ attr_reader :phone_revsoft
28
+ # Reference imei of the phone attached to the current connection
29
+ attr_reader :phone_imei
30
+
31
+
32
+ #
33
+ # Initialize the connection reprensented by name through businit function provided
34
+ # by the sms shared object. In the same way initialize all class attributes.
35
+ #
36
+ def initialize(name,port)
37
+ begin
38
+ if RUBY_PLATFORM =~ /(win|w)32$/
39
+ path = ENV['userprofile']+'/_gnokiirc'
40
+ elsif RUBY_PLATFORM =~ /linux/
41
+ path = ENV['HOME']+'/.gnokiirc'
42
+ end
43
+ error=businit(name, path)
44
+ error <= 0 ? (error==-10 ? (raise "The maximum number of connection has been open") : @id_connection=error.to_i*-1) : exception(error)
45
+ @port = port
46
+ @phone_model=phoneModel(@id_connection)
47
+ @phone_manufacter=phoneManufacter(@id_connection)
48
+ @phone_revsoft=phoneRevSoft(@id_connection)
49
+ @phone_imei=(phoneImei(@id_connection)).gsub(/[\s\D]/, "")
50
+ @typec='none'
51
+ @status='available'
52
+ end
53
+ end
54
+
55
+ #
56
+ # Allow to test and existing connection to verify if is still available. Return
57
+ # 0 if is still available, diferent from 0 otherwise.
58
+ #
59
+ def test
60
+ return testconn(@id_connection)
61
+ end
62
+
63
+ #
64
+ # Return the signal level of the phone asociatted with the current connection
65
+ #
66
+ def signallevel
67
+ return rf_level(@id_connection)
68
+ end
69
+
70
+ #
71
+ # Return the battery level of the phone asociatted with the current connection
72
+ #
73
+ def batterylevel
74
+ return bat_level(@id_connection)
75
+ end
76
+
77
+ #
78
+ # Terminate the current connection
79
+ #
80
+ def close
81
+ busterminate(@id_connection)
82
+ end
83
+
84
+ #
85
+ # Execute a specific function from the shared object depending of type option value
86
+ # specified in hsh. If an error occurs an exception will be thrown
87
+ #
88
+ def execute(hsh)
89
+ cmd = hsh[:type]
90
+
91
+ case cmd
92
+ when /send/
93
+ @status = 'sending'
94
+ error = 0
95
+ puts ":: Manufacter sending the message: "+@phone_manufacter.to_s+' in port: '+@port.to_s+' with id: '+@id_connection.to_s+"\n"
96
+ error= send_sms(hsh[:dst], hsh[:msj], hsh[:smsc], hsh[:report], hsh[:validity], @id_connection)
97
+ #puts ':: The return error in execute send function is: '+error.to_s+"\n"
98
+ sleep(7)
99
+ when /receive/
100
+ @status = 'receiving'
101
+ msj=[]
102
+ nmsj=0
103
+ error = get_sms(@id_connection)
104
+ error <= 0 ? number=error.to_i*-1 : exception(error)
105
+ number.times { |i|
106
+ m = get_msj(i,@id_connection)
107
+ if(m.type_sms.eql?("Inbox Message"))
108
+ msj[nmsj] = m if (m.error == 0)
109
+ nmsj+=1 if m.error ==0
110
+ end
111
+ }
112
+ return msj
113
+ end
114
+ exception(error) unless error==0
115
+ end
116
+
117
+ def type(status)
118
+ case status
119
+ when 0 then return "unread"
120
+ when 1 then return "read"
121
+ when 2 then return "sent"
122
+ when 3 then return "unsent"
123
+ end
124
+ end
125
+
126
+ #
127
+ # Throws a diferent exception depending of specified error code
128
+ #
129
+ def exception (error)
130
+ case error
131
+ when 1..9 then raise ErrorHandler::GeneralError.new(error)
132
+ when 10..15 then raise ErrorHandler::StatemachineError.new(error)
133
+ when 16..18 then raise ErrorHandler::LocationError.new(error)
134
+ when 19..21 then raise ErrorHandler::FormatError.new(error)
135
+ when 22..25 then raise ErrorHandler::CallError.new(error)
136
+ when 26..29 then raise ErrorHandler::OtherError.new(error)
137
+ when 30..35 then raise ErrorHandler::ConfigError.new(error)
138
+ end
139
+ end
140
+
141
+ end
@@ -0,0 +1,40 @@
1
+ require 'sms'
2
+ module ErrorHandler
3
+
4
+ #
5
+ # The Error class represent the error layer. Inherit from standard error class
6
+ # of ruby and allows to give a more specific description about produced errors
7
+ #
8
+ class Error < StandardError
9
+ include Sms
10
+
11
+ # Reference the id of the current error
12
+ attr_reader :id
13
+ # Reference a string message description of the current error
14
+ attr_reader :message
15
+
16
+ #
17
+ # Initialize all attributes for error class receiving the id error. The
18
+ # printError function of the shared object is used to obtain the string
19
+ # message of the current error
20
+ #
21
+ def initialize(id)
22
+ @id = id
23
+ @message = printError(id)
24
+ end
25
+
26
+ end
27
+
28
+ #
29
+ # Represent the diferent classes for particular given errors. All the classes
30
+ # inherits from Error class defined above.
31
+ #
32
+ class GeneralError < Error; end
33
+ class ConfigError < Error; end
34
+ class StatemachineError < Error; end
35
+ class CallError < Error; end
36
+ class OtherError < Error; end
37
+ class FormatError < Error; end
38
+ class LocationError < Error; end
39
+
40
+ end
@@ -0,0 +1,97 @@
1
+ require 'smsruby/adm_connection'
2
+ require 'rubygems'
3
+ require 'sqlite3'
4
+
5
+ #
6
+ # The Receive class represent the receive layer. Handles the reception of messages
7
+ # and the initialization of multiples threads to allow multiples connections to receive
8
+ # messages simultaniously
9
+ #
10
+ class Receive
11
+
12
+ # Reference an instance for the Connection Administrator
13
+ attr_reader :adm
14
+ # Reference the list of messages
15
+ attr_reader :list
16
+ # Reference the type of receive that will be used (0: receive for a defined period of time, 1: receive messages ones )
17
+ attr_accessor :receivetype
18
+ # Represent the time in seconds that a particular connection will be receiving messages (for receivetype==0)
19
+ attr_accessor :time
20
+
21
+
22
+ #
23
+ # Obtains and instance of the Connection Administrator to control all existing
24
+ # connections. Due to the use of a singleton in the administrator, the same
25
+ # created instance will be obtain, or will be created if an instance doesn't
26
+ # exist. The type of receive and the period of time that will be used are passed
27
+ # to initialize method. An Exception is thrown if the instance of Admconnection fail
28
+ #
29
+ def initialize(type,time)
30
+ begin
31
+ @receivetype=type
32
+ @time =time
33
+ @adm = AdmConnection.instance
34
+ end
35
+ end
36
+
37
+ #
38
+ # Represent the receive method of the Receive class. Will create the reception threads
39
+ # acording with the imeis values passed as an argument. if imeis passed are nil will be
40
+ # created as many threads as connections configured to receive are found
41
+ #
42
+ def receive(imeis)
43
+ begin
44
+ if @adm.avlconn
45
+ if imeis
46
+ imeis.each do |i|
47
+ if @adm.get_connections.inject(false){|res,act| (act[1].phone_imei==i.to_s and act[1].status=='available' and (act[1].typec=='r' or act[1].typec=='sr')) || res}
48
+ t=Thread.new{receive_internal(i.to_s){|x,y| yield x,y if block_given? }}
49
+ t[:type]='r'
50
+ else
51
+ @adm.log.warn "Can't receive message in connection with imei: #{i}." unless @adm.log.nil?
52
+ end
53
+ end
54
+ else
55
+ @adm.get_connections.select{ |n,act| (act.typec=='r' or act.typec=='sr') and act.status=='available'}.each do |i|
56
+ t=Thread.new{receive_internal(i[1].phone_imei){|x,y| yield x,y if block_given? }}
57
+ t[:type]='r'
58
+ end
59
+ end
60
+ else
61
+ raise "There are no active connections"
62
+ end
63
+ rescue Exception => e
64
+ @adm.log.error "Error receiving messages #{e.message}. Detail: #{e.message}" unless @adm.log.nil?
65
+ raise e
66
+ end
67
+ end
68
+
69
+ #
70
+ # Represent the method associated to the receive threads. Will handle the BD writting
71
+ # of the received messages and will make the call of recieve method in the Connection
72
+ # Administrator
73
+ #
74
+ def receive_internal(imei)
75
+ begin
76
+ db = SQLite3::Database.new('prueba.s3db')
77
+ @adm.receive(to_hash(imei)){ |x,y|
78
+ yield x,y if block_given?
79
+ db.execute("INSERT INTO inbox (smsdate,phone_number,text) VALUES " + "('#{x.date}', '#{x.source_number}','#{x.text}');")
80
+ }
81
+ rescue Exception => e
82
+ puts e.message
83
+ end
84
+ end
85
+
86
+ #
87
+ # Combine all option values into a hash to relate them
88
+ #
89
+ def to_hash(imei)
90
+ { :type => 'receive',
91
+ :imei => imei.gsub(/[\s\D]/, ""),
92
+ :receivetype => self.receivetype,
93
+ :time => self.time
94
+ }
95
+ end
96
+
97
+ end
@@ -0,0 +1,97 @@
1
+ require 'adm_connection'
2
+ require 'rubygems'
3
+ require 'sqlite3'
4
+
5
+ #
6
+ # The Receive class represent the receive layer. Handles the reception of messages
7
+ # and the initialization of multiples threads to allow multiples connections to receive
8
+ # messages simultaniously
9
+ #
10
+ class Receive
11
+
12
+ # Reference an instance for the Connection Administrator
13
+ attr_reader :adm
14
+ # Reference the list of messages
15
+ attr_reader :list
16
+ # Reference the type of receive that will be used (0: receive for a defined period of time, 1: receive messages ones )
17
+ attr_accessor :receivetype
18
+ # Represent the time in seconds that a particular connection will be receiving messages (for receivetype==0)
19
+ attr_accessor :time
20
+
21
+
22
+ #
23
+ # Obtains and instance of the Connection Administrator to control all existing
24
+ # connections. Due to the use of a singleton in the administrator, the same
25
+ # created instance will be obtain, or will be created if an instance doesn't
26
+ # exist. The type of receive and the period of time that will be used are passed
27
+ # to initialize method. An Exception is thrown if the instance of Admconnection fail
28
+ #
29
+ def initialize(type,time)
30
+ begin
31
+ @receivetype=type
32
+ @time =time
33
+ @adm = AdmConnection.instance
34
+ end
35
+ end
36
+
37
+ #
38
+ # Represent the receive method of the Receive class. Will create the reception threads
39
+ # acording with the imeis values passed as an argument. if imeis passed are nil will be
40
+ # created as many threads as connections configured to receive are found
41
+ #
42
+ def receive(imeis)
43
+ begin
44
+ if @adm.avlconn
45
+ if imeis
46
+ imeis.each do |i|
47
+ if @adm.get_connections.inject(false){|res,act| (act[1].phone_imei==i.to_s and act[1].status=='available' and (act[1].typec=='r' or act[1].typec=='sr')) || res}
48
+ t=Thread.new{receive_internal(i.to_s){|x,y| yield x,y if block_given? }}
49
+ t[:type]='r'
50
+ else
51
+ @adm.log.warn "Can't receive message in connection with imei: #{i}." unless @adm.log.nil?
52
+ end
53
+ end
54
+ else
55
+ @adm.get_connections.select{ |n,act| (act.typec=='r' or act.typec=='sr') and act.status=='available'}.each do |i|
56
+ t=Thread.new{receive_internal(i[1].phone_imei){|x,y| yield x,y if block_given? }}
57
+ t[:type]='r'
58
+ end
59
+ end
60
+ else
61
+ raise "There are no active connections"
62
+ end
63
+ rescue Exception => e
64
+ @adm.log.error "Error receiving messages #{e.message}. Detail: #{e.message}" unless @adm.log.nil?
65
+ raise e
66
+ end
67
+ end
68
+
69
+ #
70
+ # Represent the method associated to the receive threads. Will handle the BD writting
71
+ # of the received messages and will make the call of recieve method in the Connection
72
+ # Administrator
73
+ #
74
+ def receive_internal(imei)
75
+ begin
76
+ db = SQLite3::Database.new('prueba.s3db')
77
+ @adm.receive(to_hash(imei)){ |x,y|
78
+ yield x,y if block_given?
79
+ db.execute("INSERT INTO inbox (smsdate,phone_number,text) VALUES " + "('#{x.date}', '#{x.source_number}','#{x.text}');")
80
+ }
81
+ rescue Exception => e
82
+ puts e.message
83
+ end
84
+ end
85
+
86
+ #
87
+ # Combine all option values into a hash to relate them
88
+ #
89
+ def to_hash(imei)
90
+ { :type => 'receive',
91
+ :imei => imei.gsub(/[\s\D]/, ""),
92
+ :receivetype => self.receivetype,
93
+ :time => self.time
94
+ }
95
+ end
96
+
97
+ end