blob: a5068110e0717c29f612e2693b369fe88a738067 [file] [log] [blame]
/*
* Copyright 2004,2005 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain count 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 AXUTIL_STREAM_H
#define AXUTIL_STREAM_H
#include <axutil_utils.h>
#include <axutil_utils_defines.h>
#include <axutil_env.h>
#include <stdio.h>
#ifdef __cplusplus
extern "C"
{
#endif
#define AXIS2_STREAM_DEFAULT_BUF_SIZE 2048
/**
* @defgroup axutil_stream stream
* @ingroup axis2_util
* @{
*/
/**
* \brief Axis2 stream types
*
* This is used to create a stream to correspond to
* particular i/o mtd
*/
enum axutil_stream_type
{
AXIS2_STREAM_BASIC = 0,
AXIS2_STREAM_FILE,
AXIS2_STREAM_SOCKET,
AXIS2_STREAM_MANAGED /* Example Wrapper stream for Apache2 read mechanism */
};
typedef enum axutil_stream_type axutil_stream_type_t;
typedef struct axutil_stream axutil_stream_t;
typedef int(
AXIS2_CALL
* AXUTIL_STREAM_READ)(
axutil_stream_t * stream,
const axutil_env_t * env,
void *buffer,
size_t count);
typedef int(
AXIS2_CALL
* AXUTIL_STREAM_WRITE)(
axutil_stream_t * stream,
const axutil_env_t * env,
const void *buffer,
size_t count);
typedef int(
AXIS2_CALL
* AXUTIL_STREAM_SKIP)(
axutil_stream_t * stream,
const axutil_env_t * env,
int count);
typedef int(
AXIS2_CALL
* AXUTIL_STREAM_PEEK)(
axutil_stream_t * stream,
const axutil_env_t * env,
void *buffer,
size_t count);
struct axutil_stream
{
axutil_stream_type_t stream_type;
int len;
int max_len;
/* Only one of these is used for a perticlar
* instance depending on the type
*/
axis2_char_t *buffer;
axis2_char_t *buffer_head;
FILE *fp;
int socket;
int axis2_eof;
/**
* reads from stream
* @param buffer buffer into which the content is to be read
* @param count size of the buffer
* @return no: of bytes read
*/
int(
AXIS2_CALL
* read)(
axutil_stream_t * stream,
const axutil_env_t * env,
void *buffer,
size_t count);
/**
* writes into stream
* @param buffer buffer to be written
* @param count size of the buffer
* @return no: of bytes actually written
*/
int(
AXIS2_CALL
* write)(
axutil_stream_t * stream,
const axutil_env_t * env,
const void *buffer,
size_t count);
/**
* Skips over and discards n bytes of data from this input stream.
* @param count number of bytes to be discarded
* @return no: of bytes actually skipped
*/
int(
AXIS2_CALL
* skip)(
axutil_stream_t * stream,
const axutil_env_t * env,
int count);
/**
* peeks into stream
* @param buffer buffer into which the content is to be read
* @param count size of the buffer
* @return no: of bytes read
*/
int(
AXIS2_CALL
* peek)(
axutil_stream_t * stream,
const axutil_env_t * env,
void *buffer,
size_t count);
};
/**
* Deletes the stream
* @return axis2_status_t AXIS2_SUCCESS on success else AXIS2_FAILURE
*/
AXIS2_EXTERN void AXIS2_CALL
axutil_stream_free(
axutil_stream_t * stream,
const axutil_env_t * env);
AXIS2_EXTERN void AXIS2_CALL
axutil_stream_free_void_arg(
void *stream,
const axutil_env_t * env);
/**
* reads from stream
* @param buffer buffer into which the content is to be read
* @param count size of the buffer
* @return no: of bytes read
*/
AXIS2_EXTERN int AXIS2_CALL
axutil_stream_read(
axutil_stream_t * stream,
const axutil_env_t * env,
void *buffer,
size_t count);
/**
* writes into stream
* @param buffer buffer to be written
* @param count size of the buffer
* @return no: of bytes actually written
*/
AXIS2_EXTERN int AXIS2_CALL
axutil_stream_write(
axutil_stream_t * stream,
const axutil_env_t * env,
const void *buffer,
size_t count);
/**
* Skips over and discards n bytes of data from this input stream.
* @param count number of bytes to be discarded
* @return no: of bytes actually skipped
*/
AXIS2_EXTERN int AXIS2_CALL
axutil_stream_skip(
axutil_stream_t * stream,
const axutil_env_t * env,
int count);
/**
* peeks into stream
* @param buffer buffer into which the content is to be read
* @param count size of the buffer
* @return no: of bytes read
*/
AXIS2_EXTERN int AXIS2_CALL
axutil_stream_peek(
axutil_stream_t * stream,
const axutil_env_t * env,
void *buffer,
int count);
/**
* Returns the length of the stream (applicable only to basic stream)
* @return Length of the buffer if its type is basic, else -1
* (we can't define a length of a stream unless it is just a buffer)
*/
AXIS2_EXTERN int AXIS2_CALL
axutil_stream_get_len(
axutil_stream_t * stream,
const axutil_env_t * env);
/** \brief Constructor for creating an in memory stream
* @return axutil_stream (in memory)
*/
AXIS2_EXTERN axutil_stream_t *AXIS2_CALL
axutil_stream_create_basic(
const axutil_env_t * env);
/** \brief Constructor for creating a file stream
* @param valid file pointer (opened file)
* @return axutil_stream (file)
*/
AXIS2_EXTERN axutil_stream_t *AXIS2_CALL
axutil_stream_create_file(
const axutil_env_t * env,
FILE * fp);
/** \brief Constructor for creating a file stream
* @param valid socket (opened socket)
* @return axutil_stream (socket)
*/
AXIS2_EXTERN axutil_stream_t *AXIS2_CALL
axutil_stream_create_socket(
const axutil_env_t * env,
int socket);
/**
*Free stream
*/
AXIS2_EXTERN void AXIS2_CALL
axutil_stream_free(
axutil_stream_t * stream,
const axutil_env_t * env);
/**
* Free stream passed as void pointer. This will be
* cast into appropriate type and then pass the cast object
* into the module_desc structure's free method
*/
AXIS2_EXTERN void AXIS2_CALL
axutil_stream_free_void_arg(
void *stream,
const axutil_env_t * env);
/**
* Gets the buffer
*/
AXIS2_EXTERN axis2_char_t *AXIS2_CALL
axutil_stream_get_buffer(
const axutil_stream_t * stream,
const axutil_env_t * env);
AXIS2_EXTERN axis2_status_t AXIS2_CALL
axutil_stream_flush_buffer(
axutil_stream_t * stream,
const axutil_env_t * env);
AXIS2_EXTERN int AXIS2_CALL
axutil_stream_peek_socket(
axutil_stream_t * stream,
const axutil_env_t * env,
void *buffer,
size_t count);
AXIS2_EXTERN axis2_status_t AXIS2_CALL
axutil_stream_flush(
axutil_stream_t * stream,
const axutil_env_t * env);
AXIS2_EXTERN axis2_status_t AXIS2_CALL
axutil_stream_close(
axutil_stream_t * stream,
const axutil_env_t * env);
AXIS2_EXTERN axis2_status_t AXIS2_CALL
axutil_stream_set_read(
axutil_stream_t * stream,
const axutil_env_t * env,
AXUTIL_STREAM_READ func);
AXIS2_EXTERN axis2_status_t AXIS2_CALL
axutil_stream_set_write(
axutil_stream_t * stream,
const axutil_env_t * env,
AXUTIL_STREAM_WRITE func);
AXIS2_EXTERN axis2_status_t AXIS2_CALL
axutil_stream_set_skip(
axutil_stream_t * stream,
const axutil_env_t * env,
AXUTIL_STREAM_SKIP func);
AXIS2_EXTERN axis2_status_t AXIS2_CALL
axutil_stream_set_peek(
axutil_stream_t * stream,
const axutil_env_t * env,
AXUTIL_STREAM_PEEK func);
/** @} */
#ifdef __cplusplus
}
#endif
#endif /* AXIS2_STREAM_H */