blocxx
IOIFCStreamBuffer.cpp
Go to the documentation of this file.
1 /*******************************************************************************
2 * Copyright (C) 2005, Vintela, Inc. All rights reserved.
3 * Copyright (C) 2006, Novell, Inc. All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 *
8 * * Redistributions of source code must retain the above copyright notice,
9 * this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * * Neither the name of
14 * Vintela, Inc.,
15 * nor Novell, Inc.,
16 * nor the names of its contributors or employees may be used to
17 * endorse or promote products derived from this software without
18 * specific prior written permission.
19 *
20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
24 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30 * POSSIBILITY OF SUCH DAMAGE.
31 *******************************************************************************/
32 
33 
39 #include "blocxx/BLOCXX_config.h"
41 #include <cstring> // for strcmp
42 
43 namespace BLOCXX_NAMESPACE
44 {
45 
46 namespace
47 {
48  IOIFCStreamBuffer::EDirectionFlag directionToEnum(const char* direction)
49  {
50  if (strcmp(direction, "in") == 0)
51  {
53  }
54  if (strcmp(direction, "out") == 0)
55  {
57  }
59  }
60 }
61 
64  const char* direction)
65  : BaseStreamBuffer(directionToEnum(direction), bufSize)
66  , m_dev(dev)
67  , m_tied_buf(0)
68  , m_error_action(IOIFC::E_RETURN_ON_ERROR)
69 {
70 }
73  : BaseStreamBuffer(direction, bufSize)
74  , m_dev(dev)
75  , m_tied_buf(0)
76  , m_error_action(IOIFC::E_RETURN_ON_ERROR)
77 {
78 }
81 {
82  try
83  {
84  sync();
85  }
86  catch (...)
87  {
88  }
89 }
91 std::streambuf * IOIFCStreamBuffer::tie(std::streambuf * tied_buf)
92 {
93  std::streambuf * retval = m_tied_buf;
94  m_tied_buf = tied_buf;
95  return retval;
96 }
99 {
100  m_error_action = error_action;
101 }
102 
104 int
106 {
107  if (m_tied_buf)
108  {
109  m_tied_buf->pubsync();
110  }
111  return m_dev->read(c, n, m_error_action);
112 }
114 int
116 {
117  while (n > 0)
118  {
119  int cnt = m_dev->write(c, n, m_error_action);
120  if (cnt == -1) // failure
121  {
122  return -1;
123  }
124  c += cnt;
125  n -= cnt;
126  }
127  return 0;
128 }
129 
131 void
133 {
134  initBuffers();
135 }
136 
137 } // end namespace BLOCXX_NAMESPACE
138