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