Adding a debug prompt.
[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                 except TypeError:
30                         # HACK Newer python-telepathy way
31                         telepathy.server.ChannelTypeText.__init__(self, connection, manager, props)
32                 self._nextRecievedId = 0
33                 self._lastMessageTimestamp = datetime.datetime(1, 1, 1)
34
35                 self._otherHandle = contactHandle
36
37         @gtk_toolbox.log_exception(_moduleLogger)
38         def Send(self, messageType, text):
39                 if messageType != telepathy.CHANNEL_TEXT_MESSAGE_TYPE_NORMAL:
40                         raise telepathy.errors.NotImplemented("Unhandled message type: %r" % messageType)
41
42                 self.Sent(int(time.time()), messageType, text)
43
44                 oldStdin, oldStdout = self.stdin, self.stdout
45                 try:
46                         self.stdin = currentStdin = StringIO.StringIO()
47                         self.stdout = currentStdout = StringIO.StringIO()
48                         self.onecmd(text)
49                 finally:
50                         self.stdin, self.stdout = oldStdin, oldStdout
51
52                 self._report_new_message(currentStdout.getvalue().strip())
53
54         @gtk_toolbox.log_exception(_moduleLogger)
55         def Close(self):
56                 self.close()
57
58         def close(self):
59                 telepathy.server.ChannelTypeText.Close(self)
60                 if self._manager.channel_exists(self._props):
61                         # HACK Older python-telepathy requires doing this manually
62                         self._manager.remove_channel(self)
63                 self.remove_from_connection()
64
65         def _report_new_message(self, message):
66                 currentReceivedId = self._nextRecievedId
67
68                 timestamp = int(time.time())
69                 type = telepathy.CHANNEL_TEXT_MESSAGE_TYPE_NORMAL
70
71                 self.Received(currentReceivedId, timestamp, self._otherHandle, type, 0, message)
72
73                 self._nextRecievedId += 1
74
75         def do_reset_state_machine(self, args):
76                 if args:
77                         self._report_new_message("No arguments supported")
78                         return
79
80                 try:
81                         self._conn.session.stateMachine.reset_timers()
82                 except Exception, e:
83                         self._report_new_message(str(e))
84
85         def do_get_state(self, args):
86                 if args:
87                         self._report_new_message("No arguments supported")
88                         return
89
90                 try:
91                         state = self._conn.session.stateMachine.get_state()
92                         self._report_new_message(str(state))
93                 except Exception, e:
94                         self._report_new_message(str(e))
95
96         def do_is_authed(self, args):
97                 if args:
98                         self._report_new_message("No arguments supported")
99                         return
100
101                 try:
102                         isAuthed = self._conn.session.backend.is_authed()
103                         self._report_new_message(str(isAuthed))
104                 except Exception, e:
105                         self._report_new_message(str(e))
106
107         def do_is_dnd(self, args):
108                 if args:
109                         self._report_new_message("No arguments supported")
110                         return
111
112                 try:
113                         isDnd = self._conn.session.backend.is_dnd()
114                         self._report_new_message(str(isDnd))
115                 except Exception, e:
116                         self._report_new_message(str(e))
117
118         def do_get_account_number(self, args):
119                 if args:
120                         self._report_new_message("No arguments supported")
121                         return
122
123                 try:
124                         number = self._conn.session.backend.get_account_number()
125                         self._report_new_message(number)
126                 except Exception, e:
127                         self._report_new_message(str(e))
128
129         def do_get_callback_numbers(self, args):
130                 if args:
131                         self._report_new_message("No arguments supported")
132                         return
133
134                 try:
135                         numbers = self._conn.session.backend.get_callback_numbers()
136                         numbersDisplay = "\n".join(
137                                 "%s: %s" % (name, number)
138                                 for (number, name) in numbers.iteritems()
139                         )
140                         self._report_new_message(numbersDisplay)
141                 except Exception, e:
142                         self._report_new_message(str(e))
143
144         def do_get_callback_number(self, args):
145                 if args:
146                         self._report_new_message("No arguments supported")
147                         return
148
149                 try:
150                         number = self._conn.session.backend.get_callback_number()
151                         self._report_new_message(number)
152                 except Exception, e:
153                         self._report_new_message(str(e))
154
155         def do_call(self, args):
156                 if len(args) != 1:
157                         self._report_new_message("No arguments supported")
158                         return
159
160                 try:
161                         number = args[0]
162                         self._conn.session.backend.call(number)
163                 except Exception, e:
164                         self._report_new_message(str(e))