82b71303c2be36cbc1d704ef8615f501fdbc6016
[theonering] / src / channel / debug_log.py
1 from __future__ import with_statement
2
3 import socket
4 import logging
5
6 import telepathy
7
8 import constants
9 import tp
10 import util.misc as misc_utils
11
12
13 _moduleLogger = logging.getLogger("channel.debug_log")
14
15
16 class DebugLogChannel(tp.ChannelTypeFileTransfer):
17
18         def __init__(self, connection, manager, props, contactHandle):
19                 self.__manager = manager
20                 self.__props = props
21                 self.__otherHandle = contactHandle
22
23                 tp.ChannelTypeFileTransfer.__init__(self, connection, manager, props)
24
25                 dbus_interface = telepathy.CHANNEL_TYPE_FILE_TRANSFER
26                 self._implement_property_get(
27                         dbus_interface,
28                         {
29                                 'State': self.get_state,
30                                 "ContentType": self.get_content_type,
31                                 "Filename": self.get_filename,
32                                 "Size": self.get_state,
33                                 "Description": self.get_description,
34                                 "AvailableSocketTypes": self.get_available_socket_types,
35                                 "TransferredBytes": self.get_transferred_bytes,
36                                 "InitialOffset": self.get_initial_offset,
37                         },
38                 )
39
40                 # grab a snapshot of the log so that we are always in a consistent
41                 # state between calls
42                 with open(constants._user_logpath_, "r") as f:
43                         logLines = f.xreadlines()
44                         self._log = "".join(logLines)
45                 self._transferredBytes = 0
46
47                 self._state = telepathy.constants.FILE_TRANSFER_STATE_PENDING
48                 self.FileTransferStateChanged(
49                         self._state,
50                         telepathy.constants.FILE_TRANSFER_STATE_CHANGE_REASON_NONE,
51                 )
52
53         def get_state(self):
54                 return self._state
55
56         def get_content_type(self):
57                 return "application/octet-stream"
58
59         def get_filename(self):
60                 return "%s.log" % constants._telepathy_implementation_name_
61
62         def get_size(self):
63                 return len(self._log)
64
65         def get_description(self):
66                 return "Debug log for The One Ring"
67
68         def get_available_socket_types(self):
69                 return {
70                         telepathy.constants.SOCKET_ADDRESS_TYPE_UNIX: [
71                                 telepathy.constants.SOCKET_ACCESS_CONTROL_LOCALHOST,
72                                 telepathy.constants.SOCKET_ACCESS_CONTROL_CREDENTIALS,
73                         ],
74                 }
75
76         def get_transferred_bytes(self):
77                 return self._transferredBytes
78
79         def get_initial_offset(self):
80                 return 0
81
82         @misc_utils.log_exception(_moduleLogger)
83         def AcceptFile(self, addressType, accessControl, accessControlParam, offset):
84                 _moduleLogger.info("%r %r %r %r" % (addressType, accessControl, accessControlParam, offset))
85                 self.InitialOffsetDefined(0)
86                 self._state = telepathy.constants.FILE_TRANSFER_STATE_ACCEPTED
87                 self.FileTransferStateChanged(
88                         self._state,
89                         telepathy.constants.FILE_TRANSFER_STATE_CHANGE_REASON_REQUESTED,
90                 )
91
92                 self._state = telepathy.constants.FILE_TRANSFER_STATE_OPEN
93                 self.FileTransferStateChanged(
94                         self._state,
95                         telepathy.constants.FILE_TRANSFER_STATE_CHANGE_REASON_NONE,
96                 )
97
98                 sockittome = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
99                 sockittome.connect(accessControlParam)
100                 try:
101                         sockittome.send(self._log)
102                 finally:
103                         sockittome.close()
104
105                 self._transferredBytes = len(self._log)
106                 self.TransferredBytesChanged(self._transferredBytes)
107
108                 self._state = telepathy.constants.FILE_TRANSFER_STATE_COMPLETED
109                 self.FileTransferStateChanged(
110                         self._state,
111                         telepathy.constants.FILE_TRANSFER_STATE_CHANGE_REASON_NONE,
112                 )
113
114         @misc_utils.log_exception(_moduleLogger)
115         def ProvideFile(self, addressType, accessControl, accessControlParam):
116                 raise telepathy.errors.NotImplemented("Cannot send outbound files")
117
118         @misc_utils.log_exception(_moduleLogger)
119         def Close(self):
120                 self.close()
121
122         def close(self):
123                 _moduleLogger.debug("Closing log")
124                 tp.ChannelTypeFileTransfer.Close(self)
125                 self.remove_from_connection()