/* * 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 #include #include #include #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 */