1 from __future__ import with_statement
10 import util.misc as misc_utils
13 _moduleLogger = logging.getLogger(__name__)
16 class DebugLogChannel(tp.ChannelTypeFileTransfer):
18 def __init__(self, connection, manager, props, contactHandle):
19 self.__manager = manager
21 self.__otherHandle = contactHandle
23 tp.ChannelTypeFileTransfer.__init__(self, connection, manager, props)
25 dbus_interface = telepathy.CHANNEL_TYPE_FILE_TRANSFER
26 self._implement_property_get(
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,
40 # grab a snapshot of the log so that we are always in a consistent
42 with open(constants._user_logpath_, "r") as f:
43 logLines = f.xreadlines()
44 self._log = "".join(logLines)
45 self._transferredBytes = 0
47 self._state = telepathy.constants.FILE_TRANSFER_STATE_PENDING
48 self.FileTransferStateChanged(
50 telepathy.constants.FILE_TRANSFER_STATE_CHANGE_REASON_NONE,
56 def get_content_type(self):
57 return "application/octet-stream"
59 def get_filename(self):
60 return "%s.log" % constants._telepathy_implementation_name_
65 def get_description(self):
66 return "Debug log for The One Ring"
68 def get_available_socket_types(self):
70 telepathy.constants.SOCKET_ADDRESS_TYPE_UNIX: [
71 telepathy.constants.SOCKET_ACCESS_CONTROL_LOCALHOST,
72 telepathy.constants.SOCKET_ACCESS_CONTROL_CREDENTIALS,
76 def get_transferred_bytes(self):
77 return self._transferredBytes
79 def get_initial_offset(self):
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(
89 telepathy.constants.FILE_TRANSFER_STATE_CHANGE_REASON_REQUESTED,
92 self._state = telepathy.constants.FILE_TRANSFER_STATE_OPEN
93 self.FileTransferStateChanged(
95 telepathy.constants.FILE_TRANSFER_STATE_CHANGE_REASON_NONE,
98 sockittome = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
99 sockittome.connect(accessControlParam)
101 sockittome.send(self._log)
105 self._transferredBytes = len(self._log)
106 self.TransferredBytesChanged(self._transferredBytes)
108 self._state = telepathy.constants.FILE_TRANSFER_STATE_COMPLETED
109 self.FileTransferStateChanged(
111 telepathy.constants.FILE_TRANSFER_STATE_CHANGE_REASON_NONE,
114 @misc_utils.log_exception(_moduleLogger)
115 def ProvideFile(self, addressType, accessControl, accessControlParam):
116 raise telepathy.errors.NotImplemented("Cannot send outbound files")
118 @misc_utils.log_exception(_moduleLogger)
123 _moduleLogger.debug("Closing log")
124 tp.ChannelTypeFileTransfer.Close(self)
125 self.remove_from_connection()