1 /*
2    Source File : PDFStream.cpp
3 
4 
5    Copyright 2011 Gal Kahana PDFWriter
6 
7    Licensed under the Apache License, Version 2.0 (the "License");
8    you may not use this file except in compliance with the License.
9    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, software
14    distributed under the License is distributed on an "AS IS" BASIS,
15    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16    See the License for the specific language governing permissions and
17    limitations under the License.
18 
19 
20 */
21 #include "PDFStream.h"
22 #include "IObjectsContextExtender.h"
23 #include "InputStringBufferStream.h"
24 #include "OutputStreamTraits.h"
25 
PDFStream(bool inCompressStream,IByteWriterWithPosition * inOutputStream,ObjectIDType inExtentObjectID,IObjectsContextExtender * inObjectsContextExtender)26 PDFStream::PDFStream(bool inCompressStream,
27 					 IByteWriterWithPosition* inOutputStream,
28 					 ObjectIDType inExtentObjectID,
29 					 IObjectsContextExtender* inObjectsContextExtender)
30 {
31 	mExtender = inObjectsContextExtender;
32 	mCompressStream = inCompressStream;
33 	mExtendObjectID = inExtentObjectID;
34 	mStreamStartPosition = inOutputStream->GetCurrentPosition();
35 	mOutputStream = inOutputStream;
36 	mStreamLength = 0;
37     mStreamDictionaryContextForDirectExtentStream = NULL;
38 
39 
40 	if(mCompressStream)
41 	{
42 		if(mExtender && mExtender->OverridesStreamCompression())
43 		{
44 			mWriteStream = mExtender->GetCompressionWriteStream(inOutputStream);
45 		}
46 		else
47 		{
48 			mFlateEncodingStream.Assign(inOutputStream);
49 			mWriteStream = &mFlateEncodingStream;
50 		}
51 	}
52 	else
53 		mWriteStream = inOutputStream;
54 
55 }
56 
PDFStream(bool inCompressStream,IByteWriterWithPosition * inOutputStream,DictionaryContext * inStreamDictionaryContextForDirectExtentStream,IObjectsContextExtender * inObjectsContextExtender)57 PDFStream::PDFStream(
58           bool inCompressStream,
59           IByteWriterWithPosition* inOutputStream,
60           DictionaryContext* inStreamDictionaryContextForDirectExtentStream,
61           IObjectsContextExtender* inObjectsContextExtender)
62 {
63 	mExtender = inObjectsContextExtender;
64 	mCompressStream = inCompressStream;
65 	mExtendObjectID = 0;
66 	mStreamStartPosition = 0;
67 	mOutputStream = inOutputStream;
68 	mStreamLength = 0;
69     mStreamDictionaryContextForDirectExtentStream = inStreamDictionaryContextForDirectExtentStream;
70 
71     mTemporaryOutputStream.Assign(&mTemporaryStream);
72 
73 	if(mCompressStream)
74 	{
75 		if(mExtender && mExtender->OverridesStreamCompression())
76 		{
77 			mWriteStream = mExtender->GetCompressionWriteStream(&mTemporaryOutputStream);
78 		}
79 		else
80 		{
81 			mFlateEncodingStream.Assign(&mTemporaryOutputStream);
82 			mWriteStream = &mFlateEncodingStream;
83 		}
84 	}
85 	else
86 		mWriteStream = &mTemporaryOutputStream;
87 
88 }
89 
90 
~PDFStream(void)91 PDFStream::~PDFStream(void)
92 {
93 
94 }
95 
GetWriteStream()96 IByteWriter* PDFStream::GetWriteStream()
97 {
98 	return mWriteStream;
99 }
100 
FinalizeStreamWrite()101 void PDFStream::FinalizeStreamWrite()
102 {
103 	if(mExtender && mExtender->OverridesStreamCompression() && mCompressStream)
104 		mExtender->FinalizeCompressedStreamWrite(mWriteStream);
105 	mWriteStream = NULL;
106 	if(mCompressStream)
107 		mFlateEncodingStream.Assign(NULL);  // this both finished encoding any left buffers and releases ownership from mFlateEncodingStream
108 
109     // different endings, depending if direct stream writing or not
110     if(mExtendObjectID == 0)
111     {
112         mStreamLength = mTemporaryStream.GetCurrentWritePosition();
113     }
114     else
115     {
116         mStreamLength = mOutputStream->GetCurrentPosition()-mStreamStartPosition;
117         mOutputStream = NULL;
118     }
119 }
120 
GetLength()121 LongFilePositionType PDFStream::GetLength()
122 {
123 	return mStreamLength;
124 }
125 
IsStreamCompressed()126 bool PDFStream::IsStreamCompressed()
127 {
128 	return mCompressStream;
129 }
130 
GetExtentObjectID()131 ObjectIDType PDFStream::GetExtentObjectID()
132 {
133 	return mExtendObjectID;
134 }
135 
GetStreamDictionaryForDirectExtentStream()136 DictionaryContext* PDFStream::GetStreamDictionaryForDirectExtentStream()
137 {
138     return mStreamDictionaryContextForDirectExtentStream;
139 }
140 
FlushStreamContentForDirectExtentStream()141 void PDFStream::FlushStreamContentForDirectExtentStream()
142 {
143     mTemporaryStream.pubseekoff(0,std::ios_base::beg);
144 
145     // copy internal temporary stream to output
146     InputStringBufferStream inputStreamForWrite(&mTemporaryStream);
147     OutputStreamTraits streamCopier(mOutputStream);
148     streamCopier.CopyToOutputStream(&inputStreamForWrite);
149 
150     mTemporaryStream.str();
151     mOutputStream = NULL;
152 }
153 
154