nss: upgrade to release 3.73
[LibreOffice.git] / xmloff / source / core / DocumentSettingsContext.cxx
blobf221bfbc0f006cce8e535efec226e53443703f24
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3 * This file is part of the LibreOffice project.
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 * This file incorporates work covered by the following license notice:
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
20 #include <sal/config.h>
22 #include <officecfg/Office/Common.hxx>
23 #include <sax/tools/converter.hxx>
25 #include <com/sun/star/util/PathSubstitution.hpp>
26 #include <com/sun/star/util/XStringSubstitution.hpp>
27 #include <xmloff/DocumentSettingsContext.hxx>
28 #include <xmloff/xmlimp.hxx>
29 #include <xmloff/xmltoken.hxx>
30 #include <xmloff/xmlnamespace.hxx>
31 #include <xmloff/namespacemap.hxx>
32 #include <comphelper/base64.hxx>
34 #include <vector>
35 #include <com/sun/star/i18n/XForbiddenCharacters.hpp>
36 #include <com/sun/star/container/XIndexContainer.hpp>
37 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
38 #include <com/sun/star/formula/SymbolDescriptor.hpp>
39 #include <com/sun/star/frame/XModel.hpp>
40 #include <com/sun/star/util/DateTime.hpp>
41 #include <com/sun/star/document/XViewDataSupplier.hpp>
42 #include <com/sun/star/document/PrinterIndependentLayout.hpp>
43 #include <com/sun/star/document/IndexedPropertyValues.hpp>
44 #include <com/sun/star/document/NamedPropertyValues.hpp>
45 #include <com/sun/star/beans/XPropertySet.hpp>
46 #include <sal/log.hxx>
47 #include <osl/diagnose.h>
48 #include <tools/diagnose_ex.h>
49 #include <unotools/configmgr.hxx>
50 #include "xmlenums.hxx"
52 using namespace com::sun::star;
53 using namespace ::xmloff::token;
55 namespace {
57 class XMLMyList
59 std::vector<beans::PropertyValue> aProps;
60 sal_uInt32 nCount;
62 css::uno::Reference< css::uno::XComponentContext > m_xContext;
64 public:
65 explicit XMLMyList(const uno::Reference<uno::XComponentContext>& rxContext);
67 void push_back(beans::PropertyValue const & aProp) { aProps.push_back(aProp); nCount++; }
68 uno::Sequence<beans::PropertyValue> GetSequence();
69 uno::Reference<container::XNameContainer> GetNameContainer();
70 uno::Reference<container::XIndexContainer> GetIndexContainer();
75 XMLMyList::XMLMyList(const uno::Reference<uno::XComponentContext>& rxContext)
76 : nCount(0),
77 m_xContext(rxContext)
79 assert(m_xContext.is());
82 uno::Sequence<beans::PropertyValue> XMLMyList::GetSequence()
84 uno::Sequence<beans::PropertyValue> aSeq;
85 if(nCount)
87 assert(nCount == aProps.size());
88 aSeq.realloc(nCount);
89 beans::PropertyValue* pProps = aSeq.getArray();
90 for (auto const& prop : aProps)
92 *pProps = prop;
93 ++pProps;
96 return aSeq;
99 uno::Reference<container::XNameContainer> XMLMyList::GetNameContainer()
101 uno::Reference<container::XNameContainer> xNameContainer = document::NamedPropertyValues::create(m_xContext);
102 for (auto const& prop : aProps)
104 xNameContainer->insertByName(prop.Name, prop.Value);
107 return xNameContainer;
110 uno::Reference<container::XIndexContainer> XMLMyList::GetIndexContainer()
112 uno::Reference<container::XIndexContainer> xIndexContainer = document::IndexedPropertyValues::create(m_xContext);
113 sal_uInt32 i(0);
114 for (auto const& prop : aProps)
116 xIndexContainer->insertByIndex(i, prop.Value);
117 ++i;
120 return xIndexContainer;
123 namespace {
125 class XMLConfigBaseContext : public SvXMLImportContext
127 protected:
128 XMLMyList maProps;
129 beans::PropertyValue maProp;
130 css::uno::Any& mrAny;
131 XMLConfigBaseContext* mpBaseContext;
132 public:
133 XMLConfigBaseContext(SvXMLImport& rImport,
134 css::uno::Any& rAny,
135 XMLConfigBaseContext* pBaseContext);
137 void AddPropertyValue() { maProps.push_back(maProp); }
140 class XMLConfigItemContext : public SvXMLImportContext
142 OUString msType;
143 css::uno::Any& mrAny;
144 const OUString mrItemName;
145 XMLConfigBaseContext* mpBaseContext;
146 OUStringBuffer maCharBuffer;
148 public:
149 XMLConfigItemContext(SvXMLImport& rImport,
150 const css::uno::Reference< css::xml::sax::XFastAttributeList>& xAttrList,
151 css::uno::Any& rAny,
152 const OUString& rItemName,
153 XMLConfigBaseContext* pBaseContext);
155 virtual void SAL_CALL characters( const OUString& rChars ) override;
157 virtual void SAL_CALL endFastElement(sal_Int32 nElement) override;
159 void ManipulateConfigItem();
162 class XMLConfigItemSetContext : public XMLConfigBaseContext
164 public:
165 XMLConfigItemSetContext(SvXMLImport& rImport,
166 css::uno::Any& rAny,
167 XMLConfigBaseContext* pBaseContext);
169 virtual css::uno::Reference< css::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext(
170 sal_Int32 nElement, const css::uno::Reference< css::xml::sax::XFastAttributeList >& AttrList ) override;
172 virtual void SAL_CALL endFastElement(sal_Int32 nElement) override;
175 class XMLConfigItemMapNamedContext : public XMLConfigBaseContext
177 public:
178 XMLConfigItemMapNamedContext(SvXMLImport& rImport,
179 css::uno::Any& rAny,
180 XMLConfigBaseContext* pBaseContext);
182 virtual css::uno::Reference< css::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext(
183 sal_Int32 nElement, const css::uno::Reference< css::xml::sax::XFastAttributeList >& AttrList ) override;
185 virtual void SAL_CALL endFastElement(sal_Int32 nElement) override;
188 class XMLConfigItemMapIndexedContext : public XMLConfigBaseContext
190 private:
191 OUString maConfigItemName;
193 public:
194 XMLConfigItemMapIndexedContext(SvXMLImport& rImport,
195 css::uno::Any& rAny,
196 const OUString& rConfigItemName,
197 XMLConfigBaseContext* pBaseContext);
199 virtual css::uno::Reference< css::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext(
200 sal_Int32 nElement, const css::uno::Reference< css::xml::sax::XFastAttributeList >& AttrList ) override;
202 virtual void SAL_CALL endFastElement(sal_Int32 nElement) override;
207 static SvXMLImportContext *CreateSettingsContext(SvXMLImport& rImport, sal_Int32 nElement,
208 const uno::Reference<xml::sax::XFastAttributeList>& xAttrList,
209 beans::PropertyValue& rProp, XMLConfigBaseContext* pBaseContext)
211 SvXMLImportContext *pContext = nullptr;
213 rProp.Name.clear();
214 for (auto &aIter : sax_fastparser::castToFastAttributeList( xAttrList ))
216 if (aIter.getToken() == XML_ELEMENT(CONFIG, XML_NAME))
217 rProp.Name = aIter.toString();
220 if (nElement == XML_ELEMENT(CONFIG, XML_CONFIG_ITEM))
221 pContext = new XMLConfigItemContext(rImport, xAttrList, rProp.Value, rProp.Name, pBaseContext);
222 else if(nElement == XML_ELEMENT(CONFIG, XML_CONFIG_ITEM_SET) ||
223 nElement == XML_ELEMENT(CONFIG, XML_CONFIG_ITEM_MAP_ENTRY) )
224 pContext = new XMLConfigItemSetContext(rImport, rProp.Value, pBaseContext);
225 else if(nElement == XML_ELEMENT(CONFIG, XML_CONFIG_ITEM_MAP_NAMED))
226 pContext = new XMLConfigItemMapNamedContext(rImport, rProp.Value, pBaseContext);
227 else if(nElement == XML_ELEMENT(CONFIG, XML_CONFIG_ITEM_MAP_INDEXED))
228 pContext = new XMLConfigItemMapIndexedContext(rImport, rProp.Value, rProp.Name, pBaseContext);
230 return pContext;
233 XMLDocumentSettingsContext::XMLDocumentSettingsContext(SvXMLImport& rImport)
234 : SvXMLImportContext( rImport )
236 // here are no attributes
239 XMLDocumentSettingsContext::~XMLDocumentSettingsContext()
243 css::uno::Reference< css::xml::sax::XFastContextHandler > XMLDocumentSettingsContext::createFastChildContext(
244 sal_Int32 nElement,
245 const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList )
247 SvXMLImportContext *pContext = nullptr;
248 OUString sName;
250 for (auto &aIter : sax_fastparser::castToFastAttributeList( xAttrList ))
252 if (aIter.getToken() == XML_ELEMENT(CONFIG, XML_NAME))
253 sName = aIter.toString();
256 if (nElement == XML_ELEMENT(CONFIG, XML_CONFIG_ITEM_SET))
258 OUString aLocalConfigName;
259 sal_uInt16 nConfigPrefix =
260 GetImport().GetNamespaceMap().GetKeyByAttrValueQName(
261 sName, &aLocalConfigName );
263 if( XML_NAMESPACE_OOO == nConfigPrefix )
265 if (IsXMLToken(aLocalConfigName, XML_VIEW_SETTINGS))
266 pContext = new XMLConfigItemSetContext(GetImport(),
267 maViewProps, nullptr);
268 else if (IsXMLToken(aLocalConfigName,
269 XML_CONFIGURATION_SETTINGS))
270 pContext = new XMLConfigItemSetContext(GetImport(),
271 maConfigProps, nullptr);
272 else
274 maDocSpecificSettings.push_back( {aLocalConfigName, uno::Any()} );
276 pContext = new XMLConfigItemSetContext(GetImport(),
277 maDocSpecificSettings.back().aSettings, nullptr);
282 return pContext;
285 void XMLDocumentSettingsContext::endFastElement(sal_Int32 )
287 uno::Sequence<beans::PropertyValue> aSeqViewProps;
288 if (maViewProps >>= aSeqViewProps)
290 GetImport().SetViewSettings(aSeqViewProps);
291 sal_Int32 i(aSeqViewProps.getLength() - 1);
292 bool bFound(false);
293 while((i >= 0) && !bFound)
295 if (aSeqViewProps[i].Name == "Views")
297 bFound = true;
298 uno::Reference<container::XIndexAccess> xIndexAccess;
299 if (aSeqViewProps[i].Value >>= xIndexAccess)
301 uno::Reference<document::XViewDataSupplier> xViewDataSupplier(GetImport().GetModel(), uno::UNO_QUERY);
302 if (xViewDataSupplier.is())
303 xViewDataSupplier->setViewData(xIndexAccess);
306 else
307 i--;
311 uno::Sequence<beans::PropertyValue> aSeqConfigProps;
312 if ( maConfigProps >>= aSeqConfigProps )
314 if (!utl::ConfigManager::IsFuzzing() && !officecfg::Office::Common::Save::Document::LoadPrinter::get())
316 sal_Int32 i = aSeqConfigProps.getLength() - 1;
317 int nFound = 0;
319 while ( ( i >= 0 ) && nFound < 2 )
321 OUString sProp( aSeqConfigProps[i].Name );
323 if ( sProp == "PrinterName" )
325 aSeqConfigProps[i].Value <<= OUString();
326 nFound++;
328 else if ( sProp == "PrinterSetup" )
330 uno::Sequence< sal_Int8 > aEmpty;
331 aSeqConfigProps[i].Value <<= aEmpty;
332 nFound++;
335 i--;
339 GetImport().SetConfigurationSettings( aSeqConfigProps );
342 for (auto const& settings : maDocSpecificSettings)
344 uno::Sequence< beans::PropertyValue > aDocSettings;
345 OSL_VERIFY( settings.aSettings >>= aDocSettings );
346 GetImport().SetDocumentSpecificSettings( settings.sGroupName, aDocSettings );
350 XMLConfigBaseContext::XMLConfigBaseContext(SvXMLImport& rImport,
351 css::uno::Any& rTempAny,
352 XMLConfigBaseContext* pTempBaseContext)
353 : SvXMLImportContext( rImport ),
354 maProps( rImport.GetComponentContext() ),
355 maProp(),
356 mrAny(rTempAny),
357 mpBaseContext(pTempBaseContext)
361 XMLConfigItemSetContext::XMLConfigItemSetContext(SvXMLImport& rImport,
362 css::uno::Any& rAny,
363 XMLConfigBaseContext* pBaseContext)
364 : XMLConfigBaseContext( rImport, rAny, pBaseContext )
366 // here are no attributes
369 css::uno::Reference< css::xml::sax::XFastContextHandler > XMLConfigItemSetContext::createFastChildContext(
370 sal_Int32 nElement,
371 const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList )
373 return CreateSettingsContext(GetImport(), nElement, xAttrList, maProp, this);
376 void XMLConfigItemSetContext::endFastElement(sal_Int32 )
378 mrAny <<= maProps.GetSequence();
379 if (mpBaseContext)
380 mpBaseContext->AddPropertyValue();
383 XMLConfigItemContext::XMLConfigItemContext(SvXMLImport& rImport,
384 const css::uno::Reference< css::xml::sax::XFastAttributeList>& xAttrList,
385 css::uno::Any& rTempAny,
386 const OUString& rTempItemName,
387 XMLConfigBaseContext* pTempBaseContext)
388 : SvXMLImportContext(rImport),
389 mrAny(rTempAny),
390 mrItemName(rTempItemName),
391 mpBaseContext(pTempBaseContext)
393 for (auto &aIter : sax_fastparser::castToFastAttributeList( xAttrList ))
395 if (aIter.getToken() == XML_ELEMENT(CONFIG, XML_TYPE))
396 msType = aIter.toString();
400 void XMLConfigItemContext::characters( const OUString& rChars )
402 maCharBuffer.append(rChars);
405 void XMLConfigItemContext::endFastElement(sal_Int32 )
407 OUString sValue;
408 uno::Sequence<sal_Int8> aDecoded;
409 if (IsXMLToken(msType, XML_BASE64BINARY))
411 OUString sChars = maCharBuffer.makeStringAndClear().trim();
412 if( !sChars.isEmpty() )
413 ::comphelper::Base64::decodeSomeChars( aDecoded, sChars );
415 else
416 sValue = maCharBuffer.makeStringAndClear();
418 if (mpBaseContext)
420 if (IsXMLToken(msType, XML_BOOLEAN))
422 bool bValue(false);
423 if (IsXMLToken(sValue, XML_TRUE))
424 bValue = true;
425 mrAny <<= bValue;
427 else if (IsXMLToken(msType, XML_BYTE))
429 sal_Int32 nValue(0);
430 ::sax::Converter::convertNumber(nValue, sValue);
431 mrAny <<= static_cast<sal_Int8>(nValue);
433 else if (IsXMLToken(msType, XML_SHORT))
435 sal_Int32 nValue(0);
436 ::sax::Converter::convertNumber(nValue, sValue);
437 mrAny <<= static_cast<sal_Int16>(nValue);
439 else if (IsXMLToken(msType, XML_INT))
441 sal_Int32 nValue(0);
442 ::sax::Converter::convertNumber(nValue, sValue);
443 mrAny <<= nValue;
445 else if (IsXMLToken(msType, XML_LONG))
447 sal_Int64 nValue(sValue.toInt64());
448 mrAny <<= nValue;
450 else if (IsXMLToken(msType, XML_DOUBLE))
452 double fValue(0.0);
453 ::sax::Converter::convertDouble(fValue, sValue);
454 mrAny <<= fValue;
456 else if (IsXMLToken(msType, XML_STRING))
458 mrAny <<= sValue;
460 else if (IsXMLToken(msType, XML_DATETIME))
462 util::DateTime aDateTime;
463 ::sax::Converter::parseDateTime(aDateTime, sValue);
464 mrAny <<= aDateTime;
466 else if (IsXMLToken(msType, XML_BASE64BINARY))
468 mrAny <<= aDecoded;
470 else {
471 SAL_INFO("xmloff.core",
472 "XMLConfigItemContext: unknown type: " << msType);
475 ManipulateConfigItem();
477 mpBaseContext->AddPropertyValue();
479 else {
480 assert(false && "no BaseContext");
484 /** There are some instances where there is a mismatch between API and
485 * XML mapping of a setting. In this case, this method allows us to
486 * manipulate the values accordingly. */
487 void XMLConfigItemContext::ManipulateConfigItem()
489 if( mrItemName == "PrinterIndependentLayout" )
491 OUString sValue;
492 mrAny >>= sValue;
494 sal_Int16 nTmp = document::PrinterIndependentLayout::HIGH_RESOLUTION;
496 if( sValue == "enabled" || sValue == "low-resolution" )
498 nTmp = document::PrinterIndependentLayout::LOW_RESOLUTION;
500 else if ( sValue == "disabled" )
502 nTmp = document::PrinterIndependentLayout::DISABLED;
504 // else: default to high_resolution
506 mrAny <<= nTmp;
508 else if( (mrItemName == "ColorTableURL") || (mrItemName == "LineEndTableURL") || (mrItemName == "HatchTableURL")
509 || (mrItemName == "DashTableURL") || (mrItemName == "GradientTableURL") || (mrItemName == "BitmapTableURL") )
513 uno::Reference< uno::XComponentContext > xContext( GetImport().GetComponentContext() );
514 uno::Reference< util::XStringSubstitution > xStringSubstitution( util::PathSubstitution::create(xContext) );
516 OUString aURL;
517 mrAny >>= aURL;
518 aURL = xStringSubstitution->substituteVariables( aURL, false );
519 mrAny <<= aURL;
521 catch( uno::Exception& )
527 XMLConfigItemMapNamedContext::XMLConfigItemMapNamedContext(SvXMLImport& rImport,
528 css::uno::Any& rAny,
529 XMLConfigBaseContext* pBaseContext)
530 : XMLConfigBaseContext(rImport, rAny, pBaseContext)
534 css::uno::Reference< css::xml::sax::XFastContextHandler > XMLConfigItemMapNamedContext::createFastChildContext(
535 sal_Int32 nElement,
536 const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList )
538 return CreateSettingsContext(GetImport(), nElement, xAttrList, maProp, this);
541 void XMLConfigItemMapNamedContext::endFastElement(sal_Int32 )
543 if (mpBaseContext)
545 mrAny <<= maProps.GetNameContainer();
546 mpBaseContext->AddPropertyValue();
548 else {
549 assert(false && "no BaseContext");
553 XMLConfigItemMapIndexedContext::XMLConfigItemMapIndexedContext(SvXMLImport& rImport,
554 css::uno::Any& rAny,
555 const OUString& rConfigItemName,
556 XMLConfigBaseContext* pBaseContext)
557 : XMLConfigBaseContext(rImport, rAny, pBaseContext),
558 maConfigItemName( rConfigItemName )
562 css::uno::Reference< css::xml::sax::XFastContextHandler > XMLConfigItemMapIndexedContext::createFastChildContext(
563 sal_Int32 nElement,
564 const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList )
566 return CreateSettingsContext(GetImport(), nElement, xAttrList, maProp, this);
569 void XMLConfigItemMapIndexedContext::endFastElement(sal_Int32 )
571 if (mpBaseContext)
573 if ( maConfigItemName == "ForbiddenCharacters" )
575 uno::Reference< i18n::XForbiddenCharacters > xForbChars;
577 // get the forbidden characters from the document
578 uno::Reference< lang::XMultiServiceFactory > xFac( GetImport().GetModel(), uno::UNO_QUERY );
579 if( xFac.is() )
581 uno::Reference< beans::XPropertySet > xProps( xFac->createInstance( "com.sun.star.document.Settings" ), uno::UNO_QUERY );
582 if( xProps.is() && xProps->getPropertySetInfo()->hasPropertyByName( maConfigItemName ) )
584 xProps->getPropertyValue( maConfigItemName ) >>= xForbChars;
588 if( xForbChars.is() )
591 uno::Reference< container::XIndexAccess > xIndex = maProps.GetIndexContainer();
593 const sal_Int32 nCount = xIndex->getCount();
594 uno::Sequence < beans::PropertyValue > aProps;
595 for (sal_Int32 i = 0; i < nCount; i++)
597 if ((xIndex->getByIndex( i ) >>= aProps) && (aProps.getLength() == XML_FORBIDDEN_CHARACTER_MAX ) )
599 /* FIXME-BCP47: this stupid and counterpart in
600 * xmloff/source/core/SettingsExportHelper.cxx
601 * XMLSettingsExportHelper::exportForbiddenCharacters()
602 * */
604 beans::PropertyValue *pForChar = aProps.getArray();
605 i18n::ForbiddenCharacters aForbid;
606 lang::Locale aLocale;
607 bool bHaveLanguage = false, bHaveCountry = false, bHaveVariant = false,
608 bHaveBegin = false, bHaveEnd = false;
610 for ( sal_Int32 j = 0 ; j < XML_FORBIDDEN_CHARACTER_MAX ; j++ )
612 if (pForChar->Name == "Language")
614 pForChar->Value >>= aLocale.Language;
615 bHaveLanguage = true;
617 else if (pForChar->Name == "Country")
619 pForChar->Value >>= aLocale.Country;
620 bHaveCountry = true;
622 else if (pForChar->Name == "Variant")
624 pForChar->Value >>= aLocale.Variant;
625 bHaveVariant = true;
627 else if (pForChar->Name == "BeginLine")
629 pForChar->Value >>= aForbid.beginLine;
630 bHaveBegin = true;
632 else if (pForChar->Name == "EndLine")
634 pForChar->Value >>= aForbid.endLine;
635 bHaveEnd = true;
637 pForChar++;
640 if ( bHaveLanguage && bHaveCountry && bHaveVariant && bHaveBegin && bHaveEnd )
644 xForbChars->setForbiddenCharacters( aLocale, aForbid );
646 catch (uno::Exception const&)
648 TOOLS_WARN_EXCEPTION("xmloff.core",
649 "Exception while importing forbidden characters");
655 else
657 SAL_WARN("xmloff.core", "could not get the XForbiddenCharacters from document!");
658 mrAny <<= maProps.GetIndexContainer();
661 else if ( maConfigItemName == "Symbols" )
663 uno::Reference< container::XIndexAccess > xIndex = maProps.GetIndexContainer();
665 const sal_Int32 nCount = xIndex->getCount();
666 uno::Sequence < beans::PropertyValue > aProps;
667 uno::Sequence < formula::SymbolDescriptor > aSymbolList ( nCount );
669 formula::SymbolDescriptor *pDescriptor = aSymbolList.getArray();
671 sal_Int16 nNumFullEntries = 0;
673 for ( sal_Int32 i = 0; i < nCount; i++ )
675 if ((xIndex->getByIndex( i ) >>= aProps) && (aProps.getLength() == XML_SYMBOL_DESCRIPTOR_MAX ) )
677 bool bHaveName = false, bHaveExportName = false, bHaveCharSet = false,
678 bHaveFontName = false, bHaveFamily = false, bHavePitch = false,
679 bHaveWeight = false, bHaveItalic = false, bHaveSymbolSet = false,
680 bHaveCharacter = false;
681 beans::PropertyValue *pSymbol = aProps.getArray();
683 for ( sal_Int32 j = 0 ; j < XML_SYMBOL_DESCRIPTOR_MAX ; j++ )
685 if (pSymbol->Name == "Name")
687 pSymbol->Value >>= pDescriptor[nNumFullEntries].sName;
688 bHaveName = true;
690 else if (pSymbol->Name == "ExportName")
692 pSymbol->Value >>= pDescriptor[nNumFullEntries].sExportName;
693 bHaveExportName = true;
695 else if (pSymbol->Name == "FontName")
697 pSymbol->Value >>= pDescriptor[nNumFullEntries].sFontName;
698 bHaveFontName = true;
700 else if (pSymbol->Name == "CharSet")
702 pSymbol->Value >>= pDescriptor[nNumFullEntries].nCharSet;
703 bHaveCharSet = true;
705 else if (pSymbol->Name == "Family")
707 pSymbol->Value >>= pDescriptor[nNumFullEntries].nFamily;
708 bHaveFamily = true;
710 else if (pSymbol->Name == "Pitch")
712 pSymbol->Value >>= pDescriptor[nNumFullEntries].nPitch;
713 bHavePitch = true;
715 else if (pSymbol->Name == "Weight")
717 pSymbol->Value >>= pDescriptor[nNumFullEntries].nWeight;
718 bHaveWeight = true;
720 else if (pSymbol->Name == "Italic")
722 pSymbol->Value >>= pDescriptor[nNumFullEntries].nItalic;
723 bHaveItalic = true;
725 else if (pSymbol->Name == "SymbolSet")
727 pSymbol->Value >>= pDescriptor[nNumFullEntries].sSymbolSet;
728 bHaveSymbolSet = true;
730 else if (pSymbol->Name == "Character")
732 pSymbol->Value >>= pDescriptor[nNumFullEntries].nCharacter;
733 bHaveCharacter = true;
735 pSymbol++;
737 if ( bHaveName && bHaveExportName && bHaveCharSet && bHaveFontName && bHaveCharacter
738 && bHaveFamily && bHavePitch && bHaveWeight && bHaveItalic && bHaveSymbolSet)
739 nNumFullEntries++;
742 aSymbolList.realloc (nNumFullEntries);
743 mrAny <<= aSymbolList;
745 else
747 mrAny <<= maProps.GetIndexContainer();
749 mpBaseContext->AddPropertyValue();
751 else {
752 assert(false && "no BaseContext");
756 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */