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
43namespace BLOCXX_NAMESPACE
44{
45
46namespace
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}
91std::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
104int
106{
107 if (m_tied_buf)
108 {
109 m_tied_buf->pubsync();
110 }
111 return m_dev->read(c, n, m_error_action);
112}
114int
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
131void
136
137} // end namespace BLOCXX_NAMESPACE
138
virtual int write(const void *dataOut, int dataOutLen, ErrorAction errorAsException=E_RETURN_ON_ERROR)=0
Write a specified number of bytes to the device that is exposing the IOIFC interface.
virtual int read(void *dataIn, int dataInLen, ErrorAction errorAsException=E_RETURN_ON_ERROR)=0
Read a specified number of bytes from the device that is exposing the IOIFC interface.
virtual int buffer_to_device(const char *c, int n)
Writes the buffer to the "device".
virtual int buffer_from_device(char *c, int n)
Fill the buffer from the "device".
std::streambuf * tie(std::streambuf *tied_buf)
IOIFCStreamBuffer(IOIFC *dev, int bufSize, const char *direction) BLOCXX_DEPRECATED
void setErrorAction(IOIFC::ErrorAction error_action)
Taken from RFC 1321.