sync master with lastest vba changes
[ooovba.git] / binfilter / inc / bf_svx / svdio.hxx
blobe09628975e3eaa07ab8c373155ea80c052ecf7f2
1 /*************************************************************************
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * Copyright 2008 by Sun Microsystems, Inc.
7 * OpenOffice.org - a multi-platform office productivity suite
9 * $RCSfile: svdio.hxx,v $
10 * $Revision: 1.6 $
12 * This file is part of OpenOffice.org.
14 * OpenOffice.org is free software: you can redistribute it and/or modify
15 * it under the terms of the GNU Lesser General Public License version 3
16 * only, as published by the Free Software Foundation.
18 * OpenOffice.org is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU Lesser General Public License version 3 for more details
22 * (a copy is included in the LICENSE file that accompanied this code).
24 * You should have received a copy of the GNU Lesser General Public License
25 * version 3 along with OpenOffice.org. If not, see
26 * <http://www.openoffice.org/license.html>
27 * for a copy of the LGPLv3 License.
29 ************************************************************************/
31 #ifndef _SVDIO_HXX
32 #define _SVDIO_HXX
34 #ifndef _STREAM_HXX //autogen
35 #include <tools/stream.hxx>
36 #endif
37 class SvStream;
38 namespace binfilter {
40 ////////////////////////////////////////////////////////////////////////////////////////////////////
42 const char SdrIOMagic [2]={'D','r'};
43 const char SdrIOModlID[2]={'M','d'}; // Model
44 const char SdrIOItPlID[2]={'I','P'}; // ItemPool
45 const char SdrIOLayrID[2]={'L','y'}; // Layer
46 const char SdrIOLSetID[2]={'L','S'}; // Layerset
47 const char SdrIOPageID[2]={'P','g'}; // Page
48 const char SdrIOMaPgID[2]={'M','P'}; // MasterPage (Stammseite)
49 const char SdrIOMPgDID[2]={'M','D'}; // MasterPageDescriptor
50 const char SdrIOMPDLID[2]={'M','L'}; // MasterPageDescriptorList
51 const char SdrIOHlpLID[2]={'H','l'}; // HelpLine
52 const char SdrIOHLstID[2]={'H','L'}; // HelpLineList
53 const char SdrIODObjID[2]={'O','b'}; // Object
54 const char SdrIOConnID[2]={'C','n'}; // ObjConnection (EdgeObj)
55 const char SdrIOViewID[2]={'V','w'}; // View
56 const char SdrIOPgVwID[2]={'P','V'}; // PageView
57 const char SdrIOEndeID[2]={'X','X'}; // Ende
58 const char SdrIOJoeMagic[4]={'J','o','e','M'}; // Um meine eigenen SubRecords zu erkennen
60 const int nAktSdrFileMajorVersion = 0;
62 // #84529# increase fileversion to be able to correct gradient rotation for 5.2 and earlierl
63 const int nAktSdrFileMinorVersion = 17; // = 16;
65 const int nAktSdrFileVersion = (nAktSdrFileMajorVersion <<8) + (nAktSdrFileMinorVersion);
66 const int nSdrFileVersion31 = 12; // Fileversion des Office 3.1
67 const int nSdrFileVersion40 = 13; // Fileversion des Office 4.0
68 const int nSdrFileVersion50 = 14; // Fileversion des Office 5.0
69 const int nSdrFileVersion51 = 15; // Fileversion des Office 5.1
71 // Fileversionen:
72 // 0= ??-04-1995 Initialversion.
73 // 24-04-1995 Offizielles Office 3.0 Beta I Shipping
74 // 1= 25-04-1995 Zus. Flag fuer Layer: Standardlayer (JOE)
75 // 26-04-1995 AttrObj: Beim Stylesheet-Namen wird zusaetzlich der CharSet gemerkt (SB)
76 // 28-04-1995 Neu: MasterPageDescriptoren (VisibleLayers f. Masterpages) (JOE)
77 // 2= 18-05-1995 Drehwinkel und Shearwinkel am Gruppenobjekt (JOE)
78 // 20-05-1995 EdgeObj nun von TextObj statt von PathObj abgeleitet (JOE)
79 // 3= 23-05-1995 Textrahmen werden nun durch RectObj dargestellt (JOE)
80 // 4= 31-05-1995 Weiteres persistentes Flag am Zeichenobjekt bNotVisibleAsMaster (JOE)
81 // 12-06-1995 Offizielles Office 3.0 Beta II Shipping
82 // 13-06-1996 bTextToContour raus und durch Item ersetzt (JOE)
83 // 14-06-1996 SdrItemPool muss nun ohne RefCounts geladen werden (JOE)
84 // 5= 14-06-1995 SdrOutlinerSetItem als neuer Member im SdrAttrObj (JOE)
85 // 6= 28-06-1995 Neue Items: pMiscAttr; -> Eckenradius-Member entfaellt am RectObj (JOE)
86 // 6= 30-06-1995 Neuer Member am SdrGrafObj: aCropRect (JOE)
87 // 6= 07-07-1995 Neue Items fuer Fontwork am XOutDev (ESO)
88 // 10-07-1995 Office 3.0 Beta III Shipping an IBM
89 // 7= 18-07-1995 PolyObj raus, Import am PathObj
90 // 8= 25-07-1995 GrafObj: zus. Member: aFileName fuer FileLinks
91 // 9= 02-08-1995 GrafObj: zus. Member: aFilterName fuer FileLinks
92 // 14-10-1995 Office 3.0 PreRelease fuer Systems Muenchen
93 // 21-10-1995 Final Office 3.0 Shipping
94 // 10= 25-10-1995 *pFormTextBoundRect wird gestreamt; Neue Attribute: TextVAdjust, Textabstaende
95 // 09-11-1995 entgueltiges Format V10 durch erneute Poolumstellung (ExtraPool raus)
96 // 11= 10-11-1995 - Nicht rueckwaertskompatibel!
97 // - Einfuehrung von Major/MinorVers.
98 // - Aufraeumer: Datensack am Obj f. Konnektoren,...
99 // - bMirrored und aName fuer GrafikObjekt
100 // - DownCompat fuer Grosses, Komplexes und Unbekanntes:
101 // - SdrObject:
102 // - Konnektoren (Flag davor)
103 // - UserDataList (Flag davor)
104 // - UserData
105 // - SdrTextObj:
106 // - OutlinerParaObject (Flag war schon davor)
107 // - SdrPathObj:
108 // - PathPolygon
109 // - SdrEdgeObj:
110 // - EdgeTrack
111 // - Connections haben nun einen eigenen IOHeader
112 // - SdrGrafObj:
113 // - Graphic (Flag davor)
114 // - zus. Flag fuer HasGraphicLink
115 // - SdrOle2Obj:
116 // - Graphic (Flag war schon da)
117 // - SdrModel:
118 // - DocInfo
119 // - DocStatistic (Platz reserviert)
120 // - Misc eingepackt
121 // - SdrPage:
122 // - Misc eingepackt
123 // - Kennung fuer SubRecord meines Model und meiner Page (JoeMagic)
124 // - SvdAttrObj: CharSet fuer StyleSheet entfaellt
125 // - CharSet weg bei SdrModel und SdrAttrObj
126 // - WhichId's weg bei SdrAttrObj und SdrCaptionObj
127 // 12= 05-12-1995 Neues Item: SdrTextHorzAdjustItem. Textverankerung an Textrahmen und
128 // Grafikobjekten. Beim Import von <V12 werden Grafikobjekte hart attributiert.
129 // 12-02-1996 UIScale und UIUnit wird vom Model nun rausgeschrieben
130 // 16-02-1996 Shipping des Office 3.00.2 (SV304a)
131 // 29-02-1996 Pool V3: 17 neue Items im XOut von KA fuer Bitmapfuellungen
132 // 13-03-1996 Version fuer CeBit 96
133 // ca 15-04-1996 Shipping Version 3.1
134 // 10-08-1996 Pool Version 4; eigene Items am Verbinder
135 // 28-08-1996 CeBIT Home
136 // 21-01-1997 EdgeObj: EdgeInfo und Attribute
137 // 13= 05-02-1997 Fuer Franz's Dateiformatsumstellungen an der 3D-Engine
138 // 14= 13-03-1998 Fuer FmFormPage (FormLayer)
139 // 15= 19-01-1999 Fuer StarDraw-Preview
140 // 16= 25-08-1999 SdrPage background object
143 class SdrIOHeader
145 protected:
146 // 10 Bytes persistent:
147 char cMagic[2];
148 char cHdrID[2];
150 // Versionsnummer des Blocks
151 UINT16 nVersion;
153 // Gesamtgroesse des Blocks inkl. Header und verschachtelten Bloecken
154 UINT32 nBlkSize;
156 // ab hier Verwaltungsinformationen:
157 SvStream& rStream;
158 UINT32 nFilePos;
159 UINT16 nMode;
160 BOOL bOpen;
161 BOOL bClosed;
162 // Header wird nur zum nachschauen verwendet.
163 BOOL bLookAhead;
165 virtual void Write();
166 virtual void Read();
168 #if _SOLAR__PRIVATE
169 #ifdef DBG_UTIL
170 void ImpCheckRecordIntegrity();
171 void ImpGetRecordName(ByteString& rStr, INT32 nSubRecCount=-1, INT32 nSubRecReadCount=-1) const;
172 BOOL ImpHasSubRecords() const;
173 #endif
174 #endif // __PRIVATE
176 public:
177 SdrIOHeader(SvStream& rNewStream, UINT16 nNewMode, const char cID[2]=SdrIOEndeID, BOOL bAutoOpen=TRUE);
178 virtual ~SdrIOHeader();
180 BOOL IsMagic() const { return cMagic[0] == SdrIOMagic[0] && cMagic[1] == SdrIOMagic[1]; }
181 void SetMagic() { cMagic[0] = SdrIOMagic[0]; cMagic[1] = SdrIOMagic[1]; }
182 BOOL IsEnde() const { return cHdrID[0] == SdrIOEndeID[0] && cHdrID[1] == SdrIOEndeID[1]; }
183 void SetEnde() { cHdrID[0] = SdrIOEndeID[0]; cHdrID[1] = SdrIOEndeID[1]; nBlkSize = 0; SetMagic(); }
184 BOOL IsID(const char cID[2]) const { return cHdrID[0] == cID[0] && cHdrID[1] == cID[1]; }
185 void SetID(const char cID[2]) { cHdrID[0] = cID[0]; cHdrID[1] = cID[1]; SetMagic(); }
186 UINT16 GetVersion() const { return nVersion; }
187 UINT16 GetMinorVersion() const { return nVersion | 0xFF; }
188 UINT16 GetMajorVersion() const { return nVersion >>8; }
189 UINT32 GetFilePos() const { return nFilePos; }
190 UINT32 GetBlockSize() const { return nBlkSize; }
191 void OpenRecord();
192 void CloseRecord();
193 UINT32 GetBytesLeft() const;
196 class SdrIOHeaderLookAhead: public SdrIOHeader
198 public:
199 SdrIOHeaderLookAhead(SvStream& rNewStream, BOOL bAutoOpen = TRUE);
200 void SkipRecord() const { rStream.Seek(nFilePos+nBlkSize); }
204 I/O-Format (12+n Bytes)
205 4 Inventor
206 2 Version
207 2 Identifier
208 4 Menge der nachfolgenden Daten in Bytes
209 -------
210 2 Layer
211 16 Allumschliessendes Rechteck
212 n>=18 Objektspezifische Daten
214 //const SdrObjIOHeaderSize=6;
216 class SdrObject;
218 class SdrObjIOHeader: public SdrIOHeader
220 public:
221 // ab hier persistente Daten
222 UINT32 nInventor;
223 UINT16 nIdentifier;
225 // ab hier Verwaltungsinformationen
226 const SdrObject* pObj;
228 protected:
229 virtual void Write();
230 virtual void Read();
232 public:
233 SdrObjIOHeader(SvStream& rNewStream, UINT16 nNewMode, const SdrObject* pNewObj = NULL, BOOL bAutoOpen = TRUE);
235 // DTor ueberladen, den in Dtor von SdrIOHeader lebt der SdrObjIOJHeader nicht mehr.
236 virtual ~SdrObjIOHeader();
239 class SdrObjIOHeaderLookAhead: public SdrObjIOHeader
241 public:
242 SdrObjIOHeaderLookAhead(SvStream& rNewStream, BOOL bAutoOpen = TRUE);
243 void SkipRecord() const { rStream.Seek(nFilePos+nBlkSize); }
246 // Klasse fuer Abwaertskompatibilitaet (Lesen neuer Daten mit altem Code)
247 // In der Regel reicht es aus, diese Klasse am Anfang des Lese/Schreibfokus
248 // auf dem Stack mit bAutoOpen=TRUE (default) zu instanziieren. Der Rest
249 // geschieht von selbst. Will man am Ende des Lesens wissen, ob noch weitere
250 // Daten im Sub-Record enthalten sind, ruft man GetBytesLeft().
251 // Den SubRecord schliesst man entweder mit CloseSubRecord() oder man laesst
252 // ihn vom Destruktor automatisch schliessen.
253 // Dieses Konzept setzt jedoch eine feste Reihenfolge und Anzahl der SubRecords
254 // voraus.
255 class SdrDownCompat
257 protected:
258 SvStream& rStream;
259 UINT32 nSubRecSiz;
260 UINT32 nSubRecPos;
261 UINT16 nMode;
262 BOOL bOpen;
263 BOOL bClosed;
265 // nur fuer Debug
266 const char* pRecId;
268 protected:
269 virtual void Read();
270 virtual void Write();
272 public:
273 // Als Modus muss STREAM_READ oder STREAM_WRITE angegeben werden.
274 SdrDownCompat(SvStream& rNewStream, UINT16 nNewMode, BOOL bAutoOpen = TRUE);
275 ~SdrDownCompat();
277 #ifdef DBG_UTIL
278 // fuer etwas aussagekraeftigere Assertions
279 void SetID(const char* pId) { pRecId=pId; }
280 #endif
282 // Mit GetBytesLeft() kann man abfragen, ob und wieviele Bytes noch
283 // im SubRecord stehen. Nur gueltig bei STREAM_READ, sonst 0.
284 // Nach CloseRecord() liefert diese Methode auch im Modus STREAM_READ 0.
285 // (Denn dann sind die restlichen Bytes bereits uebersprungen.)
286 UINT32 GetBytesLeft() const;
287 BOOL IsOpen() const { return bOpen; }
289 // Die Pos ist erst gueltig nach Open bzw nach CTor mit bAutoOpen=TRUE.
290 UINT32 GetSubRecordPos() const { return nSubRecPos; }
292 // Erst gueltig nach Open bzw. nach CTor mit bAutoOpen=TRUE.
293 // Beim Modus STREAM_WRITE ist die Size erst nach Close() gueltig.
294 UINT32 GetSubRecordSize() const { return nSubRecSiz; }
295 void OpenSubRecord();
296 void CloseSubRecord();
299 // Identifier fuer SdrNamedSubRecord bei Inventor==SdrInventor
300 enum {SDRIORECNAME_VIEWPAGEVIEWS =0x0000, // alle Pageviews, angezeigte und nicht angezeigte
301 SDRIORECNAME_VIEWVISIELEM =0x0001, // sichtbare Elemente (Seite, Rand, Gitter, Hilfslinien,...)
303 SDRIORECNAME_VIEWSNAP =0x0010, // Fangeinstellungen
304 SDRIORECNAME_VIEWORTHO =0x0011, // Einstellungen fuer Ortho
306 SDRIORECNAME_VIEWDRAGMODE =0x0020, // Move oder Rotate/Slant/..., bEditMode, RefPoints, FramDragSingles, PlusAlways
307 SDRIORECNAME_VIEWMARKEDOBJ =0x0021, // (ni) markierte Objekte
308 SDRIORECNAME_VIEWMARKEDPNT =0x0022, // (ni) markierte Punkte
309 SDRIORECNAME_VIEWCROOKCENTER =0x0023, // Kreismittelpunkt des letzten Crook
310 SDRIORECNAME_VIEWMARKEDGLUE =0x0024, // (ni) markierte Klebepunkte
312 SDRIORECNAME_VIEWDRAGSTRIPES =0x0030, // Animierte Begrenzungslinien waerend des Draeggens
313 SDRIORECNAME_VIEWDRAGHIDEHDL =0x0031, // Handles waerend des Draeggens verstecken
314 SDRIORECNAME_VIEWDRAGEDGES =0x0032, // (ni) Einstellungen fuer EdgeDragging
315 SDRIORECNAME_VIEWOBJHITMOVES =0x0033, // Bei MarkedHit Move oder DragMode
316 SDRIORECNAME_VIEWMIRRDRAGOBJ =0x0034, // Obj beim schieben der Spiegelachse zeigen
318 SDRIORECNAME_VIEWCROBJECT =0x0040, // Aktuelles CreateObj
319 SDRIORECNAME_VIEWAKTLAYER =0x0041, // Layer fuer Create und Paste (nun in der PaintView)
320 SDRIORECNAME_VIEWCRATTRIBUTES=0x0042, // (ni) Attribute fuer Create
321 SDRIORECNAME_VIEWCRSTYLESHEET=0x0043, // (ni) StyleSheet fuer Create
322 SDRIORECNAME_VIEWCRFLAGS =0x0044, // Misc Flags fuer Create
324 SDRIORECNAME_VIEWTEXTEDIT =0x0050, // Div. Einstellungen fuer TextEdit
325 SDRIORECNAME_VIEWMACRO =0x0051, // Div. Einstellungen fuer Macro
327 SDRIORECNAME_VIEWCHARSET =0x0080, // Hier merkt sich die SdrView den CharSet und setzt diesem beim Read am Stream
329 SDRIORECNAME_PAGVIEW =0x0100, // Pageview sichtbar, Seitennummer, Position, Ursprung
330 SDRIORECNAME_PAGVLAYER =0x0101, // angezeigte, gesperrte und druckbare Layer
331 SDRIORECNAME_PAGVHELPLINES =0x0102, // Hilfslinien und -punkte
332 SDRIORECNAME_PAGVAKTGROUP =0x0103, // (ni) aktuelle Gruppe
334 SDRIORECNAME_MARK =0x0200, // (ni)
336 SDRIORECNAME_USERDEFINEDFIRST=0x7000,
337 SDRIORECNAME_USERDEFINEDLAST =0x7FFF};
339 class SdrNamedSubRecord: public SdrDownCompat
341 UINT32 nInventor;
342 UINT16 nIdentifier;
344 protected:
345 virtual void Read();
346 virtual void Write();
348 public:
349 SdrNamedSubRecord(SvStream& rNewStream, UINT16 nNewMode,
350 UINT32 nNewInventor = 0xFFFF, UINT16 nNewIdentifier = 0xFFFF,
351 BOOL bAutoOpen = TRUE);
352 UINT32 GetInventor() const { return nInventor; }
353 UINT16 GetIdentifier() const { return nIdentifier; }
356 // Zum Speichern einer View habe ich ein etwas anderes Konzept gewaehlt, da
357 // sich das Dateiformat hier sicherlich haeufiger und aufwendiger aendert.
358 // Es werden eine Anzahl von SdrNamedSubRecords geschrieben, wobei jeder
359 // dieser Records bestimmte Teilinformationen enthaelt, z.B. die Menge der
360 // sichtbaren Layer einer Page oder den Default-Stylesheet fuer neu zu
361 // erzeugende Objekte, ... . Diese Konzept hat zwar einen groesseren Overhead
362 // an Verwaltung und Daten zur Folge, bietet dafuer jedoch eine sehr grosse
363 // Flexibilitaet im Punkte auf-/abwaertskompatibilitaet. Da die Menge der
364 // persistenten Daten einer View recht gering ist spielt der Overhead an
365 // Streamdaten kaum eine Rolle.
366 // Eine abgeleitete View ueberlaed die Methoden ReadRecord() (lesen eines
367 // einzelnen Records) und WriteRecords() (schreiben aller Records). Ein Muster
368 // ist in SdrSnpV.CXX zu finden.
370 // Folgende Methoden schauen nach, ob sich im Stream an der aktuellen Position
371 // ein SdrModel bzw. eine SdrView befindet. Hat der Stream einen Fehlerstatus
372 // oder Eof(), so wird FALSE returniert.
374 }//end of namespace binfilter
375 #endif //_SVDIO_HXX
377 /* /////////////////////////////////////////////////////////////////////////////////////////////////
379 IO-Datenstruktur:
381 ?--------? ?---? ?---?
382 | SdrData | --->´Modl??---->----?>´Ende?-->
383 ?--------? ?---?\x18 ?---? \x19 ?---?
384 ?-´View?-?
385 ?---?
387 ?-----? ?------? ?------? ?-------? ?---?
388 | Modl | --->´ModlHdr?->´ModlDat?>´ItemPool?>?---->----?>´Ende?-->
389 ?-----? ?------? ?------? ?-------? \x18 ?---? \x19 ?---?
390 ?-´Layr?-?
391 | ?---? |
392 \x18 ?---? \x19
393 ?-´LSet?-?
394 | ?---? |
395 \x18 ?---? \x19
396 ?-´Page?-?
397 ?---?
399 ?-------? ?----------? ?----------?
400 |ItemPool| --->´ItemPoolHdr?->´SfxItemPool?-->
401 ?-------? ?----------? ?----------?
403 ?-----? ?------? ?------? ?-------?
404 | Page | --->´PageHdr?->´PageDat?>?---->----?>´DObjList?-->
405 ?-----? ?------? ?------? \x18 ?---? \x19 ?-------?
406 ?-´Layr?-?
407 | ?---? |
408 \x18 ?---? \x19
409 ?-´LSet?-?
410 ?---?
412 ?---------? ?---?
413 | DObjList | --->?----->-----?>´Ende?-->
414 ?---------? \x18 ?-----? \x19 ?---?
415 ?-?DObj ?-?
416 ?-----?
418 ?-----? ?------? ?------?
419 | DObj | --->´DObjHdr?->´DObjDat?->?----->-------?-->
420 ?-----? ?------? ?------? \x19 ?-------? \x18
421 ?>´DObjList?>?
422 ?-------?
423 ?-----? ?------? ?------?
424 | Layr | --->´LayrHdr?->´LayrDat?-->
425 ?-----? ?------? ?------?
427 ?-----? ?------? ?------?
428 | LSet | --->´LSetHdr?->´LSetDat?-->
429 ?-----? ?------? ?------?
431 ?-----? ?------? ?------?
432 | View | --->´ViewHdr?->´ViewDat?-->
433 ?-----? ?------? ?------?
435 ///////////////////////////////////////////////////////////////////////////////////////////////// */