Adding logging to close so I can be sure my channels close
[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 tp
10 import gtk_toolbox
11
12
13 _moduleLogger = logging.getLogger("channel.text")
14
15
16 class DebugPromptChannel(tp.ChannelTypeText, cmd.Cmd):
17         """
18         Look into implementing ChannelInterfaceMessages for rich text formatting
19         """
20
21         def __init__(self, connection, manager, props, contactHandle):
22                 self.__manager = manager
23                 self.__props = props
24
25                 cmd.Cmd.__init__(self, "Debug Prompt")
26                 self.use_rawinput = False
27                 tp.ChannelTypeText.__init__(self, connection, manager, props)
28                 self.__nextRecievedId = 0
29                 self.__lastMessageTimestamp = datetime.datetime(1, 1, 1)
30
31                 self.__otherHandle = contactHandle
32
33         @gtk_toolbox.log_exception(_moduleLogger)
34         def Send(self, messageType, text):
35                 if messageType != telepathy.CHANNEL_TEXT_MESSAGE_TYPE_NORMAL:
36                         raise telepathy.errors.NotImplemented("Unhandled message type: %r" % messageType)
37
38                 self.Sent(int(time.time()), messageType, text)
39
40                 oldStdin, oldStdout = self.stdin, self.stdout
41                 try:
42                         self.stdin = currentStdin = StringIO.StringIO()
43                         self.stdout = currentStdout = StringIO.StringIO()
44                         self.onecmd(text)
45                 finally:
46                         self.stdin, self.stdout = oldStdin, oldStdout
47
48                 self._report_new_message(currentStdout.getvalue())
49
50         @gtk_toolbox.log_exception(_moduleLogger)
51         def Close(self):
52                 self.close()
53
54         def close(self):
55                 _moduleLogger.info("Closing debug")
56                 tp.ChannelTypeText.Close(self)
57                 self.remove_from_connection()
58
59         def _report_new_message(self, message):
60                 currentReceivedId = self.__nextRecievedId
61
62                 timestamp = int(time.time())
63                 type = telepathy.CHANNEL_TEXT_MESSAGE_TYPE_NORMAL
64
65                 self.Received(currentReceivedId, timestamp, self.__otherHandle, type, 0, message.strip())
66
67                 self.__nextRecievedId += 1
68
69         def do_reset_state_machine(self, args):
70                 if args:
71                         self._report_new_message("No arguments supported")
72                         return
73
74                 try:
75                         for machine in self._conn.session.stateMachine._machines:
76                                 machine.reset_timers()
77                 except Exception, e:
78                         self._report_new_message(str(e))
79
80         def do_get_state(self, args):
81                 if args:
82                         self._report_new_message("No arguments supported")
83                         return
84
85                 try:
86                         state = self._conn.session.stateMachine.state
87                         self._report_new_message(str(state))
88                 except Exception, e:
89                         self._report_new_message(str(e))
90
91         def do_is_authed(self, args):
92                 if args:
93                         self._report_new_message("No arguments supported")
94                         return
95
96                 try:
97                         isAuthed = self._conn.session.backend.is_authed()
98                         self._report_new_message(str(isAuthed))
99                 except Exception, e:
100                         self._report_new_message(str(e))
101
102         def do_is_dnd(self, args):
103                 if args:
104                         self._report_new_message("No arguments supported")
105                         return
106
107                 try:
108                         isDnd = self._conn.session.backend.is_dnd()
109                         self._report_new_message(str(isDnd))
110                 except Exception, e:
111                         self._report_new_message(str(e))
112
113         def do_get_account_number(self, args):
114                 if args:
115                         self._report_new_message("No arguments supported")
116                         return
117
118                 try:
119                         number = self._conn.session.backend.get_account_number()
120                         self._report_new_message(number)
121                 except Exception, e:
122                         self._report_new_message(str(e))
123
124         def do_get_callback_numbers(self, args):
125                 if args:
126                         self._report_new_message("No arguments supported")
127                         return
128
129                 try:
130                         numbers = self._conn.session.backend.get_callback_numbers()
131                         numbersDisplay = "\n".join(
132                                 "%s: %s" % (name, number)
133                                 for (number, name) in numbers.iteritems()
134                         )
135                         self._report_new_message(numbersDisplay)
136                 except Exception, e:
137                         self._report_new_message(str(e))
138
139         def do_get_callback_number(self, args):
140                 if args:
141                         self._report_new_message("No arguments supported")
142                         return
143
144                 try:
145                         number = self._conn.session.backend.get_callback_number()
146                         self._report_new_message(number)
147                 except Exception, e:
148                         self._report_new_message(str(e))
149
150         def do_call(self, args):
151                 if len(args) != 1:
152                         self._report_new_message("Must specify the phone number and only the phone nunber")
153                         return
154
155                 try:
156                         number = args[0]
157                         self._conn.session.backend.call(number)
158                 except Exception, e:
159                         self._report_new_message(str(e))
160
161         def do_send_sms(self, args):
162                 if 1 < len(args):
163                         self._report_new_message("Must specify the phone number and then message")
164                         return
165
166                 try:
167                         number = args[0]
168                         message = " ".join(args[1:])
169                         self._conn.session.backend.send_sms(number, message)
170                 except Exception, e:
171                         self._report_new_message(str(e))