Package flumotion :: Package component :: Package base :: Module feedersnode
[hide private]

Source Code for Module flumotion.component.base.feedersnode

  1  # -*- Mode: Python; test-case-name: flumotion.test.test_feedcomponent010 -*- 
  2  # vi:si:et:sw=4:sts=4:ts=4 
  3   
  4  # Flumotion - a streaming media server 
  5  # Copyright (C) 2004,2005,2006,2007,2008,2009 Fluendo, S.L. 
  6  # Copyright (C) 2010,2011 Flumotion Services, S.A. 
  7  # All rights reserved. 
  8  # 
  9  # This file may be distributed and/or modified under the terms of 
 10  # the GNU Lesser General Public License version 2.1 as published by 
 11  # the Free Software Foundation. 
 12  # This file is distributed without any warranty; without even the implied 
 13  # warranty of merchantability or fitness for a particular purpose. 
 14  # See "LICENSE.LGPL" in the source distribution for more information. 
 15  # 
 16  # Headers in this file shall remain intact. 
 17   
 18  """ 
 19  Feeders tab in the component UI 
 20  """ 
 21  import gettext 
 22  import os 
 23  import time 
 24   
 25  import gtk 
 26   
 27  from flumotion.common import common 
 28  from flumotion.common import format as formatting 
 29  from flumotion.common.i18n import gettexter 
 30  from flumotion.component.base.baseadminnode import BaseAdminGtkNode 
 31  from flumotion.component.base.statewatcher import StateWatcher 
 32   
 33  _ = gettext.gettext 
 34  __version__ = "$Rev$" 
 35  T_ = gettexter() 
 36   
 37   
