/* -*- C++ -*- */ /** @file Mem_Map_Stream.h * * $Id$ * * @author Douglas C. Schmidt * @author Krishnakumar B * */ #ifndef _ACEXML_MEM_MAP_STREAM_H #define _ACEXML_MEM_MAP_STREAM_H #include /**/ "ace/pre.h" #include "ACEXML/common/ACEXML_Export.h" #if !defined (ACE_LACKS_PRAGMA_ONCE) #pragma once #endif /* ACE_LACKS_PRAGMA_ONCE */ #include "ace/SOCK_Stream.h" #include "ace/Mem_Map.h" #include "ace/SOCK_Connector.h" #include "ace/Connector.h" #include "ace/Svc_Handler.h" #include "ACEXML/common/XML_Types.h" typedef ACE_Svc_Handler Svc_Handler; typedef ACE_Connector Connector; /** * @class ACEXML_Mem_Map_Stream Mem_Map_Stream.h "ACEXML/common/Mem_Map_Stream.h" * * @brief Provides a memory-mapped stream abstraction to simplify parsing * of tokens. * * This class makes it possible to treat an connection as a stream of * bytes, similar to the C library stdio streams. The contents of the * connection are buffered incrementally in a memory-mapped file. This * class maintains pointers to two positions in the stream: * * 1. The position, which keeps track of the beginning of a * token that is in the stream. * * 2. The position, which moves along character-by-character * until the end of the token is reached. * * Once a token has been located, it can be extracted from the stream by * calling the . The length of the token, i.e., the , is * the length in bytes between the position and the position. * Once the token has been extracted, the and positions can be * updated by the method. */ class ACEXML_Export ACEXML_Mem_Map_Stream { public: /// Default constructor ACEXML_Mem_Map_Stream (void); /// Initialize this object. virtual int open (Connector *connector, const ACE_INET_Addr &); /// Destructor. virtual ~ACEXML_Mem_Map_Stream (void); /// Returns the underlying . ACE_SOCK_Stream &stream (void); /** * Send bytes in to the connected peer. This is a * completely unbuffered call. */ virtual ssize_t send_n (const void *buf, size_t size, ACE_Time_Value *tv = 0); /** * Return the next character in the stream and advance the * position. Returns EOF when the position reaches the end of the * HTTP stream. */ virtual int get_char (void); /** * Returns a pointer to array of at most characters starting at * the position. If the position + extends past the * EOF then is set to the number of characters between the * position and the EOF and both the and positions are * advanced by . Returns 0 if the position is at the EOF. */ virtual const char *recv (size_t &len); /** * Returns a pointer to array of characters starting at the * position. */ virtual const char *recv (void) const; /** * Returns the length in bytes between the position and the * position. */ virtual size_t recv_len (void) const; /** * Returns the no. of bytes available in the stream. */ virtual size_t available (void) const; /** * Resets the and positions to the beginning of the stream. * This works since all the data has been cached in the memory-mapped * backing store. */ virtual void rewind (void); /** * Returns the nth character from the position in the * stream without advancing the position. Automatically extends * the backing store if necessary. Returns EOF if is past the * end of the stream. */ virtual int peek_char (size_t offset); /** * Return a pointer to an array of characters starting at * characters from the position in the stream without * advancing the position. Automatically extends the backing store * if necessary. Returns 0 if or is past the * end of the stream. */ virtual const char *peek_str (size_t offset, size_t size); /** * Sets the and positions as follows: * o If is , the positions are set to * bytes from the start of the stream. * o If is , the positions are set to the * current position plus . * o If is , the positions are set to the size * of the stream plus . * * If offset is greater than EOF, both and are set to EOF. * Note special return value is returned to indicate this condition. */ virtual off_t seek (off_t offset, int whence = SEEK_CUR); /// Returns 1 if we're at the end of the HTTP stream, else 0. virtual int eof (void) const; /// Returns the underlying service handler. Svc_Handler *svc_handler (void); private: /** * Grow the file by reading another chunk from the HTTP socket and * extend the mapping to cover this chunk. Returns -1 on failure or * EOF, else 0. */ int grow_file_and_remap (void); /** * Connection to peer. The granularity is at the Svc_Handler level. * The Svc_Handler has an SOCK_Stream. */ Svc_Handler *svc_handler_; /// Memory-mapped file that we're iterating over. ACE_Mem_Map mem_map_; /// Pointer to the address where the next method will start. char *recv_pos_; /** * Pointer to the address where the next method will * start. */ char *get_pos_; /// Address at the end of the file mapping. char *end_of_mapping_plus1_; }; #include /**/ "ace/post.h" #endif /* _ACEXML_MEM_MAP_STREAM_H */