librpc
connection.h
Go to the documentation of this file.
1 /*
2  * Copyright 2015-2017 Two Pore Guys, Inc.
3  * All rights reserved
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted providing that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  * notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  * notice, this list of conditions and the following disclaimer in the
12  * documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
15  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
16  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17  * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
18  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
22  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
23  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
24  * POSSIBILITY OF SUCH DAMAGE.
25  *
26  */
27 
28 #ifndef LIBRPC_CONNECTION_H
29 #define LIBRPC_CONNECTION_H
30 
31 #include <Block.h>
32 #include <sys/time.h>
33 #include <rpc/config.h>
34 #include <rpc/object.h>
35 #ifdef ENABLE_LIBDISPATCH
36 #include <dispatch/dispatch.h>
37 #endif
38 
45 #ifdef __cplusplus
46 extern "C" {
47 #endif
48 
49 struct rpc_context;
50 struct rpc_connection;
51 struct rpc_call;
52 
56 typedef enum rpc_error_code
57 {
67 
71 typedef enum rpc_call_status
72 {
81 
85 typedef enum rpc_call_type
86 {
90 
94 typedef struct rpc_connection *rpc_connection_t;
95 
99 typedef struct rpc_call *rpc_call_t;
100 
104 typedef void (^rpc_handler_t)(const char *_Nullable path,
105  const char *_Nullable interface, const char *_Nonnull name,
106  _Nonnull rpc_object_t args);
107 
111 typedef void (^rpc_property_handler_t)(_Nonnull rpc_object_t value);
112 
116 typedef void (^rpc_error_handler_t)(rpc_error_code_t code,
117  _Nullable rpc_object_t args);
118 
122 typedef int (^rpc_raw_handler_t)(const void *_Nonnull msg, size_t len,
123  const int *_Nullable fds, size_t nfds);
124 
128 typedef bool (^rpc_callback_t)(_Nonnull rpc_call_t call);
129 
133 #define RPC_HANDLER(_fn, _arg) \
134  ^(const char *_path, const char *_iface, const char *_name, \
135  rpc_object_t _args) { \
136  _fn(_arg, _path, _iface, _name, _args); \
137  }
138 
142 #define RPC_PROPERTY_HANDLER(_fn, _arg) \
143  ^(rpc_object_t _value) { \
144  _fn(_arg, _value); \
145  }
146 
150 #define RPC_ERROR_HANDLER(_fn, _arg) \
151  ^(rpc_error_code_t _code, rpc_object_t _args) { \
152  _fn(_arg, _code, _args); \
153  }
154 
158 #define RPC_RAW_HANDLER(_fn, _arg) \
159  ^(const void *_msg, size_t _len, const int *_fds, size_t _nfd) {\
160  return (_fn(_arg, _msg, _len, _fds, _nfd)); \
161  }
162 
166 #define RPC_CALLBACK(_fn, _arg) \
167  ^(rpc_object_t _args, rpc_call_status_t _status) { \
168  return ((bool)_fn(_arg, _args, _status)); \
169  }
170 
174 #define RPC_NULL_FORMAT "[]"
175 
183 _Nullable rpc_connection_t rpc_connection_create(void *_Nonnull cookie,
184  _Nullable rpc_object_t params);
185 
192 int rpc_connection_close(_Nonnull rpc_connection_t conn);
193 
200 struct rpc_context *_Nullable rpc_connection_get_context(
201  _Nonnull rpc_connection_t conn);
202 
214 int rpc_connection_set_context(_Nonnull rpc_connection_t conn,
215  struct rpc_context *_Nonnull ctx);
216 
227 bool rpc_connection_is_open(_Nonnull rpc_connection_t conn);
228 
241 bool rpc_connection_is_valid(_Nonnull rpc_connection_t conn);
242 
249 int rpc_connection_get_fd(_Nonnull rpc_connection_t conn);
250 
256 void rpc_connection_free(_Nonnull rpc_connection_t conn);
257 
258 #ifdef ENABLE_LIBDISPATCH
259 
270 int rpc_connection_set_dispatch_queue(_Nonnull rpc_connection_t conn,
271  _Nonnull dispatch_queue_t queue);
272 #endif
273 
288 int rpc_connection_subscribe_event(_Nonnull rpc_connection_t conn,
289  const char *_Nullable path, const char *_Nullable interface,
290  const char *_Nonnull name);
291 
304 int rpc_connection_unsubscribe_event(_Nonnull rpc_connection_t conn,
305  const char *_Nullable path, const char *_Nullable interface,
306  const char *_Nonnull name);
307 
325  _Nonnull rpc_connection_t conn, const char *_Nullable path,
326  const char *_Nullable interface, const char *_Nonnull name,
327  _Nullable rpc_handler_t handler);
328 
341 int rpc_connection_unregister_event_handler(_Nonnull rpc_connection_t conn,
342  void *_Nonnull cookie);
343 
358 _Nullable rpc_object_t rpc_connection_call_sync(_Nonnull rpc_connection_t conn,
359  const char *_Nullable path, const char *_Nullable interface,
360  const char *_Nonnull method, ...);
361 
377 _Nullable rpc_object_t rpc_connection_call_syncv(_Nonnull rpc_connection_t conn,
378  const char *_Nullable path, const char *_Nullable interface,
379  const char *_Nonnull method, va_list ap);
380 
395 _Nullable rpc_object_t rpc_connection_call_syncp(_Nonnull rpc_connection_t conn,
396  const char *_Nullable path, const char *_Nullable interface,
397  const char *_Nonnull method, const char *_Nonnull fmt, ...);
398 
412  _Nonnull rpc_connection_t conn, const char *_Nullable path,
413  const char *_Nullable interface, const char *_Nonnull method,
414  const char *_Nonnull fmt, va_list ap);
415 
433  _Nonnull rpc_connection_t conn, const char *_Nonnull name,
434  const char *_Nonnull fmt, ...);
435 
452 _Nullable rpc_call_t rpc_connection_call(_Nonnull rpc_connection_t conn,
453  const char *_Nullable path, const char *_Nullable interface,
454  const char *_Nonnull name, _Nullable rpc_object_t args,
455  _Nullable rpc_callback_t callback);
456 
466  _Nonnull rpc_connection_t conn, const char *_Nullable path,
467  const char *_Nullable interface, const char *_Nonnull name);
468 
479  _Nonnull rpc_connection_t conn, const char *_Nullable path,
480  const char *_Nullable interface, const char *_Nonnull name,
481  rpc_object_t _Nonnull value);
482 
483 
495  _Nonnull rpc_connection_t conn, const char *_Nullable path,
496  const char *_Nullable interface, const char *_Nonnull name,
497  const char *_Nonnull fmt, ...);
498 
510  _Nonnull rpc_connection_t conn, const char *_Nullable path,
511  const char *_Nullable interface, const char *_Nonnull name,
512  const char *_Nonnull fmt, va_list ap);
513 
523 void *_Nullable rpc_connection_watch_property(
524  _Nonnull rpc_connection_t conn, const char *_Nullable path,
525  const char *_Nullable interface, const char *_Nonnull property,
526  _Nonnull rpc_property_handler_t handler);
527 
536 int rpc_connection_send_event(_Nonnull rpc_connection_t conn,
537  const char *_Nullable path, const char *_Nullable interface,
538  const char *_Nonnull name, _Nonnull rpc_object_t args);
539 
543 int rpc_connection_ping(_Nonnull rpc_connection_t conn);
544 
554 int rpc_connection_send_raw_message(_Nonnull rpc_connection_t conn,
555  const void *_Nonnull msg, size_t len, const int *_Nullable fds,
556  size_t nfds);
557 
564 void rpc_connection_set_raw_message_handler(_Nonnull rpc_connection_t conn,
565  _Nullable rpc_raw_handler_t handler);
566 
573 void rpc_connection_set_event_handler(_Nonnull rpc_connection_t conn,
574  _Nullable rpc_handler_t handler);
575 
582 void rpc_connection_set_error_handler(_Nonnull rpc_connection_t conn,
583  _Nullable rpc_error_handler_t handler);
584 
590 const char *_Nullable rpc_connection_get_remote_address(
591  _Nonnull rpc_connection_t conn);
592 
599 bool rpc_connection_supports_fd_passing(_Nonnull rpc_connection_t conn);
600 
607 bool rpc_connection_supports_credentials(_Nonnull rpc_connection_t conn);
608 
615 bool rpc_connection_has_credentials(_Nonnull rpc_connection_t conn);
616 
623 uid_t rpc_connection_get_remote_uid(_Nonnull rpc_connection_t conn);
624 
630 gid_t rpc_connection_get_remote_gid(_Nonnull rpc_connection_t conn);
631 
637 pid_t rpc_connection_get_remote_pid(_Nonnull rpc_connection_t conn);
638 
645 int rpc_call_wait(_Nonnull rpc_call_t call);
646 
658 int rpc_call_continue(_Nonnull rpc_call_t call, bool sync);
659 
666 int rpc_call_abort(_Nonnull rpc_call_t call);
667 
675 int rpc_call_set_prefetch(_Nonnull rpc_call_t call, size_t nitems);
676 
687 int rpc_call_timedwait(_Nonnull rpc_call_t call,
688  const struct timespec *_Nonnull ts);
689 
696 int rpc_call_success(_Nonnull rpc_call_t call);
697 
705 rpc_call_status_t rpc_call_status(_Nonnull rpc_call_t call);
706 
713 _Nullable rpc_object_t rpc_call_result(_Nonnull rpc_call_t call);
714 
720 void rpc_call_free(_Nonnull rpc_call_t call);
721 
722 #ifdef __cplusplus
723 }
724 #endif
725 
726 #endif /* LIBRPC_CONNECTION_H */
rpc_call_type
Definition: connection.h:85
int rpc_call_timedwait(_Nonnull rpc_call_t call, const struct timespec *_Nonnull ts)
enum rpc_call_status rpc_call_status_t
struct rpc_object * rpc_object_t
Definition: object.h:73
int rpc_connection_set_context(_Nonnull rpc_connection_t conn, struct rpc_context *_Nonnull ctx)
_Nullable rpc_object_t rpc_connection_call_syncv(_Nonnull rpc_connection_t conn, const char *_Nullable path, const char *_Nullable interface, const char *_Nonnull method, va_list ap)
void *_Nullable rpc_connection_watch_property(_Nonnull rpc_connection_t conn, const char *_Nullable path, const char *_Nullable interface, const char *_Nonnull property, _Nonnull rpc_property_handler_t handler)
bool rpc_connection_is_valid(_Nonnull rpc_connection_t conn)
bool rpc_connection_supports_credentials(_Nonnull rpc_connection_t conn)
int rpc_connection_ping(_Nonnull rpc_connection_t conn)
int rpc_call_wait(_Nonnull rpc_call_t call)
int(^ rpc_raw_handler_t)(const void *_Nonnull msg, size_t len, const int *_Nullable fds, size_t nfds)
Definition: connection.h:122
_Nullable rpc_connection_t rpc_connection_create(void *_Nonnull cookie, _Nullable rpc_object_t params)
_Nullable rpc_object_t rpc_connection_call_syncp(_Nonnull rpc_connection_t conn, const char *_Nullable path, const char *_Nullable interface, const char *_Nonnull method, const char *_Nonnull fmt,...)
void rpc_connection_set_error_handler(_Nonnull rpc_connection_t conn, _Nullable rpc_error_handler_t handler)
int rpc_connection_send_event(_Nonnull rpc_connection_t conn, const char *_Nullable path, const char *_Nullable interface, const char *_Nonnull name, _Nonnull rpc_object_t args)
_Nullable rpc_call_t rpc_connection_call(_Nonnull rpc_connection_t conn, const char *_Nullable path, const char *_Nullable interface, const char *_Nonnull name, _Nullable rpc_object_t args, _Nullable rpc_callback_t callback)
void rpc_connection_set_raw_message_handler(_Nonnull rpc_connection_t conn, _Nullable rpc_raw_handler_t handler)
struct rpc_context *_Nullable rpc_connection_get_context(_Nonnull rpc_connection_t conn)
int rpc_connection_send_raw_message(_Nonnull rpc_connection_t conn, const void *_Nonnull msg, size_t len, const int *_Nullable fds, size_t nfds)
const char *_Nullable rpc_connection_get_remote_address(_Nonnull rpc_connection_t conn)
struct rpc_connection * rpc_connection_t
Definition: connection.h:94
_Nullable rpc_object_t rpc_connection_call_simple(_Nonnull rpc_connection_t conn, const char *_Nonnull name, const char *_Nonnull fmt,...)
_Nullable rpc_object_t rpc_connection_call_sync(_Nonnull rpc_connection_t conn, const char *_Nullable path, const char *_Nullable interface, const char *_Nonnull method,...)
int rpc_call_success(_Nonnull rpc_call_t call)
rpc_error_code
Definition: connection.h:56
void rpc_connection_free(_Nonnull rpc_connection_t conn)
bool(^ rpc_callback_t)(_Nonnull rpc_call_t call)
Definition: connection.h:128
bool rpc_connection_supports_fd_passing(_Nonnull rpc_connection_t conn)
int rpc_connection_get_fd(_Nonnull rpc_connection_t conn)
_Nullable rpc_object_t rpc_call_result(_Nonnull rpc_call_t call)
bool rpc_connection_is_open(_Nonnull rpc_connection_t conn)
int rpc_connection_unregister_event_handler(_Nonnull rpc_connection_t conn, void *_Nonnull cookie)
int rpc_connection_unsubscribe_event(_Nonnull rpc_connection_t conn, const char *_Nullable path, const char *_Nullable interface, const char *_Nonnull name)
gid_t rpc_connection_get_remote_gid(_Nonnull rpc_connection_t conn)
struct rpc_call * rpc_call_t
Definition: connection.h:99
void *_Nullable rpc_connection_register_event_handler(_Nonnull rpc_connection_t conn, const char *_Nullable path, const char *_Nullable interface, const char *_Nonnull name, _Nullable rpc_handler_t handler)
void(^ rpc_property_handler_t)(_Nonnull rpc_object_t value)
Definition: connection.h:111
enum rpc_error_code rpc_error_code_t
_Nullable rpc_object_t rpc_connection_set_propertyp(_Nonnull rpc_connection_t conn, const char *_Nullable path, const char *_Nullable interface, const char *_Nonnull name, const char *_Nonnull fmt,...)
enum rpc_call_type rpc_call_type_t
uid_t rpc_connection_get_remote_uid(_Nonnull rpc_connection_t conn)
void(^ rpc_handler_t)(const char *_Nullable path, const char *_Nullable interface, const char *_Nonnull name, _Nonnull rpc_object_t args)
Definition: connection.h:104
_Nullable rpc_object_t rpc_connection_get_property(_Nonnull rpc_connection_t conn, const char *_Nullable path, const char *_Nullable interface, const char *_Nonnull name)
bool rpc_connection_has_credentials(_Nonnull rpc_connection_t conn)
int rpc_connection_close(_Nonnull rpc_connection_t conn)
int rpc_call_set_prefetch(_Nonnull rpc_call_t call, size_t nitems)
pid_t rpc_connection_get_remote_pid(_Nonnull rpc_connection_t conn)
void rpc_call_free(_Nonnull rpc_call_t call)
int rpc_call_abort(_Nonnull rpc_call_t call)
int rpc_connection_subscribe_event(_Nonnull rpc_connection_t conn, const char *_Nullable path, const char *_Nullable interface, const char *_Nonnull name)
rpc_call_status
Definition: connection.h:71
void(^ rpc_error_handler_t)(rpc_error_code_t code, _Nullable rpc_object_t args)
Definition: connection.h:116
int rpc_call_continue(_Nonnull rpc_call_t call, bool sync)
_Nullable rpc_object_t rpc_connection_call_syncpv(_Nonnull rpc_connection_t conn, const char *_Nullable path, const char *_Nullable interface, const char *_Nonnull method, const char *_Nonnull fmt, va_list ap)
_Nullable rpc_object_t rpc_connection_set_propertypv(_Nonnull rpc_connection_t conn, const char *_Nullable path, const char *_Nullable interface, const char *_Nonnull name, const char *_Nonnull fmt, va_list ap)
_Nullable rpc_object_t rpc_connection_set_property(_Nonnull rpc_connection_t conn, const char *_Nullable path, const char *_Nullable interface, const char *_Nonnull name, rpc_object_t _Nonnull value)
void rpc_connection_set_event_handler(_Nonnull rpc_connection_t conn, _Nullable rpc_handler_t handler)