shairport-sync/pair_ap/evrtsp/rtsp-internal.h

116 lines
3.1 KiB
C

/*
* Copyright (C) 2010 Julien BLACHE <jb@jblache.org>
* Based on evhttp from libevent 1.4.x
*
* Copyright 2001 Niels Provos <provos@citi.umich.edu>
* All rights reserved.
*
* This header file contains definitions for dealing with RTSP requests
* that are internal to libevent. As user of the library, you should not
* need to know about these.
*/
#ifndef _RTSP_H_
#define _RTSP_H_
#include <event2/buffer.h>
#include <event2/event_struct.h>
#define RTSP_CONNECT_TIMEOUT 5
#define RTSP_WRITE_TIMEOUT 30
#define RTSP_READ_TIMEOUT 30
#define RTSP_PREFIX "rtsp://"
enum message_read_status {
ALL_DATA_READ = 1,
MORE_DATA_EXPECTED = 0,
DATA_CORRUPTED = -1,
REQUEST_CANCELED = -2
};
enum evrtsp_connection_error {
EVCON_RTSP_TIMEOUT,
EVCON_RTSP_EOF,
EVCON_RTSP_INVALID_HEADER
};
struct evbuffer;
struct addrinfo;
struct evrtsp_request;
/* A stupid connection object - maybe make this a bufferevent later */
enum evrtsp_connection_state {
EVCON_DISCONNECTED, /**< not currently connected not trying either*/
EVCON_CONNECTING, /**< tries to currently connect */
EVCON_IDLE, /**< connection is established */
EVCON_READING_FIRSTLINE,/**< reading Request-Line (incoming conn) or
**< Status-Line (outgoing conn) */
EVCON_READING_HEADERS, /**< reading request/response headers */
EVCON_READING_BODY, /**< reading request/response body */
EVCON_READING_TRAILER, /**< reading request/response chunked trailer */
EVCON_WRITING /**< writing request/response headers/body */
};
struct event_base;
struct evrtsp_connection {
int fd;
struct event ev;
struct event close_ev;
struct evbuffer *input_buffer;
struct evbuffer *output_buffer;
char *bind_address; /* address to use for binding the src */
u_short bind_port; /* local port for binding the src */
char *address; /* address to connect to */
int family;
u_short port;
int flags;
#define EVRTSP_CON_CLOSEDETECT 0x0004 /* detecting if persistent close */
int timeout; /* timeout in seconds for events */
enum evrtsp_connection_state state;
int cseq;
TAILQ_HEAD(evcon_requestq, evrtsp_request) requests;
void (*cb)(struct evrtsp_connection *, void *);
void *cb_arg;
void (*closecb)(struct evrtsp_connection *, void *);
void *closecb_arg;
void (*ciphercb)(struct evbuffer *evbuf, void *, int encrypt);
void *ciphercb_arg;
struct event_base *base;
};
/* resets the connection; can be reused for more requests */
void evrtsp_connection_reset(struct evrtsp_connection *);
/* connects if necessary */
int evrtsp_connection_connect(struct evrtsp_connection *);
/* notifies the current request that it failed; resets connection */
void evrtsp_connection_fail(struct evrtsp_connection *,
enum evrtsp_connection_error error);
int evrtsp_hostportfile(char *, char **, u_short *, char **);
int evrtsp_parse_firstline(struct evrtsp_request *, struct evbuffer*);
int evrtsp_parse_headers(struct evrtsp_request *, struct evbuffer*);
void evrtsp_start_read(struct evrtsp_connection *);
void evrtsp_make_header(struct evrtsp_connection *, struct evrtsp_request *);
void evrtsp_write_buffer(struct evrtsp_connection *,
void (*)(struct evrtsp_connection *, void *), void *);
#endif /* _RTSP_H */