X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Scheduler%2FReadHelper.hh;h=c4fbbc8fba9fa418e568811ed0bd8f01ce232b36;hb=9a988902090d28007578e93bffd809f6bd913155;hp=23d1157dc57a2d7264f75ba4ef0c47248d5c0e06;hpb=553781d9e9bce316dca24ac4f0c42e5613e849e0;p=senf.git diff --git a/Scheduler/ReadHelper.hh b/Scheduler/ReadHelper.hh index 23d1157..c4fbbc8 100644 --- a/Scheduler/ReadHelper.hh +++ b/Scheduler/ReadHelper.hh @@ -16,7 +16,7 @@ // along with this program; if not, write to the // Free Software Foundation, Inc., // 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// Copyright (C) 2006 +// Copyright (C) 2006 /** \file \brief ReadHelper public header */ @@ -39,126 +39,126 @@ namespace senf { - /** \brief Asyncronous reading helper + /** \brief Asyncronous reading helper - This class provides a simple asynchronous reading facility. This helper will register with - the Scheduler and read incoming data. It will collect the data until a specific numbner of - bytes has been read or some Predicate evaluated on the data read thus far signals end of - data. + This class provides a simple asynchronous reading facility. This helper will register with + the Scheduler and read incoming data. It will collect the data until a specific number of + bytes has been read or some Predicate evaluated on the data read thus far signals end of + data. - The ReadHelper accepts the same flexible file handle interfaces as the Scheduler. - - The callback must take a ReadHelper::ptr argument. Using this ReadHelper instance, the - callback can access the data read or retrieve state information. + The ReadHelper accepts the same flexible file handle interfaces as the Scheduler. - The ReadHelper separates the data into two parts: data() will return the matched data, - tail() will return any surplus data already read. If you don't specify a predicate, tail() - will always be empty (there may however some data be left in the socket input buffer after - the ReadHelper returns). + The callback must take a ReadHelper::ptr argument. Using this ReadHelper instance, the + callback can access the data read or retrieve state information. - The predicate is any class instance with an operator(std::string const &). This - operator is called, whenever some data has been read. If the data is not yet complete, the - predicate must return \c std::string::npos. If the ReadHelper should stop readeing more - data, the predicate must return the number of bytes which are to be considered 'matched'. + The ReadHelper separates the data into two parts: data() will return the matched data, + tail() will return any surplus data already read. If you don't specify a predicate, tail() + will always be empty (there may however some data be left in the socket input buffer after + the ReadHelper returns). - \todo Move all not Handle dependent members to a ReadHandleBase class - \todo Add an optional std::string const & tail argument to the constructors which - takes the tail() of a previous ReadHelper instance. + The predicate is any class instance with an operator(std::string const &). This + operator is called, whenever some data has been read. If the data is not yet complete, the + predicate must return \c std::string::npos. If the ReadHelper should stop reading more + data, the predicate must return the number of bytes which are to be considered 'matched'. + + \todo Move all not Handle dependent members to a ReadHandleBase class + \todo Add an optional std::string const & tail argument to the constructors which + takes the tail() of a previous ReadHelper instance. */ template class ReadHelper - : public senf::intrusive_refcount + : public senf::intrusive_refcount { public: /////////////////////////////////////////////////////////////////////////// // Types - - typedef boost::intrusive_ptr ptr; ///< Smart pointer type for this class - typedef boost::function Callback; ///< Callback type + + typedef boost::intrusive_ptr ptr; ///< Smart pointer type for this class + typedef boost::function Callback; ///< Callback type /////////////////////////////////////////////////////////////////////////// ///\name Structors and default members ///@{ - static ptr dispatch(Handle handle, std::string::size_type maxSize, - Callback callback); ///< Register new ReadHandler instance + static ptr dispatch(Handle handle, std::string::size_type maxSize, + Callback callback); ///< Register new ReadHandler instance /**< The registered Callback will be called after \a maxSize - bytes have been read or EOF or some error is - encountered. - \post The returned ReadHelper instance is registered - with the Scheduler to handle read events. - \param[in] handle file descriptor or handle providing - the Handle interface defined above. - \param[in] maxSize maximum number of bytes to read - \param[in] cb callback - \returns Smart pointer to new ReadHelper instance */ - - template - static ptr dispatch(Handle handle, std::string::size_type maxSize, Predicate const & predicate, - Callback callback); ///< Register new ReadHelper instance + bytes have been read or EOF or some error is + encountered. + \post The returned ReadHelper instance is registered + with the Scheduler to handle read events. + \param[in] handle file descriptor or handle providing + the Handle interface defined above. + \param[in] maxSize maximum number of bytes to read + \param[in] cb callback + \returns Smart pointer to new ReadHelper instance */ + + template + static ptr dispatch(Handle handle, std::string::size_type maxSize, Predicate const & predicate, + Callback callback); ///< Register new ReadHelper instance /**< The registered Callback will be called after the \a - predicate returns a Value other than \c - std::string::npos, \a maxSize bytes have been read, or - EOF or some error condition is encountered. - \post The returned ReadHelper instance is registered - with the Scheduler to handle read events -. \param[in] handle file descriptor or handle providing - the Handle interface defined above. - \param[in] maxSize maximum number of bytes to read - \param[in] predicate predicate to check - \param[in] cb callback - \returns smart pointer to new ReadHelper instance */ + predicate returns a Value other than \c + std::string::npos, \a maxSize bytes have been read, or + EOF or some error condition is encountered. + \post The returned ReadHelper instance is registered + with the Scheduler to handle read events +. \param[in] handle file descriptor or handle providing + the Handle interface defined above. + \param[in] maxSize maximum number of bytes to read + \param[in] predicate predicate to check + \param[in] cb callback + \returns smart pointer to new ReadHelper instance */ ///@} /////////////////////////////////////////////////////////////////////////// - Handle handle() const; ///< Access the handle object - unsigned maxSize() const; ///< Return maximum number of bytes to be read + Handle handle() const; ///< Access the handle object + unsigned maxSize() const; ///< Return maximum number of bytes to be read - std::string const & data() const; ///< return data read - std::string const & tail() const; ///< return data read but not matched by the predicate + std::string const & data() const; ///< return data read + std::string const & tail() const; ///< return data read but not matched by the predicate - bool complete() const; ///< Check wether the read has completed successfully - bool error() const; ///< Check for error condition - void throw_error() const; ///< If an error occured, throw it + bool complete() const; ///< Check whether the read has completed successfully + bool error() const; ///< Check for error condition + void throw_error() const; ///< If an error occurred, throw it - void revoke(); ///< Remove the ReadHelper from the scheduler + void revoke(); ///< Remove the ReadHelper from the scheduler protected: private: - struct InternalPredicate; + struct InternalPredicate; ReadHelper(Handle handle, unsigned maxSize, InternalPredicate * predicate, Callback cb); - static void dispatchProcess(ptr helper, Handle handle, senf::Scheduler::EventId event); - void process(Handle handle, senf::Scheduler::EventId event); - void done(); + static void dispatchProcess(ptr helper, Handle handle, senf::Scheduler::EventId event); + void process(Handle handle, senf::Scheduler::EventId event); + void done(); - Handle handle_; - std::string::size_type maxSize_; - boost::scoped_ptr predicate_; - Callback callback_; + Handle handle_; + std::string::size_type maxSize_; + boost::scoped_ptr predicate_; + Callback callback_; - std::string data_; - std::string tail_; - int errno_; - bool complete_; + std::string data_; + std::string tail_; + int errno_; + bool complete_; }; /** \brief ReadHelper predicate matching an arbitrary string - - This predicate will terminate the read when the data read matches a given fixed string. All - data up to and including the string matched is considered to be part of the data() portion, - everything after the matched string is placed into the tail(). - \see ReadHelper + This predicate will terminate the read when the data read matches a given fixed string. All + data up to and including the string matched is considered to be part of the data() portion, + everything after the matched string is placed into the tail(). + + \see ReadHelper */ struct ReadUntil { ReadUntil(std::string const & target); - std::string::size_type operator()(std::string const & data); - std::string target; + std::string::size_type operator()(std::string const & data); + std::string target; }; } @@ -173,6 +173,8 @@ namespace senf { // Local Variables: // mode: c++ -// c-file-style: "senf" // fill-column: 100 +// c-file-style: "senf" +// indent-tabs-mode: nil +// ispell-local-dictionary: "american" // End: