2009-12-01 00:20:06 +03:00
#
# Copyright (C) 2009 Red Hat, Inc.
# Copyright (C) 2009 Cole Robinson <crobinso@redhat.com>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
# MA 02110-1301 USA.
#
import gobject
2009-12-01 00:16:43 +03:00
import logging
import virtinst
2010-02-11 20:32:00 +03:00
from virtManager import util
2009-12-11 04:04:26 +03:00
MEDIA_FLOPPY = " floppy "
MEDIA_CDROM = " cdrom "
2009-12-01 00:16:43 +03:00
MEDIA_TIMEOUT = 3
2009-12-01 00:20:06 +03:00
class vmmMediaDevice ( gobject . GObject ) :
2009-11-30 18:50:04 +03:00
__gsignals__ = {
" media-added " : ( gobject . SIGNAL_RUN_FIRST , gobject . TYPE_NONE ,
[ ] ) ,
" media-removed " : ( gobject . SIGNAL_RUN_FIRST ,
gobject . TYPE_NONE , [ ] ) ,
}
2009-12-01 00:16:43 +03:00
@staticmethod
def mediadev_from_nodedev ( conn , nodedev ) :
if nodedev . device_type != " storage " :
return None
2009-12-11 04:04:26 +03:00
if nodedev . drive_type not in [ MEDIA_CDROM , MEDIA_FLOPPY ] :
2009-12-01 00:16:43 +03:00
return None
2009-12-11 04:04:26 +03:00
drvtype = nodedev . drive_type
2009-12-01 00:16:43 +03:00
path = nodedev . block
key = nodedev . name
has_media = nodedev . media_available
2009-12-02 00:33:58 +03:00
media_label = nodedev . media_label
2009-12-01 00:16:43 +03:00
media_key = None
nodedev_obj = conn . vmm . nodeDeviceLookupByName ( key )
obj = vmmMediaDevice ( path , key , has_media , media_label , media_key ,
2009-12-11 04:04:26 +03:00
nodedev_obj , drvtype )
2009-12-01 00:16:43 +03:00
obj . enable_poll_for_media ( )
return obj
def __init__ ( self , path , key , has_media , media_label , media_key ,
2009-12-11 04:04:26 +03:00
nodedev_obj = None , media_type = MEDIA_CDROM ) :
2010-11-30 22:40:49 +03:00
gobject . GObject . __init__ ( self )
2009-12-01 00:20:06 +03:00
self . path = path
self . key = key
2009-12-01 00:16:43 +03:00
self . _has_media = has_media
2009-12-01 00:20:06 +03:00
self . media_label = media_label
2009-12-01 00:22:20 +03:00
self . media_key = media_key
2009-12-11 04:04:26 +03:00
self . media_type = media_type
2009-12-01 00:20:06 +03:00
2009-12-01 00:16:43 +03:00
self . nodedev_obj = nodedev_obj
self . poll_signal = None
2009-12-01 00:20:06 +03:00
def get_path ( self ) :
return self . path
def get_key ( self ) :
return self . key
2009-12-11 04:04:26 +03:00
def get_media_type ( self ) :
return self . media_type
2009-12-01 00:20:06 +03:00
def has_media ( self ) :
2009-12-01 00:16:43 +03:00
return self . _has_media
2009-12-01 00:20:06 +03:00
def get_media_label ( self ) :
return self . media_label
2009-12-01 00:22:20 +03:00
def get_media_key ( self ) :
return self . media_key
2009-12-01 00:20:06 +03:00
2009-12-01 00:16:43 +03:00
def set_media ( self , has_media , media_label , media_key ) :
self . _has_media = has_media
2009-12-01 00:20:06 +03:00
self . media_label = media_label
2009-12-01 00:22:20 +03:00
self . media_key = media_key
def clear_media ( self ) :
2009-12-01 00:16:43 +03:00
self . set_media ( None , None , None )
2009-12-01 00:20:06 +03:00
def pretty_label ( self ) :
media_label = self . get_media_label ( )
2009-12-01 00:16:43 +03:00
has_media = self . has_media ( )
if not has_media :
2010-02-12 21:52:33 +03:00
media_label = _ ( " No media detected " )
2009-12-02 00:33:58 +03:00
elif not media_label :
2009-12-01 00:16:43 +03:00
media_label = _ ( " Media Unknown " )
2009-12-01 00:20:06 +03:00
return " %s ( %s ) " % ( media_label , self . get_path ( ) )
2009-11-30 18:50:04 +03:00
############################
# HAL media signal helpers #
############################
def set_hal_media_signals ( self , halhelper ) :
halhelper . connect ( " optical-media-added " , self . hal_media_added )
halhelper . connect ( " device-removed " , self . hal_media_removed )
def hal_media_added ( self , ignore , devpath , media_label , media_key ) :
if devpath != self . get_path ( ) :
return
2009-12-01 00:16:43 +03:00
self . set_media ( True , media_label , media_key )
2009-11-30 18:50:04 +03:00
self . emit ( " media-added " )
def hal_media_removed ( self , ignore , media_hal_path ) :
if media_hal_path != self . get_media_key ( ) :
return
self . clear_media ( )
self . emit ( " media-removed " )
2009-12-01 00:16:43 +03:00
#########################################
# Nodedev API polling for media updates #
#########################################
def enable_poll_for_media ( self ) :
if self . poll_signal :
return
2010-02-11 20:32:00 +03:00
self . poll_signal = util . safe_timeout_add ( MEDIA_TIMEOUT * 1000 ,
self . _poll_for_media )
2009-12-01 00:16:43 +03:00
def disable_poll_for_media ( self ) :
self . poll_signal = None
def _poll_for_media ( self ) :
if not self . poll_signal :
return False
if not self . nodedev_obj :
return False
try :
xml = self . nodedev_obj . XMLDesc ( 0 )
except :
# Assume the device was removed
return False
try :
vobj = virtinst . NodeDeviceParser . parse ( xml )
has_media = vobj . media_available
except :
logging . exception ( " Node device CDROM polling failed " )
return False
if has_media != self . has_media ( ) :
self . set_media ( has_media , None , None )
if has_media :
self . emit ( " media-added " )
else :
self . emit ( " media-removed " )
return True
2009-12-01 00:20:06 +03:00
gobject . type_register ( vmmMediaDevice )