xref: /trunk/main/sd/source/filter/ppt/pptatom.cxx (revision b63233d8)
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 #ifndef _STREAM_HXX
25 #include <tools/stream.hxx>
26 #endif
27 
28 #ifndef _PPTATOM_HXX_
29 #include "pptatom.hxx"
30 #endif
31 
32 using namespace ppt;
33 
Atom(const DffRecordHeader & rRecordHeader,SvStream & rStream)34 Atom::Atom( const DffRecordHeader& rRecordHeader, SvStream& rStream )
35 : mrStream( rStream )
36 , maRecordHeader( rRecordHeader )
37 , mpFirstChild( 0 )
38 , mpNextAtom( 0 )
39 {
40 	if( isContainer() )
41 	{
42 		if( seekToContent() )
43 		{
44 			DffRecordHeader aChildHeader;
45 
46 			Atom* pLastAtom = NULL;
47 
48 			// retrieve file size (to allow sanity checks)
49 			const sal_Size nStreamPos = mrStream.Tell();
50 			mrStream.Seek( STREAM_SEEK_TO_END );
51 			const sal_Size nStreamSize = mrStream.Tell();
52 			mrStream.Seek( nStreamPos );
53 
54 			while( (mrStream.GetError() == 0 )
55 				&& ( mrStream.Tell() < nStreamSize )
56 				&& ( mrStream.Tell() < maRecordHeader.GetRecEndFilePos() ) )
57 			{
58 				mrStream >> aChildHeader;
59 
60 				if( mrStream.GetError() == 0 )
61 				{
62 					Atom* pAtom = new Atom( aChildHeader, mrStream );
63 
64 					if( pLastAtom )
65 						pLastAtom->mpNextAtom = pAtom;
66 					if( mpFirstChild == NULL )
67 						mpFirstChild = pAtom;
68 
69 					pLastAtom = pAtom;
70 				}
71 			}
72 		}
73 	}
74 
75 	maRecordHeader.SeekToEndOfRecord( mrStream );
76 }
77 
~Atom()78 Atom::~Atom()
79 {
80 	Atom* pChild = mpFirstChild;
81 	while( pChild )
82 	{
83 		Atom* pNextChild = pChild->mpNextAtom;
84 		delete pChild;
85 		pChild = pNextChild;
86 	}
87 }
88 
89 /** imports this atom and its child atoms */
import(const DffRecordHeader & rRootRecordHeader,SvStream & rStCtrl)90 Atom* Atom::import( const DffRecordHeader& rRootRecordHeader, SvStream& rStCtrl )
91 {
92 	Atom* pRootAtom = new Atom( rRootRecordHeader, rStCtrl );
93 
94 	if( rStCtrl.GetError() == 0 )
95 	{
96 		return pRootAtom;
97 	}
98 	else
99 	{
100 		delete pRootAtom;
101 		return NULL;
102 	}
103 }
104 
105 /** returns the next child atom after pLast with nRecType or NULL */
findNextChildAtom(sal_uInt16 nRecType,const Atom * pLast) const106 const Atom* Atom::findNextChildAtom( sal_uInt16 nRecType, const Atom* pLast ) const
107 {
108 	Atom* pChild = pLast != NULL ? pLast->mpNextAtom : mpFirstChild;
109 	while( pChild && pChild->maRecordHeader.nRecType != nRecType )
110 	{
111 		pChild = pChild->mpNextAtom;
112 	}
113 
114 	return pChild;
115 }
116