1 /*************************************************************************
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 * Copyright 2008 by Sun Microsystems, Inc.
7 * OpenOffice.org - a multi-platform office productivity suite
9 * $RCSfile: svdio.hxx,v $
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 ************************************************************************/
34 #ifndef _STREAM_HXX //autogen
35 #include <tools/stream.hxx>
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
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:
102 // - Konnektoren (Flag davor)
103 // - UserDataList (Flag davor)
106 // - OutlinerParaObject (Flag war schon davor)
111 // - Connections haben nun einen eigenen IOHeader
113 // - Graphic (Flag davor)
114 // - zus. Flag fuer HasGraphicLink
116 // - Graphic (Flag war schon da)
119 // - DocStatistic (Platz reserviert)
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
146 // 10 Bytes persistent:
150 // Versionsnummer des Blocks
153 // Gesamtgroesse des Blocks inkl. Header und verschachtelten Bloecken
156 // ab hier Verwaltungsinformationen:
162 // Header wird nur zum nachschauen verwendet.
165 virtual void Write();
170 void ImpCheckRecordIntegrity();
171 void ImpGetRecordName(ByteString
& rStr
, INT32 nSubRecCount
=-1, INT32 nSubRecReadCount
=-1) const;
172 BOOL
ImpHasSubRecords() const;
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
; }
193 UINT32
GetBytesLeft() const;
196 class SdrIOHeaderLookAhead
: public SdrIOHeader
199 SdrIOHeaderLookAhead(SvStream
& rNewStream
, BOOL bAutoOpen
= TRUE
);
200 void SkipRecord() const { rStream
.Seek(nFilePos
+nBlkSize
); }
204 I/O-Format (12+n Bytes)
208 4 Menge der nachfolgenden Daten in Bytes
211 16 Allumschliessendes Rechteck
212 n>=18 Objektspezifische Daten
214 //const SdrObjIOHeaderSize=6;
218 class SdrObjIOHeader
: public SdrIOHeader
221 // ab hier persistente Daten
225 // ab hier Verwaltungsinformationen
226 const SdrObject
* pObj
;
229 virtual void Write();
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
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
270 virtual void Write();
273 // Als Modus muss STREAM_READ oder STREAM_WRITE angegeben werden.
274 SdrDownCompat(SvStream
& rNewStream
, UINT16 nNewMode
, BOOL bAutoOpen
= TRUE
);
278 // fuer etwas aussagekraeftigere Assertions
279 void SetID(const char* pId
) { pRecId
=pId
; }
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
346 virtual void Write();
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
377 /* /////////////////////////////////////////////////////////////////////////////////////////////////
381 ?--------? ?---? ?---?
382 | SdrData | --->´Modl??---->----?>´Ende?-->
383 ?--------? ?---?\x18 ?---? \x19 ?---?
387 ?-----? ?------? ?------? ?-------? ?---?
388 | Modl | --->´ModlHdr?->´ModlDat?>´ItemPool?>?---->----?>´Ende?-->
389 ?-----? ?------? ?------? ?-------? \x18 ?---? \x19 ?---?
399 ?-------? ?----------? ?----------?
400 |ItemPool| --->´ItemPoolHdr?->´SfxItemPool?-->
401 ?-------? ?----------? ?----------?
403 ?-----? ?------? ?------? ?-------?
404 | Page | --->´PageHdr?->´PageDat?>?---->----?>´DObjList?-->
405 ?-----? ?------? ?------? \x18 ?---? \x19 ?-------?
413 | DObjList | --->?----->-----?>´Ende?-->
414 ?---------? \x18 ?-----? \x19 ?---?
418 ?-----? ?------? ?------?
419 | DObj | --->´DObjHdr?->´DObjDat?->?----->-------?-->
420 ?-----? ?------? ?------? \x19 ?-------? \x18
423 ?-----? ?------? ?------?
424 | Layr | --->´LayrHdr?->´LayrDat?-->
425 ?-----? ?------? ?------?
427 ?-----? ?------? ?------?
428 | LSet | --->´LSetHdr?->´LSetDat?-->
429 ?-----? ?------? ?------?
431 ?-----? ?------? ?------?
432 | View | --->´ViewHdr?->´ViewDat?-->
433 ?-----? ?------? ?------?
435 ///////////////////////////////////////////////////////////////////////////////////////////////// */