protocol_stream.h
上传用户:psq1974
上传日期:2007-01-06
资源大小:1195k
文件大小:3k
源码类别:

mpeg/mp3

开发平台:

C/C++

  1. /* Copyright (C) 1998, 1999 State University of New York at Stony Brook
  2.    Author: Andrew V. Shuvalov ( andrew@ecsl.cs.sunysb.edu )
  3.    Software license is located in file "COPYING"
  4. */
  5. #ifndef protocol_stream_h
  6. #define protocol_stream_h
  7. #ifndef WIN32
  8. # define SOCKET int
  9. #endif
  10. /** subclass if iostream, hide from user the communication details.
  11.     After discovering many-many bugs in NT and VC 5.0 this is replaced by
  12.     my own stream, not subclassing from iostream
  13.  */
  14. class protocol_stream
  15. # ifndef WIN32
  16.   : public iostream
  17. # endif
  18. {
  19.   SOCKET sock;
  20. # ifdef WIN32
  21.   /** buffer input data here */
  22.   char input_buffer[1024];
  23.   unsigned input_buffer_offset;
  24.   unsigned input_buffer_end;
  25. # endif
  26.   bool before_mark;
  27.   bool everything_read;
  28.   std::vector< std::string > messages;
  29.   const static char prompt[];
  30.   const static char command[];
  31.   const int genericTimeout;
  32. public:
  33.   /** at the beginning set the everything_read to false, because we have
  34.       prompt
  35.   */
  36.   protocol_stream( SOCKET sock, int gen_timeout );
  37.   /** s will remains empty only if it is nothing to read */
  38.   protocol_stream& operator >>( std::string &s );
  39.   /** assume that there are nothing on that string except this integer,
  40.       this is simplification of protocol, be warned
  41.   */
  42.   protocol_stream& operator >>( int &value );
  43.   /** download everything between -> and <- */
  44.   protocol_stream& operator >>( std::vector< std::string > &lines );
  45.   
  46.   protocol_stream& operator <<( const std::string &s );
  47.   /** we know that input is available */
  48.   void wait_input() { everything_read = false; before_mark = true; }
  49.   /** we don't know, but curious that is the input available: test only 
  50.       the socket by 'select' */
  51.   bool test_for_input( int millisec );
  52.   /** test not only socket, but the buffer as well */
  53.   bool test_for_any_pending_input( int millisec );
  54.   /** test if s is equal to the word 'command' */
  55.   bool is_command( const std::string &s ) {
  56.     return 0 == s.compare( command );
  57.   }
  58. # ifdef WIN32
  59.   bool buffer_is_empty();
  60.   bool eof();
  61.   /** returns -1 if no input, or the next char */
  62.   int peek();
  63.   int get( char &location );
  64.   char *getline( char *buf, unsigned size );
  65. # endif
  66.   /** before reading, check for everything_read flag.
  67.       If nothing to wait from input, return. 
  68.       After sending the command that should return something, user must
  69.       call wait_input, which indicates that sequence of -> and <-
  70.       should appear in input before '>>>'
  71.   */
  72.   void skip_to_prompt();
  73.   void skip_to_prompt( std::vector< std::string > &messages );
  74.   void append_messages( std::vector< std::string > &msgs );
  75. };
  76. #endif //  protocol_stream_h