Ubuntu Online, Fedora Online, Windows 온라인 에뮬레이터 또는 MAC OS 온라인 에뮬레이터와 같은 여러 무료 온라인 워크스테이션 중 하나를 사용하여 OnWorks 무료 호스팅 공급자에서 실행할 수 있는 gdbus-codegen 명령입니다.
프로그램:
이름
gdbus-codegen - D-Bus 코드 및 문서 생성기
개요
gdbus-codegen [-h, --도움] [--인터페이스 접두사 org.project.접두사]
[--생성-c-코드 아웃파일] [--c-네임스페이스 당신의 프로젝트]
[--c-생성-객체-관리자] [--generate-docbook 아웃파일]
[--xml 파일 FILE] [--주석 요소라는 KEY VALUE]... 파일 [파일...]
기술
gdbus-codegen 하나 이상의 D-Bus에 대한 코드 및/또는 문서를 생성하는 데 사용됩니다.
인터페이스. 도구 읽기 D- 버스 내성 XML[1] 파일을 만들고 출력 파일을 생성합니다.
이 도구는 현재 C 코드 생성을 지원합니다(통해 --생성-c-코드) 및 Docbook XML(통해
--generate-docbook).
생성 중 C CODE
C 코드를 생성할 때 각 D-Bus 인터페이스에 대해 #GInterface 파생 유형이 생성됩니다.
또한 생성된 모든 유형에 대해 푸바, 두 가지 구체적인 인스턴스화 유형,
푸바프록시 그리고 FooBar스켈레톤, 상기 인터페이스를 구현하는 것도 생성됩니다. 전자
#GDBusProxy에서 파생되며 클라이언트 측에서 사용하기 위한 것입니다.
#GDBusInterfaceSkeleton 유형에서 파생되어 쉽게 내보낼 수 있습니다.
직접 또는 #GDBusObjectManagerServer 인스턴스를 통해 #GDBusConnection.
생성된 각 C 유형의 이름은 D-Bus 인터페이스 이름에서 파생됩니다.
주어진 접두사 --인터페이스 접두사 점이 제거되고 초기 문자가 있는 상태에서
대문자. 예를 들어, D-Bus 인터페이스 com.acme.Coyote의 경우 사용되는 이름은 다음과 같습니다.
ComAcmeCoyote. D-Bus 인터페이스 org.project.Bar.Frobnicator의 경우 --인터페이스 접두사
org.project., 사용된 이름은 BarFrobnicator입니다.
메서드, 신호 및 속성의 경우 지정하지 않으면 이름은 기본적으로 다음 이름으로 지정됩니다.
방법, 신호 또는 속성.
CamelCase 형식과 소문자 형식의 두 가지 이름 형식이 사용됩니다. 낙타 케이스
형식은 #GType 및 구조체 이름에 사용되는 반면 소문자 형식은 함수에 사용됩니다.
이름. 소문자 형식은 CamelCase에서 소문자로 변환하여 계산하고
단어 경계에 밑줄 삽입(특정 휴리스틱 사용).
org.gtk.GDBus.C.Name 주석 또는 --c-네임스페이스 option
밑줄을 포함합니다(때로는 Ugly_Case), 그러면 카멜 케이스 이름이 파생됩니다.
모든 밑줄을 제거하고 소문자 이름은
끈. 이는 약어가 사용되는 일부 상황에서 유용합니다. 예를 들어,
주석은 net.MyCorp.MyApp.iSCSITarget 인터페이스에서 다음 값으로 사용됩니다.
iSCSI_Target CamelCase 형식은 iSCSITarget이고 소문자 형식은 iscsi_target입니다.
주석이 Eject_The_iPod 값이 있는 EjectTheiPod 메서드에서 사용되는 경우
소문자 형식은ject_the_ipod입니다.
생성 중 닥북 사용 설명서
생성된 각 Docbook XML 파일( --generate-docbook 세부 옵션)은
참조 항목[2] D-Bus 인터페이스를 설명하는 문서.
옵션
다음 옵션이 지원됩니다.
-h, --도움
도움말을 표시하고 종료합니다.
--xml 파일 FILE
D-Bus 인트로스펙션 XML 파일.
--인터페이스 접두사 org.project.접두사.
유형 이름을 계산할 때 모든 D-Bus 인터페이스 이름에서 제거하기 위한 접두사
C 바인딩과 Docbook 종류 속성[3].
--generate-docbook 아웃파일
각 D-Bus 인터페이스에 대한 Docbook Documentation 생성 및 넣기
OUTFILES-NAME.xml 여기서 NAME은 인터페이스 이름에 대한 자리 표시자입니다. 예:
net.Corp.FooBar 등.
--생성-c-코드 아웃파일
모든 D-Bus 인터페이스에 대한 C 코드를 생성하고 OUTFILES.c 및 OUTFILES.h에 넣습니다.
--c-네임스페이스 당신의 프로젝트
생성된 C 코드에 사용할 네임스페이스입니다. 이 될 것으로 예상됩니다 낙타 케이스[4] 또는
Ugly_Case (위 참조).
--c-생성-객체-관리자
이 옵션이 전달되면 적합한 #GDBusObject, #GDBusObjectProxy,
#GDBusObjectSkeleton 및 #GDBusObjectManagerClient 하위 클래스가 생성됩니다.
--주석 요소라는 KEY VALUE
주어진 XML 파일에 D-Bus 주석을 삽입하는 데 사용됩니다. 함께 사용할 수 있습니다.
다음과 같은 방식으로 인터페이스, 메서드, 신호, 속성 및 인수:
gdbus-codegen --c-namespace MyApp \
--generate-c-code myapp 생성 \
--"org.project.InterfaceName"에 주석 달기 \
org.gtk.GDBus.C.이름 MyFrobnicator \
--annotate "org.project.InterfaceName:Property" \
바 배트 \
--annotate "org.project.InterfaceName.Method()" \
org.freedesktop.DBus.Deprecated 참 \
--annotate "org.project.InterfaceName.Method()[arg_name]" \
뱀 히스 \
--annotate "org.project.InterfaceName::Signal" \
고양이 야옹 \
--annotate "org.project.InterfaceName::Signal[arg_name]" \
개 와프 \
myapp-dbus-interfaces.xml
모든 UTF-8 문자열을 다음에 사용할 수 있습니다. KEY 그리고 VALUE.
지원 디버스 주석
다음 D-Bus 주석은 다음에서 지원됩니다. gdbus-codegen:
org.freedesktop.DBus.더 이상 사용되지 않음
어느 곳에서나 사용할 수 있습니다. , , 그리고 지정할 요소
값이 true이면 요소가 더 이상 사용되지 않습니다. 참고로 이 주석은
에 정의 D- 버스 명세서[1] true 및 false 값만 가정할 수 있습니다.
특히 요소가 더 이상 사용되지 않는 버전을 지정할 수 없으며
유용한 지원 중단 메시지. 이러한 정보는 요소에 추가되어야 합니다.
대신 문서.
C 코드를 생성할 때 이 주석은 생성된 코드에 #G_GNUC_DEPRECATED를 추가하는 데 사용됩니다.
요소에 대한 기능.
Docbook XML을 생성할 때 문서와 함께 지원 중단 경고가 표시됩니다.
요소.
org.gtk.GDBus.Since
어느 곳에서나 사용할 수 있습니다. , , 그리고 지정할 요소
버전(자유 형식 문자열이지만 버전 인식 정렬 기능을 사용하여 비교됨)
에 등장한 요소.
C 코드를 생성할 때 이 필드는 함수 포인터 순서를 보장하는 데 사용됩니다.
ABI/API를 보존하려면 "안정성 보장" 섹션을 참조하십시오.
Docbook XML을 생성할 때 이 태그의 값이 설명서에 나타납니다.
org.gtk.GDBus.DocString
문서화를 위한 Docbook 콘텐츠가 포함된 문자열. 이 주석은 다음에 사용할 수 있습니다.
, , , 그리고 강요.
org.gtk.GDBus.DocString.Short
짧은/간단한 문서를 위한 Docbook 콘텐츠가 포함된 문자열입니다. 이 주석은
~에 사용하다 강요.
org.gtk.GDBus.C.이름
어느 곳에서나 사용할 수 있습니다. , , 그리고 지정할 요소
C 코드를 생성할 때 사용할 이름입니다. 값은 다음과 같을 것으로 예상됩니다. 낙타 케이스[4] 또는
Ugly_Case (위 참조).
org.gtk.GDBus.C.ForceGVariant
비어 있지 않은 문자열로 설정하면 자연스러운 #GVariant 인스턴스 대신 사용됩니다.
C타입. 이 주석은 모든 그리고 요소.
org.gtk.GDBus.C.UnixFD
비어 있지 않은 문자열로 설정하면 생성된 코드에 교환할 매개변수가 포함됩니다.
#GUnixFDList 유형을 사용하는 파일 설명자. 이 주석은 다음에 사용할 수 있습니다.
집단.
org.gtk.GDBus.DocString 주석을 사용하는 것보다 더 쉬운 대안으로 파서
에 의해 사용되는 gdbus-codegen 다음과 유사한 방식으로 XML 주석을 구문 분석합니다. gtk 문서[5] :
@since는 모든 인라인 문서 비트(예: 인터페이스,
메서드, 신호 및 속성) org.gtk.GDBus.Since 주석을 설정합니다. 을 위해
org.gtk.GDBus.DocString 주석(및 인라인 주석), 형식의 하위 문자열에 유의하십시오.
#net.Corp.Bar, net.Corp.Bar.FooMethod(), #net.Corp.Bar::BarSignal 및
#net.Corp.InlineDocs:BazProperty는 모두 해당 인터페이스에 대한 링크로 확장됩니다.
방법, 신호 및 속성. 또한 @ 및 % 문자로 시작하는 하위 문자열은
로 렌더링 매개 변수[6] 및 상수[7] 각각.
XML 주석과 org.gtk.GDBus.DocString 또는 org.gtk.GDBus.DocString.Short
주석이 있으면 후자가 이깁니다.
예
다음 D-Bus Introspection XML을 고려하십시오.
If gdbus-codegen 이 파일에서 다음과 같이 사용됩니다.
gdbus-codegen --generate-c-code myapp 생성 \
--c-네임스페이스 MyApp \
--인터페이스 접두사 net.corp.MyApp. \
net.Corp.MyApp.Frobber.xml
myapp-generated.[ch]라는 두 개의 파일이 생성됩니다. 파일은 초록을 제공합니다
#GTypeInterface - 파생 유형 호출 MyAppFrobber 뿐만 아니라 두 가지 인스턴스화 가능한 유형
같은 이름이지만 대리 그리고 해골. 생성된 파일에는 대략 다음이 포함됩니다.
다음 시설:
/* 생성된 세 가지 유형에 대한 GType 매크로 */
#define MY_APP_TYPE_FROBBER(my_app_frobber_get_type())
#define MY_APP_TYPE_FROBBER_SKELETON(my_app_frobber_skeleton_get_type())
#define MY_APP_TYPE_FROBBER_PROXY(my_app_frobber_proxy_get_type())
typedef 구조체 _MyAppFrobber MyAppFrobber; /* 더미 typedef */
형식 정의 구조체
{
GTypeInterface parent_iface;
/* ::notification 시그널을 위한 시그널 핸들러 */
무효(*알림)(MyAppFrobber *프록시,
GVariant *icon_blob,
긴트 높이,
const gchar* const *메시지);
/* ::handle-hello-world 신호에 대한 신호 처리기 */
gboolean (*handle_hello_world) (MyAppFrobber *프록시,
GDBusMethodInvocation *호출,
const gchar *인사);
} MyAppFrobberIface;
/* 비동기적으로 HelloWorld() 호출 */
무효화
my_app_frobber_call_hello_world(MyAppFrobber *프록시,
const gchar *인사,
GCancellable *취소 가능,
GAsyncReadyCallback 콜백,
gpointer 사용자_데이터);
부울
my_app_frobber_call_hello_world_finish(MyAppFrobber *프록시,
gchar **out_response,
GAsyncResult *res,
G오류 **오류);
/* 동기적으로 HelloWorld()를 호출합니다. 스레드 호출을 차단합니다. */
부울
my_app_frobber_call_hello_world_sync(MyAppFrobber *프록시,
const gchar *인사,
gchar **out_response,
GCancellable *취소 가능,
G오류 **오류);
/* HelloWorld() 메서드 호출 처리 완료 */
무효화
my_app_frobber_complete_hello_world(MyAppFrobber *개체,
GDBusMethodInvocation *호출,
const gchar *응답);
/* ::notification 시그널 방출 / Notification() D-Bus 시그널 */
무효화
my_app_frobber_emit_notification(MyAppFrobber *개체,
GVariant *icon_blob,
긴트 높이,
const gchar* const *메시지);
/* :verbose GObject 속성 / Verbose D-Bus 속성을 가져옵니다.
* 블로킹 I/O가 없습니다.
*/
gboolean my_app_frobber_get_verbose(MyAppFrobber *객체);
/* :verbose GObject 속성 / Verbose D-Bus 속성을 설정합니다.
* 블로킹 I/O가 없습니다.
*/
void my_app_frobber_set_verbose(MyAppFrobber *개체,
gboolean 값);
/* 인터페이스 정보 얻기 */
GDBusInterfaceInfo *my_app_frobber_interface_info(무효);
/* 내보낼 준비가 된 새로운 스켈레톤 객체 생성 */
MyAppFrobber *my_app_frobber_skeleton_new(무효);
/* 클라이언트 측 프록시 생성자.
*
* 추가로 _new_for_bus(), _new_for_bus_finish() 및
* _new_for_bus_sync() 프록시 생성자도 생성됩니다.
*/
무효화
my_app_frobber_proxy_new(GDBusConnection *연결,
GDBusProxyFlags 플래그,
const gchar *이름,
const gchar *object_path,
GCancellable *취소 가능,
GAsyncReadyCallback 콜백,
gpointer 사용자_데이터);
MyAppFrobber *
my_app_frobber_proxy_new_finish(GAsyncResult *res,
G오류 **오류);
MyAppFrobber *
my_app_frobber_proxy_new_sync(GDBusConnection *연결,
GDBusProxyFlags 플래그,
const gchar *이름,
const gchar *object_path,
GCancellable *취소 가능,
G오류 **오류);
따라서 모든 D-Bus 메서드에 대해 메서드를 호출하기 위한 XNUMX개의 C 함수가 있습니다.
들어오는 호출을 처리하기 위한 #GObject 신호 및 호출을 완료하기 위한 하나의 C 함수
수신 전화. 모든 D-Bus 신호에는 하나의 #GObject 신호와 하나의 C 함수가 있습니다.
그것을 방출. 모든 D-Bus 속성에 대해 두 개의 C 함수가 생성됩니다(세터 하나,
getter) 및 하나의 #GObject 속성. 다음 표는 생성된 시설을 요약한 것입니다.
적용 가능한 경우:
┌────────────────────┬───────────────────────┬─ ─────────────────────────────┐
│ │ Client │ 서버 │
├─────────────────────┼───────────────────────┼─ ─────────────────────────────┤
│종류 │ 용도 MyAppFrobber프록시 │ 모든 유형 구현 │
│ │ │ MyAppFrobber │
│ │ │ 인터페이스 │
├─────────────────────┼───────────────────────┼─ ─────────────────────────────┤
│방법 │ 용도 m_a_f_hello_world() │ │를 통해 수신
│ │ 전화를 겁니다. │ 핸들_hello_world() │
│ │ │ 신호 처리기. 완료 │
│ │ │ │와의 통화
│ │ │ m_a_f_complete_hello_world() │
├─────────────────────┼───────────────────────┼─ ─────────────────────────────┤
│신호 │ 연결 │ 사용 │
│ │ ::공고 G객체 │ m_a_f_emit_notification() │에
│ │ 신호. │ 신호를 방출합니다. │
├─────────────────────┼───────────────────────┼─ ─────────────────────────────┤
│속성(읽기) │ 용도 m_a_f_get_verbose() │ #GObject의 구현 │
│ │ 또는 :말 수가 많은. │ get_property() vfunc. │
├─────────────────────┼───────────────────────┼─ ─────────────────────────────┤
│속성(쓰기) │ 용도 m_a_f_set_verbose() │ #GObject의 구현 │
│ │ 또는 :말 수가 많은. │ set_property() vfunc. │
└─────────────────────┴───────────────────────┴─ ─────────────────────────────┘
고객 입장에서 용법
생성된 생성자와 함께 생성된 프록시 유형을 사용할 수 있습니다.
MyAppFrobber *프록시;
GError *오류;
오류 = NULL;
프록시 = my_app_frobber_proxy_new_for_bus_sync(
G_BUS_TYPE_SESSION,
G_DBUS_PROXY_FLAGS_NONE,
"net.Corp.MyApp", /* 버스 이름 */
"/net/Corp/MyApp/SomeFrobber", /* 개체 */
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 신호 및 get/set
전에, net.Corp.MyApp.Frobber:상세 GObject 속성을 사용하는 D-Bus 속성
:말 수가 많은 또는 my_app_get_verbose() 그리고 my_app_set_verbose() 행동 양식. 표준 사용
#GObject::notify 신호를 통해 속성 변경을 수신합니다.
모든 속성 액세스는 #GDBusProxy 의 속성 캐시를 통해 이루어지므로 I/O가 수행되지 않습니다.
속성을 읽을 때. 또한 속성을 설정하면
org.freedesktop.DBus.Properties.Set[8] 원격 개체에서 호출되는 메서드입니다. 이것
그러나 호출은 비동기식이므로 속성 설정이 차단되지 않습니다. 나아가 변화는
지연되고 오류 검사가 불가능합니다.
서버 측 용법
생성 된 MyAppFrobber 인터페이스는 쉽게 구현할 수 있도록 설계되었습니다.
#GObject 하위 클래스. 예를 들어 처리하려면 헬로월드() 메서드 호출, vfunc 설정
을 통한 핸들_hello_hello_world() 인간을 MyAppFrobberIface 구조. 유사하게,
net.Corp.MyApp.Frobber:상세 속성 재정의 :말 수가 많은 #GObject 속성의
아강. 신호를 내보내려면 예를 들어 사용하십시오. my_app_emit_signal() 또는 g_signal_emit_by_name().
서브클래싱 대신 생성된 클래스를 사용하는 것이 더 쉬운 경우가 많습니다. MyAppFrobber해골
아강. 들어오는 메소드 호출을 처리하려면 다음을 사용하십시오. g_signal_connect() 와 더불어 ::핸들-*
신호를 무시하고 #GObject 를 재정의하는 대신 get_property() 그리고 set_property() v펑크,
g_object_get() 및 g_object_set() 또는 생성된 속성 게터 및 세터(
생성된 클래스에는 내부 속성 모음 구현이 있습니다).
정적 gboolean
on_handle_hello_world(MyAppFrobber *인터페이스,
GDBusMethodInvocation *호출,
const gchar *인사,
gpointer 사용자 데이터)
{
if (g_strcmp0 (인사, "부") != 0)
{
gchar *응답;
response = g_strdup_printf("말씀! `%s'라고 하셨습니다.", 인사말);
my_app_complete_hello_world(인터페이스, 호출, 응답);
g_free(응답);
}
그렇지 않으면
{
g_dbus_method_invocation_return_error(호출,
내_앱_오류,
MY_APP_ERROR_NO_WHINING,
"이봐, %s, 징징대지 않을거야!",
g_dbus_method_invocation_get_sender(호출));
}
TRUE를 반환;
}
[...]
인터페이스 = my_app_frobber_skeleton_new();
my_app_frobber_set_verbose(인터페이스, 참);
g_signal_connect(인터페이스,
"handle-hello-world",
G_CALLBACK(on_handle_hello_world),
some_user_data);
[...]
오류 = NULL;
if (!g_dbus_interface_skeleton_export(G_DBUS_INTERFACE_SKELETON(인터페이스),
연결,
"/path/of/dbus_object",
&오류))
{
/* 오류 처리 */
}
원자적 변경 집합(동시에 변경되는 여러 속성)을 용이하게 하려면
#GObject::notify 신호는 수신될 때 대기합니다. 대기열이 유휴 상태에서 소모됨
핸들러(이는 스레드의 스레드 기본 메인 루프에서 호출됩니다.
스켈레톤 개체가 구성됨)의 방출을 유발합니다.
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 매핑
스칼라 유형(유형 문자열 'b', 'y', 'n', 'q', 'i', 'u', 'x', 't' 및 'd'), 문자열
(유형 문자열 's', 'ay', 'o' 및 'g') 및 문자열 배열(유형 문자열 'as', 'ao' 및
'aay')는 #gboolean, #gdouble, #gint, gchar*, gchar**와 같은 자연스러운 유형에 매핑됩니다.
등등. 다른 모든 것은 #GVariant 유형에 매핑됩니다.
이 자동 매핑은 주석을 사용하여 끌 수 있습니다.
org.gtk.GDBus.C.ForceGVariant - 사용되는 경우 #GVariant는 항상 대신 교환됩니다.
해당 네이티브 C 유형. 이 주석은 다음을 사용할 때 편리할 수 있습니다.
포함된 NUL 바이트를 가질 수 있는 데이터에 대한 bytestrings(type-string 'ay').
안정성 보장
생성된 C 함수는 ABI를 변경하지 않도록 보장됩니다.
신호 또는 속성은 인트로스펙션 XML, 생성된 C에서 서명을 변경하지 않습니다.
함수는 C ABI도 변경하지 않습니다. 생성된 인스턴스 및 클래스의 ABI
구조도 보존됩니다.
생성된 #GType 의 ABI는 org.gtk.GDBus.Since
주석은 신중하게 사용됩니다. 이는 #GInterface의 VTable이 다음에 의존하기 때문입니다.
시그널 핸들러를 위한 함수 포인터. 특히, D-Bus 방법, 속성 또는
신호 또는 D-Bus 인터페이스에 추가되면 생성된 #GInterface 유형의 ABI는
추가된 각 메서드, 속성 신호에 다음과 같은 주석이 추가된 경우에만 보존됩니다.
org.gtk.GDBus.Since 주석은 이전 버전보다 더 큰 버전 번호를 사용합니다.
생성된 C 코드는 현재 gtk 문서[5] / G객체
내성[9] 댓글/주석. 레이아웃 및 내용은 변경될 수 있습니다.
미래이므로 예를 들어 SECTION 사용 등에 대한 보장은 제공되지 않습니다.
생성된 Docbook for D-Bus 인터페이스는 변경되지 않을 것으로 예상되지만 보장되지는 않습니다.
이 시점에서 주어진다.
생성된 코드를 개정판에 체크인해서는 안 된다는 점에 유의하는 것이 중요합니다.
제어 시스템이나 분산 소스 아카이브에 포함되어서는 안 됩니다.
onworks.net 서비스를 사용하여 gdbus-codegen 온라인 사용