@@ -196,34 +196,6 @@ static void qdev_print_devinfos(bool show_no_user)
196
196
g_slist_free (list );
197
197
}
198
198
199
- static int set_property (void * opaque , const char * name , const char * value ,
200
- Error * * errp )
201
- {
202
- Object * obj = opaque ;
203
- QString * val ;
204
- Visitor * v ;
205
- int ret ;
206
-
207
- if (strcmp (name , "driver" ) == 0 )
208
- return 0 ;
209
- if (strcmp (name , "bus" ) == 0 )
210
- return 0 ;
211
-
212
- val = qstring_from_str (value );
213
- v = qobject_input_visitor_new_keyval (QOBJECT (val ));
214
-
215
- if (!object_property_set (obj , name , v , errp )) {
216
- ret = -1 ;
217
- goto out ;
218
- }
219
-
220
- ret = 0 ;
221
- out :
222
- visit_free (v );
223
- qobject_unref (val );
224
- return ret ;
225
- }
226
-
227
199
static const char * find_typename_by_alias (const char * alias )
228
200
{
229
201
int i ;
@@ -624,15 +596,17 @@ const char *qdev_set_id(DeviceState *dev, char *id, Error **errp)
624
596
return prop -> name ;
625
597
}
626
598
627
- DeviceState * qdev_device_add (QemuOpts * opts , Error * * errp )
599
+ DeviceState * qdev_device_add_from_qdict (const QDict * opts ,
600
+ bool from_json , Error * * errp )
628
601
{
629
602
ERRP_GUARD ();
630
603
DeviceClass * dc ;
631
604
const char * driver , * path ;
605
+ char * id ;
632
606
DeviceState * dev = NULL ;
633
607
BusState * bus = NULL ;
634
608
635
- driver = qemu_opt_get (opts , "driver" );
609
+ driver = qdict_get_try_str (opts , "driver" );
636
610
if (!driver ) {
637
611
error_setg (errp , QERR_MISSING_PARAMETER , "driver" );
638
612
return NULL ;
@@ -645,7 +619,7 @@ DeviceState *qdev_device_add(QemuOpts *opts, Error **errp)
645
619
}
646
620
647
621
/* find bus */
648
- path = qemu_opt_get (opts , "bus" );
622
+ path = qdict_get_try_str (opts , "bus" );
649
623
if (path != NULL ) {
650
624
bus = qbus_find (path , errp );
651
625
if (!bus ) {
@@ -665,12 +639,12 @@ DeviceState *qdev_device_add(QemuOpts *opts, Error **errp)
665
639
}
666
640
}
667
641
668
- if (qemu_opt_get (opts , "failover_pair_id" )) {
669
- if (!opts -> id ) {
642
+ if (qdict_haskey (opts , "failover_pair_id" )) {
643
+ if (!qdict_haskey ( opts , "id" ) ) {
670
644
error_setg (errp , "Device with failover_pair_id don't have id" );
671
645
return NULL ;
672
646
}
673
- if (qdev_should_hide_device (opts , errp )) {
647
+ if (qdev_should_hide_device (opts , from_json , errp )) {
674
648
if (bus && !qbus_is_hotpluggable (bus )) {
675
649
error_setg (errp , QERR_BUS_NO_HOTPLUG , bus -> name );
676
650
}
@@ -711,18 +685,24 @@ DeviceState *qdev_device_add(QemuOpts *opts, Error **errp)
711
685
* set dev's parent and register its id.
712
686
* If it fails it means the id is already taken.
713
687
*/
714
- if (!qdev_set_id (dev , g_strdup (qemu_opts_id (opts )), errp )) {
688
+ id = g_strdup (qdict_get_try_str (opts , "id" ));
689
+ if (!qdev_set_id (dev , id , errp )) {
715
690
goto err_del_dev ;
716
691
}
717
692
718
693
/* set properties */
719
- if (qemu_opt_foreach (opts , set_property , dev , errp )) {
694
+ dev -> opts = qdict_clone_shallow (opts );
695
+ qdict_del (dev -> opts , "driver" );
696
+ qdict_del (dev -> opts , "bus" );
697
+ qdict_del (dev -> opts , "id" );
698
+
699
+ object_set_properties_from_keyval (& dev -> parent_obj , dev -> opts , from_json ,
700
+ errp );
701
+ if (* errp ) {
720
702
goto err_del_dev ;
721
703
}
722
704
723
- dev -> opts = opts ;
724
705
if (!qdev_realize (DEVICE (dev ), bus , errp )) {
725
- dev -> opts = NULL ;
726
706
goto err_del_dev ;
727
707
}
728
708
return dev ;
@@ -735,6 +715,19 @@ DeviceState *qdev_device_add(QemuOpts *opts, Error **errp)
735
715
return NULL ;
736
716
}
737
717
718
+ /* Takes ownership of @opts on success */
719
+ DeviceState * qdev_device_add (QemuOpts * opts , Error * * errp )
720
+ {
721
+ QDict * qdict = qemu_opts_to_qdict (opts , NULL );
722
+ DeviceState * ret ;
723
+
724
+ ret = qdev_device_add_from_qdict (qdict , false, errp );
725
+ if (ret ) {
726
+ qemu_opts_del (opts );
727
+ }
728
+ qobject_unref (qdict );
729
+ return ret ;
730
+ }
738
731
739
732
#define qdev_printf (fmt , ...) monitor_printf(mon, "%*s" fmt, indent, "", ## __VA_ARGS__)
740
733
static void qbus_print (Monitor * mon , BusState * bus , int indent );
0 commit comments