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

Source Code for Module flumotion.component.base.componentnode

  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  Component tab in the component UI 
 20  """ 
 21   
 22  import gettext 
 23  import os 
 24  import time 
 25   
 26  import gtk 
 27   
 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.extern.log.log import getDebug 
 32  from flumotion.common.planet import AdminFlowState 
 33   
 34   
 35  _ = gettext.gettext 
 36  __version__ = "$Rev$" 
 37  T_ = gettexter() 
 38   
 39   
40 -class ComponentAdminGtkNode(BaseAdminGtkNode):
41 gladeFile = os.path.join('flumotion', 'component', 'base', 42 'component.glade') 43
44 - def __init__(self, state, admin):
45 BaseAdminGtkNode.__init__(self, state, admin, title=_("Component")) 46 47 self._startTime = None 48 self._debugging = None 49 self._initialFluMask = '' 50 self._initialGstMask = ''
51
52 - def setDebugEnabled(self, enabled):
53 BaseAdminGtkNode.setDebugEnabled(self, enabled) 54 if self._debugging: 55 self._debugging.set_property('visible', enabled) 56 57 self._initialFluMask = getDebug() 58 self._initialGstMask = os.environ.get('GST_DEBUG', '')
59
60 - def haveWidgetTree(self):
61 self.widget = self.wtree.get_widget('main-vbox') 62 assert self.widget, "No component-widget in %s" % self.gladeFile 63 self.gst_mask = self.wtree.get_widget('gst_mask') 64 self.gst_label = self.wtree.get_widget('gst_label') 65 self.flu_mask = self.wtree.get_widget('flu_mask') 66 self.gst_profile = self.wtree.get_widget('gst_profile') 67 self.gst_profile.connect('changed', self._on_gst_profile_changed) 68 self.flu_profile = self.wtree.get_widget('flu_profile') 69 self.flu_profile.connect('changed', self._on_flu_profile_changed) 70 self.gst_button = self.wtree.get_widget('gst_button') 71 self.gst_button.connect('clicked', self._on_gst_button_clicked) 72 self.gst_mask.connect('activate', self._on_gst_button_clicked) 73 self.flu_button = self.wtree.get_widget('flu_button') 74 self.flu_button.connect('clicked', self._on_flu_button_clicked) 75 self.flu_mask.connect('activate', self._on_flu_button_clicked) 76 77 # pid 78 l = self.wtree.get_widget('label-pid') 79 pid = self.state.get('pid') 80 l.set_text(str(pid)) 81 82 # Find the labels which we'll update when we get uiState updates. 83 self._label_start_time = self.wtree.get_widget('label-since') 84 self._label_uptime = self.wtree.get_widget('label-uptime') 85 self._label_cpu = self.wtree.get_widget('label-cpu') 86 self._label_vsize = self.wtree.get_widget('label-vsize') 87 self._label_component_type = self.wtree.get_widget( 88 'label-component-type') 89 90 self._label_resets = self.wtree.get_widget('label-resets') 91 self._label_resets_count = self.wtree.get_widget('label-resets-count') 92 self.widget.show() 93 94 self._prepareDebugging() 95 96 self._debugging = self.wtree.get_widget('debugging') 97 if self._debugEnabled: 98 self._debugging.show() 99 100 componentType = self.state.get('config')['type'] 101 self._label_component_type.set_text(componentType) 102 103 return self.widget
104
105 - def _validateMask(self, mask):
106 if ':' not in mask or mask.count(':') != 1: 107 return False 108 name, level = mask.split(':', 1) 109 try: 110 int(level) 111 except ValueError: 112 return False 113 return True
114
115 - def _on_gst_profile_changed(self, combo):
116 profile = combo.get_selected() 117 if profile is not None: 118 gtk.Entry.set_text(self.gst_mask, profile) 119 self.gst_mask.set_sensitive(profile is None)
120
121 - def _on_flu_profile_changed(self, combo):
122 profile = combo.get_selected() 123 if profile is not None: 124 gtk.Entry.set_text(self.flu_mask, profile) 125 self.flu_mask.set_sensitive(profile is None)
126
127 - def _on_flu_button_clicked(self, widget):
128 debug = self.flu_mask.get_text() 129 if not self._debugEnabled or not self._validateMask(debug): 130 return 131 self.info('setting flu debug to %s for %s' % ( 132 debug, self.state.get('name'))) 133 self.admin.componentCallRemote(self.state, 'setFluDebug', debug)
134
135 - def _on_gst_button_clicked(self, widget):
136 debug = self.gst_mask.get_text() 137 if not self._debugEnabled or not self._validateMask(debug): 138 return 139 self.info('setting gst debug to %s for %s' % ( 140 debug, self.state.get('name'))) 141 self.admin.componentCallRemote(self.state, 'setGstDebug', debug)
142
143 - def _prepareDebugging(self):
144 debugEnabled = self._debugEnabled 145 self._debugEnabled = False 146 default = [(_('Nothing'), '*:0'), 147 (_('Everything'), '*:4'), 148 (_('Custom'), None)] 149 self.flu_profile.prefill(default) 150 151 if isinstance(self.state.get('parent'), AdminFlowState): 152 self.gst_profile.prefill(default) 153 else: 154 self.gst_profile.hide() 155 self.gst_label.hide() 156 self.gst_mask.hide() 157 self.gst_button.hide() 158 159 self._debugEnabled = debugEnabled
160
161 - def _setStartTime(self, value):
162 self._label_start_time.set_text( 163 time.strftime("%c", time.localtime(value))) 164 self._label_uptime.set_text(formatting.formatTime(0)) 165 166 self._startTime = value
167
168 - def _setCurrentTime(self, value):
169 if self._startTime is not None: 170 runtime = value - self._startTime 171 172 self._label_uptime.set_text(formatting.formatTime(runtime)) 173 else: 174 self._label_uptime.set_text(_("not available"))
175
176 - def _setGstDebug(self, value):
177 self.gst_mask.set_text(value) 178 try: 179 self.gst_profile.select_item_by_data(value) 180 except KeyError: 181 self.gst_profile.select_item_by_data(None)
182
183 - def _setFluDebug(self, value):
184 self.flu_mask.set_text(value) 185 try: 186 self.flu_profile.select_item_by_data(value) 187 except KeyError: 188 self.flu_profile.select_item_by_data(None)
189
190 - def _updateCPU(self, cpu):
191 # given float for cpu, update the label 192 self._label_cpu.set_text('%.2f %%' % (cpu * 100.0))
193
194 - def _updateVSize(self, vsize):
195 # given int for vsize in bytes, update the label 196 if not vsize: 197 self._label_vsize.set_text(_('Unknown')) 198 else: 199 self._label_vsize.set_text('%sB' % formatting.formatStorage(vsize))
200
201 - def _updateResets(self, count):
202 if not self._label_resets.get_property('visible'): 203 self._label_resets.show() 204 self._label_resets_count.show() 205 self._label_resets_count.set_text('%d restarts' % count)
206
207 - def setUIState(self, uiState):
208 BaseAdminGtkNode.setUIState(self, uiState) 209 210 # Ick; we don't get these otherwise. 211 for key in uiState.keys(): 212 val = uiState.get(key) 213 if val is not None: 214 self.stateSet(uiState, key, uiState.get(key))
215 216 # IStateListener Interface 217
218 - def stateSet(self, object, key, value):
219 if key == 'cpu-percent': 220 self._updateCPU(value) 221 elif key == 'virtual-size': 222 self._updateVSize(value) 223 elif key == 'start-time': 224 self._setStartTime(value) 225 elif key == 'current-time': 226 self._setCurrentTime(value) 227 elif key == 'reset-count': 228 self._updateResets(value) 229 elif key == 'flu-debug': 230 self._setFluDebug(value) 231 elif key == 'gst-debug': 232 self._setGstDebug(value)
233
234 - def stateAppend(self, object, key, value):
235 pass
236
237 - def stateRemove(self, object, key, value):
238 pass
239