1*b1cdbd2cSJim Jagielski /************************************************************** 2*b1cdbd2cSJim Jagielski * 3*b1cdbd2cSJim Jagielski * Licensed to the Apache Software Foundation (ASF) under one 4*b1cdbd2cSJim Jagielski * or more contributor license agreements. See the NOTICE file 5*b1cdbd2cSJim Jagielski * distributed with this work for additional information 6*b1cdbd2cSJim Jagielski * regarding copyright ownership. The ASF licenses this file 7*b1cdbd2cSJim Jagielski * to you under the Apache License, Version 2.0 (the 8*b1cdbd2cSJim Jagielski * "License"); you may not use this file except in compliance 9*b1cdbd2cSJim Jagielski * with the License. You may obtain a copy of the License at 10*b1cdbd2cSJim Jagielski * 11*b1cdbd2cSJim Jagielski * http://www.apache.org/licenses/LICENSE-2.0 12*b1cdbd2cSJim Jagielski * 13*b1cdbd2cSJim Jagielski * Unless required by applicable law or agreed to in writing, 14*b1cdbd2cSJim Jagielski * software distributed under the License is distributed on an 15*b1cdbd2cSJim Jagielski * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*b1cdbd2cSJim Jagielski * KIND, either express or implied. See the License for the 17*b1cdbd2cSJim Jagielski * specific language governing permissions and limitations 18*b1cdbd2cSJim Jagielski * under the License. 19*b1cdbd2cSJim Jagielski * 20*b1cdbd2cSJim Jagielski *************************************************************/ 21*b1cdbd2cSJim Jagielski 22*b1cdbd2cSJim Jagielski 23*b1cdbd2cSJim Jagielski #ifndef _OSL_PIPE_DECL_HXX_ 24*b1cdbd2cSJim Jagielski #define _OSL_PIPE_DECL_HXX_ 25*b1cdbd2cSJim Jagielski 26*b1cdbd2cSJim Jagielski #include <osl/pipe.h> 27*b1cdbd2cSJim Jagielski # include <osl/security.hxx> 28*b1cdbd2cSJim Jagielski #include <rtl/ustring.hxx> 29*b1cdbd2cSJim Jagielski 30*b1cdbd2cSJim Jagielski namespace osl { 31*b1cdbd2cSJim Jagielski 32*b1cdbd2cSJim Jagielski class StreamPipe; 33*b1cdbd2cSJim Jagielski 34*b1cdbd2cSJim Jagielski /** Represents a pipe. 35*b1cdbd2cSJim Jagielski */ 36*b1cdbd2cSJim Jagielski class Pipe 37*b1cdbd2cSJim Jagielski { 38*b1cdbd2cSJim Jagielski protected: 39*b1cdbd2cSJim Jagielski oslPipe m_handle; 40*b1cdbd2cSJim Jagielski 41*b1cdbd2cSJim Jagielski public: 42*b1cdbd2cSJim Jagielski 43*b1cdbd2cSJim Jagielski /** Does not create a pipe. Use assignment operator to 44*b1cdbd2cSJim Jagielski make this a useable pipe. 45*b1cdbd2cSJim Jagielski */ 46*b1cdbd2cSJim Jagielski inline Pipe(); 47*b1cdbd2cSJim Jagielski 48*b1cdbd2cSJim Jagielski /** Creates an insecure pipe that is accessible for all users. 49*b1cdbd2cSJim Jagielski @param strName 50*b1cdbd2cSJim Jagielski @param Options 51*b1cdbd2cSJim Jagielski */ 52*b1cdbd2cSJim Jagielski inline Pipe(const ::rtl::OUString& strName, oslPipeOptions Options); 53*b1cdbd2cSJim Jagielski 54*b1cdbd2cSJim Jagielski /** Creates a secure pipe that access depends on the umask settings. 55*b1cdbd2cSJim Jagielski @param strName 56*b1cdbd2cSJim Jagielski @param Options 57*b1cdbd2cSJim Jagielski @param Security 58*b1cdbd2cSJim Jagielski */ 59*b1cdbd2cSJim Jagielski inline Pipe(const ::rtl::OUString& strName, oslPipeOptions Options,const Security & rSecurity); 60*b1cdbd2cSJim Jagielski 61*b1cdbd2cSJim Jagielski /** Copy constructor. 62*b1cdbd2cSJim Jagielski */ 63*b1cdbd2cSJim Jagielski inline Pipe(const Pipe& pipe); 64*b1cdbd2cSJim Jagielski 65*b1cdbd2cSJim Jagielski /** Constructs a Pipe reference without acquiring the handle 66*b1cdbd2cSJim Jagielski */ 67*b1cdbd2cSJim Jagielski inline Pipe( oslPipe pipe, __sal_NoAcquire noacquire ); 68*b1cdbd2cSJim Jagielski 69*b1cdbd2cSJim Jagielski /** Creates pipe as wrapper around the underlying oslPipe. 70*b1cdbd2cSJim Jagielski @param Pipe 71*b1cdbd2cSJim Jagielski */ 72*b1cdbd2cSJim Jagielski inline Pipe(oslPipe Pipe); 73*b1cdbd2cSJim Jagielski 74*b1cdbd2cSJim Jagielski /** Destructor. Destroys the underlying oslPipe. 75*b1cdbd2cSJim Jagielski */ 76*b1cdbd2cSJim Jagielski inline ~Pipe(); 77*b1cdbd2cSJim Jagielski 78*b1cdbd2cSJim Jagielski inline sal_Bool SAL_CALL is() const; 79*b1cdbd2cSJim Jagielski 80*b1cdbd2cSJim Jagielski /** Creates an insecure pipe that is accessible for all users 81*b1cdbd2cSJim Jagielski with the given attributes. 82*b1cdbd2cSJim Jagielski If the pipe was already created, the old one will be discarded. 83*b1cdbd2cSJim Jagielski @param strName 84*b1cdbd2cSJim Jagielski @param Options 85*b1cdbd2cSJim Jagielski @param Security 86*b1cdbd2cSJim Jagielski @return True if socket was successfully created. 87*b1cdbd2cSJim Jagielski */ 88*b1cdbd2cSJim Jagielski inline sal_Bool create( const ::rtl::OUString & strName, 89*b1cdbd2cSJim Jagielski oslPipeOptions Options, const Security &rSec ); 90*b1cdbd2cSJim Jagielski 91*b1cdbd2cSJim Jagielski /** Creates a secure that access rights depend on the umask settings 92*b1cdbd2cSJim Jagielski with the given attributes. 93*b1cdbd2cSJim Jagielski 94*b1cdbd2cSJim Jagielski If socket was already created, the old one will be discarded. 95*b1cdbd2cSJim Jagielski @param strName 96*b1cdbd2cSJim Jagielski @param Options 97*b1cdbd2cSJim Jagielski @return True if socket was successfully created. 98*b1cdbd2cSJim Jagielski */ 99*b1cdbd2cSJim Jagielski inline sal_Bool create( const ::rtl::OUString & strName, oslPipeOptions Options = osl_Pipe_OPEN ); 100*b1cdbd2cSJim Jagielski 101*b1cdbd2cSJim Jagielski /** releases the underlying handle 102*b1cdbd2cSJim Jagielski */ 103*b1cdbd2cSJim Jagielski inline void SAL_CALL clear(); 104*b1cdbd2cSJim Jagielski 105*b1cdbd2cSJim Jagielski /** Assignment operator. If pipe was already created, the old one will 106*b1cdbd2cSJim Jagielski be discarded. 107*b1cdbd2cSJim Jagielski */ 108*b1cdbd2cSJim Jagielski inline Pipe& SAL_CALL operator= (const Pipe& pipe); 109*b1cdbd2cSJim Jagielski 110*b1cdbd2cSJim Jagielski /** Assignment operator. If pipe was already created, the old one will 111*b1cdbd2cSJim Jagielski be discarded. 112*b1cdbd2cSJim Jagielski */ 113*b1cdbd2cSJim Jagielski inline Pipe& SAL_CALL operator= (const oslPipe pipe ); 114*b1cdbd2cSJim Jagielski 115*b1cdbd2cSJim Jagielski /** Checks if the pipe is valid. 116*b1cdbd2cSJim Jagielski @return True if the object represents a valid pipe. 117*b1cdbd2cSJim Jagielski */ 118*b1cdbd2cSJim Jagielski inline sal_Bool SAL_CALL isValid() const; 119*b1cdbd2cSJim Jagielski 120*b1cdbd2cSJim Jagielski inline sal_Bool SAL_CALL operator==( const Pipe& rPipe ) const; 121*b1cdbd2cSJim Jagielski 122*b1cdbd2cSJim Jagielski /** Closes the pipe. 123*b1cdbd2cSJim Jagielski */ 124*b1cdbd2cSJim Jagielski inline void SAL_CALL close(); 125*b1cdbd2cSJim Jagielski 126*b1cdbd2cSJim Jagielski /** Accept connection on an existing pipe 127*b1cdbd2cSJim Jagielski */ 128*b1cdbd2cSJim Jagielski inline oslPipeError SAL_CALL accept(StreamPipe& Connection); 129*b1cdbd2cSJim Jagielski 130*b1cdbd2cSJim Jagielski 131*b1cdbd2cSJim Jagielski /** Delivers a constant decribing the last error for the pipe system. 132*b1cdbd2cSJim Jagielski @return ENONE if no error occured, invalid_PipeError if 133*b1cdbd2cSJim Jagielski an unknown (unmapped) error occured, otherwise an enum describing the 134*b1cdbd2cSJim Jagielski error. 135*b1cdbd2cSJim Jagielski */ 136*b1cdbd2cSJim Jagielski inline oslPipeError SAL_CALL getError() const; 137*b1cdbd2cSJim Jagielski 138*b1cdbd2cSJim Jagielski inline oslPipe SAL_CALL getHandle() const; 139*b1cdbd2cSJim Jagielski }; 140*b1cdbd2cSJim Jagielski 141*b1cdbd2cSJim Jagielski /** A pipe to send or receive a stream of data. 142*b1cdbd2cSJim Jagielski */ 143*b1cdbd2cSJim Jagielski class StreamPipe : public Pipe 144*b1cdbd2cSJim Jagielski { 145*b1cdbd2cSJim Jagielski public: 146*b1cdbd2cSJim Jagielski 147*b1cdbd2cSJim Jagielski /** Creates an unattached pipe. You must attach the pipe to an oslPipe 148*b1cdbd2cSJim Jagielski e.g. by using the operator=(oslPipe), before you can use the stream- 149*b1cdbd2cSJim Jagielski functionality of the object. 150*b1cdbd2cSJim Jagielski */ 151*b1cdbd2cSJim Jagielski inline StreamPipe(); 152*b1cdbd2cSJim Jagielski 153*b1cdbd2cSJim Jagielski /** Creates pipe as wrapper around the underlying oslPipe. 154*b1cdbd2cSJim Jagielski @param Pipe 155*b1cdbd2cSJim Jagielski */ 156*b1cdbd2cSJim Jagielski inline StreamPipe(oslPipe Pipe); 157*b1cdbd2cSJim Jagielski 158*b1cdbd2cSJim Jagielski /** Copy constructor. 159*b1cdbd2cSJim Jagielski @param Pipe 160*b1cdbd2cSJim Jagielski */ 161*b1cdbd2cSJim Jagielski inline StreamPipe(const StreamPipe& Pipe); 162*b1cdbd2cSJim Jagielski 163*b1cdbd2cSJim Jagielski /** Creates a pipe. 164*b1cdbd2cSJim Jagielski @param strName 165*b1cdbd2cSJim Jagielski @param Options 166*b1cdbd2cSJim Jagielski */ 167*b1cdbd2cSJim Jagielski inline StreamPipe(const ::rtl::OUString& strName, oslPipeOptions Options = osl_Pipe_OPEN); 168*b1cdbd2cSJim Jagielski 169*b1cdbd2cSJim Jagielski /** Creates a pipe. 170*b1cdbd2cSJim Jagielski @param strName 171*b1cdbd2cSJim Jagielski @param Options 172*b1cdbd2cSJim Jagielski @param rSec 173*b1cdbd2cSJim Jagielski */ 174*b1cdbd2cSJim Jagielski inline StreamPipe(const ::rtl::OUString& strName, oslPipeOptions Options, const Security &rSec ); 175*b1cdbd2cSJim Jagielski 176*b1cdbd2cSJim Jagielski /** Constructs a Pipe reference without acquiring the handle 177*b1cdbd2cSJim Jagielski */ 178*b1cdbd2cSJim Jagielski inline StreamPipe( oslPipe pipe, __sal_NoAcquire noacquire ); 179*b1cdbd2cSJim Jagielski 180*b1cdbd2cSJim Jagielski /** Attaches the oslPipe to this object. If the object 181*b1cdbd2cSJim Jagielski already was attached to an oslPipe, the old one will 182*b1cdbd2cSJim Jagielski be closed and destroyed. 183*b1cdbd2cSJim Jagielski @param Pipe. 184*b1cdbd2cSJim Jagielski */ 185*b1cdbd2cSJim Jagielski inline StreamPipe & SAL_CALL operator=(oslPipe Pipe); 186*b1cdbd2cSJim Jagielski 187*b1cdbd2cSJim Jagielski /** Assignment operator 188*b1cdbd2cSJim Jagielski */ 189*b1cdbd2cSJim Jagielski inline StreamPipe& SAL_CALL operator=(const Pipe& pipe); 190*b1cdbd2cSJim Jagielski 191*b1cdbd2cSJim Jagielski /** Tries to receives BytesToRead data from the connected pipe, 192*b1cdbd2cSJim Jagielski 193*b1cdbd2cSJim Jagielski @param pBuffer [out] Points to a buffer that will be filled with the received 194*b1cdbd2cSJim Jagielski data. 195*b1cdbd2cSJim Jagielski @param BytesToRead [in] The number of bytes to read. pBuffer must have at least 196*b1cdbd2cSJim Jagielski this size. 197*b1cdbd2cSJim Jagielski @return the number of received bytes. 198*b1cdbd2cSJim Jagielski */ 199*b1cdbd2cSJim Jagielski inline sal_Int32 SAL_CALL recv(void* pBuffer, sal_Int32 BytesToRead) const; 200*b1cdbd2cSJim Jagielski 201*b1cdbd2cSJim Jagielski /** Tries to sends BytesToSend data from the connected pipe. 202*b1cdbd2cSJim Jagielski 203*b1cdbd2cSJim Jagielski @param pBuffer [in] Points to a buffer that contains the send-data. 204*b1cdbd2cSJim Jagielski @param BytesToSend [in] The number of bytes to send. pBuffer must have at least 205*b1cdbd2cSJim Jagielski this size. 206*b1cdbd2cSJim Jagielski @return the number of transfered bytes. 207*b1cdbd2cSJim Jagielski */ 208*b1cdbd2cSJim Jagielski inline sal_Int32 SAL_CALL send(const void* pBuffer, sal_Int32 BytesToSend) const; 209*b1cdbd2cSJim Jagielski 210*b1cdbd2cSJim Jagielski /** Retrieves n bytes from the stream and copies them into pBuffer. 211*b1cdbd2cSJim Jagielski The method avoids incomplete reads due to packet boundaries. 212*b1cdbd2cSJim Jagielski @param pBuffer receives the read data. 213*b1cdbd2cSJim Jagielski @param n the number of bytes to read. pBuffer must be large enough 214*b1cdbd2cSJim Jagielski to hold the n bytes! 215*b1cdbd2cSJim Jagielski @return the number of read bytes. The number will only be smaller than 216*b1cdbd2cSJim Jagielski n if an exceptional condition (e.g. connection closed) occurs. 217*b1cdbd2cSJim Jagielski */ 218*b1cdbd2cSJim Jagielski inline sal_Int32 SAL_CALL read(void* pBuffer, sal_Int32 n) const; 219*b1cdbd2cSJim Jagielski 220*b1cdbd2cSJim Jagielski /** Writes n bytes from pBuffer to the stream. The method avoids 221*b1cdbd2cSJim Jagielski incomplete writes due to packet boundaries. 222*b1cdbd2cSJim Jagielski @param pBuffer contains the data to be written. 223*b1cdbd2cSJim Jagielski @param n the number of bytes to write. 224*b1cdbd2cSJim Jagielski @return the number of written bytes. The number will only be smaller than 225*b1cdbd2cSJim Jagielski n if an exceptional condition (e.g. connection closed) occurs. 226*b1cdbd2cSJim Jagielski */ 227*b1cdbd2cSJim Jagielski sal_Int32 SAL_CALL write(const void* pBuffer, sal_Int32 n) const; 228*b1cdbd2cSJim Jagielski }; 229*b1cdbd2cSJim Jagielski 230*b1cdbd2cSJim Jagielski } 231*b1cdbd2cSJim Jagielski #endif 232