1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
|
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* This file incorporates work covered by the following license notice:
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed
* with this work for additional information regarding copyright
* ownership. The ASF licenses this file to you under the Apache
* License, Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
#ifndef INCLUDED_SFX2_SOURCE_DOC_OLEPROPS_HXX
#define INCLUDED_SFX2_SOURCE_DOC_OLEPROPS_HXX
#include <map>
#include <memory>
#include <string_view>
#include <osl/thread.h>
#include <rtl/ustring.hxx>
#include <sot/storage.hxx>
#include <com/sun/star/util/DateTime.hpp>
#include <com/sun/star/util/Date.hpp>
//namespace {
// property type IDs
const sal_Int32 PROPTYPE_INT16 = 2;
const sal_Int32 PROPTYPE_INT32 = 3;
const sal_Int32 PROPTYPE_FLOAT = 4;
const sal_Int32 PROPTYPE_DOUBLE = 5;
const sal_Int32 PROPTYPE_DATE = 7;
const sal_Int32 PROPTYPE_STRING = 8;
const sal_Int32 PROPTYPE_STATUS = 10;
const sal_Int32 PROPTYPE_BOOL = 11;
const sal_Int32 PROPTYPE_VARIANT = 12;
const sal_Int32 PROPTYPE_INT8 = 16;
const sal_Int32 PROPTYPE_UINT8 = 17;
const sal_Int32 PROPTYPE_UINT16 = 18;
const sal_Int32 PROPTYPE_UINT32 = 19;
const sal_Int32 PROPTYPE_INT64 = 20;
const sal_Int32 PROPTYPE_UINT64 = 21;
const sal_Int32 PROPTYPE_STRING8 = 30;
const sal_Int32 PROPTYPE_STRING16 = 31;
const sal_Int32 PROPTYPE_FILETIME = 64;
const sal_Int32 PROPTYPE_BLOB = 65;
const sal_Int32 PROPTYPE_CLIPFMT = 71;
// static property IDs
const sal_Int32 PROPID_DICTIONARY = 0;
const sal_Int32 PROPID_CODEPAGE = 1;
const sal_Int32 PROPID_FIRSTCUSTOM = 2;
// property IDs for GlobalDocPropertySet
const sal_Int32 PROPID_TITLE = 2;
const sal_Int32 PROPID_SUBJECT = 3;
const sal_Int32 PROPID_AUTHOR = 4;
const sal_Int32 PROPID_KEYWORDS = 5;
const sal_Int32 PROPID_COMMENTS = 6;
const sal_Int32 PROPID_TEMPLATE = 7;
const sal_Int32 PROPID_LASTAUTHOR = 8;
const sal_Int32 PROPID_REVNUMBER = 9;
const sal_Int32 PROPID_EDITTIME = 10;
const sal_Int32 PROPID_LASTPRINTED = 11;
const sal_Int32 PROPID_CREATED = 12;
const sal_Int32 PROPID_LASTSAVED = 13;
const sal_Int32 PROPID_THUMBNAIL = 17;
// some Builtin properties
const sal_Int32 PROPID_CATEGORY = 0x2;
const sal_Int32 PROPID_COMPANY = 0xf;
const sal_Int32 PROPID_MANAGER = 0xe;
// predefined codepages
const sal_uInt16 CODEPAGE_UNKNOWN = 0;
const sal_uInt16 CODEPAGE_UNICODE = 1200;
const sal_uInt16 CODEPAGE_UTF8 = 65001;
// predefined clipboard format IDs
const sal_Int32 CLIPFMT_WIN = -1;
// predefined clipboard data format IDs
const sal_Int32 CLIPDATAFMT_DIB = 8;
/** Helper for classes that need text encoding settings.
Classes derived from this class will include functions to store and use
text encoding settings and to convert Windows codepage constants.
*/
class SfxOleTextEncoding
{
public:
explicit SfxOleTextEncoding() :
mxTextEnc( std::make_shared<rtl_TextEncoding>( osl_getThreadTextEncoding() ) ) {}
explicit SfxOleTextEncoding( rtl_TextEncoding eTextEnc ) :
mxTextEnc( std::make_shared<rtl_TextEncoding>( eTextEnc ) ) {}
/** Returns the current text encoding identifier. */
rtl_TextEncoding GetTextEncoding() const { return *mxTextEnc; }
/** Sets the passed text encoding. */
void SetTextEncoding( rtl_TextEncoding eTextEnc ) { *mxTextEnc = eTextEnc; }
/** Returns true, if this object contains Unicode text encoding. */
bool IsUnicode() const { return GetTextEncoding() == RTL_TEXTENCODING_UCS2; }
/** Sets Unicode text encoding to this object. */
void SetUnicode() { SetTextEncoding( RTL_TEXTENCODING_UCS2 ); }
/** Converts the current settings to a Windows codepage identifier. */
sal_uInt16 GetCodePage() const;
/** Sets the current text encoding from a Windows codepage identifier. */
void SetCodePage( sal_uInt16 nCodePage );
private:
std::shared_ptr< rtl_TextEncoding > mxTextEnc;
};
/** Helper for classes that need to load or save string values.
Classes derived from this class contain functions to load and save string
values with the text encoding passed in the constructor.
*/
class SfxOleStringHelper : public SfxOleTextEncoding
{
public:
/** Creates a string helper object depending on an external text encoding. */
explicit SfxOleStringHelper( const SfxOleTextEncoding& rTextEnc ) :
SfxOleTextEncoding( rTextEnc ) {}
/** Creates a string helper object with own text encoding. */
explicit SfxOleStringHelper( rtl_TextEncoding eTextEnc ) :
SfxOleTextEncoding( eTextEnc ) {}
/** Loads a string from the passed stream with current encoding (maybe Unicode). */
OUString LoadString8( SvStream& rStrm ) const;
/** Saves a string to the passed stream with current encoding (maybe Unicode). */
void SaveString8( SvStream& rStrm, const OUString& rValue ) const;
/** Loads a Unicode string from the passed stream, ignores own encoding. */
static OUString LoadString16( SvStream& rStrm );
/** Saves a Unicode string to the passed stream, ignores own encoding. */
static void SaveString16( SvStream& rStrm, const OUString& rValue );
private:
OUString ImplLoadString8( SvStream& rStrm ) const;
static OUString ImplLoadString16( SvStream& rStrm );
void ImplSaveString8( SvStream& rStrm, std::u16string_view rValue ) const;
static void ImplSaveString16( SvStream& rStrm, const OUString& rValue );
};
/** Base class for all classes related to OLE property sets.
Derived classes have to implement the pure virtual functions ImplLoad() and
ImplSave().
*/
class SfxOleObjectBase
{
public:
explicit SfxOleObjectBase() : mnErrCode( ERRCODE_NONE ) {}
virtual ~SfxOleObjectBase();
/** Returns the current error code. */
ErrCode const & GetError() const { return mnErrCode; }
/** Loads this object from the passed stream. Calls virtual ImplLoad(). */
ErrCode const & Load( SvStream& rStrm );
/** Saves this object to the passed stream. Calls virtual ImplSave(). */
ErrCode const & Save( SvStream& rStrm );
protected:
/** Sets the passed error code. Will be returned by Load() and Save() functions.
Always the first error code is stored. Multiple calls have no effect. */
void SetError( ErrCode nErrCode ) { if( mnErrCode == ERRCODE_NONE ) mnErrCode = nErrCode; }
/** Loads the passed object from the stream. Sets returned error code as own error. */
void LoadObject( SvStream& rStrm, SfxOleObjectBase& rObj );
/** Saves the passed object to the stream. Sets returned error code as own error. */
void SaveObject( SvStream& rStrm, SfxOleObjectBase& rObj );
private:
/** Derived classes implement loading the object from the passed steam. */
virtual void ImplLoad( SvStream& rStrm ) = 0;
/** Derived classes implement saving the object to the passed steam. */
virtual void ImplSave( SvStream& rStrm ) = 0;
private:
ErrCode mnErrCode; /// Current error code.
};
/** Base class for all OLE property objects. */
class SfxOlePropertyBase : public SfxOleObjectBase
{
public:
explicit SfxOlePropertyBase( sal_Int32 nPropId, sal_Int32 nPropType ) :
mnPropId( nPropId ), mnPropType( nPropType ) {}
sal_Int32 GetPropId() const { return mnPropId; }
sal_Int32 GetPropType() const { return mnPropType; }
protected:
void SetPropType( sal_Int32 nPropType ) { mnPropType = nPropType; }
private:
sal_Int32 mnPropId;
sal_Int32 mnPropType;
};
typedef std::shared_ptr< SfxOlePropertyBase > SfxOlePropertyRef;
/** Property representing the codepage used to encode bytestrings in the entire property set. */
class SfxOleCodePageProperty : public SfxOlePropertyBase, public SfxOleTextEncoding
{
public:
explicit SfxOleCodePageProperty();
private:
virtual void ImplLoad( SvStream& rStrm ) override;
virtual void ImplSave( SvStream& rStrm ) override;
};
/** Property containing custom names for other properties in the property set. */
class SfxOleDictionaryProperty : public SfxOlePropertyBase, public SfxOleStringHelper
{
public:
explicit SfxOleDictionaryProperty( const SfxOleTextEncoding& rTextEnc );
/** Returns true, if the property contains at least one custom property name. */
bool HasPropertyNames() const { return !maPropNameMap.empty(); }
/** Prepares the property for loading. Does not affect contained names for its own. */
void SetNameCount( sal_Int32 nNameCount ) { SetPropType( nNameCount ); }
/** Returns the custom name for the passed property ID, or an empty string, if name not found. */
OUString GetPropertyName( sal_Int32 nPropId ) const;
/** Sets a custom name for the passed property ID. */
void SetPropertyName( sal_Int32 nPropId, const OUString& rPropName );
private:
virtual void ImplLoad( SvStream& rStrm ) override;
virtual void ImplSave( SvStream& rStrm ) override;
private:
typedef ::std::map< sal_Int32, OUString > SfxOlePropNameMap;
SfxOlePropNameMap maPropNameMap;
};
/** A section in a property set. Contains properties with unique identifiers. */
class SfxOleSection : public SfxOleObjectBase
{
private:
typedef ::std::map< sal_Int32, SfxOlePropertyRef > SfxOlePropMap;
public:
explicit SfxOleSection( bool bSupportsDict );
/** Returns the property with the passed ID, or an empty reference, if nothing found. */
SfxOlePropertyRef GetProperty( sal_Int32 nPropId ) const;
/** Returns the value of a signed int32 property with the passed ID in rnValue.
@return true = Property found, rnValue is valid; false = Property not found. */
bool GetInt32Value( sal_Int32& rnValue, sal_Int32 nPropId ) const;
/** Returns the value of a floating-point property with the passed ID in rfValue.
@return true = Property found, rfValue is valid; false = Property not found. */
bool GetDoubleValue( double& rfValue, sal_Int32 nPropId ) const;
/** Returns the value of a boolean property with the passed ID in rbValue.
@return true = Property found, rbValue is valid; false = Property not found. */
bool GetBoolValue( bool& rbValue, sal_Int32 nPropId ) const;
/** Returns the value of a string property with the passed ID in rValue.
@return true = Property found, rValue is valid; false = Property not found. */
bool GetStringValue( OUString& rValue, sal_Int32 nPropId ) const;
/** Returns the value of a time stamp property with the passed ID in rValue.
@return true = Property found, rValue is valid; false = Property not found. */
bool GetFileTimeValue( css::util::DateTime& rValue, sal_Int32 nPropId ) const;
/** Returns the value of a date property with the passed ID in rValue.
@return true = Property found, rValue is valid; false = Property not found. */
bool GetDateValue( css::util::Date& rValue, sal_Int32 nPropId ) const;
/** Adds the passed property to the property set. Drops an existing old property. */
void SetProperty( const SfxOlePropertyRef& xProp );
/** Inserts a signed int32 property with the passed value. */
void SetInt32Value( sal_Int32 nPropId, sal_Int32 nValue );
/** Inserts a floating-point property with the passed value. */
void SetDoubleValue( sal_Int32 nPropId, double fValue );
/** Inserts a boolean property with the passed value. */
void SetBoolValue( sal_Int32 nPropId, bool bValue );
/** Inserts a string property with the passed value.
@return true = Property inserted; false = String was empty, property not inserted. */
bool SetStringValue( sal_Int32 nPropId, const OUString& rValue );
/** Inserts a time stamp property with the passed value. */
void SetFileTimeValue( sal_Int32 nPropId, const css::util::DateTime& rValue );
/** Inserts a date property with the passed value. */
void SetDateValue( sal_Int32 nPropId, const css::util::Date& rValue );
/** Inserts a thumbnail property from the passed meta file. */
void SetThumbnailValue( sal_Int32 nPropId,
const css::uno::Sequence<sal_Int8> & i_rData);
/** Inserts a BLOB property with the passed data. */
void SetBlobValue( sal_Int32 nPropId,
const css::uno::Sequence<sal_Int8> & i_rData);
/** Returns the value of the property with the passed ID in a UNO any. */
css::uno::Any GetAnyValue( sal_Int32 nPropId ) const;
/** Inserts a property created from the passed any.
@return true = Property converted and inserted; false = Property type not supported. */
bool SetAnyValue( sal_Int32 nPropId, const css::uno::Any& rValue );
/** Returns the custom name for the passed property ID, or an empty string, if name not found. */
OUString GetPropertyName( sal_Int32 nPropId ) const;
/** Sets a custom name for the passed property ID. */
void SetPropertyName( sal_Int32 nPropId, const OUString& rPropName );
/** Returns the identifiers of all existing properties in the passed vector. */
void GetPropertyIds( ::std::vector< sal_Int32 >& rPropIds ) const;
/** Returns a property identifier not used in this section. */
sal_Int32 GetFreePropertyId() const;
private:
virtual void ImplLoad( SvStream& rStrm ) override;
virtual void ImplSave( SvStream& rStrm ) override;
bool SeekToPropertyPos( SvStream& rStrm, sal_uInt32 nPropPos ) const;
void LoadProperty( SvStream& rStrm, sal_Int32 nPropId );
void SaveProperty( SvStream& rStrm, SfxOlePropertyBase& rProp, sal_uInt64 & rnPropPosPos );
private:
SfxOlePropMap maPropMap; /// All properties in this section, by identifier.
SfxOleCodePageProperty maCodePageProp; /// The codepage property.
SfxOleDictionaryProperty maDictProp; /// The dictionary property.
sal_uInt64 mnStartPos; /// Start stream position of the section.
bool mbSupportsDict; /// true = section supports dictionary.
};
typedef std::shared_ptr< SfxOleSection > SfxOleSectionRef;
/** Enumerates different section types in OLE property sets. */
enum SfxOleSectionType
{
SECTION_GLOBAL, /// Globally defined properties.
SECTION_BUILTIN, /// Properties built into MS Office.
SECTION_CUSTOM /// Custom properties.
};
/** Represents a complete property set, may consist of several property sections. */
class SfxOlePropertySet : public SfxOleObjectBase
{
public:
explicit SfxOlePropertySet() {}
/** Loads this object from the passed storage. */
ErrCode const & LoadPropertySet( SotStorage* pStrg, const OUString& rStrmName );
/** Saves this object to the passed storage. */
ErrCode const & SavePropertySet( SotStorage* pStrg, const OUString& rStrmName );
/** Returns the specified section, or an empty reference, if nothing found. */
SfxOleSectionRef GetSection( SfxOleSectionType eSection ) const;
/** Returns the specified section, or an empty reference, if nothing found. */
SfxOleSectionRef GetSection( const SvGlobalName& rSectionGuid ) const;
/** Creates and returns the specified section, or just returns it if it already exists. */
SfxOleSection& AddSection( SfxOleSectionType eSection );
/** Creates and returns the specified section, or just returns it if it already exists. */
SfxOleSection& AddSection( const SvGlobalName& rSectionGuid );
private:
virtual void ImplLoad( SvStream& rStrm ) override;
virtual void ImplSave( SvStream& rStrm ) override;
/** Returns the GUID for the specified section. */
static const SvGlobalName& GetSectionGuid( SfxOleSectionType eSection );
private:
typedef ::std::map< SvGlobalName, SfxOleSectionRef > SfxOleSectionMap;
SfxOleSectionMap maSectionMap;
};
#endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|