xref: /aoo42x/main/sc/source/filter/lotus/lotread.cxx (revision b77af630)
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_scfilt.hxx"
26 
27 
28 
29 //------------------------------------------------------------------------
30 
31 #include "document.hxx"
32 
33 #include "scerrors.hxx"
34 #include "root.hxx"
35 #include "lotimpop.hxx"
36 #include "lotattr.hxx"
37 #include "fprogressbar.hxx"
38 
39 
40 class ScFormulaCell;
41 
42 
Read()43 FltError ImportLotus::Read()
44 {
45 	enum STATE
46 	{
47 		S_START,		// analyse first BOF
48 		S_WK1,			// in WK1-Stream
49 		S_WK3,			// in WK3-Section
50 		S_WK4,			// ...
51 		S_FM3,			// ...
52 		S_END			// Import finished
53 	};
54 
55 	sal_uInt16			nOp;
56 	sal_uInt16			nSubType;
57 	sal_uInt16			nRecLen;
58 	sal_uInt32			nNextRec = 0UL;
59 	FltError		eRet = eERR_OK;
60 //	ScFormulaCell	*pLastFormCell;
61 
62 	STATE			eAkt = S_START;
63 
64 	nTab = 0;
65 	nExtTab = -2;
66 
67 	pIn->Seek( nNextRec );
68 
69 	// Progressbar starten
70     ScfStreamProgressBar aPrgrsBar( *pIn, pD->GetDocumentShell() );
71 
72 	while( eAkt != S_END )
73 	{
74 		*pIn >> nOp >> nRecLen;
75 
76 		if( pIn->IsEof() || nNextRec > SAL_MAX_UINT32 - nRecLen - 4 )
77 			eAkt = S_END;
78 
79 		nNextRec += nRecLen + 4;
80 
81 		switch( eAkt )
82 		{
83 			// -----------------------------------------------------------
84 			case S_START:											// S_START
85 			if( nOp )
86 			{
87 				eRet = SCERR_IMPORT_UNKNOWN_WK;
88 				eAkt = S_END;
89 			}
90 			else
91 			{
92 				if( nRecLen > 2 )
93 				{
94 					Bof();
95 					switch( pLotusRoot->eFirstType )
96 					{
97 						case Lotus_WK1:	eAkt = S_WK1; break;
98 						case Lotus_WK3:	eAkt = S_WK3; break;
99 						case Lotus_WK4:	eAkt = S_WK4; break;
100 						case Lotus_FM3: eAkt = S_FM3; break;
101 						default:
102 						eRet = SCERR_IMPORT_UNKNOWN_WK;
103 						eAkt = S_END;
104 					}
105 				}
106 				else
107 				{
108 					eAkt = S_END;	// hier kommt wat fuer <= WK1 hinne!
109 					eRet = 0xFFFFFFFF;
110 				}
111 			}
112 			break;
113 			// -----------------------------------------------------------
114 			case S_WK1:												// S_WK1
115 			break;
116 			// -----------------------------------------------------------
117 			case S_WK3:												// S_WK3
118 			case S_WK4:												// S_WK4
119 			switch( nOp )
120 			{
121 				case 0x0001:							// EOF
122 				eAkt = S_FM3;
123 				nTab++;
124 				break;
125 
126 				case 0x0002:							// PASSWORD
127 				eRet = eERR_FILEPASSWD;
128 				eAkt = S_END;
129 				break;
130 
131 				case 0x0007:							// COLUMNWIDTH
132 				Columnwidth( nRecLen );
133 				break;
134 
135 				case 0x0008:							// HIDDENCOLUMN
136 				Hiddencolumn( nRecLen );
137 				break;
138 
139 				case 0x0009:							// USERRANGE
140 				Userrange();
141 				break;
142 
143 				case 0x0013:							// FORMAT
144 
145 				break;
146 				case 0x0014:							// ERRCELL
147 				Errcell();
148 				break;
149 
150 				case 0x0015:							// NACELL
151 				Nacell();
152 				break;
153 
154 				case 0x0016:							// LABELCELL
155 				Labelcell();
156 				break;
157 
158 				case 0x0017:							// NUMBERCELL
159 				Numbercell();
160 				break;
161 
162 				case 0x0018:							// SMALLNUMCELL
163 				Smallnumcell();
164 				break;
165 
166 				case 0x0019:							// FORMULACELL
167 				Formulacell( nRecLen );
168 				break;
169 
170 				case 0x001b:							// extended attributes
171                 if (nRecLen > 2)
172                 {
173                     Read( nSubType );
174                     nRecLen -= 2;
175                     switch( nSubType )
176                     {
177                         case 2007:                      // ROW PRESENTATION
178                             RowPresentation( nRecLen );
179                             break;
180 
181                         case 14000:                     // NAMED SHEET
182                             NamedSheet();
183                             break;
184                     }
185                 }
186                 else
187                 {
188                     eRet = eERR_FORMAT;
189                     eAkt = S_END;
190                 }
191 			}
192 
193 			break;
194 			// -----------------------------------------------------------
195 			case S_FM3:												// S_FM3
196 			break;
197 			// -----------------------------------------------------------
198 			case S_END:												// S_END
199 			break;
200 		}
201 
202 		DBG_ASSERT( nNextRec >= pIn->Tell(),
203 			"*ImportLotus::Read(): Etwas zu gierig..." );
204 
205 		pIn->Seek( nNextRec );
206 		aPrgrsBar.Progress();
207 	}
208 
209 	// duemmliche Namen eliminieren
210 	SCTAB		nTabs = pD->GetTableCount();
211 	SCTAB		nCnt;
212 	String		aTabName;
213 	String		aBaseName;
214 	String		aRef( RTL_CONSTASCII_USTRINGPARAM( "temp" ) );
215 	if( nTabs != 0 )
216 	{
217 		if( nTabs > 1 )
218 		{
219 			pD->GetName( 0, aBaseName );
220 			aBaseName.Erase( aBaseName.Len() - 1 );
221 		}
222 		for( nCnt = 1 ; nCnt < nTabs ; nCnt++ )
223 		{
224 			DBG_ASSERT( pD->HasTable( nCnt ),
225 				"-ImportLotus::Read(): Wo ist meine Tabelle?!" );
226 			pD->GetName( nCnt, aTabName );
227 			if( aTabName == aRef )
228 			{
229 				aTabName = aBaseName;
230 				pD->CreateValidTabName( aTabName );
231 				pD->RenameTab( nCnt, aTabName );
232 			}
233 		}
234 	}
235 
236 	pD->CalcAfterLoad();
237 
238 	return eRet;
239 }
240 
241 
Read(SvStream & rIn)242 FltError ImportLotus::Read( SvStream& rIn )
243 {
244 	pIn = &rIn;
245 
246 	sal_Bool			bRead = sal_True;
247 	sal_uInt16			nOp;
248 	sal_uInt16			nRecLen;
249 	sal_uInt32			nNextRec = 0UL;
250 	FltError		eRet = eERR_OK;
251 
252 	nTab = 0;
253 	nExtTab = -1;
254 
255 	pIn->Seek( nNextRec );
256 
257 	// Progressbar starten
258     ScfStreamProgressBar aPrgrsBar( *pIn, pD->GetDocumentShell() );
259 
260 	while( bRead )
261 	{
262 		*pIn >> nOp >> nRecLen;
263 
264 		if( pIn->IsEof() || nNextRec > SAL_MAX_UINT32 - nRecLen - 4 )
265 			bRead = sal_False;
266 		else
267 		{
268 			nNextRec += nRecLen + 4;
269 
270 			switch( nOp )
271 			{
272 				case 0x0000:							// BOF
273 				if( nRecLen != 26 || !BofFm3() )
274 				{
275 					bRead = sal_False;
276 					eRet = eERR_FORMAT;
277 				}
278 				break;
279 
280 				case 0x0001:							// EOF
281 					bRead = sal_False;
282 					DBG_ASSERT( nTab == 0,
283 						"-ImportLotus::Read( SvStream& ): Zweimal EOF nicht erlaubt" );
284 					nTab++;
285 				break;
286 
287 				case 174:								// FONT_FACE
288 					Font_Face();
289 				break;
290 
291 				case 176:								// FONT_TYPE
292 					Font_Type();
293 				break;
294 
295 				case 177:								// FONT_YSIZE
296 					Font_Ysize();
297 				break;
298 
299 				case 195:
300 					if( nExtTab >= 0 )
301 						pLotusRoot->pAttrTable->Apply( ( SCTAB ) nExtTab );
302 					nExtTab++;
303 					break;
304 				case 197:
305 					_Row( nRecLen );
306 				break;
307 			}
308 
309 			DBG_ASSERT( nNextRec >= pIn->Tell(),
310 				"*ImportLotus::Read(): Etwas zu gierig..." );
311 			pIn->Seek( nNextRec );
312 			aPrgrsBar.Progress();
313 		}
314 	}
315 
316 	pLotusRoot->pAttrTable->Apply( ( SCTAB ) nExtTab );
317 
318 	return eRet;
319 }
320 
321 
322 
323