1e8c8fa4bSAndrew Rist /**************************************************************
2cdf0e10cSrcweir *
3e8c8fa4bSAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one
4e8c8fa4bSAndrew Rist * or more contributor license agreements. See the NOTICE file
5e8c8fa4bSAndrew Rist * distributed with this work for additional information
6e8c8fa4bSAndrew Rist * regarding copyright ownership. The ASF licenses this file
7e8c8fa4bSAndrew Rist * to you under the Apache License, Version 2.0 (the
8e8c8fa4bSAndrew Rist * "License"); you may not use this file except in compliance
9e8c8fa4bSAndrew Rist * with the License. You may obtain a copy of the License at
10e8c8fa4bSAndrew Rist *
11e8c8fa4bSAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
12e8c8fa4bSAndrew Rist *
13e8c8fa4bSAndrew Rist * Unless required by applicable law or agreed to in writing,
14e8c8fa4bSAndrew Rist * software distributed under the License is distributed on an
15e8c8fa4bSAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16e8c8fa4bSAndrew Rist * KIND, either express or implied. See the License for the
17e8c8fa4bSAndrew Rist * specific language governing permissions and limitations
18e8c8fa4bSAndrew Rist * under the License.
19e8c8fa4bSAndrew Rist *
20e8c8fa4bSAndrew Rist *************************************************************/
21e8c8fa4bSAndrew Rist
22e8c8fa4bSAndrew Rist
23cdf0e10cSrcweir
24cdf0e10cSrcweir
25cdf0e10cSrcweir #include <vos/pipe.hxx>
26cdf0e10cSrcweir #include <vos/diagnose.hxx>
27cdf0e10cSrcweir
28cdf0e10cSrcweir using namespace vos;
29cdf0e10cSrcweir
30cdf0e10cSrcweir ///////////////////////////////////////////////////////////////////////////////
31cdf0e10cSrcweir // Pipe
32cdf0e10cSrcweir
33cdf0e10cSrcweir
34cdf0e10cSrcweir VOS_IMPLEMENT_CLASSINFO(VOS_CLASSNAME(OPipe, vos),
35cdf0e10cSrcweir VOS_NAMESPACE(OPipe, vos),
36cdf0e10cSrcweir VOS_NAMESPACE(OObject, vos), 0);
37cdf0e10cSrcweir
38cdf0e10cSrcweir /*****************************************************************************/
39cdf0e10cSrcweir // OPipe()
40cdf0e10cSrcweir /*****************************************************************************/
OPipe()41cdf0e10cSrcweir OPipe::OPipe()
42cdf0e10cSrcweir {
43cdf0e10cSrcweir m_pPipeRef= 0;
44cdf0e10cSrcweir }
45cdf0e10cSrcweir
46cdf0e10cSrcweir /*****************************************************************************/
47cdf0e10cSrcweir // OPipe()
48cdf0e10cSrcweir /*****************************************************************************/
49cdf0e10cSrcweir
OPipe(const rtl::OUString & strName,TPipeOption Options)50cdf0e10cSrcweir OPipe::OPipe( const rtl::OUString& strName, TPipeOption Options)
51cdf0e10cSrcweir {
52cdf0e10cSrcweir m_pPipeRef =
53cdf0e10cSrcweir new PipeRef( osl_createPipe(strName.pData,
54cdf0e10cSrcweir (oslPipeOptions)Options,
55cdf0e10cSrcweir NULL) );
56cdf0e10cSrcweir
57cdf0e10cSrcweir VOS_POSTCOND(m_pPipeRef != 0, "OPipe(): new failed.\n");
58cdf0e10cSrcweir VOS_POSTCOND((*m_pPipeRef)(), "OPipe(): creation of pipe failed!\n");
59cdf0e10cSrcweir }
60cdf0e10cSrcweir
61cdf0e10cSrcweir /*****************************************************************************/
62cdf0e10cSrcweir // OPipe()
63cdf0e10cSrcweir /*****************************************************************************/
64cdf0e10cSrcweir
OPipe(const rtl::OUString & strName,TPipeOption Options,const OSecurity & rSecurity)65cdf0e10cSrcweir OPipe::OPipe( const rtl::OUString& strName,
66cdf0e10cSrcweir TPipeOption Options,
67cdf0e10cSrcweir const OSecurity& rSecurity)
68cdf0e10cSrcweir {
69cdf0e10cSrcweir m_pPipeRef=
70cdf0e10cSrcweir new PipeRef(osl_createPipe(strName.pData,
71cdf0e10cSrcweir (oslPipeOptions)Options,
72cdf0e10cSrcweir (oslSecurity)rSecurity));
73cdf0e10cSrcweir
74cdf0e10cSrcweir VOS_POSTCOND(m_pPipeRef != 0, "OPipe(): new failed.\n");
75cdf0e10cSrcweir VOS_POSTCOND((*m_pPipeRef)(), "OPipe(): creation of pipe failed!\n");
76cdf0e10cSrcweir }
77cdf0e10cSrcweir
78cdf0e10cSrcweir /*****************************************************************************/
79cdf0e10cSrcweir // OPipe()
80cdf0e10cSrcweir /*****************************************************************************/
OPipe(const OPipe & pipe)81cdf0e10cSrcweir OPipe::OPipe(const OPipe& pipe) :
82cdf0e10cSrcweir OReference(), OObject()
83cdf0e10cSrcweir {
84cdf0e10cSrcweir
85cdf0e10cSrcweir VOS_ASSERT(pipe.m_pPipeRef != 0);
86cdf0e10cSrcweir
87cdf0e10cSrcweir m_pPipeRef= pipe.m_pPipeRef;
88cdf0e10cSrcweir
89cdf0e10cSrcweir m_pPipeRef->acquire();
90cdf0e10cSrcweir }
91cdf0e10cSrcweir
92cdf0e10cSrcweir /*****************************************************************************/
93cdf0e10cSrcweir // OPipe()
94cdf0e10cSrcweir /*****************************************************************************/
OPipe(oslPipe Pipe)95cdf0e10cSrcweir OPipe::OPipe(oslPipe Pipe)
96cdf0e10cSrcweir {
97cdf0e10cSrcweir m_pPipeRef = new PipeRef(Pipe);
98cdf0e10cSrcweir }
99cdf0e10cSrcweir
100cdf0e10cSrcweir
101cdf0e10cSrcweir /*****************************************************************************/
102cdf0e10cSrcweir // ~OPipe()
103cdf0e10cSrcweir /*****************************************************************************/
~OPipe()104cdf0e10cSrcweir OPipe::~OPipe()
105cdf0e10cSrcweir {
106cdf0e10cSrcweir close();
107cdf0e10cSrcweir }
108cdf0e10cSrcweir
109cdf0e10cSrcweir /*****************************************************************************/
110cdf0e10cSrcweir // create
111cdf0e10cSrcweir /*****************************************************************************/
create(const rtl::OUString & strName,TPipeOption Options)112cdf0e10cSrcweir sal_Bool OPipe::create( const rtl::OUString& strName, TPipeOption Options )
113cdf0e10cSrcweir {
114cdf0e10cSrcweir // if this was a valid pipe, decrease reference
115cdf0e10cSrcweir if ((m_pPipeRef) && (m_pPipeRef->release() == 0))
116cdf0e10cSrcweir {
117cdf0e10cSrcweir osl_releasePipe((*m_pPipeRef)());
118cdf0e10cSrcweir delete m_pPipeRef;
119cdf0e10cSrcweir m_pPipeRef= 0;
120cdf0e10cSrcweir }
121cdf0e10cSrcweir
122cdf0e10cSrcweir m_pPipeRef=
123cdf0e10cSrcweir new PipeRef(osl_createPipe(strName.pData,
124cdf0e10cSrcweir (oslPipeOptions)Options,
125cdf0e10cSrcweir NULL));
126cdf0e10cSrcweir
127cdf0e10cSrcweir VOS_POSTCOND(m_pPipeRef != 0, "OPipe(): new failed.\n");
128cdf0e10cSrcweir
129cdf0e10cSrcweir return (*m_pPipeRef)() != 0;
130cdf0e10cSrcweir }
131cdf0e10cSrcweir
132cdf0e10cSrcweir /*****************************************************************************/
133cdf0e10cSrcweir // create
134cdf0e10cSrcweir /*****************************************************************************/
create(const rtl::OUString & strName,TPipeOption Options,const vos::OSecurity & rSecurity)135cdf0e10cSrcweir sal_Bool OPipe::create( const rtl::OUString& strName,
136cdf0e10cSrcweir TPipeOption Options,
137cdf0e10cSrcweir const vos::OSecurity& rSecurity )
138cdf0e10cSrcweir {
139cdf0e10cSrcweir // if this was a valid pipe, decrease reference
140cdf0e10cSrcweir if ((m_pPipeRef) && (m_pPipeRef->release() == 0))
141cdf0e10cSrcweir {
142cdf0e10cSrcweir osl_releasePipe((*m_pPipeRef)());
143cdf0e10cSrcweir delete m_pPipeRef;
144cdf0e10cSrcweir m_pPipeRef= 0;
145cdf0e10cSrcweir }
146cdf0e10cSrcweir
147cdf0e10cSrcweir m_pPipeRef=
148cdf0e10cSrcweir new PipeRef(osl_createPipe(strName.pData,
149cdf0e10cSrcweir (oslPipeOptions)Options,
150cdf0e10cSrcweir (oslSecurity)rSecurity));
151cdf0e10cSrcweir
152cdf0e10cSrcweir VOS_POSTCOND(m_pPipeRef != 0, "OPipe(): new failed.\n");
153cdf0e10cSrcweir
154cdf0e10cSrcweir return (*m_pPipeRef)() != 0;
155cdf0e10cSrcweir }
156cdf0e10cSrcweir
157cdf0e10cSrcweir /*****************************************************************************/
158cdf0e10cSrcweir // operator=
159cdf0e10cSrcweir /*****************************************************************************/
operator =(const OPipe & pipe)160cdf0e10cSrcweir OPipe& OPipe::operator= (const OPipe& pipe)
161cdf0e10cSrcweir {
162cdf0e10cSrcweir VOS_PRECOND(pipe.m_pPipeRef != 0, "OPipe::operator=: tried to assign an empty/invalid pipe\n");
163cdf0e10cSrcweir
164cdf0e10cSrcweir if (m_pPipeRef == pipe.m_pPipeRef)
165cdf0e10cSrcweir return *this;
166cdf0e10cSrcweir
167cdf0e10cSrcweir // if this was a valid pipe, decrease reference
168cdf0e10cSrcweir if ((m_pPipeRef) && (m_pPipeRef->release() == 0))
169cdf0e10cSrcweir {
170cdf0e10cSrcweir osl_releasePipe((*m_pPipeRef)());
171cdf0e10cSrcweir delete m_pPipeRef;
172cdf0e10cSrcweir m_pPipeRef= 0;
173cdf0e10cSrcweir }
174cdf0e10cSrcweir
175cdf0e10cSrcweir m_pPipeRef= pipe.m_pPipeRef;
176cdf0e10cSrcweir
177cdf0e10cSrcweir m_pPipeRef->acquire();
178cdf0e10cSrcweir
179cdf0e10cSrcweir return *this;
180cdf0e10cSrcweir }
181cdf0e10cSrcweir
182cdf0e10cSrcweir /*****************************************************************************/
183cdf0e10cSrcweir // operator oslPipe()
184cdf0e10cSrcweir /*****************************************************************************/
operator oslPipe() const185cdf0e10cSrcweir OPipe::operator oslPipe() const
186cdf0e10cSrcweir {
187cdf0e10cSrcweir VOS_ASSERT(m_pPipeRef);
188cdf0e10cSrcweir return (*m_pPipeRef)();
189cdf0e10cSrcweir }
190cdf0e10cSrcweir
191cdf0e10cSrcweir /*****************************************************************************/
192cdf0e10cSrcweir // isValid()
193cdf0e10cSrcweir /*****************************************************************************/
isValid() const194cdf0e10cSrcweir sal_Bool OPipe::isValid() const
195cdf0e10cSrcweir {
196cdf0e10cSrcweir return m_pPipeRef != 0 && (*m_pPipeRef)() != 0;
197cdf0e10cSrcweir }
198cdf0e10cSrcweir
199cdf0e10cSrcweir
200cdf0e10cSrcweir /*****************************************************************************/
201cdf0e10cSrcweir // close
202cdf0e10cSrcweir /*****************************************************************************/
close()203cdf0e10cSrcweir void OPipe::close()
204cdf0e10cSrcweir {
205cdf0e10cSrcweir if (m_pPipeRef && (m_pPipeRef->release() == 0))
206cdf0e10cSrcweir {
207cdf0e10cSrcweir osl_releasePipe((*m_pPipeRef)());
208cdf0e10cSrcweir delete m_pPipeRef;
209cdf0e10cSrcweir }
210cdf0e10cSrcweir m_pPipeRef= 0;
211cdf0e10cSrcweir }
212cdf0e10cSrcweir
213cdf0e10cSrcweir /*****************************************************************************/
214cdf0e10cSrcweir // accept
215cdf0e10cSrcweir /*****************************************************************************/
accept(OStreamPipe & Connection)216cdf0e10cSrcweir OPipe::TPipeError OPipe::accept(OStreamPipe& Connection)
217cdf0e10cSrcweir {
218cdf0e10cSrcweir if ( isValid() )
219cdf0e10cSrcweir {
220cdf0e10cSrcweir Connection = osl_acceptPipe((*m_pPipeRef)());
221cdf0e10cSrcweir
222cdf0e10cSrcweir if(Connection.isValid())
223cdf0e10cSrcweir return E_None;
224cdf0e10cSrcweir }
225cdf0e10cSrcweir
226cdf0e10cSrcweir return getError();
227cdf0e10cSrcweir }
228cdf0e10cSrcweir
229cdf0e10cSrcweir /*****************************************************************************/
230cdf0e10cSrcweir // recv
231cdf0e10cSrcweir /*****************************************************************************/
recv(void * pBuffer,sal_uInt32 BytesToRead)232cdf0e10cSrcweir sal_Int32 OPipe::recv(void* pBuffer, sal_uInt32 BytesToRead)
233cdf0e10cSrcweir {
234cdf0e10cSrcweir if ( isValid() )
235cdf0e10cSrcweir return osl_receivePipe((*m_pPipeRef)(),
236cdf0e10cSrcweir pBuffer,
237cdf0e10cSrcweir BytesToRead);
238cdf0e10cSrcweir else
239cdf0e10cSrcweir return -1;
240cdf0e10cSrcweir
241cdf0e10cSrcweir }
242cdf0e10cSrcweir
243cdf0e10cSrcweir /*****************************************************************************/
244cdf0e10cSrcweir // send
245cdf0e10cSrcweir /*****************************************************************************/
send(const void * pBuffer,sal_uInt32 BytesToSend)246cdf0e10cSrcweir sal_Int32 OPipe::send(const void* pBuffer, sal_uInt32 BytesToSend)
247cdf0e10cSrcweir {
248cdf0e10cSrcweir if ( isValid() )
249cdf0e10cSrcweir return osl_sendPipe((*m_pPipeRef)(),
250cdf0e10cSrcweir pBuffer,
251cdf0e10cSrcweir BytesToSend);
252cdf0e10cSrcweir else
253cdf0e10cSrcweir return -1;
254cdf0e10cSrcweir }
255cdf0e10cSrcweir
256cdf0e10cSrcweir /*****************************************************************************/
257cdf0e10cSrcweir // getError
258cdf0e10cSrcweir /*****************************************************************************/
getError() const259cdf0e10cSrcweir OPipe::TPipeError OPipe::getError() const
260cdf0e10cSrcweir {
261cdf0e10cSrcweir if (m_pPipeRef)
262cdf0e10cSrcweir return (TPipeError)osl_getLastPipeError((*m_pPipeRef)());
263cdf0e10cSrcweir else
264cdf0e10cSrcweir return (TPipeError)osl_getLastPipeError(NULL);
265cdf0e10cSrcweir }
266cdf0e10cSrcweir
267cdf0e10cSrcweir
268cdf0e10cSrcweir
269cdf0e10cSrcweir VOS_IMPLEMENT_CLASSINFO(VOS_CLASSNAME(OStreamPipe, vos),
270cdf0e10cSrcweir VOS_NAMESPACE(OStreamPipe, vos),
271cdf0e10cSrcweir VOS_NAMESPACE(OPipe, vos), 0);
272cdf0e10cSrcweir
273cdf0e10cSrcweir
274cdf0e10cSrcweir
275cdf0e10cSrcweir /*****************************************************************************/
276cdf0e10cSrcweir // OStreamPipe
277cdf0e10cSrcweir /*****************************************************************************/
OStreamPipe()278cdf0e10cSrcweir OStreamPipe::OStreamPipe()
279cdf0e10cSrcweir {
280cdf0e10cSrcweir }
281cdf0e10cSrcweir
282cdf0e10cSrcweir /*****************************************************************************/
283cdf0e10cSrcweir // OStreamPipe
284cdf0e10cSrcweir /*****************************************************************************/
OStreamPipe(oslPipe Pipe)285cdf0e10cSrcweir OStreamPipe::OStreamPipe(oslPipe Pipe) :
286cdf0e10cSrcweir OPipe(Pipe)
287cdf0e10cSrcweir {
288cdf0e10cSrcweir }
289cdf0e10cSrcweir
290cdf0e10cSrcweir /*****************************************************************************/
291cdf0e10cSrcweir // OStreamPipe
292cdf0e10cSrcweir // copy constructor
293cdf0e10cSrcweir /*****************************************************************************/
OStreamPipe(const OStreamPipe & pipe)294cdf0e10cSrcweir OStreamPipe::OStreamPipe(const OStreamPipe& pipe) :
295cdf0e10cSrcweir OPipe(), IStream()
296cdf0e10cSrcweir {
297cdf0e10cSrcweir VOS_ASSERT(pipe.m_pPipeRef != 0);
298cdf0e10cSrcweir
299cdf0e10cSrcweir m_pPipeRef= pipe.m_pPipeRef;
300cdf0e10cSrcweir
301cdf0e10cSrcweir m_pPipeRef->acquire();
302cdf0e10cSrcweir }
303cdf0e10cSrcweir
304cdf0e10cSrcweir /*****************************************************************************/
305cdf0e10cSrcweir // ~OStreamPipe
306cdf0e10cSrcweir /*****************************************************************************/
~OStreamPipe()307cdf0e10cSrcweir OStreamPipe::~OStreamPipe()
308cdf0e10cSrcweir {
309cdf0e10cSrcweir }
310cdf0e10cSrcweir
311cdf0e10cSrcweir /*****************************************************************************/
312cdf0e10cSrcweir // operator=(oslPipe)
313cdf0e10cSrcweir /*****************************************************************************/
operator =(oslPipe Pipe)314cdf0e10cSrcweir OStreamPipe& OStreamPipe::operator=(oslPipe Pipe)
315cdf0e10cSrcweir {
316cdf0e10cSrcweir
317cdf0e10cSrcweir // if this was a valid pipe, decrease reference
318cdf0e10cSrcweir if (m_pPipeRef && (m_pPipeRef->release() == 0))
319cdf0e10cSrcweir {
320cdf0e10cSrcweir osl_releasePipe((*m_pPipeRef)());
321cdf0e10cSrcweir delete m_pPipeRef;
322cdf0e10cSrcweir m_pPipeRef= 0;
323cdf0e10cSrcweir }
324cdf0e10cSrcweir
325cdf0e10cSrcweir m_pPipeRef= new PipeRef(Pipe);
326cdf0e10cSrcweir
327cdf0e10cSrcweir VOS_POSTCOND(m_pPipeRef != 0, "OPipe(): new failed.\n");
328cdf0e10cSrcweir
329cdf0e10cSrcweir return *this;
330cdf0e10cSrcweir }
331cdf0e10cSrcweir
332cdf0e10cSrcweir /*****************************************************************************/
333cdf0e10cSrcweir // operator=OPipe
334cdf0e10cSrcweir /*****************************************************************************/
335cdf0e10cSrcweir
operator =(const OPipe & pipe)336cdf0e10cSrcweir OStreamPipe& OStreamPipe::operator= (const OPipe& pipe)
337cdf0e10cSrcweir {
338cdf0e10cSrcweir OPipe::operator= ( pipe );
339cdf0e10cSrcweir return *this;
340cdf0e10cSrcweir }
341cdf0e10cSrcweir
342cdf0e10cSrcweir /*****************************************************************************/
343cdf0e10cSrcweir // read
344cdf0e10cSrcweir /*****************************************************************************/
read(void * pBuffer,sal_uInt32 n) const345cdf0e10cSrcweir sal_Int32 OStreamPipe::read(void* pBuffer, sal_uInt32 n) const
346cdf0e10cSrcweir {
347cdf0e10cSrcweir VOS_ASSERT(m_pPipeRef && (*m_pPipeRef)());
348cdf0e10cSrcweir
349*86e1cf34SPedro Giffuni /* loop until all desired bytes were read or an error occurred */
350cdf0e10cSrcweir sal_Int32 BytesRead= 0;
351cdf0e10cSrcweir sal_Int32 BytesToRead= n;
352cdf0e10cSrcweir while (BytesToRead > 0)
353cdf0e10cSrcweir {
354cdf0e10cSrcweir sal_Int32 RetVal;
355cdf0e10cSrcweir RetVal= osl_receivePipe((*m_pPipeRef)(),
356cdf0e10cSrcweir pBuffer,
357cdf0e10cSrcweir BytesToRead);
358cdf0e10cSrcweir
359*86e1cf34SPedro Giffuni /* error occurred? */
360cdf0e10cSrcweir if(RetVal <= 0)
361cdf0e10cSrcweir {
362cdf0e10cSrcweir break;
363cdf0e10cSrcweir }
364cdf0e10cSrcweir
365cdf0e10cSrcweir BytesToRead -= RetVal;
366cdf0e10cSrcweir BytesRead += RetVal;
367cdf0e10cSrcweir pBuffer= (sal_Char*)pBuffer + RetVal;
368cdf0e10cSrcweir }
369cdf0e10cSrcweir
370cdf0e10cSrcweir return BytesRead;
371cdf0e10cSrcweir }
372cdf0e10cSrcweir
373cdf0e10cSrcweir /*****************************************************************************/
374cdf0e10cSrcweir // write
375cdf0e10cSrcweir /*****************************************************************************/
write(const void * pBuffer,sal_uInt32 n)376cdf0e10cSrcweir sal_Int32 OStreamPipe::write(const void* pBuffer, sal_uInt32 n)
377cdf0e10cSrcweir {
378cdf0e10cSrcweir VOS_ASSERT(m_pPipeRef && (*m_pPipeRef)());
379cdf0e10cSrcweir
380*86e1cf34SPedro Giffuni /* loop until all desired bytes were send or an error occurred */
381cdf0e10cSrcweir sal_Int32 BytesSend= 0;
382cdf0e10cSrcweir sal_Int32 BytesToSend= n;
383cdf0e10cSrcweir while (BytesToSend > 0)
384cdf0e10cSrcweir {
385cdf0e10cSrcweir sal_Int32 RetVal;
386cdf0e10cSrcweir
387cdf0e10cSrcweir RetVal= osl_sendPipe((*m_pPipeRef)(),
388cdf0e10cSrcweir pBuffer,
389cdf0e10cSrcweir BytesToSend);
390cdf0e10cSrcweir
391*86e1cf34SPedro Giffuni /* error occurred? */
392cdf0e10cSrcweir if(RetVal <= 0)
393cdf0e10cSrcweir {
394cdf0e10cSrcweir break;
395cdf0e10cSrcweir }
396cdf0e10cSrcweir
397cdf0e10cSrcweir BytesToSend -= RetVal;
398cdf0e10cSrcweir BytesSend += RetVal;
399cdf0e10cSrcweir pBuffer= (sal_Char*)pBuffer + RetVal;
400cdf0e10cSrcweir }
401cdf0e10cSrcweir
402cdf0e10cSrcweir return BytesSend;
403cdf0e10cSrcweir }
404cdf0e10cSrcweir
isEof() const405cdf0e10cSrcweir sal_Bool OStreamPipe::isEof() const
406cdf0e10cSrcweir {
407cdf0e10cSrcweir return isValid();
408cdf0e10cSrcweir }
409cdf0e10cSrcweir
410cdf0e10cSrcweir
411cdf0e10cSrcweir
412cdf0e10cSrcweir
413