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