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