Bump to -13 to include fixes found through dbus-monitor to get calls to work
[theonering] / src / channel / debug_prompt.py
1 import cmd
2 import StringIO
3 import time
4 import datetime
5 import logging
6
7 import telepathy
8
9 import gtk_toolbox
10
11
12 _moduleLogger = logging.getLogger("channel.text")
13
14
15 class DebugPromptChannel(telepathy.server.ChannelTypeText, cmd.Cmd):
16         """
17         Look into implementing ChannelInterfaceMessages for rich text formatting
18         """
19
20         def __init__(self, connection, manager, props, contactHandle):
21                 self.__manager = manager
22                 self.__props = props
23
24                 cmd.Cmd.__init__(self, "Debug Prompt")
25                 self.use_rawinput = False
26                 try:
27                         # HACK Older python-telepathy way
28                         telepathy.server.ChannelTypeText.__init__(self, connection, contactHandle)
29                         self._requested = props[telepathy.interfaces.CHANNEL_INTERFACE + '.Requested']
30                         self._implement_property_get(
31                                 telepathy.interfaces.CHANNEL_INTERFACE,
32                                 {"Requested": lambda: self._requested}
33                         )
34                 except TypeError:
35                         # HACK Newer python-telepathy way
36                         telepathy.server.ChannelTypeText.__init__(self, connection, manager, props)
37                 self.__nextRecievedId = 0
38                 self.__lastMessageTimestamp = datetime.datetime(1, 1, 1)
39
40                 self.__otherHandle = contactHandle
41
42                 # HACK Older python-telepathy doesn't provide this
43                 self._immutable_properties = {
44                         'ChannelType': telepathy.server.interfaces.CHANNEL_INTERFACE,
45                         'TargetHandle': telepathy.server.interfaces.CHANNEL_INTERFACE,
46                         'Interfaces': telepathy.server.interfaces.CHANNEL_INTERFACE,
47                         'TargetHandleType': telepathy.server.interfaces.CHANNEL_INTERFACE,
48                         'TargetID': telepathy.server.interfaces.CHANNEL_INTERFACE,
49                         'Requested': telepathy.server.interfaces.CHANNEL_INTERFACE
50                 }
51
52         def get_props(self):
53                 # HACK Older python-telepathy doesn't provide this
54                 props = dict()
55                 for prop, iface in self._immutable_properties.items():
56                         props[iface + '.' + prop] = \
57                                 self._prop_getters[iface][prop]()
58                 return props
59
60         @gtk_toolbox.log_exception(_moduleLogger)
61         def Send(self, messageType, text):
62                 if messageType != telepathy.CHANNEL_TEXT_MESSAGE_TYPE_NORMAL:
63                         raise telepathy.errors.NotImplemented("Unhandled message type: %r" % messageType)
64
65                 self.Sent(int(time.time()), messageType, text)
66
67                 oldStdin, oldStdout = self.stdin, self.stdout
68                 try:
69                         self.stdin = currentStdin = StringIO.StringIO()
70                         self.stdout = currentStdout = StringIO.StringIO()
71                         self.onecmd(text)
72                 finally:
73                         self.stdin, self.stdout = oldStdin, oldStdout
74
75                 self._report_new_message(currentStdout.getvalue())
76
77         @gtk_toolbox.log_exception(_moduleLogger)
78         def Close(self):
79                 self.close()
80
81         def close(self):
82                 telepathy.server.ChannelTypeText.Close(self)
83                 if self.__manager.channel_exists(self.__props):
84                         # HACK Older python-telepathy requires doing this manually
85                         self.__manager.remove_channel(self)
86                 self.remove_from_connection()
87
88         def _report_new_message(self, message):
89                 currentReceivedId = self.__nextRecievedId
90
91                 timestamp = int(time.time())
92                 type = telepathy.CHANNEL_TEXT_MESSAGE_TYPE_NORMAL
93
94                 self.Received(currentReceivedId, timestamp, self.__otherHandle, type, 0, message.strip())
95
96                 self.__nextRecievedId += 1
97
98         def do_reset_state_machine(self, args):
99                 if args:
100                         self._report_new_message("No arguments supported")
101                         return
102
103                 try:
104                         for machine in self._conn.session.stateMachine._machines:
105                                 machine.reset_timers()
106                 except Exception, e:
107                         self._report_new_message(str(e))
108
109         def do_get_state(self, args):
110                 if args:
111                         self._report_new_message("No arguments supported")
112                         return
113
114                 try:
115                         state = self._conn.session.stateMachine.state
116                         self._report_new_message(str(state))
117                 except Exception, e:
118                         self._report_new_message(str(e))
119
120         def do_is_authed(self, args):
121                 if args:
122                         self._report_new_message("No arguments supported")
123                         return
124
125                 try:
126                         isAuthed = self._conn.session.backend.is_authed()
127                         self._report_new_message(str(isAuthed))
128                 except Exception, e:
129                         self._report_new_message(str(e))
130
131         def do_is_dnd(self, args):
132                 if args:
133                         self._report_new_message("No arguments supported")
134                         return
135
136                 try:
137                         isDnd = self._conn.session.backend.is_dnd()
138                         self._report_new_message(str(isDnd))
139                 except Exception, e:
140                         self._report_new_message(str(e))
141
142         def do_get_account_number(self, args):
143                 if args:
144                         self._report_new_message("No arguments supported")
145                         return
146
147                 try:
148                         number = self._conn.session.backend.get_account_number()
149                         self._report_new_message(number)
150                 except Exception, e:
151                         self._report_new_message(str(e))
152
153         def do_get_callback_numbers(self, args):
154                 if args:
155                         self._report_new_message("No arguments supported")
156                         return
157
158                 try:
159                         numbers = self._conn.session.backend.get_callback_numbers()
160                         numbersDisplay = "\n".join(
161                                 "%s: %s" % (name, number)
162                                 for (number, name) in numbers.iteritems()
163                         )
164                         self._report_new_message(numbersDisplay)
165                 except Exception, e:
166                         self._report_new_message(str(e))
167
168         def do_get_callback_number(self, args):
169                 if args:
170                         self._report_new_message("No arguments supported")
171                         return
172
173                 try:
174                         number = self._conn.session.backend.get_callback_number()
175                         self._report_new_message(number)
176                 except Exception, e:
177                         self._report_new_message(str(e))
178
179         def do_call(self, args):
180                 if len(args) != 1:
181                         self._report_new_message("Must specify the phone number and only the phone nunber")
182                         return
183
184                 try:
185                         number = args[0]
186                         self._conn.session.backend.call(number)
187                 except Exception, e:
188                         self._report_new_message(str(e))
189
190         def do_send_sms(self, args):
191                 if 1 < len(args):
192                         self._report_new_message("Must specify the phone number and then message")
193                         return
194
195                 try:
196                         number = args[0]
197                         message = " ".join(args[1:])
198                         self._conn.session.backend.send_sms(number, message)
199                 except Exception, e:
200                         self._report_new_message(str(e))