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 _DXFGRPRD_HXX
25 #define _DXFGRPRD_HXX
26 
27 #include <svtools/fltcall.hxx>
28 
29 #define DXF_MAX_STRING_LEN 256 // Max Stringlaenge (ohne die 0)
30 
31 
32 class DXFGroupReader
33 {
34 
35 public:
36 
37 	// Anmerkkung:
38 	// sizeof(DXFGroupReader) ist gross, also nur dynamisch anlegen!
39 
40 	DXFGroupReader( SvStream & rIStream, sal_uInt16 nMinPercent, sal_uInt16 nMaxPercent );
41 
42 	sal_Bool GetStatus();
43 
44 	void SetError();
45 
46 	sal_uInt16 Read();
47 		// Liesst die naechste Gruppe ein und liefert den Gruppencode zurueck.
48 		// Im Falle eines Fehlers liefert GetStatus() sal_False, Gruppencode wird 0
49 		// gesetzt, und es wird SetS(0,"EOF") ausgefuehrt.
50 
51 	sal_uInt16 GetG();
52 		// Liefert den letzten Gruppencode (also was Read() zuletzt lieferte)
53 
54 	long   GetI();
55 		// Liefert den Integer-Wert zur Gruppe, die vorher mit Read() gelesen wurde.
56 		// Dabei muss es sich um einen Gruppencode fuer den Datentyp Integer
57 		// gehandelt haben, wenn nicht, wird 0 gelieferet.
58 
59 	double GetF();
60 		// Liefert den Floatingpoint-Wert zur Gruppe, die vorher mit Read() gelesen wurde.
61 		// Dabei muss es sich um einen Gruppencode fuer den Datentyp Floatingpoint
62 		// gehandelt haben, wenn nicht, wird 0 geliefert.
63 
64 	const char * GetS();
65 		// Liefert den String zur Gruppe, die vorher mit Read() gelesen wurde.
66 		// Dabei muss es sich um einen Gruppencode fuer den Datentyp String
67 		// gehandelt haben, wenn nicht, wird NULL geliefert.
68 
69 	// Folgende drei Methoden arbeiten wie die obigen, nur kann auch ein anderer als der
70 	// aktuelle Gruppencode angegeben werden. (DXFGroupReader speichert die Parameter
71 	// zu allen Gruppencodes. Dadurch ist es moeglich, dass zunaechst mit Read() einige
72 	// verschiedene Gruppen eingelesen werden, bevor sie ausgewertet werden.)
73 	long         GetI(sal_uInt16 nG);
74 	double       GetF(sal_uInt16 nG);
75 	const char * GetS(sal_uInt16 nG);
76 
77 	// Mit folgenden Methoden koennen die aktuell gespeicherten Werte zu den
78 	// Gruppencodes veraendert werden. (z.B. um Defaultwerte zu setzen, bevor
79 	// 'blind' eine Menge von Gruppen eingelesen wird.)
80 	void SetF(sal_uInt16 nG, double fF);
81 	void SetS(sal_uInt16 nG, const char * sS); // (wird kopiert)
82 
83 private:
84 
85 	void   ReadLine(char * ptgt);
86 	long   ReadI();
87 	double ReadF();
88 	void   ReadS(char * ptgt);
89 
90 	SvStream & rIS;
91 	char sIBuff[1024];
92 	sal_uInt16 nIBuffSize,nIBuffPos;
93 	sal_Bool bStatus;
94 	sal_uInt16 nLastG;
95 	sal_uLong nGCount;
96 
97 	sal_uLong nMinPercent;
98 	sal_uLong nMaxPercent;
99 	sal_uLong nLastPercent;
100 	sal_uLong nFileSize;
101 
102 	char   S0_9      [10][DXF_MAX_STRING_LEN+1]; // Strings  Gruppencodes 0..9
103 	double F10_59    [50];      // Floats   Gruppencodes 10..59
104 	long   I60_79    [20];      // Integers Gruppencodes 60..79
105 	long   I90_99    [10];
106     char   S100      [DXF_MAX_STRING_LEN+1];
107     char   S102      [DXF_MAX_STRING_LEN+1];
108 	double F140_147  [ 8];      // Floats   Gruppencodes 140..147
109 	long   I170_175  [ 6];      // Integers Gruppencodes 170..175
110 	double F210_239  [30];      // Floats   Gruppencodes 210..239
111 	char   S999_1009 [11][DXF_MAX_STRING_LEN+1]; // Strings  Gruppencodes 999..1009
112 	double F1010_1059[50];      // Floats   Gruppencodes 1010..1059
113 	long   I1060_1079[20];      // Integers Gruppencodes 1060..1079
114 
115 };
116 
117 
GetStatus()118 inline sal_Bool DXFGroupReader::GetStatus()
119 {
120 	return bStatus;
121 }
122 
123 
SetError()124 inline void DXFGroupReader::SetError()
125 {
126 	bStatus=sal_False;
127 }
128 
GetG()129 inline sal_uInt16 DXFGroupReader::GetG()
130 {
131 	return nLastG;
132 }
133 
GetI()134 inline long DXFGroupReader::GetI()
135 {
136 	return GetI(nLastG);
137 }
138 
GetF()139 inline double DXFGroupReader::GetF()
140 {
141 	return GetF(nLastG);
142 }
143 
GetS()144 inline const char * DXFGroupReader::GetS()
145 {
146 	return GetS(nLastG);
147 }
148 
149 #endif
150 
151 
152