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_size,
38 "Description": self.get_description,
39 "AvailableSocketTypes": self.get_available_socket_types,
40 "TransferredBytes": self.get_transferred_bytes,
41 "InitialOffset": self.get_initial_offset,
44 self._add_immutables({
45 'Filename': dbus_interface,
46 'Size': dbus_interface,
49 # grab a snapshot of the log so that we are always in a consistent
51 with open(constants._user_logpath_, "r") as f:
52 logLines = f.xreadlines()
53 self._log = "".join(logLines)
54 self._transferredBytes = 0
58 telepathy.constants.FILE_TRANSFER_STATE_PENDING,
59 telepathy.constants.FILE_TRANSFER_STATE_CHANGE_REASON_REQUESTED,
65 def set_state(self, state, reason):
66 if self._state == state:
70 self.FileTransferStateChanged(
75 def get_content_type(self):
76 return "application/octet-stream"
78 def get_filename(self):
79 return "%s.log" % constants._telepathy_implementation_name_
84 def get_description(self):
85 return "Debug log for The One Ring"
87 def get_available_socket_types(self):
89 telepathy.constants.SOCKET_ADDRESS_TYPE_UNIX: [
90 telepathy.constants.SOCKET_ACCESS_CONTROL_LOCALHOST,
91 telepathy.constants.SOCKET_ACCESS_CONTROL_CREDENTIALS,
95 def get_transferred_bytes(self):
96 return self._transferredBytes
98 def get_initial_offset(self):
101 @misc_utils.log_exception(_moduleLogger)
102 def AcceptFile(self, addressType, accessControl, accessControlParam, offset):
104 _moduleLogger.info("%r %r %r %r" % (addressType, accessControl, accessControlParam, offset))
105 assert not self.__socketName, self.__socketName
106 self.__socketName = os.tempnam()
108 assert self.__socket is None, self.__socket
109 self.__socket = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM)
110 self.__socket.bind(self.__socketName)
112 self._state = telepathy.constants.FILE_TRANSFER_STATE_ACCEPTED
113 self.FileTransferStateChanged(
115 telepathy.constants.FILE_TRANSFER_STATE_CHANGE_REASON_REQUESTED,
118 self.__delayWrite.start(seconds=0)
120 return self.__socketName
122 @misc_utils.log_exception(_moduleLogger)
123 def ProvideFile(self, addressType, accessControl, accessControlParam):
124 raise telepathy.errors.NotImplemented("Cannot send outbound files")
126 @misc_utils.log_exception(_moduleLogger)
131 _moduleLogger.debug("Closing log")
132 if self._state != telepathy.FILE_TRANSFER_STATE_COMPLETED:
134 telepathy.FILE_TRANSFER_STATE_CANCELLED,
135 telepathy.FILE_TRANSFER_STATE_CHANGE_REASON_LOCAL_STOPPED
138 if self.__socket is not None:
139 self.__socket.close()
141 tp.ChannelTypeFileTransfer.Close(self)
142 self.remove_from_connection()
144 @misc_utils.log_exception(_moduleLogger)
146 self.__socket.listen(1)
147 conn, addr = self.__socket.accept()
149 self.InitialOffsetDefined(0)
150 self._state = telepathy.constants.FILE_TRANSFER_STATE_OPEN
151 self.FileTransferStateChanged(
153 telepathy.constants.FILE_TRANSFER_STATE_CHANGE_REASON_NONE,
158 self._transferredBytes = len(self._log)
159 self.TransferredBytesChanged(self._transferredBytes)
161 self._state = telepathy.constants.FILE_TRANSFER_STATE_COMPLETED
162 self.FileTransferStateChanged(
164 telepathy.constants.FILE_TRANSFER_STATE_CHANGE_REASON_NONE,