X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;ds=sidebyside;f=src%2Finclude%2Fgnunet_client_lib.h;h=51da46de6ecbf2152f28017bedb7673679bbb8d7;hb=db3b3123f9d157c71d8b3d9e3b1d5966fe471599;hp=17f17ab507f7c2ca7352da27b40ef8c80340f911;hpb=f1b9c5c115139b02cac1cae4f053792e1e5b1ccb;p=oweals%2Fgnunet.git diff --git a/src/include/gnunet_client_lib.h b/src/include/gnunet_client_lib.h index 17f17ab50..51da46de6 100644 --- a/src/include/gnunet_client_lib.h +++ b/src/include/gnunet_client_lib.h @@ -49,27 +49,31 @@ struct GNUNET_CLIENT_Connection; /** * Get a connection with a service. * - * @param sched scheduler to use * @param service_name name of the service * @param cfg configuration to use * @return NULL on error (service unknown to configuration) */ -struct GNUNET_CLIENT_Connection *GNUNET_CLIENT_connect (struct - GNUNET_SCHEDULER_Handle - *sched, - const char - *service_name, - const struct - GNUNET_CONFIGURATION_Handle - *cfg); +struct GNUNET_CLIENT_Connection * +GNUNET_CLIENT_connect (const char *service_name, + const struct GNUNET_CONFIGURATION_Handle *cfg); + /** - * Destroy connection with the service. This will - * automatically cancel any pending "receive" request - * (however, the handler will *NOT* be called, not - * even with a NULL message). + * Destroy connection with the service. This will automatically + * cancel any pending "receive" request (however, the handler will + * *NOT* be called, not even with a NULL message). Any pending + * transmission request will also be cancelled UNLESS the callback for + * the transmission request has already been called, in which case the + * transmission 'finish_pending_write' argument determines whether or + * not the write is guaranteed to complete before the socket is fully + * destroyed (unless, of course, there is an error with the server in + * which case the message may still be lost). + * + * @param client handle to the service connection */ -void GNUNET_CLIENT_disconnect (struct GNUNET_CLIENT_Connection *sock); +void +GNUNET_CLIENT_disconnect (struct GNUNET_CLIENT_Connection *client); + /** * Type of a function to call when we receive a message @@ -79,21 +83,41 @@ void GNUNET_CLIENT_disconnect (struct GNUNET_CLIENT_Connection *sock); * @param msg message received, NULL on timeout or fatal error */ typedef void (*GNUNET_CLIENT_MessageHandler) (void *cls, - const struct - GNUNET_MessageHeader * msg); + const struct GNUNET_MessageHeader + * msg); + + +/** + * Type of a function to call when we have finished shutting + * down a service, or failed. + * + * @param cls closure + * @param reason what is the result of the shutdown + * GNUNET_NO on shutdown (not running) + * GNUNET_YES on running + * GNUNET_SYSERR on failure to transmit message + */ +typedef void (*GNUNET_CLIENT_ShutdownTask) (void *cls, int reason); + /** * Read from the service. * - * @param sock the service + * @param client connection to the service * @param handler function to call with the message * @param handler_cls closure for handler * @param timeout how long to wait until timing out */ -void GNUNET_CLIENT_receive (struct GNUNET_CLIENT_Connection *sock, - GNUNET_CLIENT_MessageHandler handler, - void *handler_cls, - struct GNUNET_TIME_Relative timeout); +void +GNUNET_CLIENT_receive (struct GNUNET_CLIENT_Connection *client, + GNUNET_CLIENT_MessageHandler handler, void *handler_cls, + struct GNUNET_TIME_Relative timeout); + + +/** + * Transmit handle for client connections. + */ +struct GNUNET_CLIENT_TransmitHandle; /** @@ -105,20 +129,35 @@ void GNUNET_CLIENT_receive (struct GNUNET_CLIENT_Connection *sock, * @param size number of bytes to send * @param timeout after how long should we give up (and call * notify with buf NULL and size 0)? + * @param auto_retry if the connection to the service dies, should we + * automatically re-connect and retry (within the timeout period) + * or should we immediately fail in this case? Pass GNUNET_YES + * if the caller does not care about temporary connection errors, + * for example because the protocol is stateless * @param notify function to call * @param notify_cls closure for notify * @return NULL if someone else is already waiting to be notified * non-NULL if the notify callback was queued (can be used to cancel * using GNUNET_CONNECTION_notify_transmit_ready_cancel) */ -struct GNUNET_CONNECTION_TransmitHandle - *GNUNET_CLIENT_notify_transmit_ready (struct GNUNET_CLIENT_Connection *sock, - size_t size, - struct GNUNET_TIME_Relative timeout, - GNUNET_CONNECTION_TransmitReadyNotify - notify, void *notify_cls); +struct GNUNET_CLIENT_TransmitHandle * +GNUNET_CLIENT_notify_transmit_ready (struct GNUNET_CLIENT_Connection *client, + size_t size, + struct GNUNET_TIME_Relative timeout, + int auto_retry, + GNUNET_CONNECTION_TransmitReadyNotify + notify, void *notify_cls); +/** + * Cancel a request for notification. + * + * @param th handle from the original request. + */ +void +GNUNET_CLIENT_notify_transmit_ready_cancel (struct GNUNET_CLIENT_TransmitHandle + *th); + /** * Convenience API that combines sending a request @@ -127,35 +166,32 @@ struct GNUNET_CONNECTION_TransmitHandle * will be called with a "NULL" response (in which * case the connection should probably be destroyed). * - * @param sock connection to use + * @param client connection to use * @param hdr message to transmit * @param timeout when to give up (for both transmission * and for waiting for a response) + * @param auto_retry if the connection to the service dies, should we + * automatically re-connect and retry (within the timeout period) + * or should we immediately fail in this case? Pass GNUNET_YES + * if the caller does not care about temporary connection errors, + * for example because the protocol is stateless * @param rn function to call with the response - * @param rn_cls closure for rn + * @param rn_cls closure for rn + * @return GNUNET_OK on success, GNUNET_SYSERR if a request + * is already pending */ -void -GNUNET_CLIENT_transmit_and_get_response (struct GNUNET_CLIENT_Connection *sock, - const struct GNUNET_MessageHeader *hdr, - struct GNUNET_TIME_Relative timeout, - GNUNET_CLIENT_MessageHandler rn, - void *rn_cls); - - - -/** - * Request that the service should shutdown. - * Afterwards, the connection should be disconnected. - * - * @param sock the socket connected to the service - */ -void GNUNET_CLIENT_service_shutdown (struct GNUNET_CLIENT_Connection *sock); +int +GNUNET_CLIENT_transmit_and_get_response (struct GNUNET_CLIENT_Connection *client, + const struct GNUNET_MessageHeader *hdr, + struct GNUNET_TIME_Relative timeout, + int auto_retry, + GNUNET_CLIENT_MessageHandler rn, + void *rn_cls); /** * Wait until the service is running. * - * @param sched scheduler to use * @param service name of the service to wait for * @param cfg configuration to use * @param timeout how long to wait at most in ms @@ -164,11 +200,11 @@ void GNUNET_CLIENT_service_shutdown (struct GNUNET_CLIENT_Connection *sock); * or "TIMEOUT" (service not known to be running)) * @param task_cls closure for task */ -void GNUNET_CLIENT_service_test (struct GNUNET_SCHEDULER_Handle *sched, - const char *service, - const struct GNUNET_CONFIGURATION_Handle *cfg, - struct GNUNET_TIME_Relative timeout, - GNUNET_SCHEDULER_Task task, void *task_cls); +void +GNUNET_CLIENT_service_test (const char *service, + const struct GNUNET_CONFIGURATION_Handle *cfg, + struct GNUNET_TIME_Relative timeout, + GNUNET_SCHEDULER_Task task, void *task_cls); #if 0 /* keep Emacsens' auto-indent happy */