[PATCH] Change in core[libreoffice-4-0]: xmloff: refactor Generator version handling:
Michael Stahl (via Code Review)
gerrit at gerrit.libreoffice.org
Fri Jan 18 14:59:37 PST 2013
Hi,
I have submitted a patch for review:
https://gerrit.libreoffice.org/1761
To pull it, you can do:
git pull ssh://gerrit.libreoffice.org:29418/core refs/changes/61/1761/1
xmloff: refactor Generator version handling:
Since there are now 2 forks of OpenOffice.org, we cannot rely on a
simple total ordering of versions any more; add a new function
SvXMLImport::isGeneratorVersionOlderThan(), taking 2 reference versions.
Also extract the LibreOffice version number from the generator string,
and extend the BuildId property to store this as a third number.
This also allows removal of the "fake LibreOffice3 as OpenOffice.org
3.3 release" hack, which is not future-proof.
(cherry picked from commit bea63709d05514555d5283279cd66439f4ceed73)
Conflicts:
xmloff/source/core/xmlimp.cxx
Change-Id: I44d8105eb537ac43fb9529a8b1b661ae0f2bba30
---
M xmloff/inc/xmloff/xmlimp.hxx
M xmloff/source/core/xmlimp.cxx
M xmloff/source/draw/ximpshap.cxx
M xmloff/source/meta/xmlmetai.cxx
4 files changed, 97 insertions(+), 30 deletions(-)
diff --git a/xmloff/inc/xmloff/xmlimp.hxx b/xmloff/inc/xmloff/xmlimp.hxx
index 125728f..3a5d1e0 100644
--- a/xmloff/inc/xmloff/xmlimp.hxx
+++ b/xmloff/inc/xmloff/xmlimp.hxx
@@ -422,8 +422,16 @@
static const sal_uInt16 OOo_32x = 32;
static const sal_uInt16 OOo_33x = 33;
static const sal_uInt16 OOo_34x = 34;
+ static const sal_uInt16 LO_flag = 0x100;
+ static const sal_uInt16 LO_3x = 30 | LO_flag;
+ static const sal_uInt16 LO_4x = 40 | LO_flag;
static const sal_uInt16 ProductVersionUnknown = SAL_MAX_UINT16;
+ /** depending on whether the generator version indicates LO, compare
+ against either the given LO or given OOo version */
+ bool isGeneratorVersionOlderThan(
+ sal_uInt16 const nOOoVersion, sal_uInt16 const nLOVersion);
+
/** this checks the build ID and returns
* OOo_1x for files created with OpenOffice.org 1.x or StarOffice 7 (this also includes binary import over binfilter)
diff --git a/xmloff/source/core/xmlimp.cxx b/xmloff/source/core/xmlimp.cxx
index d6e29df..858f838 100644
--- a/xmloff/source/core/xmlimp.cxx
+++ b/xmloff/source/core/xmlimp.cxx
@@ -157,6 +157,31 @@
namespace
{
+
+static OUString
+getBuildIdsProperty(uno::Reference<beans::XPropertySet> const& xImportInfo)
+{
+ if (xImportInfo.is())
+ {
+ try
+ {
+ Reference< XPropertySetInfo > const xSetInfo(
+ xImportInfo->getPropertySetInfo());
+ if (xSetInfo.is() && xSetInfo->hasPropertyByName("BuildId"))
+ {
+ OUString aBuildId;
+ xImportInfo->getPropertyValue("BuildId") >>= aBuildId;
+ return aBuildId;
+ }
+ }
+ catch (Exception const& e)
+ {
+ SAL_WARN("xmloff", "exception getting BuildId" << e.Message);
+ }
+ }
+ return OUString();
+}
+
class DocumentInfo
{
private:
@@ -166,6 +191,30 @@
DocumentInfo( const SvXMLImport& rImport )
: mnGeneratorVersion( SvXMLImport::ProductVersionUnknown )
{
+ OUString const buildIds(
+ getBuildIdsProperty(rImport.getImportInfo()));
+ if (!buildIds.isEmpty())
+ {
+ sal_Int32 const ix = buildIds.indexOf(';');
+ if (-1 != ix)
+ {
+ OUString const loVersion(buildIds.copy(ix + 1));
+ if (!loVersion.isEmpty())
+ {
+ if ('3' == loVersion[0])
+ {
+ mnGeneratorVersion = SvXMLImport::LO_3x;
+ }
+ else
+ {
+ SAL_INFO_IF('4' != loVersion[0], "xmloff",
+ "unknown LO version: " << loVersion);
+ mnGeneratorVersion = SvXMLImport::LO_4x;
+ }
+ return; // ignore buildIds
+ }
+ }
+ }
sal_Int32 nUPD, nBuild;
if ( rImport.getBuildIds( nUPD, nBuild ) )
{
@@ -1838,28 +1887,19 @@
bool SvXMLImport::getBuildIds( sal_Int32& rUPD, sal_Int32& rBuild ) const
{
bool bRet = false;
- if( mxImportInfo.is() ) try
+ OUString const aBuildId(getBuildIdsProperty(mxImportInfo));
+ if (!aBuildId.isEmpty())
{
- const OUString aPropName(RTL_CONSTASCII_USTRINGPARAM("BuildId"));
- Reference< XPropertySetInfo > xSetInfo( mxImportInfo->getPropertySetInfo() );
- if( xSetInfo.is() && xSetInfo->hasPropertyByName( aPropName ) )
+ sal_Int32 nIndex = aBuildId.indexOf('$');
+ if (nIndex != -1)
{
- OUString aBuildId;
- mxImportInfo->getPropertyValue( aPropName ) >>= aBuildId;
- if( !aBuildId.isEmpty() )
- {
- sal_Int32 nIndex = aBuildId.indexOf('$');
- if( nIndex != -1 )
- {
- rUPD = aBuildId.copy( 0, nIndex ).toInt32();
- rBuild = aBuildId.copy( nIndex+1 ).toInt32();
- bRet = true;
- }
- }
+ rUPD = aBuildId.copy( 0, nIndex ).toInt32();
+ sal_Int32 nIndexEnd = aBuildId.indexOf(';', nIndex);
+ rBuild = (nIndexEnd == -1)
+ ? aBuildId.copy(nIndex + 1).toInt32()
+ : aBuildId.copy(nIndex + 1, nIndexEnd - nIndex - 1).toInt32();
+ bRet = true;
}
- }
- catch( Exception& )
- {
}
return bRet;
}
@@ -1871,6 +1911,17 @@
// <--
}
+bool SvXMLImport::isGeneratorVersionOlderThan(
+ sal_uInt16 const nOOoVersion, sal_uInt16 const nLOVersion)
+{
+ assert( (nLOVersion & LO_flag));
+ assert(!(nOOoVersion & LO_flag));
+ const sal_uInt16 nGeneratorVersion(getGeneratorVersion());
+ return (nGeneratorVersion & LO_flag)
+ ? nGeneratorVersion < nLOVersion
+ : nGeneratorVersion < nOOoVersion;
+}
+
bool SvXMLImport::isGraphicLoadOnDemandSupported() const
{
return mbIsGraphicLoadOnDemandSupported;
diff --git a/xmloff/source/draw/ximpshap.cxx b/xmloff/source/draw/ximpshap.cxx
index 3143910..08d8decf 100644
--- a/xmloff/source/draw/ximpshap.cxx
+++ b/xmloff/source/draw/ximpshap.cxx
@@ -2696,10 +2696,8 @@
void SdXMLObjectShapeContext::EndElement()
{
- // #i67705#
- const sal_uInt16 nGeneratorVersion(GetImport().getGeneratorVersion());
-
- if(nGeneratorVersion < SvXMLImport::OOo_34x)
+ if (GetImport().isGeneratorVersionOlderThan(
+ SvXMLImport::OOo_34x, SvXMLImport::LO_4x))
{
// #i118485#
// If it's an old file from us written before OOo3.4, we need to correct
diff --git a/xmloff/source/meta/xmlmetai.cxx b/xmloff/source/meta/xmlmetai.cxx
index ba9c58b..af3362f 100644
--- a/xmloff/source/meta/xmlmetai.cxx
+++ b/xmloff/source/meta/xmlmetai.cxx
@@ -279,17 +279,27 @@
sBuildId = OUString("680$9134"); // fake NeoOffice as OpenOffice.org 2.2 release
}
}
-// Is this really what we want / correct ?
-#ifdef FIXME_REMOVE_WHEN_RE_BASE_COMPLETE
- else
+
+ if (i_rBuildId.startsWith("LibreOffice/"))
{
- if (i_rBuildId.startsWith("LibreOffice/3"))
+ OUStringBuffer sNumber;
+ for (sal_Int32 i = sizeof("LibreOffice/") - 1;
+ i < i_rBuildId.getLength(); ++i)
{
- // #118558# fake LibreOffice3 as OpenOffice.org 3.3 release
- sBuildId = OUString::createFromAscii( "330$9567" );
+ if (isdigit(i_rBuildId[i]))
+ {
+ sNumber.append(i_rBuildId[i]);
+ }
+ else if ('.' != i_rBuildId[i])
+ {
+ break;
+ }
+ }
+ if (sNumber.getLength())
+ {
+ sBuildId += (";" + sNumber.makeStringAndClear());
}
}
-#endif
if ( !sBuildId.isEmpty() ) try
{
--
To view, visit https://gerrit.libreoffice.org/1761
To unsubscribe, visit https://gerrit.libreoffice.org/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I44d8105eb537ac43fb9529a8b1b661ae0f2bba30
Gerrit-PatchSet: 1
Gerrit-Project: core
Gerrit-Branch: libreoffice-4-0
Gerrit-Owner: Michael Stahl <mstahl at redhat.com>
More information about the LibreOffice
mailing list