ນີ້ແມ່ນຄໍາສັ່ງ gdbus-codegen ທີ່ສາມາດດໍາເນີນການໄດ້ໃນ OnWorks ຜູ້ໃຫ້ບໍລິການໂຮດຕິ້ງຟຣີໂດຍໃຊ້ຫນຶ່ງໃນຫຼາຍໆບ່ອນເຮັດວຽກອອນໄລນ໌ຂອງພວກເຮົາເຊັ່ນ Ubuntu Online, Fedora Online, Windows online emulator ຫຼື MAC OS online emulator
ໂຄງການ:
NAME
gdbus-codegen - ລະຫັດ D-Bus ແລະເຄື່ອງສ້າງເອກະສານ
ສະຫຼຸບສັງລວມ
gdbus-codegen [-h, - ຊ່ວຍ] [--interface-prefix org.project.Prefix]
[--generate-c-code ເອກະສານອອກ] [--c-namespace ໂຄງການຂອງເຈົ້າ]
[--c-generate-object-manage] [--generate-docbook ເອກະສານອອກ]
[--xml-files ເອກະສານ] [--ອະທິບາຍ ELEMENT KEY ມູນຄ່າ]... FILE [FILE...]
ລາຍລະອຽດ
gdbus-codegen ຖືກນໍາໃຊ້ເພື່ອສ້າງລະຫັດແລະ / ຫຼືເອກະສານສໍາລັບຫນຶ່ງຫຼືຫຼາຍກວ່າ D-Bus
ການໂຕ້ຕອບ. ເຄື່ອງມືອ່ານ D ລົດເມ ການກວດກາ XML[1] ໄຟລ໌ແລະສ້າງໄຟລ໌ຜົນຜະລິດ.
ເຄື່ອງມືປະຈຸບັນສະຫນັບສະຫນູນການສ້າງລະຫັດ C (ຜ່ານ --generate-c-code) ແລະ Docbook XML (ຜ່ານ
--generate-docbook).
ການຜະລິດ C CODE
ເມື່ອສ້າງລະຫັດ C, ປະເພດ #GIinterface -derived ແມ່ນຖືກສ້າງຂຶ້ນສໍາລັບແຕ່ລະການໂຕ້ຕອບ D-Bus.
ນອກຈາກນັ້ນ, ສໍາລັບທຸກປະເພດທີ່ສ້າງຂຶ້ນ, FooBar, ສອງປະເພດ instantiable ສີມັງ,
FooBarProxy ແລະ FooBarSkeleton, ການປະຕິບັດການໂຕ້ຕອບທີ່ເວົ້າແມ່ນຍັງຖືກສ້າງຂຶ້ນ. ອະດີດ
ແມ່ນມາຈາກ #GDBusProxy ແລະມີຈຸດປະສົງເພື່ອໃຊ້ໃນດ້ານລູກຄ້າໃນຂະນະທີ່ອັນສຸດທ້າຍແມ່ນ
ໄດ້ມາຈາກປະເພດ #GDBusInterfaceSkeleton ເຮັດໃຫ້ມັນງ່າຍຕໍ່ການສົ່ງອອກໃນ a
#GDBusConnection ບໍ່ວ່າຈະໂດຍກົງຫຼືຜ່ານຕົວຢ່າງ #GDBusObjectManagerServer.
ຊື່ຂອງແຕ່ລະປະເພດ C ທີ່ສ້າງຂຶ້ນແມ່ນມາຈາກຊື່ການໂຕ້ຕອບ D-Bus ທີ່ລອກດ້ວຍ
ຄໍານໍາຫນ້າໃຫ້ກັບ --interface-prefix ແລະມີຈຸດທີ່ຖືກໂຍກຍ້າຍອອກແລະຕົວອັກສອນເບື້ອງຕົ້ນ
ຕົວພິມໃຫຍ່. ຕົວຢ່າງ, ສໍາລັບການໂຕ້ຕອບ D-Bus com.acme.Coyote ຊື່ທີ່ໃຊ້ແມ່ນ
ComAcmeCoyote. ສໍາລັບການໂຕ້ຕອບ D-Bus org.project.Bar.Frobnicator ກັບ --interface-prefix
org.project., ຊື່ທີ່ໃຊ້ແມ່ນ BarFrobnicator.
ສໍາລັບວິທີການ, ສັນຍານແລະຄຸນສົມບັດ, ຖ້າບໍ່ໄດ້ລະບຸ, ຊື່ເລີ່ມຕົ້ນເປັນຊື່ຂອງ
ວິທີການ, ສັນຍານຫຼືຊັບສິນ.
ສອງຮູບແບບຂອງຊື່ຖືກນໍາໃຊ້ - ແບບຟອມ CamelCase ແລະແບບຟອມຕົວພິມນ້ອຍ. CamelCase
ແບບຟອມແມ່ນໃຊ້ສໍາລັບຊື່ #GType ແລະໂຄງສ້າງ, ໃນຂະນະທີ່ແບບຟອມຕົວພິມນ້ອຍຖືກນໍາໃຊ້ໃນຫນ້າທີ່
ຊື່. ແບບຟອມຕົວພິມນ້ອຍແມ່ນຖືກຄິດໄລ່ໂດຍການປ່ຽນຈາກ CamelCase ໄປຫາຕົວພິມນ້ອຍແລະ
ການໃສ່ຂີດກ້ອງຢູ່ຂອບເຂດຄຳສັບ (ໂດຍນຳໃຊ້ heuristics ທີ່ແນ່ນອນ).
ຖ້າຄ່າທີ່ໃຫ້ໂດຍ org.gtk.GDBus.C.Name annotation ຫຼື the --c-namespace ທາງເລືອກ
ປະກອບມີຂີດກ້ອງ (ບາງຄັ້ງເອີ້ນວ່າ Ugly_Case), ຫຼັງຈາກນັ້ນຊື່ camel-case ແມ່ນມາຈາກ
ໂດຍການເອົາອັນດັບລຸ່ມອອກທັງຫມົດ, ແລະຊື່ຕົວພິມນ້ອຍໄດ້ມາໂດຍຕົວພິມນ້ອຍໄດ້
ສາຍ. ນີ້ແມ່ນເປັນປະໂຫຍດໃນບາງສະຖານະການທີ່ຕົວຫຍໍ້ຖືກນໍາໃຊ້. ຕົວຢ່າງ, ຖ້າ
ຄໍາບັນຍາຍຖືກນໍາໃຊ້ໃນການໂຕ້ຕອບ net.MyCorp.MyApp.iSCSITarget ກັບຄ່າ.
iSCSI_Target ແບບຟອມ CamelCase ແມ່ນ iSCSITarget ໃນຂະນະທີ່ຮູບແບບຕົວພິມນ້ອຍແມ່ນ iscsi_target.
ຖ້າຄໍາບັນຍາຍຖືກນໍາໃຊ້ໃນວິທີການ EjectTheiPod ດ້ວຍຄ່າ Eject_The_iPod, the
ຮູບແບບຕົວພິມນ້ອຍແມ່ນ eject_the_ipod.
ການຜະລິດ DOCBOOK ເອກະສານອ້າງອີງ
ແຕ່ລະໄຟລ໌ Docbook XML ທີ່ສ້າງຂຶ້ນ (ເບິ່ງ --generate-docbook ທາງເລືອກສໍາລັບລາຍລະອຽດ) ແມ່ນ a
ການສົ່ງຂໍ້ມູນ[2] ບົດຄວາມອະທິບາຍການໂຕ້ຕອບ D-Bus.
OPTIONS
ທາງເລືອກດັ່ງຕໍ່ໄປນີ້ແມ່ນສະຫນັບສະຫນູນ:
-h, - ຊ່ວຍ
ສະແດງການຊ່ວຍເຫຼືອ ແລະອອກ.
--xml-files ເອກະສານ
ໄຟລ໌ XML introspection D-Bus.
--interface-prefix org.project.Prefix.
ຄໍານໍາຫນ້າເພື່ອລອກອອກຈາກຊື່ການໂຕ້ຕອບ D-Bus ທັງຫມົດໃນເວລາທີ່ຄໍານວນປະເພດສໍາລັບ the
C binding ແລະ Docbook ປະເພດ ຄຸນລັກສະນະ[3]
--generate-docbook ເອກະສານອອກ
ສ້າງເອກະສານ Docbook ສໍາລັບແຕ່ລະສ່ວນຕິດຕໍ່ຂອງ D-Bus ແລະໃສ່ມັນໃສ່
OUTFILES-NAME.xml ບ່ອນທີ່ NAME ເປັນຜູ້ຖືສະຖານທີ່ສໍາລັບຊື່ສ່ວນຕິດຕໍ່, ຕົວຢ່າງ
net.Corp.FooBar ແລະອື່ນໆ.
--generate-c-code ເອກະສານອອກ
ສ້າງລະຫັດ C ສໍາລັບການໂຕ້ຕອບ D-Bus ທັງຫມົດແລະໃສ່ໃນ OUTFILES.c ແລະ OUTFILES.h.
--c-namespace ໂຄງການຂອງເຈົ້າ
namespace ທີ່ຈະໃຊ້ສໍາລັບການສ້າງລະຫັດ C. ນີ້ຄາດວ່າຈະຢູ່ໃນ CamelCase[4] ຫລື
Ugly_Case (ເບິ່ງຢູ່ຂ້າງເທິງ).
--c-generate-object-manage
ຖ້າຕົວເລືອກນີ້ຜ່ານໄປ, ເຫມາະສົມ #GDBusObject, #GDBusObjectProxy,
ຊັ້ນຍ່ອຍ #GDBusObjectSkeleton ແລະ #GDBusObjectManagerClient ແມ່ນຖືກສ້າງຂຶ້ນ.
--ອະທິບາຍ ELEMENT KEY ມູນຄ່າ
ໃຊ້ເພື່ອໃສ່ຄໍາບັນຍາຍ D-Bus ເຂົ້າໄປໃນໄຟລ໌ XML ທີ່ໃຫ້. ມັນສາມາດໃຊ້ກັບ
ການໂຕ້ຕອບ, ວິທີການ, ສັນຍານ, ຄຸນສົມບັດແລະການໂຕ້ຖຽງໃນວິທີການດັ່ງຕໍ່ໄປນີ້:
gdbus-codegen --c-namespace MyApp
--generate-c-code myapp-generate
--annotate "org.project.InterfaceName"
org.gtk.GDBus.C.Name MyFrobnicator
--annotate "org.project.InterfaceName:Property"
ບາ bat
--annotate "org.project.InterfaceName.Method()"
org.freedesktop.DBus.Deprecated true
--annotate "org.project.InterfaceName.Method()[arg_name]"
ງູ hiss
--annotate "org.project.InterfaceName::ສັນຍານ"
cat meow
--annotate "org.project.InterfaceName::Signal[arg_name]"
ຫມາ wuff
myapp-dbus-interfaces.xml
ສະຕຣິງ UTF-8 ສາມາດໃຊ້ສໍາລັບ KEY ແລະ ມູນຄ່າ.
ສະ ໜັບ ສະ ໜູນ D-BUS ຄຳບັນຍາຍ
ຄຳອະທິບາຍປະກອບ D-Bus ຕໍ່ໄປນີ້ໄດ້ຮັບການສະໜັບສະໜູນໂດຍ gdbus-codegen:
org.freedesktop.DBus.Deprecated
ສາມາດໃຊ້ໄດ້ກັບທຸກ , , ແລະ ອົງປະກອບທີ່ຈະລະບຸ
ວ່າອົງປະກອບຖືກປະຕິເສດຖ້າຄ່າຂອງມັນຖືກຕ້ອງ. ໃຫ້ສັງເກດວ່າຄໍາບັນຍາຍນີ້ແມ່ນ
ກຳ ນົດໃນ D ລົດເມ ຂໍ້ມູນ[1] ແລະພຽງແຕ່ສາມາດສົມມຸດວ່າຄ່າທີ່ແທ້ຈິງແລະບໍ່ຖືກຕ້ອງ.
ໂດຍສະເພາະ, ທ່ານບໍ່ສາມາດລະບຸສະບັບທີ່ອົງປະກອບໄດ້ຖືກປະຕິເສດໃນຫຼື
ຂໍ້ຄວາມການປະຕິເສດທີ່ເປັນປະໂຫຍດໃດໆ. ຂໍ້ມູນດັ່ງກ່າວຄວນໄດ້ຮັບການເພີ່ມເຂົ້າໃນອົງປະກອບ
ເອກະສານແທນ.
ເມື່ອສ້າງລະຫັດ C, ຄໍາບັນຍາຍນີ້ຖືກນໍາໃຊ້ເພື່ອເພີ່ມ #G_GNUC_DEPRECATED ເພື່ອສ້າງ
ຫນ້າທີ່ສໍາລັບອົງປະກອບ.
ເມື່ອສ້າງ Docbook XML, ຄຳເຕືອນການຍົກເລີກການຄັດຄ້ານຈະປາກົດຢູ່ຕາມເອກະສານ
ສຳ ລັບອົງປະກອບ.
org.gtk.GDBus.ນັບຕັ້ງແຕ່
ສາມາດໃຊ້ໄດ້ກັບທຸກ , , ແລະ ອົງປະກອບທີ່ຈະລະບຸ
ສະບັບ (ສະຕຣິງຮູບແບບຟຣີໃດໆແຕ່ປຽບທຽບໂດຍໃຊ້ຟັງຊັນການຈັດຮຽງແບບສະບັບ)
ອົງປະກອບທີ່ປາກົດຢູ່ໃນ.
ເມື່ອສ້າງລະຫັດ C, ພາກສະຫນາມນີ້ຖືກນໍາໃຊ້ເພື່ອຮັບປະກັນຄໍາສັ່ງຕົວຊີ້ຫນ້າທີ່ສໍາລັບ
ຮັກສາ ABI/API, ເບິ່ງພາກສ່ວນທີ່ເອີ້ນວ່າ “ການຮັບປະກັນຄວາມໝັ້ນຄົງ”.
ເມື່ອສ້າງ Docbook XML, ຄ່າຂອງແທັກນີ້ປາກົດຢູ່ໃນເອກະສານ.
org.gtk.GDBus.DocString
ສະຕຣິງທີ່ມີເນື້ອໃນ Docbook ສໍາລັບເອກະສານ. ຄໍາບັນຍາຍນີ້ສາມາດຖືກນໍາໃຊ້ໃນ
, , , ແລະ ອົງປະກອບ.
org.gtk.GDBus.DocString.Short
ສະຕຣິງທີ່ມີເນື້ອໃນ Docbook ສໍາລັບເອກະສານສັ້ນ/ຫຍໍ້. ຄໍາບັນຍາຍນີ້ສາມາດພຽງແຕ່
ຖືກນໍາໃຊ້ໃນ ອົງປະກອບ.
org.gtk.GDBus.C.Name
ສາມາດໃຊ້ໄດ້ກັບທຸກ , , ແລະ ອົງປະກອບທີ່ຈະລະບຸ
ຊື່ທີ່ຈະໃຊ້ເມື່ອສ້າງລະຫັດ C. ມູນຄ່າຄາດວ່າຈະຢູ່ໃນ CamelCase[4] ຫລື
Ugly_Case (ເບິ່ງຢູ່ຂ້າງເທິງ).
org.gtk.GDBus.C.ForceGVariant
ຖ້າຕັ້ງເປັນສະຕຣິງທີ່ບໍ່ຫວ່າງເປົ່າ, ຕົວຢ່າງ #GVariant ຈະຖືກໃຊ້ແທນຄ່າທໍາມະຊາດ
ປະເພດ C. ຄຳອະທິບາຍນີ້ສາມາດໃຊ້ກັບອັນໃດກໍໄດ້ ແລະ ອົງປະກອບ.
org.gtk.GDBus.C.UnixFD
ຖ້າຕັ້ງເປັນສະຕຣິງທີ່ບໍ່ຫວ່າງເປົ່າ, ລະຫັດທີ່ສ້າງຂຶ້ນຈະປະກອບມີພາລາມິເຕີເພື່ອແລກປ່ຽນ
ຕົວອະທິບາຍໄຟລ໌ໂດຍໃຊ້ປະເພດ #GunixFDList. ຄໍາບັນຍາຍນີ້ສາມາດຖືກນໍາໃຊ້ໃນ
ອົງປະກອບ.
ເປັນທາງເລືອກທີ່ງ່າຍກວ່າທີ່ຈະໃຊ້ຄໍາບັນຍາຍ org.gtk.GDBus.DocString, ຈົ່ງຈື່ໄວ້ວ່າ parser
ໃຊ້ໂດຍ gdbus-codegen ວິເຄາະຄໍາຄິດເຫັນ XML ໃນທາງທີ່ຄ້າຍຄືກັບ gtk-doc[ສອງ]:
ໃຫ້ສັງເກດວ່າ @since ສາມາດຖືກນໍາໃຊ້ໃນເອກະສານເອກະສານ inline ໃດ (ເຊັ່ນ: ສໍາລັບການໂຕ້ຕອບ,
ວິທີການ, ສັນຍານ ແລະຄຸນສົມບັດ) ເພື່ອຕັ້ງຄ່າ org.gtk.GDBus.Since annotation. ສໍາລັບ
org.gtk.GDBus.DocString annotation (ແລະ inline comment), ໃຫ້ສັງເກດວ່າ substrings ຂອງແບບຟອມ.
#net.Corp.Bar, net.Corp.Bar.FooMethod(), #net.Corp.Bar::BarSignal ແລະ
#net.Corp.InlineDocs:BazProperty ທັງຫມົດແມ່ນຂະຫຍາຍໄປສູ່ການເຊື່ອມຕໍ່ກັບສ່ວນຕິດຕໍ່ທີ່ກ່ຽວຂ້ອງ,
ວິທີການ, ສັນຍານແລະຊັບສິນ. ນອກຈາກນັ້ນ, ແຖວຍ່ອຍທີ່ເລີ່ມຕົ້ນດ້ວຍ @ ແລະ % ຕົວອັກສອນແມ່ນ
rendered ເປັນ ພາລາມິເຕີ[6] ແລະ ຄົງທີ່[7] ຕາມລໍາດັບ.
ຖ້າທັງສອງຄຳເຫັນ XML ແລະ org.gtk.GDBus.DocString ຫຼື org.gtk.GDBus.DocString.Short
ຄໍາບັນຍາຍແມ່ນມີຢູ່, ສຸດທ້າຍຊະນະ.
EXAMPLE
ພິຈາລະນາ D-Bus Introspection XML ຕໍ່ໄປນີ້.
If gdbus-codegen ຖືກນໍາໃຊ້ໃນໄຟລ໌ເຊັ່ນນີ້:
gdbus-codegen --generate-c-code myapp-generated
--c-namespace MyApp
--interface-prefix net.corp.MyApp.
net.Corp.MyApp.Frobber.xml
ສອງໄຟລ໌ທີ່ເອີ້ນວ່າ myapp-generated.[ch] ແມ່ນຖືກສ້າງຂຶ້ນ. ໄຟລ໌ໃຫ້ບົດຄັດຫຍໍ້
#GTypeInterface -ປະເພດທີ່ມາຈາກເອີ້ນວ່າ MyAppFrobber ເຊັ່ນດຽວກັນກັບສອງປະເພດ instantiable ກັບ
ຊື່ດຽວກັນແຕ່ຕໍ່ທ້າຍດ້ວຍ proxy ແລະ skeleton. ໄຟລ໌ທີ່ສ້າງຂຶ້ນ, ປະມານ, ມີ
ສິ່ງອໍານວຍຄວາມສະດວກດັ່ງຕໍ່ໄປນີ້:
/* GType macro ສໍາລັບສາມປະເພດທີ່ສ້າງຂຶ້ນ */
#ກຳນົດ MY_APP_TYPE_FROBBER (my_app_frobber_get_type ())
#ກຳນົດ MY_APP_TYPE_FROBBER_SKELETON (my_app_frobber_skeleton_get_type ())
#ກຳນົດ MY_APP_TYPE_FROBBER_PROXY (my_app_frobber_proxy_get_type ())
typedef struct _MyAppFrobber MyAppFrobber; /* Dummy typedef */
typedef ໂຄງສ້າງ
{
GTypeInterface parent_iface;
/* ຕົວຈັດສັນຍານສໍາລັບການ :: ສັນຍານແຈ້ງການ */
ໂມຄະ (*ການແຈ້ງເຕືອນ) (MyAppFrobber *ຕົວແທນ,
GVariant *icon_blob,
ຄວາມສູງ gint,
const gchar* const *ຂໍ້ຄວາມ);
/* ຕົວຈັດການສັນຍານສໍາລັບ ::handle-hello-world signal */
gboolean (*handle_hello_world) (MyAppFrobber *proxy,
GDBusMethodInvocation *ການຮຽກຮ້ອງ,
const gchar *ທັກທາຍ);
} MyAppFrobberIface;
/* ໂທ Asynchronously ໂທ HelloWorld() */
void
my_app_frobber_call_hello_world (MyAppFrobber *ຕົວແທນ,
const gchar *ທັກທາຍ,
GCancellable *ຍົກເລີກໄດ້,
GAsyncReadyCallback ໂທກັບ,
gpointer user_data);
gboolean
my_app_frobber_call_hello_world_finish (MyAppFrobber *ຕົວແທນ,
gchar **ການຕອບສະຫນອງອອກ,
GAsyncResult *res,
GError **ຄວາມຜິດພາດ);
/* synchronously ໂທ HelloWorld(). ບລັອກສາຍໂທ. */
gboolean
my_app_frobber_call_hello_world_sync (MyAppFrobber *ຕົວແທນ,
const gchar *ທັກທາຍ,
gchar **ການຕອບສະຫນອງອອກ,
GCancellable *ຍົກເລີກໄດ້,
GError **ຄວາມຜິດພາດ);
/* ສໍາເລັດການຈັດການ HelloWorld() ວິທີການໂທ */
void
my_app_frobber_complete_hello_world (MyAppFrobber *object,
GDBusMethodInvocation *ການຮຽກຮ້ອງ,
const gchar *ຕອບສະຫນອງ);
/* ປ່ອຍສັນຍານ ::notification signal / Notification() D-Bus signal */
void
my_app_frobber_emit_notification (MyAppFrobber *object,
GVariant *icon_blob,
ຄວາມສູງ gint,
const gchar* const *ຂໍ້ຄວາມ);
/* ໄດ້ຮັບຊັບສິນ :verbose GObject / Verbose D-Bus ຊັບສິນ.
* ບໍ່ມີການສະກັດ I/O.
*/
gboolean my_app_frobber_get_verbose (MyAppFrobber *object);
/* ກໍານົດຄຸນສົມບັດ :verbose GObject / Verbose D-Bus ຄຸນສົມບັດ.
* ບໍ່ມີການສະກັດ I/O.
*/
ເປັນໂມຄະ my_app_frobber_set_verbose (MyAppFrobber *object,
ຄ່າ gboolean);
/* ໄດ້ຮັບຂໍ້ມູນການໂຕ້ຕອບ */
GDBusInterfaceInfo *my_app_frobber_interface_info (void);
/* ສ້າງວັດຖຸໂຄງກະດູກໃໝ່, ພ້ອມທີ່ຈະສົ່ງອອກ */
MyAppFrobber *my_app_frobber_skeleton_new (void);
/* ຕົວສ້າງພຣັອກຊີຝ່າຍລູກຄ້າ.
*
* ນອກຈາກນັ້ນ, _new_for_bus(), _new_for_bus_finish() ແລະ
* _new_for_bus_sync() ຕົວສ້າງພຣັອກຊີຍັງຖືກສ້າງຂຶ້ນ.
*/
void
my_app_frobber_proxy_new (GDBusConnection *ການເຊື່ອມຕໍ່,
ທຸງ GDBusProxyFlags,
const gchar *ຊື່,
const gchar *object_path,
GCancellable *ຍົກເລີກໄດ້,
GAsyncReadyCallback ໂທກັບ,
gpointer user_data);
MyAppFrobber *
my_app_frobber_proxy_new_finish (GAsyncResult *res,
GError **ຄວາມຜິດພາດ);
MyAppFrobber *
my_app_frobber_proxy_new_sync (GDBusConnection *ການເຊື່ອມຕໍ່,
ທຸງ GDBusProxyFlags,
const gchar *ຊື່,
const gchar *object_path,
GCancellable *ຍົກເລີກໄດ້,
GError **ຄວາມຜິດພາດ);
ດັ່ງນັ້ນ, ສໍາລັບທຸກໆວິທີການ D-Bus, ຈະມີສາມຫນ້າທີ່ C ສໍາລັບການໂທຫາວິທີການ, ຫນຶ່ງ
ສັນຍານ #GObject ສໍາລັບການຈັດການສາຍໂທເຂົ້າ ແລະຟັງຊັນ C ຫນຶ່ງສໍາລັບການເຮັດສໍາເລັດ
ສາຍໂທເຂົ້າ. ສໍາລັບທຸກໆສັນຍານ D-Bus, ມີຫນຶ່ງສັນຍານ #GObject ແລະຫນຶ່ງຟັງຊັນ C ສໍາລັບ
ປ່ອຍມັນ. ສໍາລັບທຸກໆຊັບສິນ D-Bus, ສອງຟັງຊັນ C ແມ່ນຖືກສ້າງຂຶ້ນ (ຫນຶ່ງ setter, ຫນຶ່ງ
getter) ແລະຫນຶ່ງ #GObject ຊັບສິນ. ຕາຕະລາງຕໍ່ໄປນີ້ສະຫຼຸບສິ່ງອໍານວຍຄວາມສະດວກທີ່ສ້າງຂຶ້ນ
ແລະບ່ອນທີ່ພວກມັນໃຊ້ໄດ້:
┌─────────────────────── ┬──────────────────────── ──────────────────────────── ┐
││ ລູກຄ້າ │ Server │
├────────────────────── ┼──────────────────── ──────────────────────────── ┤
│ປະເພດ│ໃຊ້ MyAppFrobberProxy │ ການປະຕິບັດປະເພດໃດຫນຶ່ງ │
│ │ │ ທ MyAppFrobber │
│ │ │ ການໂຕ້ຕອບ │
├────────────────────── ┼──────────────────── ──────────────────────────── ┤
│ວິທີການ│ໃຊ້ m_a_f_hello_world() │ຮັບຜ່ານ│
│ │ ໂທ. │ handle_hello_world() │
│ │ │ ຕົວຈັບສັນຍານ. ສໍາເລັດ │
│ │ │ ໂທກັບ │
│ │ │ m_a_f_complete_hello_world() │
├────────────────────── ┼──────────────────── ──────────────────────────── ┤
│ສັນຍານ │ ເຊື່ອມຕໍ່ກັບ │ ໃຊ້ │
││ ::ແຈ້ງການ GObject │ m_a_f_emit_notification() ເຖິງ │
│ │ ສັນຍານ. │ ປ່ອຍສັນຍານ. │
├────────────────────── ┼──────────────────── ──────────────────────────── ┤
│ຄຸນສົມບັດ (ການອ່ານ) │ ໃຊ້ m_a_f_get_verbose() │ ປະຕິບັດ #GObject's │
│ │ ຫຼື : ຄຳເວົ້າ. │ get_property() vfunc. │
├────────────────────── ┼──────────────────── ──────────────────────────── ┤
│ຄຸນສົມບັດ (ການຂຽນ) │ ໃຊ້ m_a_f_set_verbose() │ ປະຕິບັດ #GObject's │
│ │ ຫຼື : ຄຳເວົ້າ. │ set_property() vfunc. │
└────────────────────── ┴──────────────────────── ────────────────────────────── ┘
Cl່າຍລູກຄ້າ ການນໍາໃຊ້
ທ່ານສາມາດນໍາໃຊ້ປະເພດ proxy ທີ່ຜະລິດກັບ constructors ທີ່ສ້າງຕັ້ງຂື້ນ:
MyAppFrobber *ຕົວແທນ;
GError *ຜິດພາດ;
error = NULL;
proxy = my_app_frobber_proxy_new_for_bus_sync (
G_BUS_TYPE_SESSION,
G_DBUS_PROXY_FLAGS_NONE,
"net.Corp.MyApp", /* ຊື່ລົດເມ */
"/net/Corp/MyApp/SomeFrobber", /* object */
NULL, /* GCancellable* */
ຜິດພາດ);
/* ເຮັດສິ່ງຕ່າງໆດ້ວຍຕົວແທນ */
g_object_unref (ຕົວແທນ);
ແທນທີ່ຈະໃຊ້ສິ່ງອໍານວຍຄວາມສະດວກ #GDBusProxy ທົ່ວໄປ, ຄົນເຮົາສາມາດໃຊ້ວິທີການທີ່ສ້າງຂຶ້ນໄດ້
ເຊັ່ນວ່າ my_app_frobber_call_hello_world() ເພື່ອຮຽກຮ້ອງ
net.Corp.MyApp.Frobber.HelloWorld() ວິທີການ D-Bus, ເຊື່ອມຕໍ່ກັບ ::ແຈ້ງການ
GObject ສັນຍານທີ່ຈະໄດ້ຮັບ net.Corp.MyApp.Frobber::ແຈ້ງການ ສັນຍານ D-Bus ແລະຮັບ/ຕັ້ງ
ໄດ້ net.Corp.MyApp.Frobber:Verbose D-Bus Property ໂດຍໃຊ້ຄຸນສົມບັດ GObject
: ຄຳເວົ້າ ຫຼື my_app_get_verbose() ແລະ my_app_set_verbose() ວິທີການ. ໃຊ້ມາດຕະຖານ
#GObject::ແຈ້ງສັນຍານເພື່ອຟັງການປ່ຽນແປງຊັບສິນ.
ໃຫ້ສັງເກດວ່າການເຂົ້າເຖິງຊັບສິນທັງຫມົດແມ່ນຜ່ານ cache ຊັບສິນຂອງ #GDBusProxy ດັ່ງນັ້ນບໍ່ມີ I/O ເຄີຍເຮັດ
ເມື່ອອ່ານຄຸນສົມບັດ. ໃຫ້ສັງເກດວ່າການກໍານົດຊັບສິນຈະເຮັດໃຫ້ເກີດການ
org.freedesktop.DBus.Properties.Set[8] ວິທີການທີ່ຈະໄດ້ຮັບການເອີ້ນໃນວັດຖຸຫ່າງໄກສອກຫຼີກ. ນີ້
ຢ່າງໃດກໍຕາມ, ການໂທແມ່ນ asynchronous ດັ່ງນັ້ນການຕັ້ງຄ່າຄຸນສົມບັດຈະບໍ່ຂັດຂວາງ. ນອກຈາກນັ້ນ, ການປ່ຽນແປງແມ່ນ
ຊັກຊ້າແລະບໍ່ມີການກວດສອບຄວາມຜິດພາດທີ່ເປັນໄປໄດ້.
ດ້ານເຊີບເວີ ການນໍາໃຊ້
ສ້າງຂຶ້ນ MyAppFrobber ການໂຕ້ຕອບໄດ້ຖືກອອກແບບເພື່ອໃຫ້ມັນງ່າຍທີ່ຈະປະຕິບັດມັນຢູ່ໃນ a
#ຊັ້ນຍ່ອຍ GObject. ຕົວຢ່າງ, ເພື່ອຈັດການ ສະບາຍດີຊາວໂລກ() ວິທີການ invocations, ກໍານົດ vfunc
ສໍາລັບການ handle_hello_hello_world() ໃນ MyAppFrobberIface ໂຄງສ້າງ. ຄ້າຍຄືກັນ, ເພື່ອຈັດການ
net.Corp.MyApp.Frobber:Verbose ຊັບສິນ override ໄດ້ : ຄຳເວົ້າ #Gobject ຊັບສິນຈາກ
ຊັ້ນຍ່ອຍ. ເພື່ອປ່ອຍສັນຍານ, ໃຊ້ຕົວຢ່າງ my_app_emit_signal() ຫຼື g_signal_emit_by_name().
ແທນທີ່ຈະຈັດປະເພດຍ່ອຍ, ມັນມັກຈະງ່າຍຕໍ່ການໃຊ້ສິ່ງທີ່ສ້າງຂຶ້ນ MyAppFrobberSkeleton
ຊັ້ນຍ່ອຍ. ເພື່ອຈັດການສາຍໂທເຂົ້າ, ໃຫ້ໃຊ້ g_signal_connect() ກັບ :: handle-*
ສັນຍານແລະແທນທີ່ຈະ overriding #GObject 's get_property() ແລະ set_property() vfuncs,
ໃຊ້ g_object_get() ແລະ g_object_set() ຫຼືຄຸນສົມບັດທີ່ສ້າງຂຶ້ນ getters ແລະ setters (the
ຊັ້ນຮຽນທີ່ສ້າງຂຶ້ນມີການປະຕິບັດຖົງຊັບສິນພາຍໃນ).
gboolean ຄົງທີ່
on_handle_hello_world (MyAppFrobber *ການໂຕ້ຕອບ,
GDBusMethodInvocation *ການຮຽກຮ້ອງ,
const gchar *ທັກທາຍ,
gpointer user_data)
{
ຖ້າ (g_strcmp0 (ທັກທາຍ, "Boo") != 0)
{
gchar *ຕອບສະຫນອງ;
response = g_strdup_printf("Word! ເຈົ້າເວົ້າວ່າ `%s'.", ທັກທາຍ);
my_app_complete_hello_world (ການໂຕ້ຕອບ, ການຮຽກຮ້ອງ, ການຕອບສະໜອງ);
g_free (ຕອບສະຫນອງ);
}
ອື່ນ
{
g_dbus_method_invocation_return_error (ການຮຽກຮ້ອງ,
MY_APP_ERROR,
MY_APP_ERROR_NO_WHINING,
"Hey, %s, ຈະບໍ່ສຽງດັງ!",
g_dbus_method_invocation_get_sender (invocation));
}
ກັບຄືນຈິງ;
}
[ ... ]
interface = my_app_frobber_skeleton_new ();
my_app_frobber_set_verbose (ການໂຕ້ຕອບ, TRUE);
g_signal_connect (ການໂຕ້ຕອບ,
"ຈັດການ-ສະບາຍດີ-ໂລກ",
G_CALLBACK (on_handle_hello_world),
some_user_data);
[ ... ]
error = NULL;
ຖ້າ (!g_dbus_interface_skeleton_export (G_DBUS_INTERFACE_SKELETON (ການໂຕ້ຕອບ),
ການເຊື່ອມຕໍ່,
"/path/of/dbus_object",
&ຜິດພາດ))
{
/* ການຈັດການຄວາມຜິດພາດ */
}
ເພື່ອອຳນວຍຄວາມສະດວກໃຫ້ບັນດາການປ່ຽນແປງຂອງປະລໍາມະນູ (ຫຼາຍຄຸນສົມບັດທີ່ປ່ຽນໄປໃນເວລາດຽວກັນ),
#GObject::ສັນຍານແຈ້ງເຕືອນຖືກຈັດຄິວຂຶ້ນເມື່ອໄດ້ຮັບ. ແຖວຖືກລະບາຍໃນບ່ອນຫວ່າງ
handler (ເຊິ່ງເອີ້ນວ່າຈາກ thread-default loop main ຂອງ thread ບ່ອນທີ່
ວັດຖຸ skeleton ໄດ້ກໍ່ສ້າງ) ແລະຈະເຮັດໃຫ້ເກີດການປ່ອຍອາຍພິດຂອງ
org.freedesktop.DBus.Properties::PropertiesChanged[8] ສັນຍານທີ່ມີຄຸນສົມບັດທັງຫມົດທີ່
ມີການປ່ຽນແປງ. ໃຊ້ g_dbus_interface_skeleton_flush() ຫຼື g_dbus_object_skeleton_flush() ເພື່ອ
ຫວ່າງຄິວທັນທີ. ໃຊ້ g_object_freeze_notify() ແລະ g_object_thaw_notify() ສໍາລັບ
ການປ່ຽນແປງປະລໍາມະນູຖ້າຫາກວ່າຢູ່ໃນຫົວຂໍ້ທີ່ແຕກຕ່າງກັນ.
C TYPE MAPPING
ປະເພດ Scalar (type-strings 'b', 'y', 'n', 'q', 'i', 'u', 'x', 't' ແລະ 'd') ), strings
(type-strings 's', 'ay', 'o' ແລະ 'g') ແລະ array ຂອງ string (type-strings 'as', 'ao' ແລະ
'aay') ຖືກສ້າງແຜນທີ່ເປັນປະເພດທໍາມະຊາດ, ເຊັ່ນ: #gboolean, #gdouble, #gint, gchar*, gchar**
ແລະອື່ນໆ. ທຸກສິ່ງທຸກຢ່າງອື່ນແມ່ນເຮັດແຜນທີ່ເປັນປະເພດ #GVariant.
ແຜນທີ່ອັດຕະໂນມັດນີ້ສາມາດຖືກປິດໄດ້ໂດຍການໃຊ້ຄໍາບັນຍາຍ
org.gtk.GDBus.C.ForceGVariant - ຖ້າໃຊ້ແລ້ວ #GVariant ຈະຖືກແລກປ່ຽນສະເໝີແທນ.
ປະເພດ C native ທີ່ສອດຄ້ອງກັນ. ຄໍາບັນຍາຍນີ້ອາດຈະສະດວກໃນການນໍາໃຊ້ໃນເວລາທີ່ການນໍາໃຊ້
bytestrings (type-string 'ay') ສໍາລັບຂໍ້ມູນທີ່ສາມາດຝັງ NUL bytes.
STABILITY ຮັບປະກັນ
ຟັງຊັນ C ທີ່ສ້າງຂຶ້ນແມ່ນຮັບປະກັນວ່າຈະບໍ່ປ່ຽນແປງ ABI ຂອງພວກເຂົາ, ນັ້ນແມ່ນ, ຖ້າວິທີການ,
ສັນຍານຫຼືຊັບສິນບໍ່ໄດ້ມີການປ່ຽນແປງລາຍເຊັນຂອງຕົນໃນ introspection XML, C ທີ່ຜະລິດໄດ້
ຟັງຊັນຈະບໍ່ປ່ຽນແປງ C ABI ຂອງມັນຄືກັນ. ABI ຂອງຕົວຢ່າງ ແລະຊັ້ນຮຽນທີ່ສ້າງຂຶ້ນ
ໂຄງສ້າງຈະຖືກຮັກສາໄວ້ເຊັ່ນດຽວກັນ.
ABI ຂອງ #GType s ທີ່ສ້າງຂຶ້ນຈະຖືກຮັກສາໄວ້ພຽງແຕ່ຖ້າ org.gtk.GDBus.Since
ຄໍາບັນຍາຍຖືກນໍາໃຊ້ຢ່າງສົມເຫດສົມຜົນ - ນີ້ແມ່ນຍ້ອນວ່າ VTable ສໍາລັບ # GIinterface ອີງໃສ່
ຕົວຊີ້ຟັງຊັນສໍາລັບຕົວຈັດການສັນຍານ. ໂດຍສະເພາະ, ຖ້າວິທີການ D-Bus, ຊັບສິນຫຼື
ສັນຍານຫຼືຖືກເພີ່ມເຂົ້າໃນການໂຕ້ຕອບ D-Bus, ຫຼັງຈາກນັ້ນ ABI ຂອງປະເພດ #GIinterface ທີ່ສ້າງຂຶ້ນແມ່ນ
ເກັບຮັກສາໄວ້ຖ້າຫາກວ່າ, ແລະພຽງແຕ່ຖ້າຫາກວ່າ, ແຕ່ລະວິທີການເພີ່ມ, ສັນຍານຊັບສິນແມ່ນ annotated ກັບເຂົາເຈົ້າ
org.gtk.GDBus.ນັບຕັ້ງແຕ່ annotation ໂດຍໃຊ້ຕົວເລກສະບັບທີ່ໃຫຍ່ກວ່າສະບັບທີ່ຜ່ານມາ.
ລະຫັດ C ທີ່ຖືກສ້າງຂື້ນໃນປັດຈຸບັນຈະມີການບັນຍາຍດ້ວຍ gtk-doc[5] / GObject
ການກວດກາ[9] ຄໍາຄິດເຫັນ / ຄໍາບັນຍາຍ. ຮູບແບບແລະເນື້ອໃນອາດຈະມີການປ່ຽນແປງໃນ
ໃນອະນາຄົດ, ດັ່ງນັ້ນບໍ່ມີການຮັບປະກັນກ່ຽວກັບການນໍາໃຊ້ SECTION ແລະອື່ນໆ.
ໃນຂະນະທີ່ Docbook ທີ່ສ້າງຂຶ້ນສໍາລັບການໂຕ້ຕອບ D-Bus ຄາດວ່າຈະບໍ່ປ່ຽນແປງ, ບໍ່ມີການຮັບປະກັນ
ແມ່ນໃຫ້ຢູ່ໃນຈຸດນີ້.
ມັນເປັນສິ່ງສໍາຄັນທີ່ຈະສັງເກດວ່າລະຫັດທີ່ສ້າງຂຶ້ນບໍ່ຄວນຖືກກວດສອບໃນການແກ້ໄຂ
ລະບົບການຄວບຄຸມ, ຫຼືມັນຄວນຈະຖືກລວມເຂົ້າໃນການເກັບມ້ຽນແຫຼ່ງແຈກຢາຍ.
ໃຊ້ gdbus-codegen ອອນໄລນ໌ໂດຍໃຊ້ບໍລິການ onworks.net