/* ====================================================================
 *    Licensed to the Apache Software Foundation (ASF) under one
 *    or more contributor license agreements.  See the NOTICE file
 *    distributed with this work for additional information
 *    regarding copyright ownership.  The ASF licenses this file
 *    to you under the Apache License, Version 2.0 (the
 *    "License"); you may not use this file except in compliance
 *    with the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *    Unless required by applicable law or agreed to in writing,
 *    software distributed under the License is distributed on an
 *    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 *    KIND, either express or implied.  See the License for the
 *    specific language governing permissions and limitations
 *    under the License.
 * ====================================================================
 */

#ifndef SERF_BUCKET_UTIL_H
#define SERF_BUCKET_UTIL_H

/**
 * @file serf_bucket_util.h
 * @brief This header defines a set of functions and other utilities
 * for implementing buckets. It is not needed by users of the bucket
 * system.
 */

#include "serf.h"

#ifdef __cplusplus
extern "C" {
#endif


/**
 * Basic bucket creation function.
 *
 * This function will create a bucket of @a type, allocating the necessary
 * memory from @a allocator. The @a data bucket-private information will
 * be stored into the bucket.
 */
serf_bucket_t *serf_bucket_create(
    const serf_bucket_type_t *type,
    serf_bucket_alloc_t *allocator,
    void *data);

/**
 * Default implementation of the @see read_iovec functionality.
 *
 * This function will use the @see read function to get a block of memory,
 * then return it in the iovec.
 */
apr_status_t serf_default_read_iovec(
    serf_bucket_t *bucket,
    apr_size_t requested,
    int vecs_size,
    struct iovec *vecs,
    int *vecs_used);

/**
 * Default implementation of the @see readline functionality.
 *
 * This function will use the @see read function, when possible optimized by
 * the @a peek function to return the requested result.
 */
apr_status_t serf_default_readline(serf_bucket_t *bucket, int acceptable,
                                   int *found,
                                   const char **data, apr_size_t *len);


/**
 * Default implementation of the @see read_for_sendfile functionality.
 *
 * This function will use the @see read function to get a block of memory,
 * then return it as a header. No file will be returned.
 */
apr_status_t serf_default_read_for_sendfile(
    serf_bucket_t *bucket,
    apr_size_t requested,
    apr_hdtr_t *hdtr,
    apr_file_t **file,
    apr_off_t *offset,
    apr_size_t *len);

/**
 * Default implementation of the @see read_bucket functionality.
 *
 * This function will always return NULL, indicating that the @a type
 * of bucket cannot be found within @a bucket.
 */
serf_bucket_t *serf_default_read_bucket(
    serf_bucket_t *bucket,
    const serf_bucket_type_t *type);

/**
 * Default implementation of the @see peek functionality.
 *
 * This function will always state that there is no data available.
 *
 * @since New in 1.4.
 */
apr_status_t serf_default_peek(
    serf_bucket_t *bucket,
    const char **data,
    apr_size_t *len);

/**
 * Default implementation of the @see destroy functionality.
 *
 * This function will return the @a bucket to its allcoator.
 */
void serf_default_destroy(
    serf_bucket_t *bucket);


/**
 * Default implementation of the @see destroy functionality.
 *
 * This function will return the @a bucket, and the data member to its
 * allocator.
 */
void serf_default_destroy_and_data(
    serf_bucket_t *bucket);

/**
 * Implementation of a limited @see readline functionality.
 *
 * This function will use the @see read function, when possible optimized by
 * the @a peek function to return the requested result.
 */
apr_status_t serf_bucket_limited_readline(serf_bucket_t *bucket, int acceptable,
                                          apr_size_t requested, int *found,
                                          const char **data, apr_size_t *len);

/**
 * Default implementation of the @see get_remaining functionality.
 *
 * This function will just return SERF_LENGTH_UNKNOWN.
 */
apr_uint64_t serf_default_get_remaining(
    serf_bucket_t *bucket);

/**
 * Default implementation of the @see set_config functionality.
 *
 * This function will not do anything, it should be used in buckets
 * that have no use for the shared config, and do not wrap other bucket(s).
 */
apr_status_t serf_default_ignore_config(serf_bucket_t *bucket,
                                        serf_config_t *config);

/**
 * Allocate @a size bytes of memory using @a allocator.
 *
 * Returns NULL of the requested memory size could not be allocated.
 */
void *serf_bucket_mem_alloc(
    serf_bucket_alloc_t *allocator,
    apr_size_t size);

/**
 * Allocate @a size bytes of memory using @a allocator and set all of the
 * memory to 0.
 *
 * Returns NULL of the requested memory size could not be allocated.
 */
void *serf_bucket_mem_calloc(
    serf_bucket_alloc_t *allocator,
    apr_size_t size);

/**
 * Free the memory at @a block, returning it to @a allocator.
 */
void serf_bucket_mem_free(
    serf_bucket_alloc_t *allocator,
    void *block);


/**
 * Analogous to apr_pstrmemdup, using a bucket allocator instead.
 */
char *serf_bstrmemdup(
    serf_bucket_alloc_t *allocator,
    const char *str,
    apr_size_t size);

/**
 * Analogous to apr_pmemdup, using a bucket allocator instead.
 */
void * serf_bmemdup(
    serf_bucket_alloc_t *allocator,
    const void *mem,
    apr_size_t size);

/**
 * Analogous to apr_pstrdup, using a bucket allocator instead.
 */
char * serf_bstrdup(
    serf_bucket_alloc_t *allocator,
    const char *str);

/**
 * Analogous to apr_pstrcatv, using a bucket allocator instead.
 */
char * serf_bstrcatv(
    serf_bucket_alloc_t *allocator,
    struct iovec *vec,
    int vecs,
    apr_size_t *bytes_written);

/**
 * Read data up to a newline.
 *
 * @a acceptable contains the allowed forms of a newline, and @a found
 * will return the particular newline type that was found. If a newline
 * is not found, then SERF_NEWLINE_NONE will be placed in @a found.
 *
 * @a data should contain a pointer to the data to be scanned. @a len
 * should specify the length of that data buffer. On exit, @a data will
 * be advanced past the newline, and @a len will specify the remaining
 * amount of data in the buffer.
 *
 * Given this pattern of behavior, the caller should store the initial
 * value of @a data as the line start. The difference between the
 * returned value of @a data and the saved start is the length of the
 * line.
 *
 * Note that the newline character(s) will remain within the buffer.
 * This function scans at a byte level for the newline characters. Thus,
 * the data buffer may contain NUL characters. As a corollary, this
 * function only works on 8-bit character encodings.
 *
 * If the data is fully consumed (@a len gets set to zero) and a CR
 * character is found at the end and the CRLF sequence is allowed, then
 * this function may store SERF_NEWLINE_CRLF_SPLIT into @a found. The
 * caller should take particular consideration for the CRLF sequence
 * that may be split across data buffer boundaries.
 */
void serf_util_readline(
    const char **data,
    apr_size_t *len,
    int acceptable,
    int *found);


/** The buffer size used within @see serf_databuf_t. */
#define SERF_DATABUF_BUFSIZE 8000

/** Callback function which is used to refill the data buffer.
 *
 * The function takes @a baton, which is the @see read_baton value
 * from the serf_databuf_t structure. Data should be placed into
 * a buffer specified by @a buf, which is @a bufsize bytes long.
 * The amount of data read should be returned in @a len.
 *
 * APR_EOF should be returned if no more data is available. APR_EAGAIN
 * should be returned, rather than blocking. In both cases, @a buf
 * should be filled in and @a len set, as appropriate.
 */
typedef apr_status_t (*serf_databuf_reader_t)(
    void *baton,
    apr_size_t bufsize,
    char *buf,
    apr_size_t *len);

/**
 * This structure is used as an intermediate data buffer for some "external"
 * source of data. It works as a scratch pad area for incoming data to be
 * stored, and then returned as a ptr/len pair by the bucket read functions.
 *
 * This structure should be initialized by calling @see serf_databuf_init.
 * Users should not bother to zero the structure beforehand.
 */
typedef struct serf_databuf_t {
    /** The current data position within the buffer. */
    const char *current;

    /** Amount of data remaining in the buffer. */
    apr_size_t remaining;

    /** Callback function. */
    serf_databuf_reader_t read;

    /** A baton to hold context-specific data. */
    void *read_baton;

    /** Records the status from the last @see read operation. */
    apr_status_t status;

    /** Holds the data until it can be returned. */
    char buf[SERF_DATABUF_BUFSIZE];

} serf_databuf_t;

/**
 * Initialize the @see serf_databuf_t structure specified by @a databuf.
 */
void serf_databuf_init(
    serf_databuf_t *databuf);

/**
 * Implement a bucket-style read function from the @see serf_databuf_t
 * structure given by @a databuf.
 *
 * The @a requested, @a data, and @a len fields are interpreted and used
 * as in the read function of @see serf_bucket_t.
 */
apr_status_t serf_databuf_read(
    serf_databuf_t *databuf,
    apr_size_t requested,
    const char **data,
    apr_size_t *len);

/**
 * Implement a bucket-style readline function from the @see serf_databuf_t
 * structure given by @a databuf.
 *
 * The @a acceptable, @a found, @a data, and @a len fields are interpreted
 * and used as in the read function of @see serf_bucket_t.
 */
apr_status_t serf_databuf_readline(
    serf_databuf_t *databuf,
    int acceptable,
    int *found,
    const char **data,
    apr_size_t *len);

/**
 * Implement a bucket-style peek function from the @see serf_databuf_t
 * structure given by @a databuf.
 *
 * The @a data, and @a len fields are interpreted and used as in the
 * peek function of @see serf_bucket_t.
 */
apr_status_t serf_databuf_peek(
    serf_databuf_t *databuf,
    const char **data,
    apr_size_t *len);


#ifdef __cplusplus
}
#endif

#endif /* !SERF_BUCKET_UTIL_H */
