| /* Copyright (c) 2012 The Chromium OS Authors. All rights reserved. |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| /* |
| * A remote client to the server. |
| */ |
| #ifndef CRAS_RCLIENT_H_ |
| #define CRAS_RCLIENT_H_ |
| |
| #include "cras_types.h" |
| |
| struct cras_client_message; |
| struct cras_message; |
| struct cras_server_message; |
| |
| /* An attached client. |
| * id - The id of the client. |
| * fd - Connection for client communication. |
| * ops - cras_rclient_ops for the cras_rclient. |
| * supported_directions - Bit mask for supported stream directions. |
| * client_type - Client type of this rclient. If this is set to value other |
| * than CRAS_CLIENT_TYPE_UNKNOWN, rclient will overwrite incoming |
| * messages' client type. |
| */ |
| struct cras_rclient { |
| struct cras_observer_client *observer; |
| size_t id; |
| int fd; |
| const struct cras_rclient_ops *ops; |
| int supported_directions; |
| enum CRAS_CLIENT_TYPE client_type; |
| }; |
| |
| /* Operations for cras_rclient. |
| * handle_message_from_client - Entry point for handling a message from the |
| * corresponded client. |
| * send_message_to_client - Method for sending message to the corresponded |
| * client. |
| * destroy - Method to destroy and free the cras_rclient. |
| */ |
| struct cras_rclient_ops { |
| int (*handle_message_from_client)(struct cras_rclient *, |
| const struct cras_server_message *, |
| int *fds, unsigned int num_fds); |
| int (*send_message_to_client)(const struct cras_rclient *, |
| const struct cras_client_message *, |
| int *fds, unsigned int num_fds); |
| void (*destroy)(struct cras_rclient *); |
| }; |
| |
| /* Creates an rclient structure. |
| * Args: |
| * fd - The file descriptor used for communication with the client. |
| * id - Unique identifier for this client. |
| * conn_type - Client connection type. |
| * Returns: |
| * A pointer to the newly created rclient on success, NULL on failure. |
| */ |
| struct cras_rclient *cras_rclient_create(int fd, size_t id, |
| enum CRAS_CONNECTION_TYPE conn_type); |
| |
| /* Destroys an rclient created with "cras_rclient_create". |
| * Args: |
| * client - The client to destroy. |
| */ |
| void cras_rclient_destroy(struct cras_rclient *client); |
| |
| /* Handles a received buffer from the client. |
| * Args: |
| * client - The client that received this message. |
| * buf - The raw byte buffer the client sent. It should contain a valid |
| * cras_server_message. |
| * buf_len - The length of |buf|. |
| * fds - Array of valid file descriptors sent by the remote client. |
| * num_fds - Length of |fds|. |
| * Returns: |
| * 0 on success, otherwise a negative error code. |
| */ |
| int cras_rclient_buffer_from_client(struct cras_rclient *client, |
| const uint8_t *buf, size_t buf_len, |
| int *fds, int num_fds); |
| |
| /* Sends a message to the client. |
| * Args: |
| * client - The client to send the message to. |
| * msg - The message to send. |
| * fds - Array of file descriptors or null |
| * num_fds - Number of entries in the fds array. |
| * Returns: |
| * number of bytes written on success, otherwise a negative error code. |
| */ |
| int cras_rclient_send_message(const struct cras_rclient *client, |
| const struct cras_client_message *msg, int *fds, |
| unsigned int num_fds); |
| |
| #endif /* CRAS_RCLIENT_H_ */ |