1 from __future__ import with_statement
11 import util.go_utils as gobject_utils
12 import util.misc as misc_utils
15 _moduleLogger = logging.getLogger(__name__)
18 class DebugLogChannel(tp.ChannelTypeFileTransfer):
20 def __init__(self, connection, manager, props, contactHandle):
21 self.__manager = manager
23 self.__otherHandle = contactHandle
25 self.__socketName = ""
26 self.__delayWrite = gobject_utils.Timeout(self._on_write)
28 tp.ChannelTypeFileTransfer.__init__(self, connection, manager, props)
30 dbus_interface = telepathy.CHANNEL_TYPE_FILE_TRANSFER
31 self._implement_property_get(
34 'State': self.get_state,
35 "ContentType": self.get_content_type,
36 "Filename": self.get_filename,
37 "Size": self.get_state,
38 "Description": self.get_description,
39 "AvailableSocketTypes": self.get_available_socket_types,
40 "TransferredBytes": self.get_transferred_bytes,
41 "InitialOffset": self.get_initial_offset,
45 # grab a snapshot of the log so that we are always in a consistent
47 with open(constants._user_logpath_, "r") as f:
48 logLines = f.xreadlines()
49 self._log = "".join(logLines)
50 self._transferredBytes = 0
52 self._state = telepathy.constants.FILE_TRANSFER_STATE_PENDING
53 self.FileTransferStateChanged(
55 telepathy.constants.FILE_TRANSFER_STATE_CHANGE_REASON_NONE,
61 def get_content_type(self):
62 return "application/octet-stream"
64 def get_filename(self):
65 return "%s.log" % constants._telepathy_implementation_name_
70 def get_description(self):
71 return "Debug log for The One Ring"
73 def get_available_socket_types(self):
75 telepathy.constants.SOCKET_ADDRESS_TYPE_UNIX: [
76 telepathy.constants.SOCKET_ACCESS_CONTROL_LOCALHOST,
77 telepathy.constants.SOCKET_ACCESS_CONTROL_CREDENTIALS,
81 def get_transferred_bytes(self):
82 return self._transferredBytes
84 def get_initial_offset(self):
87 @misc_utils.log_exception(_moduleLogger)
88 def AcceptFile(self, addressType, accessControl, accessControlParam, offset):
90 _moduleLogger.info("%r %r %r %r" % (addressType, accessControl, accessControlParam, offset))
91 assert not self.__socketName, self.__socketName
92 self.__socketName = os.tempnam()
94 assert self.__socket is None, self.__socket
95 self.__socket = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM)
96 self.__socket.bind(self.__socketName)
98 self._state = telepathy.constants.FILE_TRANSFER_STATE_ACCEPTED
99 self.FileTransferStateChanged(
101 telepathy.constants.FILE_TRANSFER_STATE_CHANGE_REASON_REQUESTED,
104 self.__delayWrite.start(seconds=0)
106 return self.__socketName
108 @misc_utils.log_exception(_moduleLogger)
109 def ProvideFile(self, addressType, accessControl, accessControlParam):
110 raise telepathy.errors.NotImplemented("Cannot send outbound files")
112 @misc_utils.log_exception(_moduleLogger)
117 _moduleLogger.debug("Closing log")
118 if self.__socket is not None:
119 self.__socket.close()
120 tp.ChannelTypeFileTransfer.Close(self)
121 self.remove_from_connection()
123 @misc_utils.log_exception(_moduleLogger)
125 self.__socket.listen(1)
126 conn, addr = self.__socket.accept()
128 self.InitialOffsetDefined(0)
129 self._state = telepathy.constants.FILE_TRANSFER_STATE_OPEN
130 self.FileTransferStateChanged(
132 telepathy.constants.FILE_TRANSFER_STATE_CHANGE_REASON_NONE,
137 self._transferredBytes = len(self._log)
138 self.TransferredBytesChanged(self._transferredBytes)
140 self._state = telepathy.constants.FILE_TRANSFER_STATE_COMPLETED
141 self.FileTransferStateChanged(
143 telepathy.constants.FILE_TRANSFER_STATE_CHANGE_REASON_NONE,