38 -class FeedersAdminGtkNode(BaseAdminGtkNode):
39 gladeFile = os.path.join('flumotion', 'component', 'base', 'feeders.glade') 40
41 - def __init__(self, state, admin):
42 BaseAdminGtkNode.__init__(self, state, admin, title=_("Feeders")) 43 # tree model is a model of id, uiState, StateWatcher, type 44 # tree model contains feeders and their feeder clients 45 # type is a str, 'feeder' or 'client' 46 self.treemodel = None 47 self.treeview = None 48 self.selected = None 49 self.labels = {} 50 self._lastConnect = 0 51 self._lastDisconnect = 0
52
53 - def select(self, watcher):
54 if self.selected: 55 self.selected.hide() 56 if watcher: 57 self.selected = watcher 58 self.selected.show() 59 else: 60 self.selected = None
61
62 - def setFeederName(self, state, value):
63 self.labels['feeder-name'].set_markup(_('Feeder <b>%s</b>') % value)
64
65 - def _mungeClientId(self, clientId):
66 try: 67 flowName, compName, feedName = common.parseFullFeedId(clientId) 68 return common.feedId(compName, feedName) 69 except: 70 return clientId
71
72 - def setFeederClientName(self, state, value):
73 if not value: 74 self.labels['eater-name'].set_markup(_('<i>select an eater</i>')) 75 return 76 value = self._mungeClientId(value) 77 self.labels['eater-name'].set_markup(_('<b>%s</b>') 78 % (value, ))
79
80 - def setFeederClientBytesReadCurrent(self, state, value):
81 txt = value and (formatting.formatStorage(value) + _('Byte')) or '' 82 self.labels['bytes-read-current'].set_text(txt) 83 self.updateConnectionTime() 84 self.updateDisconnectionTime()
85
86 - def setFeederClientBuffersDroppedCurrent(self, state, value):
87 if value is None: 88 # no support for counting dropped buffers 89 value = _("Unknown") 90 self.labels['buffers-dropped-current'].set_text(str(value)) 91 self.updateConnectionTime() 92 self.updateDisconnectionTime()
93
94 - def setFeederClientBytesReadTotal(self, state, value):
95 txt = value and (formatting.formatStorage(value) + _('Byte')) or '' 96 self.labels['bytes-read-total'].set_text(txt)
97
98 - def setFeederClientBuffersDroppedTotal(self, state, value):
99 if value is None: 100 # no support for counting dropped buffers 101 value = _("Unknown") 102 self.labels['buffers-dropped-total'].set_text(str(value))
103
104 - def setFeederClientReconnects(self, state, value):
105 self.labels['connections-total'].set_text(str(value))
106
107 - def setFeederClientLastConnect(self, state, value):
108 if value: 109 text = formatting.formatTimeStamp(time.localtime(value)) 110 self.labels['connected-since'].set_text(text) 111 self._lastConnect = value 112 self.updateConnectionTime()
113
114 - def setFeederClientLastDisconnect(self, state, value):
115 if value: 116 text = formatting.formatTimeStamp(time.localtime(value)) 117 self.labels['disconnected-since'].set_text(text) 118 self._lastDisconnect = value 119 self.updateDisconnectionTime()
120
121 - def setFeederClientLastActivity(self, state, value):
122 if value: 123 text = formatting.formatTimeStamp(time.localtime(value)) 124 self.labels['last-activity'].set_text(text)
125
126 - def setFeederClientFD(self, state, value):
127 if value == None: 128 # disconnected 129 self._table_connected.hide() 130 self._table_disconnected.show() 131 else: 132 self._table_disconnected.hide() 133 self._table_connected.show()
134 135 # FIXME: add a timeout to update this ? 136
137 - def updateConnectionTime(self):
138 if self._lastConnect: 139 text = formatting.formatTime(time.time() - self._lastConnect) 140 self.labels['connection-time'].set_text(text)
141 142 # FIXME: add a timeout to update this ? 143
144 - def updateDisconnectionTime(self):
145 if self._lastDisconnect: 146 text = formatting.formatTime(time.time() - self._lastDisconnect) 147 self.labels['disconnection-time'].set_text(text)
148
149 - def addFeeder(self, uiState, state):
150 """ 151 @param uiState: the component's uiState 152 @param state: the feeder's uiState 153 """ 154 feederName = state.get('feederName') 155 i = self.treemodel.append(None) 156 self.treemodel.set(i, 0, feederName, 1, state) 157 w = StateWatcher(state, 158 {'feederName': self.setFeederName}, 159 {'clients': self.addFeederClient}, 160 {'clients': self.removeFeederClient}) 161 self.treemodel.set(i, 2, w, 3, 'feeder') 162 self.treeview.expand_all()
163 164 # FIXME: this docstring is confusing 165
166 - def addFeederClient(self, feederState, state):
167 """ 168 @param feederState: the component's uiState 169 @param state: the feeder client's uiState 170 """ 171 172 printableClientId = self._mungeClientId(state.get('client-id')) 173 for row in self.treemodel: 174 if self.treemodel.get_value(row.iter, 1) == feederState: 175 break 176 i = self.treemodel.append(row.iter) 177 self.treemodel.set(i, 0, printableClientId, 1, state) 178 w = StateWatcher(state, 179 { 180 'client-id': self.setFeederClientName, 181 'bytes-read-current': self.setFeederClientBytesReadCurrent, 182 'buffers-dropped-current': 183 self.setFeederClientBuffersDroppedCurrent, 184 'bytes-read-total': self.setFeederClientBytesReadTotal, 185 'buffers-dropped-total': self.setFeederClientBuffersDroppedTotal, 186 'reconnects': self.setFeederClientReconnects, 187 'last-connect': self.setFeederClientLastConnect, 188 'last-disconnect': self.setFeederClientLastDisconnect, 189 'last-activity': self.setFeederClientLastActivity, 190 'fd': self.setFeederClientFD, 191 }, {}, {}) 192 self.treemodel.set(i, 2, w, 3, 'client') 193 self.treeview.expand_all()
194
195 - def removeFeederClient(self, feederState, state):
196 for row in self.treemodel: 197 if self.treemodel.get_value(row.iter, 1) == feederState: 198 break 199 for row in row.iterchildren(): 200 if self.treemodel.get_value(row.iter, 1) == state: 201 break 202 state, watcher = self.treemodel.get(row.iter, 1, 2) 203 if watcher == self.selected: 204 self.select(None) 205 watcher.unwatch() 206 self.treemodel.remove(row.iter)
207
208 - def setUIState(self, state):
209 # will only be called when we have a widget tree 210 BaseAdminGtkNode.setUIState(self, state) 211 self.widget.show_all() 212 for feeder in state.get('feeders'): 213 self.addFeeder(state, feeder) 214 sel = self.treeview.get_selection() 215 if sel is not None: 216 sel.select_iter(self.treemodel.get_iter_first())
217
218 - def haveWidgetTree(self):
219 self.labels = {} 220 self.widget = self.wtree.get_widget('feeders-widget') 221 self.treeview = self.wtree.get_widget('treeview-feeders') 222 self.treemodel = gtk.TreeStore(str, object, object, str) 223 self.treeview.set_model(self.treemodel) 224 col = gtk.TreeViewColumn('Feeder', gtk.CellRendererText(), 225 text=0) 226 self.treeview.append_column(col) 227 sel = self.treeview.get_selection() 228 sel.set_mode(gtk.SELECTION_SINGLE) 229 230 def sel_changed(sel): 231 model, i = sel.get_selected() 232 if not i: 233 sel.select_iter(model.get_iter_first()) 234 return 235 self.select(i and model.get_value(i, 2)) 236 # don't show the feeder client stuff for a feeder 237 if model.get_value(i, 3) == 'feeder': 238 self.setFeederClientName(model.get_value(i, 1), None) 239 self._table_feedclient.hide() 240 else: 241 parent = model.get_value(model.iter_parent(i), 1) 242 self.setFeederName(parent, parent.get('feederName')) 243 self._table_feedclient.show()
244 245 sel.connect('changed', sel_changed) 246 247 def set_label(name): 248 self.labels[name] = self.wtree.get_widget('label-' + name) 249 # zeroes out all value labels 250 self.labels[name].set_text('')
251 252 for name in ('feeder-name', 'eater-name', 253 'bytes-read-current', 'buffers-dropped-current', 254 'connected-since', 'connection-time', 255 'disconnected-since', 'disconnection-time', 256 'bytes-read-total', 'buffers-dropped-total', 257 'connections-total', 'last-activity'): 258 set_label(name) 259 260 self._table_connected = self.wtree.get_widget( 261 'table-current-connected') 262 self._table_disconnected = self.wtree.get_widget( 263 'table-current-disconnected') 264 self._table_feedclient = self.wtree.get_widget('table-feedclient') 265 self._table_connected.hide() 266 self._table_disconnected.hide() 267 self._table_feedclient.hide() 268 self.wtree.get_widget('box-right').hide() 269 270 return self.widget 271