@ -1011,6 +1011,56 @@ const char *qtest_get_arch(void)
return end + 1 ;
}
static bool qtest_qom_has_concrete_type ( const char * parent_typename ,
const char * child_typename ,
QList * * cached_list )
{
QList * list = cached_list ? * cached_list : NULL ;
const QListEntry * p ;
QObject * qobj ;
QString * qstr ;
QDict * devinfo ;
int idx ;
if ( ! list ) {
QDict * resp ;
QDict * args ;
QTestState * qts = qtest_init ( " -machine none " ) ;
args = qdict_new ( ) ;
qdict_put_bool ( args , " abstract " , false ) ;
qdict_put_str ( args , " implements " , parent_typename ) ;
resp = qtest_qmp ( qts , " {'execute': 'qom-list-types', 'arguments': %p } " ,
args ) ;
g_assert ( qdict_haskey ( resp , " return " ) ) ;
list = qdict_get_qlist ( resp , " return " ) ;
qobject_ref ( list ) ;
qobject_unref ( resp ) ;
qtest_quit ( qts ) ;
if ( cached_list ) {
* cached_list = list ;
}
}
for ( p = qlist_first ( list ) , idx = 0 ; p ; p = qlist_next ( p ) , idx + + ) {
devinfo = qobject_to ( QDict , qlist_entry_obj ( p ) ) ;
g_assert ( devinfo ) ;
qobj = qdict_get ( devinfo , " name " ) ;
g_assert ( qobj ) ;
qstr = qobject_to ( QString , qobj ) ;
g_assert ( qstr ) ;
if ( g_str_equal ( qstring_get_str ( qstr ) , child_typename ) ) {
return true ;
}
}
return false ;
}
bool qtest_has_accel ( const char * accel_name )
{
if ( g_str_equal ( accel_name , " tcg " ) ) {
@ -1790,45 +1840,8 @@ bool qtest_has_machine(const char *machine)
bool qtest_has_device ( const char * device )
{
static QList * list ;
const QListEntry * p ;
QObject * qobj ;
QString * qstr ;
QDict * devinfo ;
int idx ;
if ( ! list ) {
QDict * resp ;
QDict * args ;
QTestState * qts = qtest_init ( " -machine none " ) ;
args = qdict_new ( ) ;
qdict_put_bool ( args , " abstract " , false ) ;
qdict_put_str ( args , " implements " , " device " ) ;
resp = qtest_qmp ( qts , " {'execute': 'qom-list-types', 'arguments': %p } " ,
args ) ;
g_assert ( qdict_haskey ( resp , " return " ) ) ;
list = qdict_get_qlist ( resp , " return " ) ;
qobject_ref ( list ) ;
qobject_unref ( resp ) ;
qtest_quit ( qts ) ;
}
for ( p = qlist_first ( list ) , idx = 0 ; p ; p = qlist_next ( p ) , idx + + ) {
devinfo = qobject_to ( QDict , qlist_entry_obj ( p ) ) ;
g_assert ( devinfo ) ;
qobj = qdict_get ( devinfo , " name " ) ;
g_assert ( qobj ) ;
qstr = qobject_to ( QString , qobj ) ;
g_assert ( qstr ) ;
if ( g_str_equal ( qstring_get_str ( qstr ) , device ) ) {
return true ;
}
}
return false ;
return qtest_qom_has_concrete_type ( " device " , device , & list ) ;
}
/*