xref: /AOO41X/main/package/source/zippackage/ZipPackageBuffer.cxx (revision a38728232e8c39f9058a1a2aa8ee4e6db7b8ca34)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_package.hxx"
26 #include <ZipPackageBuffer.hxx>
27 #include <string.h> // for memcpy
28 
29 using namespace ::com::sun::star;
30 using namespace com::sun::star::uno;
31 using namespace com::sun::star::io;
32 using com::sun::star::lang::IllegalArgumentException;
33 
ZipPackageBuffer(sal_Int64 nNewBufferSize)34 ZipPackageBuffer::ZipPackageBuffer(sal_Int64 nNewBufferSize )
35 : m_nBufferSize (nNewBufferSize)
36 , m_nEnd(0)
37 , m_nCurrent(0)
38 , m_bMustInitBuffer ( sal_True )
39 {
40 }
~ZipPackageBuffer(void)41 ZipPackageBuffer::~ZipPackageBuffer(void)
42 {
43 }
44 
readBytes(Sequence<sal_Int8> & aData,sal_Int32 nBytesToRead)45 sal_Int32 SAL_CALL ZipPackageBuffer::readBytes( Sequence< sal_Int8 >& aData, sal_Int32 nBytesToRead )
46         throw(NotConnectedException, BufferSizeExceededException, IOException, RuntimeException)
47 {
48     if (nBytesToRead < 0)
49         throw BufferSizeExceededException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), *this );
50 
51     if (nBytesToRead + m_nCurrent > m_nEnd)
52         nBytesToRead = static_cast < sal_Int32 > (m_nEnd - m_nCurrent);
53 
54     aData.realloc ( nBytesToRead );
55     memcpy(aData.getArray(), m_aBuffer.getConstArray() + m_nCurrent, nBytesToRead);
56     m_nCurrent +=nBytesToRead;
57     return nBytesToRead;
58 }
59 
readSomeBytes(Sequence<sal_Int8> & aData,sal_Int32 nMaxBytesToRead)60 sal_Int32 SAL_CALL ZipPackageBuffer::readSomeBytes( Sequence< sal_Int8 >& aData, sal_Int32 nMaxBytesToRead )
61         throw(NotConnectedException, BufferSizeExceededException, IOException, RuntimeException)
62 {
63     return readBytes(aData, nMaxBytesToRead);
64 }
skipBytes(sal_Int32 nBytesToSkip)65 void SAL_CALL ZipPackageBuffer::skipBytes( sal_Int32 nBytesToSkip )
66         throw(NotConnectedException, BufferSizeExceededException, IOException, RuntimeException)
67 {
68     if (nBytesToSkip < 0)
69         throw BufferSizeExceededException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), *this );
70 
71     if (nBytesToSkip + m_nCurrent > m_nEnd)
72         nBytesToSkip = static_cast < sal_Int32 > (m_nEnd - m_nCurrent);
73 
74     m_nCurrent+=nBytesToSkip;
75 }
available()76 sal_Int32 SAL_CALL ZipPackageBuffer::available(  )
77         throw(NotConnectedException, IOException, RuntimeException)
78 {
79     return static_cast < sal_Int32 > (m_nEnd - m_nCurrent);
80 }
closeInput()81 void SAL_CALL ZipPackageBuffer::closeInput(  )
82         throw(NotConnectedException, IOException, RuntimeException)
83 {
84 }
writeBytes(const Sequence<sal_Int8> & aData)85 void SAL_CALL ZipPackageBuffer::writeBytes( const Sequence< sal_Int8 >& aData )
86         throw(NotConnectedException, BufferSizeExceededException, IOException, RuntimeException)
87 {
88     sal_Int64 nDataLen = aData.getLength(), nCombined = m_nEnd + nDataLen;
89 
90     if ( nCombined > m_nBufferSize)
91     {
92         do
93             m_nBufferSize *=2;
94         while (nCombined > m_nBufferSize);
95         m_aBuffer.realloc(static_cast < sal_Int32 > (m_nBufferSize));
96         m_bMustInitBuffer = sal_False;
97     }
98     else if (m_bMustInitBuffer)
99     {
100         m_aBuffer.realloc ( static_cast < sal_Int32 > ( m_nBufferSize ) );
101         m_bMustInitBuffer = sal_False;
102     }
103     memcpy( m_aBuffer.getArray() + m_nCurrent, aData.getConstArray(), static_cast < sal_Int32 > (nDataLen));
104     m_nCurrent+=nDataLen;
105     if (m_nCurrent>m_nEnd)
106         m_nEnd = m_nCurrent;
107 }
flush()108 void SAL_CALL ZipPackageBuffer::flush(  )
109         throw(NotConnectedException, BufferSizeExceededException, IOException, RuntimeException)
110 {
111 }
closeOutput()112 void SAL_CALL ZipPackageBuffer::closeOutput(  )
113         throw(NotConnectedException, BufferSizeExceededException, IOException, RuntimeException)
114 {
115 }
seek(sal_Int64 location)116 void SAL_CALL ZipPackageBuffer::seek( sal_Int64 location )
117         throw( IllegalArgumentException, IOException, RuntimeException)
118 {
119     if ( location > m_nEnd || location < 0 )
120         throw IllegalArgumentException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >(), 1 );
121     m_nCurrent = location;
122 }
getPosition()123 sal_Int64 SAL_CALL ZipPackageBuffer::getPosition(  )
124         throw(IOException, RuntimeException)
125 {
126     return m_nCurrent;
127 }
getLength()128 sal_Int64 SAL_CALL ZipPackageBuffer::getLength(  )
129         throw(IOException, RuntimeException)
130 {
131     return m_nEnd;
132 }
133