Index: /trunk/libfreebob/src/bebob/bebob_functionblock.h =================================================================== --- /trunk/libfreebob/src/bebob/bebob_functionblock.h (revision 341) +++ /trunk/libfreebob/src/bebob/bebob_functionblock.h (revision 376) @@ -62,4 +62,8 @@ virtual const char* getName() = 0; + bool serialize( Glib::ustring basePath, Util::IOSerialize& ser ) const; + static FunctionBlock* deserialize( Glib::ustring basePath, + Util::IODeserialize& deser, + AvDevice& avDevice ); protected: bool discoverPlugs( AvPlug::EAvPlugDirection plugDirection, Index: /trunk/libfreebob/src/bebob/bebob_avdevice.cpp =================================================================== --- /trunk/libfreebob/src/bebob/bebob_avdevice.cpp (revision 375) +++ /trunk/libfreebob/src/bebob/bebob_avdevice.cpp (revision 376) @@ -552,5 +552,6 @@ switch( subunit_type ) { case AVCCommand::eST_Audio: - subunit = new AvDeviceSubunitAudio( *this, subunitId, + subunit = new AvDeviceSubunitAudio( *this, + subunitId, m_verboseLevel ); if ( !subunit ) { @@ -564,5 +565,6 @@ break; case AVCCommand::eST_Music: - subunit = new AvDeviceSubunitMusic( *this, subunitId, + subunit = new AvDeviceSubunitMusic( *this, + subunitId, m_verboseLevel ); if ( !subunit ) { @@ -1248,7 +1250,5 @@ template bool deserializeVector( Glib::ustring path, Util::IODeserialize& deser, - Ieee1394Service& ieee1394Service, - ConfigRom& configRom, - AvPlugManager& plugManager, + AvDevice& avDevice, VT& vec ) { @@ -1260,7 +1260,5 @@ T* ptr = T::deserialize( strstrm.str() + "/", deser, - ieee1394Service, - configRom, - plugManager ); + avDevice ); if ( ptr ) { vec.push_back( ptr ); @@ -1325,5 +1323,5 @@ bool result; result = deser.read( basePath + "m_verboseLevel", pDev->m_verboseLevel ); - pDev->m_pPlugManager = AvPlugManager::deserialize( basePath + "AvPlug", deser, ieee1394Service, *pDev->m_pConfigRom.get() ); + pDev->m_pPlugManager = AvPlugManager::deserialize( basePath + "AvPlug", deser, *pDev ); if ( !pDev->m_pPlugManager ) { delete pDev; @@ -1332,6 +1330,6 @@ result &= deserializeAvPlugUpdateConnections( basePath + "AvPlug", deser, pDev->m_pcrPlugs ); result &= deserializeAvPlugUpdateConnections( basePath + "AvPlug", deser, pDev->m_externalPlugs ); - result &= deserializeVector( basePath + "PlugConnnection", deser, ieee1394Service, *pDev->m_pConfigRom.get(), *pDev->m_pPlugManager, pDev->m_plugConnections ); - result &= deserializeVector( basePath + "Subunit", deser, ieee1394Service, *pDev->m_pConfigRom.get(), *pDev->m_pPlugManager, pDev->m_subunits ); + result &= deserializeVector( basePath + "PlugConnnection", deser, *pDev, pDev->m_plugConnections ); + result &= deserializeVector( basePath + "Subunit", deser, *pDev, pDev->m_subunits ); // XXX ... Index: /trunk/libfreebob/src/bebob/bebob_avplug.cpp =================================================================== --- /trunk/libfreebob/src/bebob/bebob_avplug.cpp (revision 375) +++ /trunk/libfreebob/src/bebob/bebob_avplug.cpp (revision 376) @@ -20,4 +20,5 @@ #include "bebob/bebob_avplug.h" +#include "bebob/bebob_avdevice.h" #include "configrom.h" @@ -119,5 +120,7 @@ AvPlug::~AvPlug() { - m_plugManager->remPlug( *this ); + if ( m_plugManager ) { + m_plugManager->remPlug( *this ); + } } @@ -1704,6 +1707,5 @@ AvPlug::deserialize( Glib::ustring basePath, Util::IODeserialize& deser, - Ieee1394Service& ieee1394Service, - ConfigRom& configRom, + AvDevice& avDevice, AvPlugManager& plugManager ) { @@ -1713,7 +1715,7 @@ } - pPlug->m_p1394Service = &ieee1394Service; - pPlug->m_pConfigRom = &configRom; - pPlug->m_plugManager = &plugManager; + pPlug->m_p1394Service = &avDevice.get1394Service(); + pPlug->m_pConfigRom = &avDevice.getConfigRom(); + pPlug->m_plugManager = &plugManager; bool result; result = deser.read( basePath + "m_subunitType", pPlug->m_subunitType ); @@ -2130,6 +2132,6 @@ AvPlugManager::deserialize( Glib::ustring basePath, Util::IODeserialize& deser, - Ieee1394Service& ieee1394Service, - ConfigRom& configRom ) + AvDevice& avDevice ) + { AvPlugManager* pMgr = new AvPlugManager; @@ -2144,8 +2146,9 @@ std::ostringstream strstrm; strstrm << basePath << i; + // avDevice still holds a null pointer for the plug manager + // therefore we have to *this as additional argument AvPlug* pPlug = AvPlug::deserialize( strstrm.str() + "/", deser, - ieee1394Service, - configRom, + avDevice, *pMgr ); if ( pPlug ) { @@ -2187,7 +2190,5 @@ AvPlugConnection::deserialize( Glib::ustring basePath, Util::IODeserialize& deser, - Ieee1394Service& /* ieee1394Service */, - ConfigRom& /* configRom */, - AvPlugManager& plugManager ) + AvDevice& avDevice ) { AvPlugConnection* pConnection = new AvPlugConnection; @@ -2207,6 +2208,6 @@ } - pConnection->m_srcPlug = plugManager.getPlug( iSrcPlugId ); - pConnection->m_destPlug = plugManager.getPlug( iDestPlugId ); + pConnection->m_srcPlug = avDevice.getPlugManager().getPlug( iSrcPlugId ); + pConnection->m_destPlug = avDevice.getPlugManager().getPlug( iDestPlugId ); if ( !pConnection->m_srcPlug || !pConnection->m_destPlug ) { Index: /trunk/libfreebob/src/bebob/bebob_avdevice_subunit.cpp =================================================================== --- /trunk/libfreebob/src/bebob/bebob_avdevice_subunit.cpp (revision 375) +++ /trunk/libfreebob/src/bebob/bebob_avdevice_subunit.cpp (revision 376) @@ -1,4 +1,4 @@ /* bebob_avdevice_subunit.cpp - * Copyright (C) 2005,06 by Daniel Wagner + * Copyright (C) 2005,06,07 by Daniel Wagner * * This file is part of FreeBoB. @@ -29,14 +29,14 @@ #include "libfreebobavc/avc_serialize.h" -namespace BeBoB { - -IMPL_DEBUG_MODULE( AvDeviceSubunit, AvDeviceSubunit, DEBUG_LEVEL_VERBOSE ); +#include + +IMPL_DEBUG_MODULE( BeBoB::AvDeviceSubunit, BeBoB::AvDeviceSubunit, DEBUG_LEVEL_VERBOSE ); //////////////////////////////////////////// -AvDeviceSubunit::AvDeviceSubunit( AvDevice& avDevice, - AVCCommand::ESubunitType type, - subunit_t id, - int verboseLevel ) +BeBoB::AvDeviceSubunit::AvDeviceSubunit( AvDevice& avDevice, + AVCCommand::ESubunitType type, + subunit_t id, + int verboseLevel ) : m_avDevice( &avDevice ) , m_sbType( type ) @@ -47,5 +47,9 @@ } -AvDeviceSubunit::~AvDeviceSubunit() +BeBoB::AvDeviceSubunit::AvDeviceSubunit() +{ +} + +BeBoB::AvDeviceSubunit::~AvDeviceSubunit() { for ( AvPlugVector::iterator it = m_plugs.begin(); @@ -58,5 +62,5 @@ bool -AvDeviceSubunit::discover() +BeBoB::AvDeviceSubunit::discover() { if ( !discoverPlugs() ) { @@ -69,5 +73,5 @@ bool -AvDeviceSubunit::discoverPlugs() +BeBoB::AvDeviceSubunit::discoverPlugs() { PlugInfoCmd plugInfoCmd( m_avDevice->get1394Service(), @@ -107,5 +111,5 @@ bool -AvDeviceSubunit::discoverConnections() +BeBoB::AvDeviceSubunit::discoverConnections() { for ( AvPlugVector::iterator it = m_plugs.begin(); @@ -125,6 +129,6 @@ bool -AvDeviceSubunit::discoverPlugs(AvPlug::EAvPlugDirection plugDirection, - plug_id_t plugMaxId ) +BeBoB::AvDeviceSubunit::discoverPlugs(AvPlug::EAvPlugDirection plugDirection, + plug_id_t plugMaxId ) { for ( int plugIdx = 0; @@ -158,5 +162,5 @@ bool -AvDeviceSubunit::addPlug( AvPlug& plug ) +BeBoB::AvDeviceSubunit::addPlug( AvPlug& plug ) { m_plugs.push_back( &plug ); @@ -165,6 +169,6 @@ -AvPlug* -AvDeviceSubunit::getPlug(AvPlug::EAvPlugDirection direction, plug_id_t plugId) +BeBoB::AvPlug* +BeBoB::AvDeviceSubunit::getPlug(AvPlug::EAvPlugDirection direction, plug_id_t plugId) { for ( AvPlugVector::iterator it = m_plugs.begin(); @@ -184,29 +188,71 @@ bool -AvDeviceSubunit::serialize( Glib::ustring basePath, Util::IOSerialize& ser ) const -{ - return true; -} - -AvDeviceSubunit* -AvDeviceSubunit::deserialize( Glib::ustring basePath, - Util::IODeserialize& deser, - Ieee1394Service& ieee1394Service, - ConfigRom& configRom, - AvPlugManager& plugManager ) -{ - return 0; +BeBoB::AvDeviceSubunit::serialize( Glib::ustring basePath, + Util::IOSerialize& ser ) const +{ + bool result; + + result = ser.write( basePath + "m_sbType", m_sbType ); + result &= ser.write( basePath + "m_sbId", m_sbId ); + result &= ser.write( basePath + "m_verboseLevel", m_verboseLevel ); + result &= serializeChild( basePath, ser ); + + return result; +} + +BeBoB::AvDeviceSubunit* +BeBoB::AvDeviceSubunit::deserialize( Glib::ustring basePath, + Util::IODeserialize& deser, + AvDevice& avDevice ) +{ + bool result; + AVCCommand::ESubunitType sbType; + result = deser.read( basePath + "m_sbType", sbType ); + + AvDeviceSubunit* pSubunit = 0; + switch( sbType ) { + case AVCCommand::eST_Audio: + pSubunit = new AvDeviceSubunitAudio; + break; + case AVCCommand::eST_Music: + pSubunit = new AvDeviceSubunitMusic; + break; + default: + pSubunit = 0; + } + + if ( !pSubunit ) { + return 0; + } + + pSubunit->m_avDevice = &avDevice; + pSubunit->m_sbType = sbType; + result &= deser.read( basePath + "m_sbId", pSubunit->m_sbId ); + result &= deser.read( basePath + "m_verboseLevel", pSubunit->m_verboseLevel ); + result &= pSubunit->deserializeChild( basePath, deser, avDevice ); + + if ( !result ) { + delete pSubunit; + return 0; + } + + return pSubunit; } //////////////////////////////////////////// -AvDeviceSubunitAudio::AvDeviceSubunitAudio( AvDevice& avDevice, - subunit_t id, - int verboseLevel ) +BeBoB::AvDeviceSubunitAudio::AvDeviceSubunitAudio( AvDevice& avDevice, + subunit_t id, + int verboseLevel ) : AvDeviceSubunit( avDevice, AVCCommand::eST_Audio, id, verboseLevel ) { } -AvDeviceSubunitAudio::~AvDeviceSubunitAudio() +BeBoB::AvDeviceSubunitAudio::AvDeviceSubunitAudio() + : AvDeviceSubunit() +{ +} + +BeBoB::AvDeviceSubunitAudio::~AvDeviceSubunitAudio() { for ( FunctionBlockVector::iterator it = m_functions.begin(); @@ -219,5 +265,5 @@ bool -AvDeviceSubunitAudio::discover() +BeBoB::AvDeviceSubunitAudio::discover() { if ( !AvDeviceSubunit::discover() ) { @@ -234,5 +280,5 @@ bool -AvDeviceSubunitAudio::discoverConnections() +BeBoB::AvDeviceSubunitAudio::discoverConnections() { if ( !AvDeviceSubunit::discoverConnections() ) { @@ -256,5 +302,5 @@ const char* -AvDeviceSubunitAudio::getName() +BeBoB::AvDeviceSubunitAudio::getName() { return "AudioSubunit"; @@ -262,5 +308,5 @@ bool -AvDeviceSubunitAudio::discoverFunctionBlocks() +BeBoB::AvDeviceSubunitAudio::discoverFunctionBlocks() { if ( !discoverFunctionBlocksDo( @@ -293,5 +339,5 @@ bool -AvDeviceSubunitAudio::discoverFunctionBlocksDo( +BeBoB::AvDeviceSubunitAudio::discoverFunctionBlocksDo( ExtendedSubunitInfoCmd::EFunctionBlockType fbType ) { @@ -341,5 +387,5 @@ bool -AvDeviceSubunitAudio::createFunctionBlock( +BeBoB::AvDeviceSubunitAudio::createFunctionBlock( ExtendedSubunitInfoCmd::EFunctionBlockType fbType, ExtendedSubunitInfoPageData& data ) @@ -436,6 +482,6 @@ } -FunctionBlock::ESpecialPurpose -AvDeviceSubunitAudio::convertSpecialPurpose( +BeBoB::FunctionBlock::ESpecialPurpose +BeBoB::AvDeviceSubunitAudio::convertSpecialPurpose( function_block_special_purpose_t specialPurpose ) { @@ -454,23 +500,87 @@ } +bool +BeBoB::AvDeviceSubunitAudio::serializeChild( Glib::ustring basePath, + Util::IOSerialize& ser ) const +{ + bool result = true; + int i = 0; + + for ( FunctionBlockVector::const_iterator it = m_functions.begin(); + it != m_functions.end(); + ++it ) + { + FunctionBlock* pFB = *it; + std::ostringstream strstrm; + strstrm << basePath << "FunctionBlock" << i << "/"; + + result &= pFB->serialize( strstrm.str() , ser ); + + i++; + } + + return result; +} + +bool +BeBoB::AvDeviceSubunitAudio::deserializeChild( Glib::ustring basePath, + Util::IODeserialize& deser, + AvDevice& avDevice ) +{ + int i = 0; + bool bFinished = false; + do { + std::ostringstream strstrm; + strstrm << basePath << "FunctionBlock" << i << "/"; + FunctionBlock* pFB = FunctionBlock::deserialize( strstrm.str(), + deser, + avDevice ); + if ( pFB ) { + m_functions.push_back( pFB ); + i++; + } else { + bFinished = true; + } + } while ( !bFinished ); + + return true; +} //////////////////////////////////////////// -AvDeviceSubunitMusic::AvDeviceSubunitMusic( AvDevice& avDevice, - subunit_t id, - int verboseLevel ) +BeBoB::AvDeviceSubunitMusic::AvDeviceSubunitMusic( AvDevice& avDevice, + subunit_t id, + int verboseLevel ) : AvDeviceSubunit( avDevice, AVCCommand::eST_Music, id, verboseLevel ) { } -AvDeviceSubunitMusic::~AvDeviceSubunitMusic() +BeBoB::AvDeviceSubunitMusic::AvDeviceSubunitMusic() + : AvDeviceSubunit() +{ +} + +BeBoB::AvDeviceSubunitMusic::~AvDeviceSubunitMusic() { } const char* -AvDeviceSubunitMusic::getName() +BeBoB::AvDeviceSubunitMusic::getName() { return "MusicSubunit"; } -} +bool +BeBoB::AvDeviceSubunitMusic::serializeChild( Glib::ustring basePath, + Util::IOSerialize& ser ) const +{ + return true; +} + +bool +BeBoB::AvDeviceSubunitMusic::deserializeChild( Glib::ustring basePath, + Util::IODeserialize& deser, + AvDevice& avDevice ) +{ + return true; +} Index: /trunk/libfreebob/src/bebob/bebob_functionblock.cpp =================================================================== --- /trunk/libfreebob/src/bebob/bebob_functionblock.cpp (revision 375) +++ /trunk/libfreebob/src/bebob/bebob_functionblock.cpp (revision 376) @@ -147,4 +147,19 @@ } +bool +FunctionBlock::serialize( Glib::ustring basePath, Util::IOSerialize& ser ) const +{ + int dummy = 42; + return ser.write( basePath + "dummy", dummy ); +} + +FunctionBlock* +FunctionBlock::deserialize( Glib::ustring basePath, + Util::IODeserialize& deser, + AvDevice& avDevice ) +{ + return 0; +} + /////////////////////// Index: /trunk/libfreebob/src/bebob/bebob_avplug.h =================================================================== --- /trunk/libfreebob/src/bebob/bebob_avplug.h (revision 375) +++ /trunk/libfreebob/src/bebob/bebob_avplug.h (revision 376) @@ -41,4 +41,5 @@ namespace BeBoB { +class AvDevice; class AvPlugManager; class AvPlug; @@ -141,7 +142,7 @@ static AvPlug* deserialize( Glib::ustring basePath, Util::IODeserialize& deser, - Ieee1394Service& ieee1394Service, - ConfigRom& configRom, + AvDevice& avDevice, AvPlugManager& plugManager ); + bool deserializeUpdate( Glib::ustring basePath, Util::IODeserialize& deser ); @@ -317,6 +318,6 @@ static AvPlugManager* deserialize( Glib::ustring basePath, Util::IODeserialize& deser, - Ieee1394Service& ieee1394Service, - ConfigRom& configRom ); + AvDevice& avDevice ); + private: AvPlugManager(); @@ -340,7 +341,5 @@ static AvPlugConnection* deserialize( Glib::ustring basePath, Util::IODeserialize& deser, - Ieee1394Service& ieee1394Service, - ConfigRom& configRom, - AvPlugManager& plugManager ); + AvDevice& avDevice ); private: AvPlugConnection(); Index: /trunk/libfreebob/src/bebob/bebob_avdevice_subunit.h =================================================================== --- /trunk/libfreebob/src/bebob/bebob_avdevice_subunit.h (revision 375) +++ /trunk/libfreebob/src/bebob/bebob_avdevice_subunit.h (revision 376) @@ -67,11 +67,17 @@ static AvDeviceSubunit* deserialize( Glib::ustring basePath, Util::IODeserialize& deser, - Ieee1394Service& ieee1394Service, - ConfigRom& configRom, - AvPlugManager& plugManager ); + AvDevice& avDevice ); protected: + AvDeviceSubunit(); + bool discoverPlugs(); bool discoverPlugs(AvPlug::EAvPlugDirection plugDirection, plug_id_t plugMaxId ); + + virtual bool serializeChild( Glib::ustring basePath, + Util::IOSerialize& ser ) const = 0; + virtual bool deserializeChild( Glib::ustring basePath, + Util::IODeserialize& deser, + AvDevice& avDevice ) = 0; protected: @@ -95,4 +101,5 @@ subunit_t id, int verboseLevel ); + AvDeviceSubunitAudio(); virtual ~AvDeviceSubunitAudio(); @@ -114,4 +121,10 @@ function_block_special_purpose_t specialPurpose ); + virtual bool serializeChild( Glib::ustring basePath, + Util::IOSerialize& ser ) const; + virtual bool deserializeChild( Glib::ustring basePath, + Util::IODeserialize& deser, + AvDevice& avDevice ); + protected: FunctionBlockVector m_functions; @@ -125,7 +138,15 @@ subunit_t id, int verboseLevel ); + AvDeviceSubunitMusic(); virtual ~AvDeviceSubunitMusic(); virtual const char* getName(); + +protected: + virtual bool serializeChild( Glib::ustring basePath, + Util::IOSerialize& ser ) const; + virtual bool deserializeChild( Glib::ustring basePath, + Util::IODeserialize& deser, + AvDevice& avDevice ); };