- Main Page
- Related Pages
- Namespaces
- Classes
- Files

- Search for |

# stream.hpp

Go to the documentation of this file.

    00001 //  Copyright (c) 2005-2007 Andre Merzky (andre@merzky.net)
    00002 //  Copyright (c) 2005-2009 Hartmut Kaiser
    00003 //  Copyright (c) 2007 Ole Weidner (oweidner@cct.lsu.edu)
    00004 //
    00005 //  Use, modification and distribution is subject to the Boost Software
    00006 //  License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
    00007 //  http://www.boost.org/LICENSE_1_0.txt)
    00008
    00009 #ifndef SAGA_COMM_STREAM_STREAM_HPP
    00010 #define SAGA_COMM_STREAM_STREAM_HPP
    00011
    00012 // include stl
    00013 #include <string>
    00014 #include <vector>
    00015
    00016 // include dependent spec sections
    00017 #include <saga/saga/util.hpp>
    00018 #include <saga/saga/call.hpp>
    00019 #include <saga/saga/base.hpp>
    00020 #include <saga/saga/session.hpp>
    00021 #include <saga/saga/task.hpp>
    00022 #include <saga/saga/buffer.hpp>
    00023 #include <saga/saga/url.hpp>
    00024 #include <saga/saga/context.hpp>
    00025
    00026 #include <saga/saga/detail/attribute.hpp>
    00027 #include <saga/saga/detail/monitorable.hpp>
    00028
    00029 // include package config
    00030 #include <saga/saga/packages/stream/config.hpp>
    00031
    00032 // suppress warnings about dependent classes not being exported from the dll
    00033 #if defined(BOOST_MSVC)
    00034 #pragma warning(push)
    00035 #pragma warning(disable: 4251 4231 4660)
    00036 #endif
    00037
    00038 namespace saga
    00039 {
    00042     namespace stream {
    00043
    00046     namespace attributes
    00047     {
    00048         //  read write attributes
    00049         char const* const stream_bufsize = "Bufsize";
    00050         char const* const stream_timeout = "Timeout";
    00051         char const* const stream_blocking = "Blocking";
    00052         char const* const stream_compression = "Compression";
    00053         char const* const stream_nodelay = "Nodelay";
    00054         char const* const stream_reliable = "Reliable";
    00055     }
    00056
    00060     namespace metrics
    00061     {
    00062         char const* const stream_state = "stream.State";
    00063         char const* const stream_read = "stream.Read";
    00064         char const* const stream_write = "stream.Write";
    00065         char const* const stream_exception = "stream.Exception";
    00066         char const* const stream_dropped = "stream.Dropped";
    00067     }
    00068
    00069     namespace attributes
    00070     {
    00071         // string based representation of stream states
    00072         char const* const stream_state_unknown = "Unknown";
    00073         char const* const stream_state_new = "New";
    00074         char const* const stream_state_open = "open";
    00075         char const* const stream_state_closed = "Closed";
    00076         char const* const stream_state_dropped = "Dropped";
    00077         char const* const stream_state_error = "Error";
    00078     }
    00079
    00092     enum state
    00093     {
    00094         Unknown      = -1,
    00095         New          =  1,
    00096         Open         =  2,
    00097         Closed       =  3,
    00098         Dropped      =  4,
    00099         Error        =  5
    00100     };
    00101
    00110     enum activity
    00111     {
    00112         Read         =  1,
    00113         Write        =  2,
    00114         Exception    =  4
    00115     };
    00116
    00121     class SAGA_STREAM_PACKAGE_EXPORT stream
    00122         : public saga::object,
    00123           public saga::detail::attribute<stream>,
    00124           public saga::detail::monitorable<stream>
    00125     {
    00127
    00128         friend struct saga::detail::attribute<stream>;    // needs to access get_impl()
    00129         friend struct saga::detail::monitorable<stream>;  // needs to access get_impl()
    00130
    00131         typedef saga::detail::attribute<stream> attribute_base_type;
    00132         typedef saga::detail::monitorable<stream> monitorable_base_type;
    00134
    00135     public:
    00136
    00141       //typedef stream_base::state state;
    00142
    00143     protected:
    00145
    00146         TR1::shared_ptr <saga::impl::stream> get_impl_sp(void) const;
    00147         saga::impl::stream* get_impl (void) const;
    00148         friend class saga::impl::stream;
    00149         friend struct saga::detail::create_default<stream>;
    00150
    00151         explicit stream (saga::impl::stream *);
    00152         explicit stream (int);    // dummy constructor to create empty facade
    00154
    00155     private:
    00156         // factory
    00157         SAGA_CALL_CREATE_PRIV_2(session const&, saga::url)
    00158
    00159         // stream inspection methods
    00160         SAGA_CALL_CONST_PRIV_0(get_url)
    00161         SAGA_CALL_CONST_PRIV_0(get_context)
    00162
    00163         // stream methods
    00164         SAGA_CALL_PRIV_1(connect, double)
    00165         SAGA_CALL_PRIV_2(wait, saga::stream::activity, double)
    00166         SAGA_CALL_PRIV_1(close, double)
    00167         SAGA_CALL_PRIV_2(read, saga::mutable_buffer, saga::ssize_t)
    00168         SAGA_CALL_PRIV_2(write, saga::const_buffer, saga::ssize_t)
    00169
    00170         void init_attributes();
    00171         void init_metrics();
    00172
    00173     public:
    00178         explicit stream (session const & s, saga::url url = saga::url());
    00179
    00184         explicit stream (saga::url url);
    00185
    00190         stream ();
    00191
    00196         explicit stream (saga::object const& o);
    00197
    00202         ~stream (void);
    00203
    00207         static stream create(session const& s, saga::url name = saga::url())
    00208         {
    00209             return stream(s, name);
    00210         }
    00212         SAGA_CALL_CREATE_2_DEF_1(session const&, saga::url, saga::url())
    00214
    00217         static stream create(saga::url name = saga::url())
    00218         {
    00219             return stream(name);
    00220         }
    00221         template <typename Tag>
    00222         static saga::task create(saga::url name = saga::url())
    00223         {
    00224             return create<Tag>(detail::get_the_session(), name);
    00225         }
    00226
    00231         stream &operator= (saga::object const& o);
    00232
    00239         saga::url get_url() const
    00240         {
    00241             saga::task t = get_urlpriv(saga::task_base::Sync());
    00242             return t.get_result<saga::url>();
    00243         }
    00244         SAGA_CALL_CONST_PUB_0_DEF_0(get_url)
    00245
    00246
    00252         saga::context get_context() const
    00253         {
    00254             saga::task t = get_contextpriv(saga::task_base::Sync());
    00255             return t.get_result<saga::context>();
    00256         }
    00257         SAGA_CALL_CONST_PUB_0_DEF_0(get_context)
    00258
    00259
    00265         void connect(double timeout  = -1.0)
    00266         {
    00267             saga::task t = connectpriv(timeout, saga::task_base::Sync());
    00268             return t.get_result();
    00269         }
    00270         SAGA_CALL_PUB_1_DEF_1(connect, double, -1.0)
    00271
    00272
    00281         std::vector<saga::stream::activity>
    00282         wait(saga::stream::activity what, double timeout = -1.0)
    00283         {
    00284             saga::task t = waitpriv(what, timeout, saga::task_base::Sync());
    00285             return t.get_result<std::vector<saga::stream::activity> >();
    00286         }
    00287         SAGA_CALL_PUB_2_DEF_1(wait, saga::stream::activity, double, -1.0)
    00288
    00289
    00294         void close(double timeout = 0.0)
    00295         {
    00296           saga::task t = closepriv(timeout, saga::task_base::Sync());
    00297           t.get_result ();
    00298         }
    00299         SAGA_CALL_PUB_1_DEF_1(close, double, 0.0)
    00300
    00301
    00309         saga::ssize_t read(saga::mutable_buffer buffer, saga::ssize_t length = 0)
    00310         {
    00311             saga::task t = readpriv(buffer, length, saga::task_base::Sync());
    00312             return t.get_result<saga::ssize_t>();
    00313         }
    00314         SAGA_CALL_PUB_2_DEF_1(read, saga::mutable_buffer, saga::ssize_t, 0)
    00315
    00316
    00324         saga::ssize_t write(saga::const_buffer buffer, saga::ssize_t length = 0)
    00325         {
    00326             saga::task t = writepriv(buffer, length, saga::task_base::Sync());
    00327             return t.get_result<saga::ssize_t>();
    00328         }
    00329         SAGA_CALL_PUB_2_DEF_1(write, saga::const_buffer, saga::ssize_t, 0)
    00330     };
    00331
    00332   }
    00333
    00334   namespace detail
    00335   {
    00336       // we need to specialize the create_default template (used in hold_any)
    00337       // to be able to create a truly default constructed stream (empty
    00338       // facade)
    00339       template<>
    00340       struct create_default<saga::stream::stream>
    00341       {
    00342           static saga::stream::stream* call()
    00343           {
    00344               return new saga::stream::stream(1);    // use dummy constructor
    00345           }
    00346           template <typename T_> static void call(T_* obj)
    00347           {
    00348               new (obj) saga::stream::stream(1);
    00349           }
    00350       };
    00351   }
    00352
    00354     namespace adaptors
    00355     {
    00356         saga::stream::state SAGA_STREAM_PACKAGE_EXPORT
    00357             stream_state_value_to_enum(std::string const& val);
    00358         std::string SAGA_STREAM_PACKAGE_EXPORT
    00359             stream_state_enum_to_value(int s);
    00360     }
    00362 }
    00363
    00364 // re-enable warnings about dependent classes not being exported from the dll
    00365 #if defined(BOOST_MSVC)
    00366 #pragma warning(pop)
    00367 #endif
    00368
    00369 #endif // SAGA_COMM_STREAM_STREAM_HPP
    00370