blob: 3a3988c222ccbc88d7fc7ca0ec481dd549f5d8aa [file] [log] [blame]
/* 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_ */