summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJens-Heiner Rechtien <hr@openoffice.org>2009-11-16 17:25:15 +0000
committerJens-Heiner Rechtien <hr@openoffice.org>2009-11-16 17:25:15 +0000
commit0ac04b65b486ba023b8f0cc8bb31ba8254f136c5 (patch)
treeb88e96bc472dce7eea5587828919e6b95baea54a
parentd2e577579a29bae6d2ae1e5c3e7a859a55187fa2 (diff)
parent4e1053c98877fded9edb2752d6574f215f5042da (diff)
controltextrendering: merge changes from DEV300_m61
-rw-r--r--UnoControls/source/controls/makefile.mk3
-rw-r--r--accessibility/source/extended/accessibletablistbox.cxx14
-rw-r--r--automation/util/makefile.mk4
-rw-r--r--basctl/inc/basidesh.hrc9
-rw-r--r--basctl/sdi/baside.sdi6
-rw-r--r--basctl/sdi/makefile.mk4
-rw-r--r--basctl/source/basicide/baside2.cxx14
-rw-r--r--basctl/source/basicide/baside2.hxx1
-rw-r--r--basctl/source/basicide/baside3.cxx408
-rw-r--r--basctl/source/basicide/basides3.cxx10
-rw-r--r--basctl/source/basicide/basidesh.src42
-rw-r--r--basctl/source/basicide/brkdlg.src8
-rw-r--r--basctl/source/inc/baside3.hxx5
-rw-r--r--basctl/source/inc/basidesh.hxx3
-rw-r--r--basctl/uiconfig/basicide/toolbar/dialogbar.xml5
-rw-r--r--basctl/uiconfig/basicide/toolbar/macrobar.xml6
-rw-r--r--bean/com/sun/star/beans/makefile.mk3
-rw-r--r--bean/com/sun/star/comp/beans/makefile.mk3
-rw-r--r--bean/util/makefile.mk3
-rw-r--r--extensions/source/abpilot/typeselectionpage.cxx3
-rw-r--r--extensions/source/oooimprovecore/makefile.mk3
-rw-r--r--extensions/source/oooimprovement/errormail.cxx6
-rw-r--r--extensions/source/oooimprovement/makefile.mk4
-rw-r--r--extensions/source/oooimprovement/soaprequest.cxx8
-rw-r--r--extensions/source/plugin/aqua/macmgr.cxx26
-rw-r--r--extensions/source/plugin/aqua/makefile.mk1
-rw-r--r--extensions/source/plugin/base/makefile.mk1
-rw-r--r--extensions/source/plugin/base/manager.cxx38
-rw-r--r--extensions/source/plugin/inc/plugin/impl.hxx3
-rw-r--r--extensions/source/plugin/inc/plugin/unx/plugcon.hxx6
-rw-r--r--extensions/source/plugin/unx/unxmgr.cxx2
-rw-r--r--extensions/source/plugin/util/makefile.mk4
-rw-r--r--extensions/source/plugin/win/winmgr.cxx2
-rw-r--r--extensions/source/propctrlr/browserlistbox.cxx69
-rw-r--r--extensions/source/propctrlr/browserlistbox.hxx1
-rw-r--r--extensions/source/propctrlr/eventhandler.cxx41
-rw-r--r--extensions/source/propctrlr/eventhandler.hxx8
-rw-r--r--extensions/source/propctrlr/formbrowsertools.cxx15
-rw-r--r--extensions/source/propctrlr/formbrowsertools.hxx1
-rw-r--r--extensions/source/propctrlr/propcontroller.cxx7
-rw-r--r--extensions/source/propctrlr/propcontroller.hxx1
-rw-r--r--extensions/source/propctrlr/standardcontrol.hxx28
-rw-r--r--forms/source/xforms/model_ui.cxx11
-rw-r--r--forms/util/makefile.mk16
-rw-r--r--lingucomponent/source/spellcheck/macosxspell/makefile.mk4
-rw-r--r--package/inc/ZipEntry.hxx4
-rw-r--r--package/inc/ZipFile.hxx1
-rw-r--r--package/inc/ZipPackage.hxx33
-rw-r--r--package/inc/ZipPackageFolder.hxx2
-rw-r--r--package/source/manifest/ManifestDefines.hxx7
-rw-r--r--package/source/manifest/ManifestExport.cxx47
-rw-r--r--package/source/manifest/makefile.mk4
-rw-r--r--package/source/xstor/makefile.mk4
-rw-r--r--package/source/xstor/owriteablestream.cxx9
-rw-r--r--package/source/xstor/xstorage.cxx8
-rw-r--r--package/source/zipapi/ZipFile.cxx66
-rw-r--r--package/source/zipapi/ZipOutputStream.cxx8
-rw-r--r--package/source/zipapi/makefile.mk3
-rw-r--r--package/source/zippackage/ZipPackage.cxx370
-rw-r--r--package/source/zippackage/ZipPackageEntry.cxx14
-rw-r--r--package/source/zippackage/ZipPackageEntry.hxx1
-rw-r--r--package/source/zippackage/ZipPackageFolder.cxx77
-rw-r--r--package/source/zippackage/ZipPackageStream.cxx13
-rw-r--r--package/source/zippackage/ZipPackageStream.hxx6
-rw-r--r--package/source/zippackage/makefile.mk4
-rw-r--r--package/source/zippackage/zipfileaccess.cxx4
-rw-r--r--package/util/makefile.mk4
-rw-r--r--setup_native/prj/build.lst7
-rw-r--r--setup_native/prj/d.lst7
-rw-r--r--setup_native/registry/data/org/openoffice/Office/Jobs.xcu78
-rw-r--r--setup_native/registry/data/org/openoffice/Office/makefile.mk79
-rw-r--r--setup_native/scripts/fake-db.spec1
-rw-r--r--setup_native/scripts/makefile.mk6
-rwxr-xr-xsetup_native/source/java/javaversion.dat26
-rw-r--r--setup_native/source/packinfo/spellchecker_selection.txt4
-rw-r--r--setup_native/source/registration/com/sun/star/registration/Registration.java342
-rw-r--r--setup_native/source/registration/com/sun/star/registration/makefile.mk59
-rw-r--r--setup_native/source/registration/com/sun/star/registration/manifest2
-rw-r--r--setup_native/source/registration/com/sun/star/servicetag/BrowserSupport.java205
-rw-r--r--setup_native/source/registration/com/sun/star/servicetag/Installer.java947
-rw-r--r--setup_native/source/registration/com/sun/star/servicetag/LinuxSystemEnvironment.java194
-rw-r--r--setup_native/source/registration/com/sun/star/servicetag/RegistrationData.java473
-rw-r--r--setup_native/source/registration/com/sun/star/servicetag/RegistrationDocument.java374
-rw-r--r--setup_native/source/registration/com/sun/star/servicetag/Registry.java558
-rw-r--r--setup_native/source/registration/com/sun/star/servicetag/ServiceTag.java640
-rw-r--r--setup_native/source/registration/com/sun/star/servicetag/SolarisServiceTag.java68
-rw-r--r--setup_native/source/registration/com/sun/star/servicetag/SolarisSystemEnvironment.java159
-rw-r--r--setup_native/source/registration/com/sun/star/servicetag/SunConnection.java296
-rw-r--r--setup_native/source/registration/com/sun/star/servicetag/SysnetRegistryHelper.java380
-rw-r--r--setup_native/source/registration/com/sun/star/servicetag/SystemEnvironment.java341
-rw-r--r--setup_native/source/registration/com/sun/star/servicetag/Util.java297
-rw-r--r--setup_native/source/registration/com/sun/star/servicetag/WindowsSystemEnvironment.java145
-rw-r--r--setup_native/source/registration/com/sun/star/servicetag/makefile.mk83
-rw-r--r--setup_native/source/registration/com/sun/star/servicetag/resources/product_registration.xsd301
-rw-r--r--setup_native/source/win32/customactions/shellextensions/vistaspecial.cxx20
-rw-r--r--wizards/com/sun/star/wizards/ui/WizardDialog.java19
-rw-r--r--wizards/source/euro/Init.xba65
-rw-r--r--wizards/source/euro/euro.src17
-rw-r--r--wizards/source/importwizard/ImportDialog.xdl2
-rw-r--r--wizards/source/schedule/LocalHolidays.xba4
-rw-r--r--xmlsecurity/inc/xmlsecurity/digitalsignaturesdialog.hxx25
-rw-r--r--xmlsecurity/inc/xmlsecurity/documentsignaturehelper.hxx29
-rw-r--r--xmlsecurity/inc/xmlsecurity/global.hrc2
-rw-r--r--xmlsecurity/inc/xmlsecurity/xmlsignaturehelper.hxx7
-rw-r--r--xmlsecurity/source/component/documentdigitalsignatures.cxx156
-rw-r--r--xmlsecurity/source/component/documentdigitalsignatures.hxx24
-rw-r--r--xmlsecurity/source/dialogs/certificateviewer.cxx12
-rw-r--r--xmlsecurity/source/dialogs/dialogs.hrc1
-rw-r--r--xmlsecurity/source/dialogs/digitalsignaturesdialog.cxx394
-rw-r--r--xmlsecurity/source/dialogs/digitalsignaturesdialog.hrc (renamed from setup_native/source/registration/com/sun/star/servicetag/UnauthorizedAccessException.java)95
-rw-r--r--xmlsecurity/source/dialogs/digitalsignaturesdialog.src19
-rw-r--r--xmlsecurity/source/dialogs/resourcemanager.cxx320
-rw-r--r--xmlsecurity/source/dialogs/resourcemanager.hxx10
-rw-r--r--xmlsecurity/source/helper/documentsignaturehelper.cxx750
-rw-r--r--xmlsecurity/source/helper/xmlsignaturehelper.cxx8
-rw-r--r--xmlsecurity/source/helper/xmlsignaturehelper2.cxx35
-rw-r--r--xmlsecurity/source/xmlsec/mscrypt/x509certificate_mscryptimpl.cxx139
117 files changed, 2706 insertions, 7068 deletions
diff --git a/UnoControls/source/controls/makefile.mk b/UnoControls/source/controls/makefile.mk
index 0255791fa293..bccdd5704bae 100644
--- a/UnoControls/source/controls/makefile.mk
+++ b/UnoControls/source/controls/makefile.mk
@@ -33,6 +33,7 @@ PRJ=..$/..
PRJNAME=UnoControls
TARGET=controls
ENABLE_EXCEPTIONS=TRUE
+.IF "$(L10N_framework)"==""
# --- Settings -----------------------------------------------------
.INCLUDE : $(PRJ)$/util$/makefile.pmk
@@ -47,4 +48,6 @@ SLOFILES=\
$(SLO)$/statusindicator.obj
# --- Targets ------------------------------------------------------
+.ENDIF # L10N_framework
+
.INCLUDE : target.mk
diff --git a/accessibility/source/extended/accessibletablistbox.cxx b/accessibility/source/extended/accessibletablistbox.cxx
index 42fba56981e5..2912056827b4 100644
--- a/accessibility/source/extended/accessibletablistbox.cxx
+++ b/accessibility/source/extended/accessibletablistbox.cxx
@@ -107,7 +107,7 @@ namespace accessibility
sal_Int32 SAL_CALL AccessibleTabListBox::getAccessibleChildCount()
throw ( uno::RuntimeException )
{
- return 1; // no header, only table
+ return 2; // header and table
}
// -----------------------------------------------------------------------------
@@ -125,11 +125,17 @@ namespace accessibility
::osl::MutexGuard aGuard( getOslMutex() );
ensureIsAlive();
- if ( nChildIndex != 0 )
- // only one child
+ if ( nChildIndex < 0 || nChildIndex > 1 )
throw IndexOutOfBoundsException();
- Reference< XAccessible > xRet = implGetFixedChild( ::svt::BBINDEX_TABLE );
+ Reference< XAccessible > xRet;
+ if (nChildIndex == 0)
+ {
+ //! so far the actual implementation object only supports column headers
+ xRet = implGetFixedChild( ::svt::BBINDEX_COLUMNHEADERBAR );
+ }
+ else if (nChildIndex == 1)
+ xRet = implGetFixedChild( ::svt::BBINDEX_TABLE );
if ( !xRet.is() )
throw RuntimeException();
diff --git a/automation/util/makefile.mk b/automation/util/makefile.mk
index f96910a01325..8d68000c7c5a 100644
--- a/automation/util/makefile.mk
+++ b/automation/util/makefile.mk
@@ -157,7 +157,6 @@ APP1STDLIBS+= \
$(SVLLIB) \
$(VCLLIB) \
$(SALLIB) \
- $(SJLIB) \
$(VOSLIB) \
$(UCBHELPERLIB) \
$(COMPHELPERLIB) \
@@ -221,8 +220,7 @@ APP3STDLIBS= \
$(SALLIB) \
$(TOOLSLIB) \
$(SVTOOLLIB) \
- $(VCLLIB) \
- $(SJLIB)
+ $(VCLLIB)
.IF "$(GUI)"=="UNX"
.IF "$(OS)"=="MACOSX"
diff --git a/basctl/inc/basidesh.hrc b/basctl/inc/basidesh.hrc
index 3049e80968c7..ddff29283d2d 100644
--- a/basctl/inc/basidesh.hrc
+++ b/basctl/inc/basidesh.hrc
@@ -176,6 +176,15 @@
#define RID_STR_EXPORTBASIC ( RID_BASICIDE_START + 101 )
#define RID_STR_PACKAGE_BUNDLE ( RID_BASICIDE_START + 102 )
+#define RID_STR_DLGIMP_CLASH_RENAME ( RID_BASICIDE_START + 110 )
+#define RID_STR_DLGIMP_CLASH_REPLACE ( RID_BASICIDE_START + 111 )
+#define RID_STR_DLGIMP_CLASH_TITLE ( RID_BASICIDE_START + 112 )
+#define RID_STR_DLGIMP_CLASH_TEXT ( RID_BASICIDE_START + 113 )
+#define RID_STR_DLGIMP_MISMATCH_ADD ( RID_BASICIDE_START + 114 )
+#define RID_STR_DLGIMP_MISMATCH_OMIT ( RID_BASICIDE_START + 115 )
+#define RID_STR_DLGIMP_MISMATCH_TITLE ( RID_BASICIDE_START + 116 )
+#define RID_STR_DLGIMP_MISMATCH_TEXT ( RID_BASICIDE_START + 117 )
+
#endif // _SVX_NOIDERESIDS
#endif // _BASIDESH_HRC
diff --git a/basctl/sdi/baside.sdi b/basctl/sdi/baside.sdi
index a665ad8e505f..2ada0ff3159c 100644
--- a/basctl/sdi/baside.sdi
+++ b/basctl/sdi/baside.sdi
@@ -416,6 +416,12 @@ shell BasicIDEShell
StateMethod = GetState;
]
+ SID_IMPORT_DIALOG
+ [
+ ExecMethod = ExecuteDialog;
+ StateMethod = GetState;
+ ]
+
SID_DIALOG_TESTMODE
[
ExecMethod = ExecuteDialog;
diff --git a/basctl/sdi/makefile.mk b/basctl/sdi/makefile.mk
index abb072712ceb..d94921bf9ae2 100644
--- a/basctl/sdi/makefile.mk
+++ b/basctl/sdi/makefile.mk
@@ -38,7 +38,7 @@ TARGET=basslots
# --- Settings -----------------------------------------------------
.INCLUDE : settings.mk
-
+.IF "$(L10N_framework)"==""
SDI1NAME=$(TARGET)
SDI1EXPORT=basctl
@@ -49,6 +49,6 @@ SVSDI1DEPEND= \
baside.sdi
# --- Targets -------------------------------------------------------
-
+.ENDIF
.INCLUDE : target.mk
diff --git a/basctl/source/basicide/baside2.cxx b/basctl/source/basicide/baside2.cxx
index e92e4251be54..030fa5e68e26 100644
--- a/basctl/source/basicide/baside2.cxx
+++ b/basctl/source/basicide/baside2.cxx
@@ -538,6 +538,15 @@ BOOL ModulWindow::SaveBasicSource()
return bDone;
}
+BOOL implImportDialog( Window* pWin, const String& rCurPath, const ScriptDocument& rDocument, const String& aLibName );
+
+BOOL ModulWindow::ImportDialog()
+{
+ const ScriptDocument& rDocument = GetDocument();
+ String aLibName = GetLibName();
+ BOOL bRet = implImportDialog( this, aCurPath, rDocument, aLibName );
+ return bRet;
+}
BOOL ModulWindow::ToggleBreakPoint( ULONG nLine )
{
@@ -1016,6 +1025,11 @@ void __EXPORT ModulWindow::ExecuteCommand( SfxRequest& rReq )
SaveBasicSource();
}
break;
+ case SID_IMPORT_DIALOG:
+ {
+ ImportDialog();
+ }
+ break;
case SID_BASICIDE_MATCHGROUP:
{
if ( !GetEditView()->MatchGroup() )
diff --git a/basctl/source/basicide/baside2.hxx b/basctl/source/basicide/baside2.hxx
index 640c0582ca9e..7c9fd764cef0 100644
--- a/basctl/source/basicide/baside2.hxx
+++ b/basctl/source/basicide/baside2.hxx
@@ -403,6 +403,7 @@ public:
BOOL LoadBasic();
BOOL SaveBasicSource();
+ BOOL ImportDialog();
void EditMacro( const String& rMacroName );
diff --git a/basctl/source/basicide/baside3.cxx b/basctl/source/basicide/baside3.cxx
index 41f171c69480..d89191803c9f 100644
--- a/basctl/source/basicide/baside3.cxx
+++ b/basctl/source/basicide/baside3.cxx
@@ -46,6 +46,7 @@
#include <ide_pch.hxx>
+#include <vector>
#include <basidesh.hrc>
#include <baside3.hxx>
#include <localizationmgr.hxx>
@@ -63,6 +64,7 @@
#include <helpid.hrc>
#include <bastype2.hxx>
#include <svx/svdview.hxx>
+#include <svx/unolingu.hxx>
#include <tools/diagnose_ex.h>
#include <tools/urlobj.hxx>
#include <comphelper/processfactory.hxx>
@@ -73,6 +75,7 @@
#include <com/sun/star/script/XLibraryContainer2.hpp>
#endif
#include <svtools/ehdl.hxx>
+#include <svtools/langtab.hxx>
#include <com/sun/star/ui/dialogs/XFilePicker.hpp>
#include <com/sun/star/ui/dialogs/XFilePickerControlAccess.hpp>
#include <com/sun/star/ui/dialogs/XFilterManager.hpp>
@@ -638,6 +641,10 @@ void __EXPORT DialogWindow::ExecuteCommand( SfxRequest& rReq )
case SID_EXPORT_DIALOG:
SaveDialog();
break;
+
+ case SID_IMPORT_DIALOG:
+ ImportDialog();
+ break;
}
rReq.Done();
@@ -859,7 +866,406 @@ BOOL DialogWindow::SaveDialog()
return bDone;
}
-
+extern bool localesAreEqual( const ::com::sun::star::lang::Locale& rLocaleLeft,
+ const ::com::sun::star::lang::Locale& rLocaleRight );
+
+std::vector< lang::Locale > implGetLanguagesOnlyContainedInFirstSeq
+ ( Sequence< lang::Locale > aFirstSeq, Sequence< lang::Locale > aSecondSeq )
+{
+ std::vector< lang::Locale > avRet;
+
+ const lang::Locale* pFirst = aFirstSeq.getConstArray();
+ const lang::Locale* pSecond = aSecondSeq.getConstArray();
+ sal_Int32 nFirstCount = aFirstSeq.getLength();
+ sal_Int32 nSecondCount = aSecondSeq.getLength();
+
+ for( sal_Int32 iFirst = 0 ; iFirst < nFirstCount ; iFirst++ )
+ {
+ const lang::Locale& rFirstLocale = pFirst[ iFirst ];
+
+ bool bAlsoContainedInSecondSeq = false;
+ for( sal_Int32 iSecond = 0 ; iSecond < nSecondCount ; iSecond++ )
+ {
+ const lang::Locale& rSecondLocale = pSecond[ iSecond ];
+
+ bool bMatch = localesAreEqual( rFirstLocale, rSecondLocale );
+ if( bMatch )
+ {
+ bAlsoContainedInSecondSeq = true;
+ break;
+ }
+ }
+
+ if( !bAlsoContainedInSecondSeq )
+ avRet.push_back( rFirstLocale );
+ }
+
+ return avRet;
+}
+
+
+class NameClashQueryBox : public MessBox
+{
+public:
+ NameClashQueryBox( Window* pParent,
+ const XubString& rTitle, const XubString& rMessage );
+};
+
+NameClashQueryBox::NameClashQueryBox( Window* pParent,
+ const XubString& rTitle, const XubString& rMessage )
+ : MessBox( pParent, 0, rTitle, rMessage )
+{
+ if ( rTitle.Len() )
+ SetText( rTitle );
+
+ maMessText = rMessage;
+
+ AddButton( String( IDEResId( RID_STR_DLGIMP_CLASH_RENAME ) ), RET_YES,
+ BUTTONDIALOG_DEFBUTTON | BUTTONDIALOG_OKBUTTON | BUTTONDIALOG_FOCUSBUTTON );
+ AddButton( String( IDEResId( RID_STR_DLGIMP_CLASH_REPLACE ) ), RET_NO, 0 );
+ AddButton( BUTTON_CANCEL, RET_CANCEL, BUTTONDIALOG_CANCELBUTTON );
+
+ SetImage( GetSettings().GetStyleSettings().GetDialogColor().IsDark() ?
+ QueryBox::GetStandardImageHC() : QueryBox::GetStandardImage() );
+}
+
+
+class LanguageMismatchQueryBox : public MessBox
+{
+public:
+ LanguageMismatchQueryBox( Window* pParent,
+ const XubString& rTitle, const XubString& rMessage );
+};
+
+LanguageMismatchQueryBox::LanguageMismatchQueryBox( Window* pParent,
+ const XubString& rTitle, const XubString& rMessage )
+ : MessBox( pParent, 0, rTitle, rMessage )
+{
+ if ( rTitle.Len() )
+ SetText( rTitle );
+
+ maMessText = rMessage;
+ AddButton( String( IDEResId( RID_STR_DLGIMP_MISMATCH_ADD ) ), RET_YES,
+ BUTTONDIALOG_DEFBUTTON | BUTTONDIALOG_OKBUTTON | BUTTONDIALOG_FOCUSBUTTON );
+ AddButton( String( IDEResId( RID_STR_DLGIMP_MISMATCH_OMIT ) ), RET_NO, 0 );
+ AddButton( BUTTON_CANCEL, RET_CANCEL, BUTTONDIALOG_CANCELBUTTON );
+ AddButton( BUTTON_HELP, BUTTONID_HELP, BUTTONDIALOG_HELPBUTTON, 4 );
+
+ SetImage( GetSettings().GetStyleSettings().GetDialogColor().IsDark() ?
+ QueryBox::GetStandardImageHC() : QueryBox::GetStandardImage() );
+}
+
+BOOL implImportDialog( Window* pWin, const String& rCurPath, const ScriptDocument& rDocument, const String& aLibName )
+{
+ BOOL bDone = FALSE;
+
+ Reference< lang::XMultiServiceFactory > xMSF( ::comphelper::getProcessServiceFactory() );
+ Reference < XFilePicker > xFP;
+ if( xMSF.is() )
+ {
+ Sequence <Any> aServiceType(1);
+ aServiceType[0] <<= TemplateDescription::FILEOPEN_SIMPLE;
+ xFP = Reference< XFilePicker >( xMSF->createInstanceWithArguments(
+ ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.ui.dialogs.FilePicker" ) ), aServiceType ), UNO_QUERY );
+ }
+
+ Reference< XFilePickerControlAccess > xFPControl(xFP, UNO_QUERY);
+ xFPControl->enableControl(ExtendedFilePickerElementIds::CHECKBOX_PASSWORD, sal_False);
+ Any aValue;
+ aValue <<= (sal_Bool) sal_True;
+ xFPControl->setValue(ExtendedFilePickerElementIds::CHECKBOX_AUTOEXTENSION, 0, aValue);
+
+ String aCurPath( rCurPath );
+ if ( aCurPath.Len() )
+ xFP->setDisplayDirectory ( aCurPath );
+
+ String aDialogStr( IDEResId( RID_STR_STDDIALOGNAME ) );
+ Reference< XFilterManager > xFltMgr(xFP, UNO_QUERY);
+ xFltMgr->appendFilter( aDialogStr, String( RTL_CONSTASCII_USTRINGPARAM( "*.xdl" ) ) );
+ xFltMgr->appendFilter( String( IDEResId( RID_STR_FILTER_ALLFILES ) ), String( RTL_CONSTASCII_USTRINGPARAM( FILTERMASK_ALL ) ) );
+ xFltMgr->setCurrentFilter( aDialogStr );
+
+ if( xFP->execute() == RET_OK )
+ {
+ Sequence< ::rtl::OUString > aPaths = xFP->getFiles();
+ aCurPath = aPaths[0];
+
+ ::rtl::OUString aBasePath;
+ ::rtl::OUString aOUCurPath( aCurPath );
+ sal_Int32 iSlash = aOUCurPath.lastIndexOf( '/' );
+ if( iSlash != -1 )
+ aBasePath = aOUCurPath.copy( 0, iSlash + 1 );
+
+ try
+ {
+ // create dialog model
+ Reference< container::XNameContainer > xDialogModel( xMSF->createInstance
+ ( ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.awt.UnoControlDialogModel" ) ) ), UNO_QUERY_THROW );
+
+ Reference< XSimpleFileAccess > xSFI( xMSF->createInstance
+ ( ::rtl::OUString::createFromAscii( "com.sun.star.ucb.SimpleFileAccess" ) ), UNO_QUERY_THROW );
+
+ Reference< XInputStream > xInput;
+ if( xSFI->exists( aCurPath ) )
+ xInput = xSFI->openFileRead( aCurPath );
+
+ Reference< XComponentContext > xContext;
+ Reference< beans::XPropertySet > xProps( xMSF, UNO_QUERY );
+ OSL_ASSERT( xProps.is() );
+ OSL_VERIFY( xProps->getPropertyValue( ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("DefaultContext")) ) >>= xContext );
+ ::xmlscript::importDialogModel( xInput, xDialogModel, xContext );
+
+ String aXmlDlgName;
+ Reference< beans::XPropertySet > xDialogModelPropSet( xDialogModel, UNO_QUERY );
+ if( xDialogModelPropSet.is() )
+ {
+ try
+ {
+ Any aXmlDialogNameAny = xDialogModelPropSet->getPropertyValue( DLGED_PROP_NAME );
+ ::rtl::OUString aOUXmlDialogName;
+ aXmlDialogNameAny >>= aOUXmlDialogName;
+ aXmlDlgName = aOUXmlDialogName;
+ }
+ catch( beans::UnknownPropertyException& )
+ {}
+ }
+ bool bValidName = (aXmlDlgName.Len() != 0);
+ OSL_ASSERT( bValidName );
+ if( !bValidName )
+ return bDone;
+
+ bool bDialogAlreadyExists = rDocument.hasDialog( aLibName, aXmlDlgName );
+
+ String aNewDlgName = aXmlDlgName;
+ enum NameClashMode
+ {
+ NO_CLASH,
+ CLASH_OVERWRITE_DIALOG,
+ CLASH_RENAME_DIALOG,
+ };
+ NameClashMode eNameClashMode = NO_CLASH;
+ if( bDialogAlreadyExists )
+ {
+ String aQueryBoxTitle( IDEResId( RID_STR_DLGIMP_CLASH_TITLE ) );
+ String aQueryBoxText( IDEResId( RID_STR_DLGIMP_CLASH_TEXT ) );
+ aQueryBoxText.SearchAndReplace( String( RTL_CONSTASCII_USTRINGPARAM( "$(ARG1)" ) ), aXmlDlgName );
+
+ NameClashQueryBox aQueryBox( pWin, aQueryBoxTitle, aQueryBoxText );
+ USHORT nRet = aQueryBox.Execute();
+ if( RET_YES == nRet )
+ {
+ // RET_YES == Rename, see NameClashQueryBox::NameClashQueryBox
+ eNameClashMode = CLASH_RENAME_DIALOG;
+
+ aNewDlgName = rDocument.createObjectName( E_DIALOGS, aLibName );
+ }
+ else if( RET_NO == nRet )
+ {
+ // RET_NO == Replace, see NameClashQueryBox::NameClashQueryBox
+ eNameClashMode = CLASH_OVERWRITE_DIALOG;
+ }
+ else if( RET_CANCEL == nRet )
+ {
+ return bDone;
+ }
+ }
+
+ BasicIDEShell* pIDEShell = IDE_DLL()->GetShell();
+ if( pIDEShell == NULL )
+ {
+ OSL_ASSERT( pIDEShell != NULL );
+ return bDone;
+ }
+
+ // Resource?
+ ::com::sun::star::lang::Locale aLocale = Application::GetSettings().GetUILocale();
+ Reference< task::XInteractionHandler > xDummyHandler;
+ bool bReadOnly = true;
+ Reference< XStringResourceWithLocation > xImportStringResource =
+ StringResourceWithLocation::create( xContext, aBasePath, bReadOnly,
+ aLocale, aXmlDlgName, ::rtl::OUString(), xDummyHandler );
+
+ Sequence< lang::Locale > aImportLocaleSeq = xImportStringResource->getLocales();
+ sal_Int32 nImportLocaleCount = aImportLocaleSeq.getLength();
+
+ Reference< container::XNameContainer > xDialogLib( rDocument.getLibrary( E_DIALOGS, aLibName, TRUE ) );
+ Reference< resource::XStringResourceManager > xLibStringResourceManager = LocalizationMgr::getStringResourceFromDialogLibrary( xDialogLib );
+ sal_Int32 nLibLocaleCount = 0;
+ Sequence< lang::Locale > aLibLocaleSeq;
+ if( xLibStringResourceManager.is() )
+ {
+ aLibLocaleSeq = xLibStringResourceManager->getLocales();
+ nLibLocaleCount = aLibLocaleSeq.getLength();
+ }
+
+ // Check language matches
+ std::vector< lang::Locale > aOnlyInImportLanguages =
+ implGetLanguagesOnlyContainedInFirstSeq( aImportLocaleSeq, aLibLocaleSeq );
+ int nOnlyInImportLanguageCount = aOnlyInImportLanguages.size();
+
+ // For now: Keep languages from lib
+ bool bLibLocalized = (nLibLocaleCount > 0);
+ bool bImportLocalized = (nImportLocaleCount > 0);
+
+ bool bAddDialogLanguagesToLib = false;
+ if( nOnlyInImportLanguageCount > 0 )
+ {
+ String aQueryBoxTitle( IDEResId( RID_STR_DLGIMP_MISMATCH_TITLE ) );
+ String aQueryBoxText( IDEResId( RID_STR_DLGIMP_MISMATCH_TEXT ) );
+ LanguageMismatchQueryBox aQueryBox( pWin, aQueryBoxTitle, aQueryBoxText );
+ USHORT nRet = aQueryBox.Execute();
+ if( RET_YES == nRet )
+ {
+ // RET_YES == Add, see LanguageMismatchQueryBox::LanguageMismatchQueryBox
+ bAddDialogLanguagesToLib = true;
+ }
+ // RET_NO == Omit, see LanguageMismatchQueryBox::LanguageMismatchQueryBox
+ // -> nothing to do here
+ //else if( RET_NO == nRet )
+ //{
+ //}
+ else if( RET_CANCEL == nRet )
+ {
+ return bDone;
+ }
+ }
+
+ if( bImportLocalized )
+ {
+ bool bCopyResourcesForDialog = true;
+ if( bAddDialogLanguagesToLib )
+ {
+ LocalizationMgr* pCurMgr = pIDEShell->GetCurLocalizationMgr();
+
+ lang::Locale aFirstLocale;
+ aFirstLocale = aOnlyInImportLanguages[0];
+ if( nOnlyInImportLanguageCount > 1 )
+ {
+ // Check if import default belongs to only import languages and use it then
+ lang::Locale aImportDefaultLocale = xImportStringResource->getDefaultLocale();
+ lang::Locale aTmpLocale;
+ for( int i = 0 ; i < nOnlyInImportLanguageCount ; ++i )
+ {
+ aTmpLocale = aOnlyInImportLanguages[i];
+ if( localesAreEqual( aImportDefaultLocale, aTmpLocale ) )
+ {
+ aFirstLocale = aImportDefaultLocale;
+ break;
+ }
+ }
+ }
+
+ Sequence< lang::Locale > aFirstLocaleSeq( 1 );
+ aFirstLocaleSeq[0] = aFirstLocale;
+ pCurMgr->handleAddLocales( aFirstLocaleSeq );
+
+ if( nOnlyInImportLanguageCount > 1 )
+ {
+ Sequence< lang::Locale > aRemainingLocaleSeq( nOnlyInImportLanguageCount - 1 );
+ lang::Locale aTmpLocale;
+ int iSeq = 0;
+ for( int i = 0 ; i < nOnlyInImportLanguageCount ; ++i )
+ {
+ aTmpLocale = aOnlyInImportLanguages[i];
+ if( !localesAreEqual( aFirstLocale, aTmpLocale ) )
+ aRemainingLocaleSeq[iSeq++] = aTmpLocale;
+ }
+ pCurMgr->handleAddLocales( aRemainingLocaleSeq );
+ }
+ }
+ else if( !bLibLocalized )
+ {
+ Reference< resource::XStringResourceManager > xImportStringResourceManager( xImportStringResource, UNO_QUERY );
+ LocalizationMgr::resetResourceForDialog( xDialogModel, xImportStringResourceManager );
+ bCopyResourcesForDialog = false;
+ }
+
+ if( bCopyResourcesForDialog )
+ {
+ Reference< resource::XStringResourceResolver > xImportStringResourceResolver( xImportStringResource, UNO_QUERY );
+ LocalizationMgr::copyResourceForDroppedDialog( xDialogModel, aXmlDlgName,
+ xLibStringResourceManager, xImportStringResourceResolver );
+ }
+ }
+ else if( bLibLocalized )
+ {
+ LocalizationMgr::setResourceIDsForDialog( xDialogModel, xLibStringResourceManager );
+ }
+
+
+ LocalizationMgr::setStringResourceAtDialog( rDocument, aLibName, aNewDlgName, xDialogModel );
+
+ if( eNameClashMode == CLASH_OVERWRITE_DIALOG )
+ {
+ if ( BasicIDE::RemoveDialog( rDocument, aLibName, aNewDlgName ) )
+ {
+ IDEBaseWindow* pDlgWin = pIDEShell->FindDlgWin( rDocument, aLibName, aNewDlgName, FALSE, TRUE );
+ if( pDlgWin != NULL )
+ pIDEShell->RemoveWindow( pDlgWin, TRUE );
+ BasicIDE::MarkDocumentModified( rDocument );
+ }
+ else
+ {
+ // TODO: Assertion?
+ return bDone;
+ }
+ }
+
+ if( eNameClashMode == CLASH_RENAME_DIALOG )
+ {
+ bool bRenamed = false;
+ if( xDialogModelPropSet.is() )
+ {
+ try
+ {
+ Any aXmlDialogNameAny;
+ aXmlDialogNameAny <<= ::rtl::OUString( aNewDlgName );
+ xDialogModelPropSet->setPropertyValue( DLGED_PROP_NAME, aXmlDialogNameAny );
+ bRenamed = true;
+ }
+ catch( beans::UnknownPropertyException& )
+ {}
+ }
+
+
+ if( bRenamed )
+ {
+ LocalizationMgr::renameStringResourceIDs( rDocument, aLibName, aNewDlgName, xDialogModel );
+ }
+ else
+ {
+ // TODO: Assertion?
+ return bDone;
+ }
+ }
+
+ Reference< XInputStreamProvider > xISP = ::xmlscript::exportDialogModel( xDialogModel, xContext );
+ bool bSuccess = rDocument.insertDialog( aLibName, aNewDlgName, xISP );
+ if( bSuccess )
+ {
+ DialogWindow* pNewDlgWin = pIDEShell->CreateDlgWin( rDocument, aLibName, aNewDlgName );
+ pIDEShell->SetCurWindow( pNewDlgWin, TRUE );
+ }
+
+ bDone = TRUE;
+ }
+ catch( Exception& )
+ {}
+ }
+
+ return bDone;
+}
+
+BOOL DialogWindow::ImportDialog()
+{
+ DBG_CHKTHIS( DialogWindow, 0 );
+
+ const ScriptDocument& rDocument = GetDocument();
+ String aLibName = GetLibName();
+ BOOL bRet = implImportDialog( this, aCurPath, rDocument, aLibName );
+ return bRet;
+}
+
DlgEdModel* DialogWindow::GetModel() const
{
return pEditor ? pEditor->GetModel() : NULL;
diff --git a/basctl/source/basicide/basides3.cxx b/basctl/source/basicide/basides3.cxx
index a435450e3a8a..581c685427d2 100644
--- a/basctl/source/basicide/basides3.cxx
+++ b/basctl/source/basicide/basides3.cxx
@@ -41,6 +41,7 @@
#define _SOLAR__PRIVATE 1
#include <basidesh.hxx>
+#include <baside2.hxx>
#include <baside3.hxx>
#include <basobj.hxx>
#include <localizationmgr.hxx>
@@ -170,9 +171,10 @@ SdrView* BasicIDEShell::GetCurDlgView() const
// Nur wenn Dialogfenster oben:
void __EXPORT BasicIDEShell::ExecuteDialog( SfxRequest& rReq )
{
- if ( !pCurWin || !pCurWin->IsA( TYPE( DialogWindow ) ) )
- return;
-
- pCurWin->ExecuteCommand( rReq );
+ if ( pCurWin && ( pCurWin->IsA( TYPE( DialogWindow) ) ||
+ (rReq.GetSlot() == SID_IMPORT_DIALOG &&pCurWin->IsA( TYPE( ModulWindow) ) ) ) )
+ {
+ pCurWin->ExecuteCommand( rReq );
+ }
}
diff --git a/basctl/source/basicide/basidesh.src b/basctl/source/basicide/basidesh.src
index 130dda34d9e4..1c8d734d1997 100644
--- a/basctl/source/basicide/basidesh.src
+++ b/basctl/source/basicide/basidesh.src
@@ -640,6 +640,48 @@ String RID_STR_TRANSLATION_DEFAULT
Text [ en-US ] = "[Default Language]" ;
};
+
+String RID_STR_DLGIMP_CLASH_RENAME
+{
+ Text [ en-US ] = "Rename" ;
+};
+
+String RID_STR_DLGIMP_CLASH_REPLACE
+{
+ Text [ en-US ] = "Replace" ;
+};
+
+String RID_STR_DLGIMP_CLASH_TITLE
+{
+ Text [ en-US ] = "Dialog Import - Name already used" ;
+};
+
+String RID_STR_DLGIMP_CLASH_TEXT
+{
+ Text [ en-US ] = "The library already contains a dialog with the name:\n\n$(ARG1)\n\nRename dialog to keep current dialog or replace existing dialog.\n " ;
+};
+
+String RID_STR_DLGIMP_MISMATCH_ADD
+{
+ Text [ en-US ] = "Add" ;
+};
+
+String RID_STR_DLGIMP_MISMATCH_OMIT
+{
+ Text [ en-US ] = "Omit" ;
+};
+
+String RID_STR_DLGIMP_MISMATCH_TITLE
+{
+ Text [ en-US ] = "Dialog Import - Language Mismatch" ;
+};
+
+String RID_STR_DLGIMP_MISMATCH_TEXT
+{
+ Text [ en-US ] = "The dialog to be imported supports other languages than the target library.\n\nAdd these languages to the library to keep additional language resources provided by the dialog or omit them to stay with the current library languages.\n\nNote: For languages not supported by the dialog the resources of the dialog's default language will be used.\n " ;
+};
+
+
#define MN_EDIT 20
#define MN_VIEW 21
#define MN_EXTRA 22
diff --git a/basctl/source/basicide/brkdlg.src b/basctl/source/basicide/brkdlg.src
index 50623ff94ac3..ededb6909e8f 100644
--- a/basctl/source/basicide/brkdlg.src
+++ b/basctl/source/basicide/brkdlg.src
@@ -81,20 +81,20 @@ ModalDialog RID_BASICIDE_BREAKPOINTDLG
FixedText RID_FT_PASS
{
Pos = MAP_APPFONT ( 6 , 102 ) ;
- Size = MAP_APPFONT ( 35 , 10 ) ;
+ Size = MAP_APPFONT ( 75 , 10 ) ;
Text [ en-US ] = "Pass Count:" ;
};
FixedText RID_FT_BRKPOINTS
{
Pos = MAP_APPFONT ( 6 , 3 ) ;
- Size = MAP_APPFONT ( 40 , 10 ) ;
+ Size = MAP_APPFONT ( 110, 10 ) ;
Text [ en-US ] = "Breakpoints" ;
};
NumericField RID_FLD_PASS
{
Border = TRUE ;
- Pos = MAP_APPFONT ( 41 , 100 ) ;
- Size = MAP_APPFONT ( 40 , 12 ) ;
+ Pos = MAP_APPFONT ( 81 , 100 ) ;
+ Size = MAP_APPFONT ( 35 , 12 ) ;
TabStop = TRUE ;
};
Text [ en-US ] = "Manage Breakpoints" ;
diff --git a/basctl/source/inc/baside3.hxx b/basctl/source/inc/baside3.hxx
index a1585f083b34..45eace9f6137 100644
--- a/basctl/source/inc/baside3.hxx
+++ b/basctl/source/inc/baside3.hxx
@@ -37,6 +37,10 @@
#include <bastypes.hxx>
#include <svtools/undo.hxx>
+#include <vcl/dialog.hxx>
+#include <vcl/button.hxx>
+#include <vcl/lstbox.hxx>
+#include <vcl/fixed.hxx>
#ifndef _COM_SUN_STAR_SCRIPT_XLIBRYARYCONTAINER_HPP_
#include <com/sun/star/script/XLibraryContainer.hpp>
@@ -94,6 +98,7 @@ public:
void DisableBrowser();
void UpdateBrowser();
BOOL SaveDialog();
+ BOOL ImportDialog();
virtual String GetTitle();
virtual BasicEntryDescriptor CreateEntryDescriptor();
diff --git a/basctl/source/inc/basidesh.hxx b/basctl/source/inc/basidesh.hxx
index a6c865ae0ee4..d8e58b968398 100644
--- a/basctl/source/inc/basidesh.hxx
+++ b/basctl/source/inc/basidesh.hxx
@@ -86,6 +86,7 @@ class BasicIDEShell :public SfxViewShell
{
friend class JavaDebuggingListenerImpl;
friend class LocalizationMgr;
+friend BOOL implImportDialog( Window* pWin, const String& rCurPath, const ScriptDocument& rDocument, const String& aLibName );
friend bool BasicIDE::RemoveDialog( const ScriptDocument& rDocument, const String& rLibName, const String& rDlgName );
ObjectCatalog* pObjectCatalog;
@@ -147,7 +148,6 @@ protected:
DialogWindow* CreateDlgWin( const ScriptDocument& rDocument, const String& rLibName, const String& rDlgName );
ModulWindow* FindBasWin( const ScriptDocument& rDocument, const String& rLibName, const String& rModName, BOOL bCreateIfNotExist, BOOL bFindSuspended = FALSE );
- DialogWindow* FindDlgWin( const ScriptDocument& rDocument, const String& rLibName, const String& rDlgName, BOOL bCreateIfNotExist, BOOL bFindSuspended = FALSE );
ModulWindow* ShowActiveModuleWindow( StarBASIC* pBasic );
virtual void SFX_NOTIFY( SfxBroadcaster& rBC, const TypeId& rBCType,
@@ -219,6 +219,7 @@ public:
ModulWindowLayout* GetLayoutWindow() const { return pModulLayout; }
IDEBaseWindow* FindWindow( const ScriptDocument& rDocument, const String& rLibName = String(), const String& rName = String(), USHORT nType = BASICIDE_TYPE_UNKNOWN, BOOL bFindSuspended = FALSE );
+ DialogWindow* FindDlgWin( const ScriptDocument& rDocument, const String& rLibName, const String& rDlgName, BOOL bCreateIfNotExist, BOOL bFindSuspended = FALSE );
IDEBaseWindow* FindApplicationWindow();
BOOL NextPage( BOOL bPrev = FALSE );
diff --git a/basctl/uiconfig/basicide/toolbar/dialogbar.xml b/basctl/uiconfig/basicide/toolbar/dialogbar.xml
index afc409fa4895..91b9a925fa60 100644
--- a/basctl/uiconfig/basicide/toolbar/dialogbar.xml
+++ b/basctl/uiconfig/basicide/toolbar/dialogbar.xml
@@ -1,8 +1,9 @@
-<?xml version="1.0" encoding="UTF-8"?>
+<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink" toolbar:id="toolbar">
<toolbar:toolbaritem xlink:href=".uno:LibSelector" />
<toolbar:toolbarseparator/>
<toolbar:toolbaritem xlink:href=".uno:ChooseControls" />
- <toolbar:toolbaritem xlink:href=".uno:ExportDialog" />
+ <toolbar:toolbaritem xlink:href=".uno:ImportDialog" />
+ <toolbar:toolbaritem xlink:href=".uno:ExportDialog" />
</toolbar:toolbar> \ No newline at end of file
diff --git a/basctl/uiconfig/basicide/toolbar/macrobar.xml b/basctl/uiconfig/basicide/toolbar/macrobar.xml
index 8f08ba1ce97f..6e22bff09baf 100644
--- a/basctl/uiconfig/basicide/toolbar/macrobar.xml
+++ b/basctl/uiconfig/basicide/toolbar/macrobar.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8"?>
+<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink" toolbar:id="toolbar">
<toolbar:toolbaritem xlink:href=".uno:LibSelector" toolbar:helpid="helpid:30787" />
@@ -17,4 +17,6 @@
<toolbar:toolbarseparator/>
<toolbar:toolbaritem xlink:href=".uno:LoadBasic" toolbar:helpid="helpid:5951" />
<toolbar:toolbaritem xlink:href=".uno:SaveBasicAs" toolbar:helpid="helpid:5953" />
-</toolbar:toolbar> \ No newline at end of file
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:ImportDialog" />
+</toolbar:toolbar>
diff --git a/bean/com/sun/star/beans/makefile.mk b/bean/com/sun/star/beans/makefile.mk
index a59ff3fa006a..1c38ff105ec9 100644
--- a/bean/com/sun/star/beans/makefile.mk
+++ b/bean/com/sun/star/beans/makefile.mk
@@ -36,7 +36,7 @@ PACKAGE = com$/sun$/star$/beans
# --- Settings -----------------------------------------------------
.INCLUDE: settings.mk
-
+.IF "$(L10N_framework)"==""
.IF "$(OS)"=="MACOSX"
dummy:
@@ -63,5 +63,6 @@ JAVACLASSFILES= $(foreach,i,$(JAVAFILES) $(CLASSDIR)$/$(PACKAGE)$/$(i:b).class)
.ENDIF
# --- Targets ------------------------------------------------------
+.ENDIF # L10N_framework
.INCLUDE : target.mk
diff --git a/bean/com/sun/star/comp/beans/makefile.mk b/bean/com/sun/star/comp/beans/makefile.mk
index afe3e63dfdc7..983991fd0c70 100644
--- a/bean/com/sun/star/comp/beans/makefile.mk
+++ b/bean/com/sun/star/comp/beans/makefile.mk
@@ -36,7 +36,7 @@ PACKAGE = com$/sun$/star$/comp$/beans
# --- Settings -----------------------------------------------------
.INCLUDE: settings.mk
-
+.IF "$(L10N_framework)"==""
.IF "$(OS)"=="MACOSX"
dummy:
@@ -74,5 +74,6 @@ JAVACLASSFILES= $(foreach,i,$(JAVAFILES) $(CLASSDIR)$/$(PACKAGE)$/$(i:b).class)
.ENDIF
# --- Targets ------------------------------------------------------
+.ENDIF # L10N_framework
.INCLUDE : target.mk
diff --git a/bean/util/makefile.mk b/bean/util/makefile.mk
index 9e62d604dc15..ac495a77f554 100644
--- a/bean/util/makefile.mk
+++ b/bean/util/makefile.mk
@@ -36,7 +36,7 @@ TARGET = officebean
# --- Settings -----------------------------------------------------
.INCLUDE : settings.mk
-
+.IF "$(L10N_framework)"==""
JARCLASSDIRS = \
com$/sun$/star$/comp$/beans \
com$/sun$/star$/beans
@@ -53,6 +53,7 @@ ZIP1DIR=$(PRJ)
ZIP1LIST=com -x "*makefile.mk"
# --- Targets ------------------------------------------------------
+.ENDIF # L10N_framework
.INCLUDE : target.mk
diff --git a/extensions/source/abpilot/typeselectionpage.cxx b/extensions/source/abpilot/typeselectionpage.cxx
index f7cfafe39c10..c34aceb418a3 100644
--- a/extensions/source/abpilot/typeselectionpage.cxx
+++ b/extensions/source/abpilot/typeselectionpage.cxx
@@ -116,6 +116,7 @@ namespace abp
bool bFirstVisible = true;
Link aTypeSelectionHandler = LINK(this, TypeSelectionPage, OnTypeSelected );
+ const Size aSpacing( LogicToPixel( Size( 0, 3 ), MAP_APPFONT ) );
for ( ::std::vector< ButtonItem >::const_iterator loop = m_aAllTypes.begin();
loop != m_aAllTypes.end(); ++loop )
{
@@ -125,7 +126,7 @@ namespace abp
else
{
aItem.m_pItem->SetPosPixel( aTopLeft );
- aTopLeft.Y() += aItemSize.Height();
+ aTopLeft.Y() += aItemSize.Height() + aSpacing.Height();
aItem.m_pItem->SetClickHdl( aTypeSelectionHandler );
aItem.m_pItem->Show();
diff --git a/extensions/source/oooimprovecore/makefile.mk b/extensions/source/oooimprovecore/makefile.mk
index 74a9ad9aee19..b527f16bf44e 100644
--- a/extensions/source/oooimprovecore/makefile.mk
+++ b/extensions/source/oooimprovecore/makefile.mk
@@ -52,6 +52,9 @@ LIB1FILES= \
$(SLB)$/$(TARGET).lib \
SHL1TARGET=$(TARGET)$(DLLPOSTFIX)
+.IF "$(GUI)"=="OS2"
+SHL1TARGET=oooimpc$(DLLPOSTFIX)
+.ENDIF
SHL1STDLIBS= \
$(COMPHELPERLIB) \
diff --git a/extensions/source/oooimprovement/errormail.cxx b/extensions/source/oooimprovement/errormail.cxx
index fdfec120695f..38e863750220 100644
--- a/extensions/source/oooimprovement/errormail.cxx
+++ b/extensions/source/oooimprovement/errormail.cxx
@@ -37,7 +37,7 @@
#include <rtl/string.hxx>
#include <rtl/strbuf.hxx>
-#ifdef UNIX
+#if defined(UNIX) || defined(OS2)
#include <sys/utsname.h>
#endif
#ifdef WIN32
@@ -83,12 +83,14 @@ namespace {
return "Win32";
#elif defined UNIX
return "Unix";
+ #elif defined OS2
+ return "OS/2";
#else
return "Unknown";
#endif
};
-#ifdef UNIX
+#if defined(UNIX) || defined(OS2)
static const OString getLocale()
{
const char * locale = getenv( "LC_ALL" );
diff --git a/extensions/source/oooimprovement/makefile.mk b/extensions/source/oooimprovement/makefile.mk
index 41f91fc7b5ca..f9b508b13f2f 100644
--- a/extensions/source/oooimprovement/makefile.mk
+++ b/extensions/source/oooimprovement/makefile.mk
@@ -70,6 +70,10 @@ SHL1STDLIBS= \
$(UNOTOOLSLIB) \
SHL1TARGET= $(TARGET)$(DLLPOSTFIX)
+.IF "$(GUI)"=="OS2"
+SHL1TARGET= oooimp$(DLLPOSTFIX)
+.ENDIF
+
SHL1LIBS= $(SLB)$/$(TARGET).lib
SHL1DEF= $(MISC)$/$(SHL1TARGET).def
DEF1NAME= $(SHL1TARGET)
diff --git a/extensions/source/oooimprovement/soaprequest.cxx b/extensions/source/oooimprovement/soaprequest.cxx
index 94099cc21aee..045a02701fc6 100644
--- a/extensions/source/oooimprovement/soaprequest.cxx
+++ b/extensions/source/oooimprovement/soaprequest.cxx
@@ -153,11 +153,7 @@ namespace
static const OString getSoapOfficeversion(const Reference<XMultiServiceFactory>& sf)
{
- OStringBuffer buf =
- "<Officeversion Productname=\""
- + ::rtl::OUStringToOString(oooimprovement::Config(sf).getCompleteProductname(), RTL_TEXTENCODING_ASCII_US)
- + "\"/>\n";
- return buf.makeStringAndClear();
+ return ::rtl::OUStringToOString(oooimprovement::Config(sf).getCompleteProductname(), RTL_TEXTENCODING_ASCII_US);
};
static const OString getSoapSoapId(const Reference<XMultiServiceFactory>& sf, const OString& soap_id)
@@ -165,7 +161,7 @@ namespace
OStringBuffer buf;
buf.append("<body xsi:type=\"xsd:string\">");
buf.append(xmlEncode(soap_id)).append("\n");
- buf.append(getSoapOfficeversion(sf));
+ buf.append(xmlEncode(getSoapOfficeversion(sf))).append("\n");
buf.append("</body>\n");
return buf.makeStringAndClear();
};
diff --git a/extensions/source/plugin/aqua/macmgr.cxx b/extensions/source/plugin/aqua/macmgr.cxx
index 29cc793b5856..65a56f03f7ad 100644
--- a/extensions/source/plugin/aqua/macmgr.cxx
+++ b/extensions/source/plugin/aqua/macmgr.cxx
@@ -413,6 +413,7 @@ static bool checkBlackList( CFBundleRef i_xBundle )
if( bundleversion && CFGetTypeID(bundleversion) == CFStringGetTypeID() )
aBundleVersion = getString( static_cast<CFStringRef>(bundleversion) );
+ bool bReject = false;
// #i102735# VLC plugin prior to 1.0 tends to crash
if( aBundleName.equalsAscii( "VLC Plug-in" ) )
{
@@ -420,17 +421,24 @@ static bool checkBlackList( CFBundleRef i_xBundle )
rtl::OUString aMajor( aBundleVersion.getToken( 0, '.', nIndex ) );
if( aMajor.toInt32() < 1 )
{
- #if OSL_DEBUG_LEVEL > 1
- fprintf( stderr, "rejecting VCL plugin (%s %s)\n",
- rtl::OUStringToOString( aBundleName, RTL_TEXTENCODING_UTF8 ).getStr(),
- rtl::OUStringToOString( aBundleVersion, RTL_TEXTENCODING_UTF8 ).getStr()
- );
- #endif
- return true;
+ bReject = true;
}
}
+ // #i103674# Garmin Communicator Plugin crashes
+ else if( aBundleName.equalsAscii( "Garmin Communicator Plugin" ) )
+ {
+ bReject = true;
+ }
+
+ #if OSL_DEBUG_LEVEL > 1
+ if( bReject )
+ fprintf( stderr, "rejecting plugin \"%s\" version %s\n",
+ rtl::OUStringToOString( aBundleName, RTL_TEXTENCODING_UTF8 ).getStr(),
+ rtl::OUStringToOString( aBundleVersion, RTL_TEXTENCODING_UTF8 ).getStr()
+ );
+ #endif
- return false;
+ return bReject;
}
static int getPluginDescriptions( CFBundleRef i_xBundle , list< PluginDescription* >& io_rDescriptions )
@@ -572,7 +580,7 @@ static rtl::OUString FindFolderURL( FSVolumeRefNum vRefNum, OSType folderType )
return aRet;
}
-Sequence<PluginDescription> XPluginManager_Impl::getPluginDescriptions() throw()
+Sequence<PluginDescription> XPluginManager_Impl::impl_getPluginDescriptions() throw()
{
static Sequence<PluginDescription> aDescriptions;
static BOOL bHavePlugins = FALSE;
diff --git a/extensions/source/plugin/aqua/makefile.mk b/extensions/source/plugin/aqua/makefile.mk
index b68ee9f73f93..9cbe83809d11 100644
--- a/extensions/source/plugin/aqua/makefile.mk
+++ b/extensions/source/plugin/aqua/makefile.mk
@@ -55,7 +55,6 @@ CDEFS+=-DOJI
.ENDIF
.IF "$(GUIBASE)"=="aqua"
-OBJCXXFLAGS=-x objective-c++ -fobjc-exceptions
CFLAGSCXX+=$(OBJCXXFLAGS)
.ENDIF # "$(GUIBASE)"=="aqua"
diff --git a/extensions/source/plugin/base/makefile.mk b/extensions/source/plugin/base/makefile.mk
index f25f8fb47679..1e0a39b663e6 100644
--- a/extensions/source/plugin/base/makefile.mk
+++ b/extensions/source/plugin/base/makefile.mk
@@ -51,7 +51,6 @@ CDEFS+=-DDISABLE_XAW
.IF "$(WITH_MOZILLA)" != "NO"
.IF "$(GUIBASE)"=="aqua"
-OBJCXXFLAGS=-x objective-c++ -fobjc-exceptions
CFLAGSCXX+=$(OBJCXXFLAGS)
.ENDIF # "$(GUIBASE)"=="aqua"
diff --git a/extensions/source/plugin/base/manager.cxx b/extensions/source/plugin/base/manager.cxx
index 92fca1211caa..bb5422c69a51 100644
--- a/extensions/source/plugin/base/manager.cxx
+++ b/extensions/source/plugin/base/manager.cxx
@@ -35,19 +35,19 @@
#include <cstdarg>
#endif
-#include <plugin/impl.hxx>
+#include "plugin/impl.hxx"
-#ifndef _OSL_MUTEX_HXX
-#include <osl/mutex.hxx>
-#endif
-#include <svtools/pathoptions.hxx>
-#include <com/sun/star/container/XEnumerationAccess.hpp>
-#include <com/sun/star/container/XNameAccess.hpp>
-#include <com/sun/star/container/XEnumeration.hpp>
-#include <com/sun/star/container/XElementAccess.hpp>
-#include <com/sun/star/container/XIndexAccess.hpp>
-#include <com/sun/star/loader/XImplementationLoader.hpp>
-#include <com/sun/star/loader/CannotActivateFactoryException.hpp>
+#include "osl/mutex.hxx"
+#include "svtools/pathoptions.hxx"
+#include "vcl/configsettings.hxx"
+
+#include "com/sun/star/container/XEnumerationAccess.hpp"
+#include "com/sun/star/container/XNameAccess.hpp"
+#include "com/sun/star/container/XEnumeration.hpp"
+#include "com/sun/star/container/XElementAccess.hpp"
+#include "com/sun/star/container/XIndexAccess.hpp"
+#include "com/sun/star/loader/XImplementationLoader.hpp"
+#include "com/sun/star/loader/CannotActivateFactoryException.hpp"
PluginManager* PluginManager::pManager = NULL;
@@ -165,6 +165,20 @@ XPlugin_Impl* XPluginManager_Impl::getPluginImplementation( const Reference< ::c
return NULL;
}
+Sequence<com::sun::star::plugin::PluginDescription> XPluginManager_Impl::getPluginDescriptions() throw()
+{
+ Sequence<com::sun::star::plugin::PluginDescription> aRet;
+
+ vcl::SettingsConfigItem* pCfg = vcl::SettingsConfigItem::get();
+ rtl::OUString aVal( pCfg->getValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "BrowserPlugins" ) ),
+ rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Disabled" ) ) ) );
+ if( ! aVal.toBoolean() )
+ {
+ aRet = impl_getPluginDescriptions();
+ }
+ return aRet;
+}
+
Reference< ::com::sun::star::plugin::XPlugin > XPluginManager_Impl::createPlugin( const Reference< ::com::sun::star::plugin::XPluginContext >& acontext, INT16 mode, const Sequence< ::rtl::OUString >& argn, const Sequence< ::rtl::OUString >& argv, const ::com::sun::star::plugin::PluginDescription& plugintype)
throw( RuntimeException,::com::sun::star::plugin::PluginException )
{
diff --git a/extensions/source/plugin/inc/plugin/impl.hxx b/extensions/source/plugin/inc/plugin/impl.hxx
index 28524770521c..e9adee5088dd 100644
--- a/extensions/source/plugin/inc/plugin/impl.hxx
+++ b/extensions/source/plugin/inc/plugin/impl.hxx
@@ -293,6 +293,9 @@ public:
virtual Reference< com::sun::star::plugin::XPluginContext > SAL_CALL createPluginContext() throw();
// has to be implemented per system
+ virtual Sequence< com::sun::star::plugin::PluginDescription > SAL_CALL impl_getPluginDescriptions(void) throw();
+ // calls system specific impl_getPluginDescriptions
+ // checks whether plugins are disabled
virtual Sequence< com::sun::star::plugin::PluginDescription > SAL_CALL getPluginDescriptions(void) throw();
virtual Reference< com::sun::star::plugin::XPlugin > SAL_CALL createPlugin( const Reference< com::sun::star::plugin::XPluginContext > & acontext, sal_Int16 mode, const Sequence< rtl::OUString >& argn, const Sequence< rtl::OUString >& argv, const com::sun::star::plugin::PluginDescription& plugintype) throw( RuntimeException,::com::sun::star::plugin::PluginException );
diff --git a/extensions/source/plugin/inc/plugin/unx/plugcon.hxx b/extensions/source/plugin/inc/plugin/unx/plugcon.hxx
index 5f0e639e1c7e..862075d92c28 100644
--- a/extensions/source/plugin/inc/plugin/unx/plugcon.hxx
+++ b/extensions/source/plugin/inc/plugin/unx/plugcon.hxx
@@ -67,7 +67,9 @@ extern "C" {
# endif
#endif
#include <X11/Xatom.h>
-#define XP_UNIX
+#ifndef XP_UNIX
+# define XP_UNIX
+#endif
#define MOZ_X11
#include <stdio.h>
#ifdef SYSTEM_MOZILLA
@@ -102,7 +104,7 @@ extern "C" {
extern "C" {
#include <npsdk/npupp.h>
}
-#include <npapi.h>
+#include <npsdk/npapi.h>
#if NP_VERSION_MINOR < 17
// compatibility hack: compile with older NPN api header, but define
diff --git a/extensions/source/plugin/unx/unxmgr.cxx b/extensions/source/plugin/unx/unxmgr.cxx
index ff17d1e24324..1f1d291daf8d 100644
--- a/extensions/source/plugin/unx/unxmgr.cxx
+++ b/extensions/source/plugin/unx/unxmgr.cxx
@@ -226,7 +226,7 @@ static void CheckPluginRegistryFiles( const rtl::OString& rPath, list< PluginDes
closedir( pDIR );
}
-Sequence<PluginDescription> XPluginManager_Impl::getPluginDescriptions() throw()
+Sequence<PluginDescription> XPluginManager_Impl::impl_getPluginDescriptions() throw()
{
static Sequence<PluginDescription> aDescriptions;
static BOOL bHavePlugins = FALSE;
diff --git a/extensions/source/plugin/util/makefile.mk b/extensions/source/plugin/util/makefile.mk
index 657992ec1b33..dfba6a755201 100644
--- a/extensions/source/plugin/util/makefile.mk
+++ b/extensions/source/plugin/util/makefile.mk
@@ -96,8 +96,8 @@ SHL1STDLIBS+= \
$(CPPULIB) \
$(SALLIB)
-.IF "$(OS)"=="MACOSX" && "$(GUIBASE)"=="unx"
-SHL1STDLIBS+= -lX11
+.IF "$(GUIBASE)"=="unx"
+SHL1STDLIBS+=$(X11LINK_DYNAMIC)
.ENDIF
SHL1STDLIBS+=$(SHL1OWNLIBS)
diff --git a/extensions/source/plugin/win/winmgr.cxx b/extensions/source/plugin/win/winmgr.cxx
index 6a63ad8b5402..caf7a38a5458 100644
--- a/extensions/source/plugin/win/winmgr.cxx
+++ b/extensions/source/plugin/win/winmgr.cxx
@@ -325,7 +325,7 @@ static void add_SO_Plugins( PluginLocationMap & rPlugins )
}
//__________________________________________________________________________________________________
-Sequence< PluginDescription > XPluginManager_Impl::getPluginDescriptions(void) throw()
+Sequence< PluginDescription > XPluginManager_Impl::impl_getPluginDescriptions(void) throw()
{
Guard< Mutex > aGuard( Mutex::getGlobalMutex() );
static Sequence<PluginDescription > s_aDescriptions( 0 );
diff --git a/extensions/source/propctrlr/browserlistbox.cxx b/extensions/source/propctrlr/browserlistbox.cxx
index 23008fc9a1de..bd60181f1d0e 100644
--- a/extensions/source/propctrlr/browserlistbox.cxx
+++ b/extensions/source/propctrlr/browserlistbox.cxx
@@ -1244,14 +1244,74 @@ namespace pcr
}
//------------------------------------------------------------------
+ long OBrowserListBox::PreNotify( NotifyEvent& _rNEvt )
+ {
+ switch ( _rNEvt.GetType() )
+ {
+ case EVENT_KEYINPUT:
+ {
+ const KeyEvent* pKeyEvent = _rNEvt.GetKeyEvent();
+ if ( ( pKeyEvent->GetKeyCode().GetModifier() != 0 )
+ || ( ( pKeyEvent->GetKeyCode().GetCode() != KEY_PAGEUP )
+ && ( pKeyEvent->GetKeyCode().GetCode() != KEY_PAGEDOWN )
+ )
+ )
+ break;
+
+ long nScrollOffset = 0;
+ if ( m_aVScroll.IsVisible() )
+ {
+ if ( pKeyEvent->GetKeyCode().GetCode() == KEY_PAGEUP )
+ nScrollOffset = -m_aVScroll.GetPageSize();
+ else if ( pKeyEvent->GetKeyCode().GetCode() == KEY_PAGEDOWN )
+ nScrollOffset = m_aVScroll.GetPageSize();
+ }
+
+ if ( nScrollOffset )
+ {
+ long nNewThumbPos = m_aVScroll.GetThumbPos() + nScrollOffset;
+ nNewThumbPos = ::std::max( nNewThumbPos, m_aVScroll.GetRangeMin() );
+ nNewThumbPos = ::std::min( nNewThumbPos, m_aVScroll.GetRangeMax() );
+ m_aVScroll.DoScroll( nNewThumbPos );
+ nNewThumbPos = m_aVScroll.GetThumbPos();
+
+ sal_uInt16 nFocusControlPos = 0;
+ sal_uInt16 nActiveControlPos = impl_getControlPos( m_xActiveControl );
+ if ( nActiveControlPos < nNewThumbPos )
+ nFocusControlPos = (sal_uInt16)nNewThumbPos;
+ else if ( nActiveControlPos >= nNewThumbPos + CalcVisibleLines() )
+ nFocusControlPos = (sal_uInt16)nNewThumbPos + CalcVisibleLines() - 1;
+ if ( nFocusControlPos )
+ {
+ if ( nFocusControlPos < m_aOrderedLines.size() )
+ {
+ m_aOrderedLines[ nFocusControlPos ]->second.pLine->GrabFocus();
+ }
+ else
+ OSL_ENSURE( false, "OBrowserListBox::PreNotify: internal error, invalid focus control position!" );
+ }
+ }
+
+ return 1L;
+ // handled this. In particular, we also consume PageUp/Down events if we do not use them for scrolling,
+ // otherwise they would be used to scroll the document view, which does not sound like it is desired by
+ // the user.
+ }
+ }
+ return Control::PreNotify( _rNEvt );
+ }
+
+ //------------------------------------------------------------------
long OBrowserListBox::Notify( NotifyEvent& _rNEvt )
{
- if ( EVENT_COMMAND == _rNEvt.GetType() )
+ switch ( _rNEvt.GetType() )
+ {
+ case EVENT_COMMAND:
{
const CommandEvent* pCommand = _rNEvt.GetCommandEvent();
if ( ( COMMAND_WHEEL == pCommand->GetCommand() )
- || ( COMMAND_STARTAUTOSCROLL == pCommand->GetCommand() )
- || ( COMMAND_AUTOSCROLL == pCommand->GetCommand() )
+ || ( COMMAND_STARTAUTOSCROLL == pCommand->GetCommand() )
+ || ( COMMAND_AUTOSCROLL == pCommand->GetCommand() )
)
{
// interested in scroll events if we have a scrollbar
@@ -1261,6 +1321,9 @@ namespace pcr
}
}
}
+ break;
+ }
+
return Control::Notify( _rNEvt );
}
diff --git a/extensions/source/propctrlr/browserlistbox.hxx b/extensions/source/propctrlr/browserlistbox.hxx
index a89e1dc83c39..46ae1f94aaa8 100644
--- a/extensions/source/propctrlr/browserlistbox.hxx
+++ b/extensions/source/propctrlr/browserlistbox.hxx
@@ -149,6 +149,7 @@ namespace pcr
void EnableUpdate();
void DisableUpdate();
long Notify( NotifyEvent& _rNEvt );
+ long PreNotify( NotifyEvent& _rNEvt );
void SetListener( IPropertyLineListener* _pListener );
void SetObserver( IPropertyControlObserver* _pObserver );
diff --git a/extensions/source/propctrlr/eventhandler.cxx b/extensions/source/propctrlr/eventhandler.cxx
index 4d7c09563b5d..05d0984349b4 100644
--- a/extensions/source/propctrlr/eventhandler.cxx
+++ b/extensions/source/propctrlr/eventhandler.cxx
@@ -53,6 +53,7 @@
#include <com/sun/star/container/XIndexAccess.hpp>
#include <com/sun/star/container/XNameContainer.hpp>
#include <com/sun/star/container/XNameReplace.hpp>
+#include <com/sun/star/form/FormComponentType.hpp>
#include <com/sun/star/form/XForm.hpp>
#include <com/sun/star/form/XFormController.hpp>
#include <com/sun/star/inspection/PropertyControlType.hpp>
@@ -146,6 +147,7 @@ namespace pcr
/** === end UNO using === **/
namespace PropertyControlType = ::com::sun::star::inspection::PropertyControlType;
namespace PropertyAttribute = ::com::sun::star::beans::PropertyAttribute;
+ namespace FormComponentType = ::com::sun::star::form::FormComponentType;
//====================================================================
//= EventDescription
@@ -538,6 +540,7 @@ namespace pcr
,m_aPropertyListeners( m_aMutex )
,m_bEventsMapInitialized( false )
,m_bIsDialogElement( false )
+ ,m_nGridColumnType( -1 )
{
DBG_CTOR( EventHandler, NULL );
}
@@ -602,6 +605,7 @@ namespace pcr
m_aEvents.swap( aEmpty );
m_bIsDialogElement = false;
+ m_nGridColumnType = -1;
try
{
Reference< XPropertySetInfo > xPSI( m_xComponent->getPropertySetInfo() );
@@ -610,6 +614,15 @@ namespace pcr
&& xPSI->hasPropertyByName( PROPERTY_HEIGHT )
&& xPSI->hasPropertyByName( PROPERTY_POSITIONX )
&& xPSI->hasPropertyByName( PROPERTY_POSITIONY );
+
+ Reference< XChild > xAsChild( _rxIntrospectee, UNO_QUERY );
+ if ( xAsChild.is() && !Reference< XForm >( _rxIntrospectee, UNO_QUERY ).is() )
+ {
+ if ( FormComponentType::GRIDCONTROL == classifyComponent( xAsChild->getParent() ) )
+ {
+ m_nGridColumnType = classifyComponent( _rxIntrospectee );
+ }
+ }
}
catch( const Exception& )
{
@@ -827,12 +840,15 @@ namespace pcr
const ::rtl::OUString* pMethods = aMethods.getConstArray();
sal_uInt32 methodCount = aMethods.getLength();
- for (sal_uInt32 method = 0 ; method < methodCount ; method++,++pMethods )
+ for (sal_uInt32 method = 0 ; method < methodCount ; ++method, ++pMethods )
{
EventDescription aEvent;
if ( !lcl_getEventDescriptionForMethod( *pMethods, aEvent ) )
continue;
+ if ( !impl_filterMethod_nothrow( aEvent ) )
+ continue;
+
const_cast< EventHandler* >( this )->m_aEvents.insert( EventMap::value_type(
lcl_getEventPropertyName( sListenerClassName, *pMethods ), aEvent ) );
}
@@ -1272,6 +1288,29 @@ namespace pcr
}
}
+ //--------------------------------------------------------------------
+ bool EventHandler::impl_filterMethod_nothrow( const EventDescription& _rEvent ) const
+ {
+ // some (control-triggered) events do not make sense for certain grid control columns. However,
+ // our mechnism to retrieve control-triggered events does not know about this, so we do some
+ // late filtering here.
+ switch ( m_nGridColumnType )
+ {
+ case FormComponentType::COMBOBOX:
+ if ( UID_BRWEVT_ACTIONPERFORMED == _rEvent.nUniqueBrowseId )
+ return false;
+ break;
+ case FormComponentType::LISTBOX:
+ if ( ( UID_BRWEVT_CHANGED == _rEvent.nUniqueBrowseId )
+ || ( UID_BRWEVT_ACTIONPERFORMED == _rEvent.nUniqueBrowseId )
+ )
+ return false;
+ break;
+ }
+
+ return true;
+ }
+
//........................................................................
} // namespace pcr
//........................................................................
diff --git a/extensions/source/propctrlr/eventhandler.hxx b/extensions/source/propctrlr/eventhandler.hxx
index a68fe100afb4..dcb70f8fd2b3 100644
--- a/extensions/source/propctrlr/eventhandler.hxx
+++ b/extensions/source/propctrlr/eventhandler.hxx
@@ -107,6 +107,8 @@ namespace pcr
/// is our introspectee a dialog element?
bool m_bIsDialogElement;
// TODO: move different handling into different derived classes?
+ /// (FormComponent) type of the grid column being inspected, or -1 if we're not inspecting a grid column
+ sal_Int16 m_nGridColumnType;
public:
// XServiceInfo - static versions
@@ -248,6 +250,12 @@ namespace pcr
::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame >
impl_getContextFrame_nothrow() const;
+ /** approves or denies a certain method to be included in the UI
+ @return
+ <TRUE/> if and only if the given method is allowed.
+ */
+ bool impl_filterMethod_nothrow( const EventDescription& _rEvent ) const;
+
private:
EventHandler(); // never implemented
EventHandler( const EventHandler& ); // never implemented
diff --git a/extensions/source/propctrlr/formbrowsertools.cxx b/extensions/source/propctrlr/formbrowsertools.cxx
index 898a618f53a0..ccce47a7346d 100644
--- a/extensions/source/propctrlr/formbrowsertools.cxx
+++ b/extensions/source/propctrlr/formbrowsertools.cxx
@@ -53,6 +53,7 @@ namespace pcr
using namespace ::com::sun::star::lang;
using namespace ::com::sun::star::beans;
+ //------------------------------------------------------------------------
::rtl::OUString GetUIHeadlineName(sal_Int16 nClassId, const Any& aUnoObj)
{
PcrClient aResourceAccess;
@@ -130,6 +131,20 @@ namespace pcr
return sClassName;
}
+ //------------------------------------------------------------------------
+ sal_Int16 classifyComponent( const Reference< XInterface >& _rxComponent )
+ {
+ Reference< XPropertySet > xComponentProps( _rxComponent, UNO_QUERY_THROW );
+ Reference< XPropertySetInfo > xPSI( xComponentProps->getPropertySetInfo(), UNO_SET_THROW );
+
+ sal_Int16 nControlType( FormComponentType::CONTROL );
+ if ( xPSI->hasPropertyByName( PROPERTY_CLASSID ) )
+ {
+ OSL_VERIFY( xComponentProps->getPropertyValue( PROPERTY_CLASSID ) >>= nControlType );
+ }
+ return nControlType;
+ }
+
//............................................................................
} // namespace pcr
//............................................................................
diff --git a/extensions/source/propctrlr/formbrowsertools.hxx b/extensions/source/propctrlr/formbrowsertools.hxx
index 6fb0c732ea1f..760aa9cb6d42 100644
--- a/extensions/source/propctrlr/formbrowsertools.hxx
+++ b/extensions/source/propctrlr/formbrowsertools.hxx
@@ -44,6 +44,7 @@ namespace pcr
//............................................................................
::rtl::OUString GetUIHeadlineName(sal_Int16 _nClassId, const ::com::sun::star::uno::Any& _rUnoObject);
+ sal_Int16 classifyComponent( const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& _rxComponent );
//========================================================================
struct FindPropertyByHandle : public ::std::unary_function< ::com::sun::star::beans::Property, bool >
diff --git a/extensions/source/propctrlr/propcontroller.cxx b/extensions/source/propctrlr/propcontroller.cxx
index c4dff2512a29..ac9ae434cad6 100644
--- a/extensions/source/propctrlr/propcontroller.cxx
+++ b/extensions/source/propctrlr/propcontroller.cxx
@@ -114,6 +114,7 @@ namespace pcr
,m_bContainerFocusListening( false )
,m_bSuspendingPropertyHandlers( false )
,m_bConstructed( false )
+ ,m_bBindingIntrospectee( false )
{
DBG_CTOR(OPropertyBrowserController,NULL);
}
@@ -300,7 +301,13 @@ namespace pcr
// it in order to inspect another object.
throw VetoException();
}
+ if ( m_bBindingIntrospectee )
+ throw VetoException();
+
+ m_bBindingIntrospectee = true;
impl_rebindToInspectee_nothrow( InterfaceArray( _rObjects.getConstArray(), _rObjects.getConstArray() + _rObjects.getLength() ) );
+ m_bBindingIntrospectee = false;
+
}
//--------------------------------------------------------------------
diff --git a/extensions/source/propctrlr/propcontroller.hxx b/extensions/source/propctrlr/propcontroller.hxx
index 3254294e4777..bfa55053338b 100644
--- a/extensions/source/propctrlr/propcontroller.hxx
+++ b/extensions/source/propctrlr/propcontroller.hxx
@@ -168,6 +168,7 @@ namespace pcr
bool m_bContainerFocusListening;
bool m_bSuspendingPropertyHandlers;
bool m_bConstructed;
+ bool m_bBindingIntrospectee;
protected:
DECLARE_XINTERFACE()
diff --git a/extensions/source/propctrlr/standardcontrol.hxx b/extensions/source/propctrlr/standardcontrol.hxx
index ebe5b7c4ed48..d87865c0405c 100644
--- a/extensions/source/propctrlr/standardcontrol.hxx
+++ b/extensions/source/propctrlr/standardcontrol.hxx
@@ -69,6 +69,7 @@ namespace pcr
{
protected:
typedef ControlWindow< LISTBOX_WINDOW > ListBoxType;
+
public:
ListLikeControlWithModifyHandler( Window* _pParent, WinBits _nStyle )
:ListBoxType( _pParent, _nStyle )
@@ -76,8 +77,35 @@ namespace pcr
}
void SetModifyHdl( const Link& _rLink ) { ListBoxType::SetSelectHdl( _rLink ); }
+
+ protected:
+ long PreNotify( NotifyEvent& _rNEvt );
};
+ //------------------------------------------------------------------------
+ template< class LISTBOX_WINDOW >
+ long ListLikeControlWithModifyHandler< LISTBOX_WINDOW >::PreNotify( NotifyEvent& _rNEvt )
+ {
+ if ( _rNEvt.GetType() == EVENT_KEYINPUT )
+ {
+ const ::KeyEvent* pKeyEvent = _rNEvt.GetKeyEvent();
+ if ( ( pKeyEvent->GetKeyCode().GetModifier() == 0 )
+ && ( ( pKeyEvent->GetKeyCode().GetCode() == KEY_PAGEUP )
+ || ( pKeyEvent->GetKeyCode().GetCode() == KEY_PAGEDOWN )
+ )
+ )
+ {
+ if ( !ListBoxType::IsInDropDown() )
+ {
+ // don't give the base class a chance to consume the event, in the property browser, it is
+ // intended to scroll the complete property page
+ return ListBoxType::GetParent()->PreNotify( _rNEvt );
+ }
+ }
+ }
+ return ListBoxType::PreNotify( _rNEvt );
+ }
+
//========================================================================
//= OTimeControl
//========================================================================
diff --git a/forms/source/xforms/model_ui.cxx b/forms/source/xforms/model_ui.cxx
index 20900f3ec3e0..92883f70a950 100644
--- a/forms/source/xforms/model_ui.cxx
+++ b/forms/source/xforms/model_ui.cxx
@@ -539,18 +539,21 @@ Model::XModel_t Model::newModel( const Reference<com::sun::star::frame::XModel>&
const OUString& sName )
throw( RuntimeException )
{
- Model* pModel = NULL;
+ Model::XModel_t xModel;
Reference<XNameContainer> xModels = lcl_getModels( xCmp );
if( xModels.is()
&& ! xModels->hasByName( sName ) )
{
- pModel = new Model();
+ Model* pModel = new Model();
+ xModel.set( pModel );
+
pModel->setID( sName );
pModel->newInstance( OUString(), OUString(), sal_False );
- xModels->insertByName( sName, makeAny( Reference<XModel>( pModel ) ) );
+ pModel->initialize();
+ xModels->insertByName( sName, makeAny( xModel ) );
}
- return pModel;
+ return xModel;
}
void Model::renameModel( const Reference<com::sun::star::frame::XModel>& xCmp,
diff --git a/forms/util/makefile.mk b/forms/util/makefile.mk
index 17f594ba7c4f..1c454b1383db 100644
--- a/forms/util/makefile.mk
+++ b/forms/util/makefile.mk
@@ -96,22 +96,6 @@ RES1FILELIST=\
RESLIB1NAME=$(TARGET)
RESLIB1SRSFILES=$(RES1FILELIST)
-.IF "$(GUI)"=="UNX"
-
-# [ed] 6/19/02 Only add in libraries for X11 OS X builds
-
-.IF "$(OS)"=="MACOSX"
-.IF "$(GUIBASE)"=="unx"
-SHL1STDLIBS +=\
- -lX11 -lXt -lXmu
-.ENDIF
-.ELSE
-SHL1STDLIBS +=\
- -lX11
-.ENDIF # OS == MACOSX
-
-.ENDIF
-
.IF "$(GUI)"=="OS2"
SHL1STDLIBS += pthread.lib libz.lib
.ENDIF
diff --git a/lingucomponent/source/spellcheck/macosxspell/makefile.mk b/lingucomponent/source/spellcheck/macosxspell/makefile.mk
index c414c671dfcc..ac3ac3b7d3a0 100644
--- a/lingucomponent/source/spellcheck/macosxspell/makefile.mk
+++ b/lingucomponent/source/spellcheck/macosxspell/makefile.mk
@@ -52,8 +52,8 @@ CFLAGSCC += $(HUNSPELL_CFLAGS)
# --- Files --------------------------------------------------------
-CFLAGSCXX += -I..$/..$/lingutil
-CFLAGSCXX += -x objective-c++ -fobjc-exceptions
+CFLAGSCXX+=$(OBJCXXFLAGS)
+CFLAGSCXX+=-I..$/..$/lingutil
EXCEPTIONSFILES= \
$(SLO)$/macspellimp.obj
diff --git a/package/inc/ZipEntry.hxx b/package/inc/ZipEntry.hxx
index aa311cc14ae9..eed7a7a7cff5 100644
--- a/package/inc/ZipEntry.hxx
+++ b/package/inc/ZipEntry.hxx
@@ -42,8 +42,8 @@ struct ZipEntry
sal_Int32 nCompressedSize;
sal_Int32 nSize;
sal_Int32 nOffset;
- sal_Int16 nNameLen;
+ sal_Int16 nPathLen;
sal_Int16 nExtraLen;
- ::rtl::OUString sName;
+ ::rtl::OUString sPath;
};
#endif
diff --git a/package/inc/ZipFile.hxx b/package/inc/ZipFile.hxx
index aaabda3181f0..a954a1691c4b 100644
--- a/package/inc/ZipFile.hxx
+++ b/package/inc/ZipFile.hxx
@@ -65,7 +65,6 @@ class EncryptionData;
class ZipFile
{
protected:
- ::rtl::OUString sName; /* zip file name */
::rtl::OUString sComment; /* zip file comment */
EntryHash aEntries;
ByteGrabber aGrabber;
diff --git a/package/inc/ZipPackage.hxx b/package/inc/ZipPackage.hxx
index b733171edc4b..0549c06b6bb7 100644
--- a/package/inc/ZipPackage.hxx
+++ b/package/inc/ZipPackage.hxx
@@ -86,27 +86,28 @@ class ZipPackage : public cppu::WeakImplHelper7
protected:
SotMutexHolderRef m_aMutexHolder;
- ::com::sun::star::uno::Sequence < sal_Int8 > aEncryptionKey;
- FolderHash aRecent;
- ::rtl::OUString sURL;
- sal_Bool bHasEncryptedEntries;
- sal_Bool bUseManifest;
- sal_Bool bForceRecovery;
+ ::com::sun::star::uno::Sequence < sal_Int8 > m_aEncryptionKey;
+ FolderHash m_aRecent;
+ ::rtl::OUString m_aURL;
+ sal_Bool m_bHasEncryptedEntries;
+ sal_Bool m_bHasNonEncryptedEntries;
+ sal_Bool m_bUseManifest;
+ sal_Bool m_bForceRecovery;
sal_Bool m_bMediaTypeFallbackUsed;
sal_Int16 m_nFormat;
sal_Bool m_bAllowRemoveOnInsert;
- InitialisationMode eMode;
+ InitialisationMode m_eMode;
- ::com::sun::star::uno::Reference < com::sun::star::container::XNameContainer > xRootFolder;
- ::com::sun::star::uno::Reference < com::sun::star::io::XStream > xStream;
- ::com::sun::star::uno::Reference < com::sun::star::io::XInputStream > xContentStream;
- ::com::sun::star::uno::Reference < com::sun::star::io::XSeekable > xContentSeek;
- const ::com::sun::star::uno::Reference < com::sun::star::lang::XMultiServiceFactory > xFactory;
+ ::com::sun::star::uno::Reference < com::sun::star::container::XNameContainer > m_xRootFolder;
+ ::com::sun::star::uno::Reference < com::sun::star::io::XStream > m_xStream;
+ ::com::sun::star::uno::Reference < com::sun::star::io::XInputStream > m_xContentStream;
+ ::com::sun::star::uno::Reference < com::sun::star::io::XSeekable > m_xContentSeek;
+ const ::com::sun::star::uno::Reference < com::sun::star::lang::XMultiServiceFactory > m_xFactory;
- ZipPackageFolder *pRootFolder;
- ZipFile *pZipFile;
+ ZipPackageFolder *m_pRootFolder;
+ ZipFile *m_pZipFile;
void parseManifest();
void parseContentType();
@@ -124,8 +125,8 @@ protected:
public:
ZipPackage (const ::com::sun::star::uno::Reference < com::sun::star::lang::XMultiServiceFactory > &xNewFactory);
virtual ~ZipPackage( void );
- ZipFile& getZipFile() { return *pZipFile;}
- const com::sun::star::uno::Sequence < sal_Int8 > & getEncryptionKey ( ) {return aEncryptionKey;}
+ ZipFile& getZipFile() { return *m_pZipFile;}
+ const com::sun::star::uno::Sequence < sal_Int8 > & getEncryptionKey ( ) {return m_aEncryptionKey;}
sal_Int16 getFormat() const { return m_nFormat; }
SotMutexHolderRef GetSharedMutexRef() { return m_aMutexHolder; }
diff --git a/package/inc/ZipPackageFolder.hxx b/package/inc/ZipPackageFolder.hxx
index dfe72a6975b9..1edbae7f5d3d 100644
--- a/package/inc/ZipPackageFolder.hxx
+++ b/package/inc/ZipPackageFolder.hxx
@@ -74,6 +74,8 @@ public:
::rtl::OUString& GetVersion() { return m_sVersion; }
void SetVersion( const ::rtl::OUString& aVersion ) { m_sVersion = aVersion; }
+ sal_Bool LookForUnexpectedODF12Streams( const ::rtl::OUString& aPath );
+
void setChildStreamsTypeByExtension( const ::com::sun::star::beans::StringPair& aPair );
void doInsertByName ( ZipPackageEntry *pEntry, sal_Bool bSetParent )
diff --git a/package/source/manifest/ManifestDefines.hxx b/package/source/manifest/ManifestDefines.hxx
index 78d262358a0f..e64c650a386c 100644
--- a/package/source/manifest/ManifestDefines.hxx
+++ b/package/source/manifest/ManifestDefines.hxx
@@ -54,10 +54,17 @@
#define ATTRIBUTE_ALGORITHM_NAME "manifest:algorithm-name"
#define ATTRIBUTE_INITIALISATION_VECTOR "manifest:initialisation-vector"
+#define ELEMENT_START_KEY_GENERATION "manifest:start-key-generation"
+#define ATTRIBUTE_START_KEY_GENERATION_NAME "manifest:start-key-generation-name"
+#define ALGORITHM_SHA1 "SHA1"
+#define ATTRIBUTE_KEY_SIZE "manifest:key-size"
+#define START_KEY_SIZE "20"
+
#define ELEMENT_KEY_DERIVATION "manifest:key-derivation"
#define ATTRIBUTE_KEY_DERIVATION_NAME "manifest:key-derivation-name"
#define ATTRIBUTE_SALT "manifest:salt"
#define ATTRIBUTE_ITERATION_COUNT "manifest:iteration-count"
#define CHECKSUM_TYPE "SHA1/1K"
+#define DERIVED_KEY_SIZE "16"
#endif
diff --git a/package/source/manifest/ManifestExport.cxx b/package/source/manifest/ManifestExport.cxx
index 6ca9972cf729..4ae1785a0d8b 100644
--- a/package/source/manifest/ManifestExport.cxx
+++ b/package/source/manifest/ManifestExport.cxx
@@ -61,6 +61,7 @@ ManifestExport::ManifestExport(Reference < XDocumentHandler > xHandler, const S
const OUString sManifestElement ( RTL_CONSTASCII_USTRINGPARAM ( ELEMENT_MANIFEST ) );
const OUString sEncryptionDataElement( RTL_CONSTASCII_USTRINGPARAM ( ELEMENT_ENCRYPTION_DATA ) );
const OUString sAlgorithmElement ( RTL_CONSTASCII_USTRINGPARAM ( ELEMENT_ALGORITHM ) );
+ const OUString sStartKeyGenerationElement ( RTL_CONSTASCII_USTRINGPARAM ( ELEMENT_START_KEY_GENERATION ) );
const OUString sKeyDerivationElement( RTL_CONSTASCII_USTRINGPARAM ( ELEMENT_KEY_DERIVATION ) );
const OUString sCdataAttribute ( RTL_CONSTASCII_USTRINGPARAM ( ATTRIBUTE_CDATA ) );
@@ -68,10 +69,12 @@ ManifestExport::ManifestExport(Reference < XDocumentHandler > xHandler, const S
const OUString sVersionAttribute ( RTL_CONSTASCII_USTRINGPARAM ( ATTRIBUTE_VERSION ) );
const OUString sFullPathAttribute ( RTL_CONSTASCII_USTRINGPARAM ( ATTRIBUTE_FULL_PATH ) );
const OUString sSizeAttribute ( RTL_CONSTASCII_USTRINGPARAM ( ATTRIBUTE_SIZE ) );
+ const OUString sKeySizeAttribute ( RTL_CONSTASCII_USTRINGPARAM ( ATTRIBUTE_KEY_SIZE ) );
const OUString sSaltAttribute ( RTL_CONSTASCII_USTRINGPARAM ( ATTRIBUTE_SALT ) );
const OUString sInitialisationVectorAttribute ( RTL_CONSTASCII_USTRINGPARAM ( ATTRIBUTE_INITIALISATION_VECTOR ) );
const OUString sIterationCountAttribute ( RTL_CONSTASCII_USTRINGPARAM ( ATTRIBUTE_ITERATION_COUNT ) );
const OUString sAlgorithmNameAttribute ( RTL_CONSTASCII_USTRINGPARAM ( ATTRIBUTE_ALGORITHM_NAME ) );
+ const OUString sStartKeyGenerationNameAttribute ( RTL_CONSTASCII_USTRINGPARAM ( ATTRIBUTE_START_KEY_GENERATION_NAME ) );
const OUString sKeyDerivationNameAttribute ( RTL_CONSTASCII_USTRINGPARAM ( ATTRIBUTE_KEY_DERIVATION_NAME ) );
const OUString sChecksumTypeAttribute ( RTL_CONSTASCII_USTRINGPARAM ( ATTRIBUTE_CHECKSUM_TYPE ) );
const OUString sChecksumAttribute ( RTL_CONSTASCII_USTRINGPARAM ( ATTRIBUTE_CHECKSUM) );
@@ -89,6 +92,9 @@ ManifestExport::ManifestExport(Reference < XDocumentHandler > xHandler, const S
const OUString sBlowfish ( RTL_CONSTASCII_USTRINGPARAM ( "Blowfish CFB" ) );
const OUString sPBKDF2 ( RTL_CONSTASCII_USTRINGPARAM ( "PBKDF2" ) );
const OUString sChecksumType ( RTL_CONSTASCII_USTRINGPARAM ( CHECKSUM_TYPE ) );
+ const OUString sStartKeySize ( RTL_CONSTASCII_USTRINGPARAM ( START_KEY_SIZE ) );
+ const OUString sDerivedKeySize ( RTL_CONSTASCII_USTRINGPARAM ( DERIVED_KEY_SIZE ) );
+ const OUString sSHA1 ( RTL_CONSTASCII_USTRINGPARAM ( ALGORITHM_SHA1 ) );
::comphelper::AttributeList * pRootAttrList = new ::comphelper::AttributeList;
const Sequence < PropertyValue > *pSequence = rManList.getConstArray();
@@ -96,15 +102,16 @@ ManifestExport::ManifestExport(Reference < XDocumentHandler > xHandler, const S
// find the mediatype of the document if any
OUString aDocMediaType;
+ OUString aDocVersion;
for (sal_uInt32 nInd = 0; nInd < nManLength ; nInd++ )
{
OUString aMediaType;
OUString aPath;
+ OUString aVersion;
const PropertyValue *pValue = pSequence[nInd].getConstArray();
for (sal_uInt32 j = 0, nNum = pSequence[nInd].getLength(); j < nNum; j++, pValue++)
{
-
if (pValue->Name.equals (sMediaTypeProperty) )
{
pValue->Value >>= aMediaType;
@@ -113,20 +120,26 @@ ManifestExport::ManifestExport(Reference < XDocumentHandler > xHandler, const S
{
pValue->Value >>= aPath;
}
+ else if (pValue->Name.equals (sVersionProperty) )
+ {
+ pValue->Value >>= aVersion;
+ }
- if ( aPath.getLength() && aMediaType.getLength() )
+ if ( aPath.getLength() && aMediaType.getLength() && aVersion.getLength() )
break;
}
if ( aPath.equals( OUString( RTL_CONSTASCII_USTRINGPARAM( "/" ) ) ) )
{
aDocMediaType = aMediaType;
+ aDocVersion = aVersion;
break;
}
}
sal_Bool bProvideDTD = sal_False;
sal_Bool bAcceptNonemptyVersion = sal_False;
+ sal_Bool bStoreStartKeyGeneration = sal_False;
if ( aDocMediaType.getLength() )
{
if ( aDocMediaType.equals( OUString( RTL_CONSTASCII_USTRINGPARAM( MIMETYPE_OASIS_OPENDOCUMENT_TEXT_ASCII ) ) )
@@ -152,6 +165,11 @@ ManifestExport::ManifestExport(Reference < XDocumentHandler > xHandler, const S
sCdataAttribute,
OUString( RTL_CONSTASCII_USTRINGPARAM ( MANIFEST_OASIS_NAMESPACE ) ) );
bAcceptNonemptyVersion = sal_True;
+ if ( aDocVersion.compareTo( ODFVER_012_TEXT ) >= 0 )
+ {
+ // this is ODF12 generation, let encrypted streams contain start-key-generation entry
+ bStoreStartKeyGeneration = sal_True;
+ }
}
else
{
@@ -224,6 +242,7 @@ ManifestExport::ManifestExport(Reference < XDocumentHandler > xHandler, const S
xHandler->startElement( sFileEntryElement , xAttrList);
if ( pVector && pSalt && pIterationCount )
{
+ // ==== Encryption Data
::comphelper::AttributeList * pNewAttrList = new ::comphelper::AttributeList;
Reference < XAttributeList > xNewAttrList (pNewAttrList);
OUStringBuffer aBuffer;
@@ -239,6 +258,7 @@ ManifestExport::ManifestExport(Reference < XDocumentHandler > xHandler, const S
}
xHandler->startElement( sEncryptionDataElement , xNewAttrList);
+ // ==== Algorithm
pNewAttrList = new ::comphelper::AttributeList;
xNewAttrList = pNewAttrList;
@@ -253,11 +273,15 @@ ManifestExport::ManifestExport(Reference < XDocumentHandler > xHandler, const S
xHandler->ignorableWhitespace ( sWhiteSpace );
xHandler->endElement( sAlgorithmElement );
+ // ==== Key Derivation
pNewAttrList = new ::comphelper::AttributeList;
xNewAttrList = pNewAttrList;
pNewAttrList->AddAttribute ( sKeyDerivationNameAttribute, sCdataAttribute, sPBKDF2 );
+ if ( bStoreStartKeyGeneration )
+ pNewAttrList->AddAttribute ( sKeySizeAttribute, sCdataAttribute, sDerivedKeySize );
+
sal_Int32 nCount = 0;
pIterationCount->Value >>= nCount;
aBuffer.append (nCount);
@@ -271,6 +295,25 @@ ManifestExport::ManifestExport(Reference < XDocumentHandler > xHandler, const S
xHandler->startElement( sKeyDerivationElement , xNewAttrList);
xHandler->ignorableWhitespace ( sWhiteSpace );
xHandler->endElement( sKeyDerivationElement );
+
+ // we have to store start-key-generation element as the last one to workaround the parsing problem
+ // in OOo3.1 and older versions
+ if ( bStoreStartKeyGeneration )
+ {
+ // ==== Start Key Generation
+ pNewAttrList = new ::comphelper::AttributeList;
+ xNewAttrList = pNewAttrList;
+
+ // currently SHA1 is used to generate 20-bytes start key
+ pNewAttrList->AddAttribute ( sStartKeyGenerationNameAttribute, sCdataAttribute, sSHA1 );
+ pNewAttrList->AddAttribute ( sKeySizeAttribute, sCdataAttribute, sStartKeySize );
+
+ xHandler->ignorableWhitespace ( sWhiteSpace );
+ xHandler->startElement( sStartKeyGenerationElement , xNewAttrList);
+ xHandler->ignorableWhitespace ( sWhiteSpace );
+ xHandler->endElement( sStartKeyGenerationElement );
+ }
+
xHandler->ignorableWhitespace ( sWhiteSpace );
xHandler->endElement( sEncryptionDataElement );
}
diff --git a/package/source/manifest/makefile.mk b/package/source/manifest/makefile.mk
index 4d6e599c83c4..197ace20479e 100644
--- a/package/source/manifest/makefile.mk
+++ b/package/source/manifest/makefile.mk
@@ -42,6 +42,8 @@ ENABLE_EXCEPTIONS=TRUE
# --- Files --------------------------------------------------------
+.IF "$(L10N_framework)"==""
+
SLOFILES= \
$(SLO)$/ManifestReader.obj \
$(SLO)$/ManifestWriter.obj \
@@ -50,6 +52,8 @@ SLOFILES= \
$(SLO)$/Base64Codec.obj \
$(SLO)$/UnoRegister.obj
+.ENDIF # L10N_framework
+
# --- Targets ------------------------------------------------------
.INCLUDE : target.mk
diff --git a/package/source/xstor/makefile.mk b/package/source/xstor/makefile.mk
index 1a2e0ef765e5..a0e49f2096e0 100644
--- a/package/source/xstor/makefile.mk
+++ b/package/source/xstor/makefile.mk
@@ -42,6 +42,8 @@ ENABLE_EXCEPTIONS=TRUE
# --- Files --------------------------------------------------------
+.IF "$(L10N_framework)"==""
+
SLOFILES = \
$(SLO)$/ohierarchyholder.obj\
$(SLO)$/ocompinstream.obj\
@@ -68,6 +70,8 @@ SHL1IMPLIB=i$(SHL1TARGET)
DEF1NAME=$(SHL1TARGET)
DEF1EXPORTFILE=$(SHL1TARGET).dxp
+.ENDIF # L10N_framework
+
# --- Targets -------------------------------------------------------
.INCLUDE : target.mk
diff --git a/package/source/xstor/owriteablestream.cxx b/package/source/xstor/owriteablestream.cxx
index 2946c14f98ff..67e71baf8533 100644
--- a/package/source/xstor/owriteablestream.cxx
+++ b/package/source/xstor/owriteablestream.cxx
@@ -3171,7 +3171,7 @@ void SAL_CALL OWriteStream::setPropertyValue( const ::rtl::OUString& aPropertyNa
m_pImpl->m_aProps[nInd].Value <<= bCompressedValueFromType;
}
}
- else if ( m_pData->m_nStorageType == PACKAGE_STORAGE && aPropertyName.equalsAscii( "Compressed" ) )
+ else if ( aPropertyName.equals( aCompressedString ) )
{
// if the "Compressed" property is not set explicitly, the MediaType can change the default value
m_pImpl->m_bCompressedSetExplicit = sal_True;
@@ -3206,8 +3206,7 @@ void SAL_CALL OWriteStream::setPropertyValue( const ::rtl::OUString& aPropertyNa
else
throw lang::IllegalArgumentException(); //TODO
}
- else if ( m_pData->m_nStorageType == OFOPXML_STORAGE
- && ( aPropertyName.equalsAscii( "MediaType" ) || aPropertyName.equalsAscii( "Compressed" ) ) )
+ else if ( m_pData->m_nStorageType == OFOPXML_STORAGE && aPropertyName.equals( aMediaTypeString ) )
{
for ( sal_Int32 nInd = 0; nInd < m_pImpl->m_aProps.getLength(); nInd++ )
{
@@ -3282,8 +3281,8 @@ uno::Any SAL_CALL OWriteStream::getPropertyValue( const ::rtl::OUString& aProp )
else
aPropertyName = aProp;
- if ( ( m_pData->m_nStorageType == PACKAGE_STORAGE || m_pData->m_nStorageType == OFOPXML_STORAGE )
- && aPropertyName.equalsAscii( "MediaType" )
+ if ( ( ( m_pData->m_nStorageType == PACKAGE_STORAGE || m_pData->m_nStorageType == OFOPXML_STORAGE )
+ && aPropertyName.equalsAscii( "MediaType" ) )
|| m_pData->m_nStorageType == PACKAGE_STORAGE && aPropertyName.equalsAscii( "Encrypted" )
|| aPropertyName.equalsAscii( "Compressed" ) )
{
diff --git a/package/source/xstor/xstorage.cxx b/package/source/xstor/xstorage.cxx
index b49fbd67b98d..4d0af7bb7619 100644
--- a/package/source/xstor/xstorage.cxx
+++ b/package/source/xstor/xstorage.cxx
@@ -3224,7 +3224,7 @@ sal_Bool SAL_CALL OStorage::isStreamElement( const ::rtl::OUString& aElementName
m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
uno::Any aCaught( ::cppu::getCaughtException() );
- throw embed::StorageWrappedTargetException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Can't detect whether it is a stream!" ) ),
+ throw lang::WrappedTargetRuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Can't detect whether it is a stream!" ) ),
uno::Reference< io::XInputStream >(),
aCaught );
}
@@ -3293,7 +3293,7 @@ sal_Bool SAL_CALL OStorage::isStorageElement( const ::rtl::OUString& aElementNam
m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
uno::Any aCaught( ::cppu::getCaughtException() );
- throw embed::StorageWrappedTargetException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Can't detect whether it is a storage" ) ),
+ throw lang::WrappedTargetRuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "can't detect whether it is a storage" ) ),
uno::Reference< io::XInputStream >(),
aCaught );
}
@@ -4804,6 +4804,7 @@ void SAL_CALL OStorage::setPropertyValue( const ::rtl::OUString& aPropertyName,
m_pImpl->m_bIsModified = sal_True;
}
else if ( m_pData->m_bIsRoot && ( aPropertyName.equalsAscii( "HasEncryptedEntries" )
+ || aPropertyName.equalsAscii( "HasNonEncryptedEntries" )
|| aPropertyName.equalsAscii( "URL" )
|| aPropertyName.equalsAscii( "RepairPackage" ) )
|| aPropertyName.equalsAscii( "IsRoot" )
@@ -4937,7 +4938,8 @@ uno::Any SAL_CALL OStorage::getPropertyValue( const ::rtl::OUString& aPropertyNa
return uno::makeAny( sal_False ); // RepairPackage
}
- else if ( m_pData->m_nStorageType == PACKAGE_STORAGE && aPropertyName.equalsAscii( "HasEncryptedEntries" ) )
+ else if ( m_pData->m_nStorageType == PACKAGE_STORAGE
+ && ( aPropertyName.equalsAscii( "HasEncryptedEntries" ) || aPropertyName.equalsAscii( "HasNonEncryptedEntries" ) ) )
{
try {
m_pImpl->ReadContents();
diff --git a/package/source/zipapi/ZipFile.cxx b/package/source/zipapi/ZipFile.cxx
index 936ab2acd1bc..246cbd889015 100644
--- a/package/source/zipapi/ZipFile.cxx
+++ b/package/source/zipapi/ZipFile.cxx
@@ -608,7 +608,7 @@ sal_Bool ZipFile::readLOC( ZipEntry &rEntry )
throw(IOException, ZipException, RuntimeException)
{
sal_Int32 nTestSig, nTime, nCRC, nSize, nCompressedSize;
- sal_Int16 nVersion, nFlag, nHow, nNameLen, nExtraLen;
+ sal_Int16 nVersion, nFlag, nHow, nPathLen, nExtraLen;
sal_Int32 nPos = -rEntry.nOffset;
aGrabber.seek(nPos);
@@ -623,18 +623,32 @@ sal_Bool ZipFile::readLOC( ZipEntry &rEntry )
aGrabber >> nCRC;
aGrabber >> nCompressedSize;
aGrabber >> nSize;
- aGrabber >> nNameLen;
+ aGrabber >> nPathLen;
aGrabber >> nExtraLen;
- rEntry.nOffset = static_cast < sal_Int32 > (aGrabber.getPosition()) + nNameLen + nExtraLen;
+ rEntry.nOffset = static_cast < sal_Int32 > (aGrabber.getPosition()) + nPathLen + nExtraLen;
- if ( rEntry.nNameLen == -1 ) // the file was created
- rEntry.nNameLen = nNameLen;
+ // read always in UTF8, some tools seem not to set UTF8 bit
+ uno::Sequence < sal_Int8 > aNameBuffer( nPathLen );
+ sal_Int32 nRead = aGrabber.readBytes( aNameBuffer, nPathLen );
+ if ( nRead < aNameBuffer.getLength() )
+ aNameBuffer.realloc( nRead );
+
+ ::rtl::OUString sLOCPath = rtl::OUString::intern( (sal_Char *) aNameBuffer.getArray(),
+ aNameBuffer.getLength(),
+ RTL_TEXTENCODING_UTF8 );
+
+ if ( rEntry.nPathLen == -1 ) // the file was created
+ {
+ rEntry.nPathLen = nPathLen;
+ rEntry.sPath = sLOCPath;
+ }
// the method can be reset for internal use so it is not checked
sal_Bool bBroken = rEntry.nVersion != nVersion
|| rEntry.nFlag != nFlag
|| rEntry.nTime != nTime
- || rEntry.nNameLen != nNameLen;
+ || rEntry.nPathLen != nPathLen
+ || !rEntry.sPath.equals( sLOCPath );
if ( bBroken && !bRecoveryMode )
throw ZipIOException( OUString( RTL_CONSTASCII_USTRINGPARAM( "The stream seems to be broken!" ) ),
@@ -749,7 +763,7 @@ sal_Int32 ZipFile::readCEN()
aMemGrabber >> aEntry.nCrc;
aMemGrabber >> aEntry.nCompressedSize;
aMemGrabber >> aEntry.nSize;
- aMemGrabber >> aEntry.nNameLen;
+ aMemGrabber >> aEntry.nPathLen;
aMemGrabber >> aEntry.nExtraLen;
aMemGrabber >> nCommentLen;
aMemGrabber.skipBytes ( 8 );
@@ -758,7 +772,7 @@ sal_Int32 ZipFile::readCEN()
aEntry.nOffset += nLocPos;
aEntry.nOffset *= -1;
- if ( aEntry.nNameLen < 0 || aEntry.nNameLen > ZIP_MAXNAMELEN )
+ if ( aEntry.nPathLen < 0 || aEntry.nPathLen > ZIP_MAXNAMELEN )
throw ZipException( OUString( RTL_CONSTASCII_USTRINGPARAM ( "name length exceeds ZIP_MAXNAMELEN bytes" ) ), Reference < XInterface > () );
if ( nCommentLen < 0 || nCommentLen > ZIP_MAXNAMELEN )
@@ -768,15 +782,15 @@ sal_Int32 ZipFile::readCEN()
throw ZipException( OUString( RTL_CONSTASCII_USTRINGPARAM ( "extra header info exceeds ZIP_MAXEXTRA bytes") ), Reference < XInterface > () );
// read always in UTF8, some tools seem not to set UTF8 bit
- aEntry.sName = rtl::OUString::intern ( (sal_Char *) aMemGrabber.getCurrentPos(),
- aEntry.nNameLen,
+ aEntry.sPath = rtl::OUString::intern ( (sal_Char *) aMemGrabber.getCurrentPos(),
+ aEntry.nPathLen,
RTL_TEXTENCODING_UTF8 );
- if ( !::comphelper::OStorageHelper::IsValidZipEntryFileName( aEntry.sName, sal_True ) )
+ if ( !::comphelper::OStorageHelper::IsValidZipEntryFileName( aEntry.sPath, sal_True ) )
throw ZipException( OUString( RTL_CONSTASCII_USTRINGPARAM ( "Zip entry has an invalid name.") ), Reference < XInterface > () );
- aMemGrabber.skipBytes( aEntry.nNameLen + aEntry.nExtraLen + nCommentLen );
- aEntries[aEntry.sName] = aEntry;
+ aMemGrabber.skipBytes( aEntry.nPathLen + aEntry.nExtraLen + nCommentLen );
+ aEntries[aEntry.sPath] = aEntry;
}
if (nCount != nTotal)
@@ -830,7 +844,7 @@ sal_Int32 ZipFile::recover()
aMemGrabber >> aEntry.nCrc;
aMemGrabber >> aEntry.nCompressedSize;
aMemGrabber >> aEntry.nSize;
- aMemGrabber >> aEntry.nNameLen;
+ aMemGrabber >> aEntry.nPathLen;
aMemGrabber >> aEntry.nExtraLen;
sal_Int32 nDescrLength =
@@ -842,32 +856,32 @@ sal_Int32 ZipFile::recover()
// For OOo2.0 the whole package must be switched to unsigned values
if ( aEntry.nCompressedSize < 0 ) aEntry.nCompressedSize = 0x7FFFFFFF;
if ( aEntry.nSize < 0 ) aEntry.nSize = 0x7FFFFFFF;
- if ( aEntry.nNameLen < 0 ) aEntry.nNameLen = 0x7FFF;
+ if ( aEntry.nPathLen < 0 ) aEntry.nPathLen = 0x7FFF;
if ( aEntry.nExtraLen < 0 ) aEntry.nExtraLen = 0x7FFF;
// End of quick fix
- sal_Int32 nBlockLength = aEntry.nSize + aEntry.nNameLen + aEntry.nExtraLen + 30 + nDescrLength;
- if ( aEntry.nNameLen <= ZIP_MAXNAMELEN && aEntry.nExtraLen < ZIP_MAXEXTRA
+ sal_Int32 nBlockLength = aEntry.nSize + aEntry.nPathLen + aEntry.nExtraLen + 30 + nDescrLength;
+ if ( aEntry.nPathLen <= ZIP_MAXNAMELEN && aEntry.nExtraLen < ZIP_MAXEXTRA
&& ( nGenPos + nPos + nBlockLength ) <= nLength )
{
// read always in UTF8, some tools seem not to set UTF8 bit
- if( nPos + 30 + aEntry.nNameLen <= nBufSize )
- aEntry.sName = OUString ( (sal_Char *) &pBuffer[nPos + 30],
- aEntry.nNameLen,
+ if( nPos + 30 + aEntry.nPathLen <= nBufSize )
+ aEntry.sPath = OUString ( (sal_Char *) &pBuffer[nPos + 30],
+ aEntry.nPathLen,
RTL_TEXTENCODING_UTF8 );
else
{
Sequence < sal_Int8 > aFileName;
aGrabber.seek( nGenPos + nPos + 30 );
- aGrabber.readBytes( aFileName, aEntry.nNameLen );
- aEntry.sName = OUString ( (sal_Char *) aFileName.getArray(),
+ aGrabber.readBytes( aFileName, aEntry.nPathLen );
+ aEntry.sPath = OUString ( (sal_Char *) aFileName.getArray(),
aFileName.getLength(),
RTL_TEXTENCODING_UTF8 );
- aEntry.nNameLen = static_cast< sal_Int16 >(aFileName.getLength());
+ aEntry.nPathLen = static_cast< sal_Int16 >(aFileName.getLength());
}
- aEntry.nOffset = nGenPos + nPos + 30 + aEntry.nNameLen + aEntry.nExtraLen;
+ aEntry.nOffset = nGenPos + nPos + 30 + aEntry.nPathLen + aEntry.nExtraLen;
if ( ( aEntry.nSize || aEntry.nCompressedSize ) && !checkSizeAndCRC( aEntry ) )
{
@@ -876,8 +890,8 @@ sal_Int32 ZipFile::recover()
aEntry.nSize = 0;
}
- if ( aEntries.find( aEntry.sName ) == aEntries.end() )
- aEntries[aEntry.sName] = aEntry;
+ if ( aEntries.find( aEntry.sPath ) == aEntries.end() )
+ aEntries[aEntry.sPath] = aEntry;
}
}
}
diff --git a/package/source/zipapi/ZipOutputStream.cxx b/package/source/zipapi/ZipOutputStream.cxx
index 65e8369e9095..1faa37176271 100644
--- a/package/source/zipapi/ZipOutputStream.cxx
+++ b/package/source/zipapi/ZipOutputStream.cxx
@@ -295,10 +295,10 @@ void ZipOutputStream::writeEND(sal_uInt32 nOffset, sal_uInt32 nLength)
void ZipOutputStream::writeCEN( const ZipEntry &rEntry )
throw(IOException, RuntimeException)
{
- if ( !::comphelper::OStorageHelper::IsValidZipEntryFileName( rEntry.sName, sal_True ) )
+ if ( !::comphelper::OStorageHelper::IsValidZipEntryFileName( rEntry.sPath, sal_True ) )
throw IOException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Unexpected character is used in file name." ) ), Reference< XInterface >() );
- ::rtl::OString sUTF8Name = ::rtl::OUStringToOString( rEntry.sName, RTL_TEXTENCODING_UTF8 );
+ ::rtl::OString sUTF8Name = ::rtl::OUStringToOString( rEntry.sPath, RTL_TEXTENCODING_UTF8 );
sal_Int16 nNameLength = static_cast < sal_Int16 > ( sUTF8Name.getLength() );
aChucker << CENSIG;
@@ -344,10 +344,10 @@ void ZipOutputStream::writeEXT( const ZipEntry &rEntry )
sal_Int32 ZipOutputStream::writeLOC( const ZipEntry &rEntry )
throw(IOException, RuntimeException)
{
- if ( !::comphelper::OStorageHelper::IsValidZipEntryFileName( rEntry.sName, sal_True ) )
+ if ( !::comphelper::OStorageHelper::IsValidZipEntryFileName( rEntry.sPath, sal_True ) )
throw IOException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Unexpected character is used in file name." ) ), Reference< XInterface >() );
- ::rtl::OString sUTF8Name = ::rtl::OUStringToOString( rEntry.sName, RTL_TEXTENCODING_UTF8 );
+ ::rtl::OString sUTF8Name = ::rtl::OUStringToOString( rEntry.sPath, RTL_TEXTENCODING_UTF8 );
sal_Int16 nNameLength = static_cast < sal_Int16 > ( sUTF8Name.getLength() );
aChucker << LOCSIG;
diff --git a/package/source/zipapi/makefile.mk b/package/source/zipapi/makefile.mk
index 5b58eae750b3..e0fb43f93180 100644
--- a/package/source/zipapi/makefile.mk
+++ b/package/source/zipapi/makefile.mk
@@ -40,6 +40,7 @@ ENABLE_EXCEPTIONS=TRUE
.INCLUDE : settings.mk
# --- Files --------------------------------------------------------
+.IF "$(L10N_framework)"==""
#CFLAGS+=/Ob0 /Od
.IF "$(SYSTEM_ZLIB)" == "YES"
CFLAGS+=-DSYSTEM_ZLIB
@@ -55,6 +56,8 @@ SLOFILES= \
$(SLO)$/ZipOutputStream.obj \
$(SLO)$/XUnbufferedStream.obj
+.ENDIF # L10N_framework
+
# --- Targets ------------------------------------------------------
.INCLUDE : target.mk
diff --git a/package/source/zippackage/ZipPackage.cxx b/package/source/zippackage/ZipPackage.cxx
index a8c3d20be274..b95711778e77 100644
--- a/package/source/zippackage/ZipPackage.cxx
+++ b/package/source/zippackage/ZipPackage.cxx
@@ -199,39 +199,40 @@ class DummyInputStream : public ::cppu::WeakImplHelper1< XInputStream >
ZipPackage::ZipPackage (const uno::Reference < XMultiServiceFactory > &xNewFactory)
: m_aMutexHolder( new SotMutexHolder )
-, bHasEncryptedEntries ( sal_False )
-, bUseManifest ( sal_True )
-, bForceRecovery ( sal_False )
+, m_bHasEncryptedEntries ( sal_False )
+, m_bHasNonEncryptedEntries ( sal_False )
+, m_bUseManifest ( sal_True )
+, m_bForceRecovery ( sal_False )
, m_bMediaTypeFallbackUsed ( sal_False )
, m_nFormat( PACKAGE_FORMAT ) // package is the default format
, m_bAllowRemoveOnInsert( sal_True )
-, eMode ( e_IMode_None )
-, xFactory( xNewFactory )
-, pRootFolder( NULL )
-, pZipFile( NULL )
+, m_eMode ( e_IMode_None )
+, m_xFactory( xNewFactory )
+, m_pRootFolder( NULL )
+, m_pZipFile( NULL )
{
- xRootFolder = pRootFolder = new ZipPackageFolder( xFactory, m_nFormat, m_bAllowRemoveOnInsert );
+ m_xRootFolder = m_pRootFolder = new ZipPackageFolder( m_xFactory, m_nFormat, m_bAllowRemoveOnInsert );
}
ZipPackage::~ZipPackage( void )
{
- delete pZipFile;
+ delete m_pZipFile;
// All folders and streams contain pointers to their parents, when a parent diappeares
// it should disconnect all the children from itself during destruction automatically.
- // So there is no need in explicit pRootFolder->releaseUpwardRef() call here any more
- // since pRootFolder has no parent and cleaning of it's children will be done automatically
- // during pRootFolder dieing by refcount.
+ // So there is no need in explicit m_pRootFolder->releaseUpwardRef() call here any more
+ // since m_pRootFolder has no parent and cleaning of it's children will be done automatically
+ // during m_pRootFolder dieing by refcount.
#if 0
// As all folders and streams contain references to their parents,
// we must remove these references so that they will be deleted when
// the hash_map of the root folder is cleared, releasing all subfolders
- // and substreams which in turn release theirs, etc. When xRootFolder is
+ // and substreams which in turn release theirs, etc. When m_xRootFolder is
// released when this destructor completes, the folder tree should be
// deleted fully (and automagically).
- pRootFolder->releaseUpwardRef();
+ m_pRootFolder->releaseUpwardRef();
#endif
}
@@ -241,13 +242,13 @@ void ZipPackage::parseManifest()
{
sal_Bool bManifestParsed = sal_False;
const OUString sMeta ( RTL_CONSTASCII_USTRINGPARAM ( "META-INF" ) );
- if ( xRootFolder->hasByName( sMeta ) )
+ if ( m_xRootFolder->hasByName( sMeta ) )
{
const OUString sManifest (RTL_CONSTASCII_USTRINGPARAM( "manifest.xml") );
try {
uno::Reference< XUnoTunnel > xTunnel;
- Any aAny = xRootFolder->getByName( sMeta );
+ Any aAny = m_xRootFolder->getByName( sMeta );
aAny >>= xTunnel;
uno::Reference< XNameContainer > xMetaInfFolder( xTunnel, UNO_QUERY );
if ( xMetaInfFolder.is() && xMetaInfFolder->hasByName( sManifest ) )
@@ -258,7 +259,7 @@ void ZipPackage::parseManifest()
if (xSink.is())
{
OUString sManifestReader ( RTL_CONSTASCII_USTRINGPARAM ( "com.sun.star.packages.manifest.ManifestReader" ) );
- uno::Reference < XManifestReader > xReader (xFactory->createInstance( sManifestReader ), UNO_QUERY );
+ uno::Reference < XManifestReader > xReader (m_xFactory->createInstance( sManifestReader ), UNO_QUERY );
if ( xReader.is() )
{
const OUString sPropFullPath ( RTL_CONSTASCII_USTRINGPARAM ( "FullPath" ) );
@@ -300,6 +301,7 @@ void ZipPackage::parseManifest()
else if (pValue[j].Name.equals( sPropDigest ) )
pDigest = &(pValue[j].Value);
}
+
if (sPath.getLength() && hasByHierarchicalName ( sPath ) )
{
aAny = getByHierarchicalName( sPath );
@@ -316,6 +318,7 @@ void ZipPackage::parseManifest()
{
pStream = reinterpret_cast < ZipPackageStream* > ( xUnoTunnel->getSomething(ZipPackageStream::static_getImplementationId()));
pStream->SetMediaType ( sMediaType );
+ pStream->SetFromManifest( sal_True );
if (pSalt && pVector && pCount && pSize)
{
@@ -344,9 +347,12 @@ void ZipPackage::parseManifest()
pStream->SetToBeCompressed ( sal_True );
pStream->SetToBeEncrypted ( sal_True );
pStream->SetIsEncrypted ( sal_True );
- if ( !bHasEncryptedEntries && pStream->getName().compareToAscii ( "content.xml" ) == 0 )
- bHasEncryptedEntries = sal_True;
+ if ( !m_bHasEncryptedEntries
+ && pStream->getName().equals( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "content.xml" ) ) ) )
+ m_bHasEncryptedEntries = sal_True;
}
+ else
+ m_bHasNonEncryptedEntries = sal_True;
}
}
}
@@ -354,7 +360,7 @@ void ZipPackage::parseManifest()
bManifestParsed = sal_True;
}
else
- VOS_ENSURE ( 0, "Couldn't get a ManifestReader!" ); // throw RuntimeException?
+ throw uno::RuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "No manifes parser!" ) ), uno::Reference< uno::XInterface >() );
}
// now hide the manifest.xml file from user
@@ -363,46 +369,76 @@ void ZipPackage::parseManifest()
}
catch( Exception& )
{
- if ( !bForceRecovery )
+ if ( !m_bForceRecovery )
throw;
}
}
+ if ( !bManifestParsed && !m_bForceRecovery )
+ throw ZipIOException(
+ ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Could not parse manifest.xml\n" ) ),
+ uno::Reference< uno::XInterface >() );
+
const OUString sMimetype ( RTL_CONSTASCII_USTRINGPARAM ( "mimetype" ) );
- if ( xRootFolder->hasByName( sMimetype ) )
+ if ( m_xRootFolder->hasByName( sMimetype ) )
{
- if ( !bManifestParsed )
+ // get mediatype from the "mimetype" stream
+ ::rtl::OUString aPackageMediatype;
+ uno::Reference< lang::XUnoTunnel > xMimeTypeTunnel;
+ m_xRootFolder->getByName( sMimetype ) >>= xMimeTypeTunnel;
+ uno::Reference < io::XActiveDataSink > xMimeSink( xMimeTypeTunnel, UNO_QUERY );
+ if ( xMimeSink.is() )
{
- // try to get mediatype from the "mimetype" stream
- uno::Reference< lang::XUnoTunnel > xMimeTypeTunnel;
- xRootFolder->getByName( sMimetype ) >>= xMimeTypeTunnel;
- uno::Reference < io::XActiveDataSink > xMimeSink( xMimeTypeTunnel, UNO_QUERY );
- if ( xMimeSink.is() )
+ uno::Reference< io::XInputStream > xMimeInStream = xMimeSink->getInputStream();
+ if ( xMimeInStream.is() )
{
- uno::Reference< io::XInputStream > xMimeInStream = xMimeSink->getInputStream();
- if ( xMimeInStream.is() )
- {
- // Mediatypes longer than 1024 symbols should not appear here
- uno::Sequence< sal_Int8 > aData( 1024 );
- sal_Int32 nRead = xMimeInStream->readBytes( aData, 1024 );
- OSL_ENSURE( nRead == aData.getLength(), "Difference between reading result and data!\n" );
- if ( nRead > aData.getLength() )
- nRead = aData.getLength();
- if ( nRead )
- {
- ::rtl::OUString aFallBack( (sal_Char*)aData.getConstArray(), nRead, RTL_TEXTENCODING_ASCII_US );
- if ( aFallBack.compareToAscii( RTL_CONSTASCII_STRINGPARAM( "application/vnd." ) ) == 0 )
- {
- // accept only types that look similar to own mediatypes
- pRootFolder->SetMediaType( aFallBack );
- m_bMediaTypeFallbackUsed = sal_True;
- }
- }
- }
+ // Mediatypes longer than 1024 symbols should not appear here
+ uno::Sequence< sal_Int8 > aData( 1024 );
+ sal_Int32 nRead = xMimeInStream->readBytes( aData, 1024 );
+ if ( nRead > aData.getLength() )
+ nRead = aData.getLength();
+
+ if ( nRead )
+ aPackageMediatype = ::rtl::OUString( (sal_Char*)aData.getConstArray(), nRead, RTL_TEXTENCODING_ASCII_US );
}
+ }
+
+ if ( !bManifestParsed )
+ {
+ // the manifest.xml could not be successfuly parsed, this is an inconsistent package
+ if ( aPackageMediatype.compareToAscii( RTL_CONSTASCII_STRINGPARAM( "application/vnd." ) ) == 0 )
+ {
+ // accept only types that look similar to own mediatypes
+ m_pRootFolder->SetMediaType( aPackageMediatype );
+ m_bMediaTypeFallbackUsed = sal_True;
+ }
+ }
+ else if ( !m_bForceRecovery )
+ {
+ // the mimetype stream should contain the information from manifest.xml
+ if ( !m_pRootFolder->GetMediaType().equals( aPackageMediatype ) )
+ throw ZipIOException(
+ ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "mimetype conflicts with manifest.xml\n" ) ),
+ uno::Reference< uno::XInterface >() );
}
- xRootFolder->removeByName( sMimetype );
+
+ m_xRootFolder->removeByName( sMimetype );
+ }
+
+ sal_Bool bODF12AndOlder = ( m_pRootFolder->GetVersion().compareTo( ODFVER_012_TEXT ) >= 0 );
+ if ( !m_bForceRecovery && bODF12AndOlder && m_pRootFolder->LookForUnexpectedODF12Streams( ::rtl::OUString() ) )
+ {
+ // this is an ODF1.2 document that contains streams not referred in the manifest.xml
+ throw ZipIOException(
+ ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "there are streams not referred in manifest.xml\n" ) ),
+ uno::Reference< uno::XInterface >() );
+ }
+
+ if ( bODF12AndOlder )
+ {
+ // it is ODF1.2 or later, let the META-INF folder be unavailable for user
+ m_xRootFolder->removeByName( sMeta );
}
}
}
@@ -414,12 +450,12 @@ void ZipPackage::parseContentType()
const ::rtl::OUString aContentTypes( RTL_CONSTASCII_USTRINGPARAM ( "[Content_Types].xml" ) );
try {
// the content type must exist in OFOPXML format!
- if ( !xRootFolder->hasByName( aContentTypes ) )
+ if ( !m_xRootFolder->hasByName( aContentTypes ) )
throw io::IOException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Wrong format!" ) ),
uno::Reference< uno::XInterface >() );
uno::Reference< lang::XUnoTunnel > xTunnel;
- uno::Any aAny = xRootFolder->getByName( aContentTypes );
+ uno::Any aAny = m_xRootFolder->getByName( aContentTypes );
aAny >>= xTunnel;
uno::Reference < io::XActiveDataSink > xSink( xTunnel, UNO_QUERY );
if ( xSink.is() )
@@ -430,14 +466,14 @@ void ZipPackage::parseContentType()
sal_Int32 nInd = 0;
// here aContentTypeInfo[0] - Defaults, and aContentTypeInfo[1] - Overrides
uno::Sequence< uno::Sequence< beans::StringPair > > aContentTypeInfo =
- ::comphelper::OFOPXMLHelper::ReadContentTypeSequence( xInStream, xFactory );
+ ::comphelper::OFOPXMLHelper::ReadContentTypeSequence( xInStream, m_xFactory );
if ( aContentTypeInfo.getLength() != 2 )
throw io::IOException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
// set the implicit types fist
for ( nInd = 0; nInd < aContentTypeInfo[0].getLength(); nInd++ )
- pRootFolder->setChildStreamsTypeByExtension( aContentTypeInfo[0][nInd] );
+ m_pRootFolder->setChildStreamsTypeByExtension( aContentTypeInfo[0][nInd] );
// now set the explicit types
for ( nInd = 0; nInd < aContentTypeInfo[1].getLength(); nInd++ )
@@ -465,11 +501,11 @@ void ZipPackage::parseContentType()
}
}
- xRootFolder->removeByName( aContentTypes );
+ m_xRootFolder->removeByName( aContentTypes );
}
catch( uno::Exception& )
{
- if ( !bForceRecovery )
+ if ( !m_bForceRecovery )
throw;
}
}
@@ -477,7 +513,7 @@ void ZipPackage::parseContentType()
void ZipPackage::getZipFileContents()
{
- auto_ptr < ZipEnumeration > pEnum ( pZipFile->entries() );
+ auto_ptr < ZipEnumeration > pEnum ( m_pZipFile->entries() );
ZipPackageStream *pPkgStream;
ZipPackageFolder *pPkgFolder, *pCurrent;
OUString sTemp, sDirName;
@@ -487,20 +523,20 @@ void ZipPackage::getZipFileContents()
while (pEnum->hasMoreElements())
{
nIndex = nOldIndex = 0;
- pCurrent = pRootFolder;
+ pCurrent = m_pRootFolder;
const ZipEntry & rEntry = *pEnum->nextElement();
- const OUString & rName = rEntry.sName;
+ const OUString & rName = rEntry.sPath;
nStreamIndex = rName.lastIndexOf ( '/' );
if ( nStreamIndex != -1 )
{
sDirName = rName.copy ( 0, nStreamIndex);
- aIter = aRecent.find ( sDirName );
- if ( aIter != aRecent.end() )
+ aIter = m_aRecent.find ( sDirName );
+ if ( aIter != m_aRecent.end() )
pCurrent = (*aIter).second;
}
- if ( pCurrent == pRootFolder )
+ if ( pCurrent == m_pRootFolder )
{
while ( (nIndex = rName.indexOf('/', nOldIndex) ) != -1 )
{
@@ -509,7 +545,7 @@ void ZipPackage::getZipFileContents()
break;
if ( !pCurrent->hasByName( sTemp ) )
{
- pPkgFolder = new ZipPackageFolder( xFactory, m_nFormat, m_bAllowRemoveOnInsert );
+ pPkgFolder = new ZipPackageFolder( m_xFactory, m_nFormat, m_bAllowRemoveOnInsert );
pPkgFolder->setName( sTemp );
pPkgFolder->doSetParent( pCurrent, sal_True );
pCurrent = pPkgFolder;
@@ -519,13 +555,13 @@ void ZipPackage::getZipFileContents()
nOldIndex = nIndex+1;
}
if ( nStreamIndex != -1 && sDirName.getLength() )
- aRecent [ sDirName ] = pCurrent;
+ m_aRecent [ sDirName ] = pCurrent;
}
if ( rName.getLength() -1 != nStreamIndex )
{
nStreamIndex++;
sTemp = rName.copy( nStreamIndex, rName.getLength() - nStreamIndex);
- pPkgStream = new ZipPackageStream( *this, xFactory, m_bAllowRemoveOnInsert );
+ pPkgStream = new ZipPackageStream( *this, m_xFactory, m_bAllowRemoveOnInsert );
pPkgStream->SetPackageMember( sal_True );
pPkgStream->setZipEntryOnLoading( rEntry );
pPkgStream->setName( sTemp );
@@ -555,13 +591,13 @@ void SAL_CALL ZipPackage::initialize( const Sequence< Any >& aArguments )
OUString aParamUrl;
if ( (aArguments[ind] >>= aParamUrl))
{
- eMode = e_IMode_URL;
+ m_eMode = e_IMode_URL;
try
{
sal_Int32 nParam = aParamUrl.indexOf( '?' );
if ( nParam >= 0 )
{
- sURL = aParamUrl.copy( 0, nParam );
+ m_aURL = aParamUrl.copy( 0, nParam );
OUString aParam = aParamUrl.copy( nParam + 1 );
sal_Int32 nIndex = 0;
@@ -570,28 +606,28 @@ void SAL_CALL ZipPackage::initialize( const Sequence< Any >& aArguments )
::rtl::OUString aCommand = aParam.getToken( 0, '&', nIndex );
if ( aCommand.equals( OUString::createFromAscii( "repairpackage" ) ) )
{
- bForceRecovery = sal_True;
+ m_bForceRecovery = sal_True;
break;
}
else if ( aCommand.equals( OUString::createFromAscii( "purezip" ) ) )
{
m_nFormat = ZIP_FORMAT;
- pRootFolder->setPackageFormat_Impl( m_nFormat );
+ m_pRootFolder->setPackageFormat_Impl( m_nFormat );
break;
}
else if ( aCommand.equals( OUString::createFromAscii( "ofopxml" ) ) )
{
m_nFormat = OFOPXML_FORMAT;
- pRootFolder->setPackageFormat_Impl( m_nFormat );
+ m_pRootFolder->setPackageFormat_Impl( m_nFormat );
break;
}
}
while ( nIndex >= 0 );
}
else
- sURL = aParamUrl;
+ m_aURL = aParamUrl;
- Content aContent ( sURL, uno::Reference < XCommandEnvironment >() );
+ Content aContent ( m_aURL, uno::Reference < XCommandEnvironment >() );
Any aAny = aContent.getPropertyValue( OUString::createFromAscii( "Size" ) );
sal_uInt64 aSize = 0;
// kind of optimisation: treat empty files as nonexistent files
@@ -601,7 +637,7 @@ void SAL_CALL ZipPackage::initialize( const Sequence< Any >& aArguments )
{
uno::Reference < XActiveDataSink > xSink = new ZipPackageSink;
if (aContent.openStream ( xSink ) )
- xContentStream = xSink->getInputStream();
+ m_xContentStream = xSink->getInputStream();
}
else
bHaveZipFile = sal_False;
@@ -614,20 +650,20 @@ void SAL_CALL ZipPackage::initialize( const Sequence< Any >& aArguments )
bHaveZipFile = sal_False;
}
}
- else if ( (aArguments[ind] >>= xStream ) )
+ else if ( (aArguments[ind] >>= m_xStream ) )
{
// a writable stream can implement both XStream & XInputStream
- eMode = e_IMode_XStream;
- xContentStream = xStream->getInputStream();
+ m_eMode = e_IMode_XStream;
+ m_xContentStream = m_xStream->getInputStream();
}
- else if ( (aArguments[ind] >>= xContentStream) )
+ else if ( (aArguments[ind] >>= m_xContentStream) )
{
- eMode = e_IMode_XInputStream;
+ m_eMode = e_IMode_XInputStream;
}
else if ( ( aArguments[ind] >>= aNamedValue ) )
{
if ( aNamedValue.Name.equalsAscii( "RepairPackage" ) )
- aNamedValue.Value >>= bForceRecovery;
+ aNamedValue.Value >>= m_bForceRecovery;
else if ( aNamedValue.Name.equalsAscii( "PackageFormat" ) )
{
// setting this argument to true means Package format
@@ -638,27 +674,27 @@ void SAL_CALL ZipPackage::initialize( const Sequence< Any >& aArguments )
if ( !bPackFormat )
m_nFormat = ZIP_FORMAT;
- pRootFolder->setPackageFormat_Impl( m_nFormat );
+ m_pRootFolder->setPackageFormat_Impl( m_nFormat );
}
else if ( aNamedValue.Name.equalsAscii( "StorageFormat" ) )
{
::rtl::OUString aFormatName;
aNamedValue.Value >>= aFormatName;
- if ( aFormatName.equalsAscii( "PackageFormat" ) )
+ if ( aFormatName.equals( PACKAGE_STORAGE_FORMAT_STRING ) )
m_nFormat = PACKAGE_FORMAT;
- else if ( aFormatName.equalsAscii( "ZipFormat" ) )
+ else if ( aFormatName.equals( ZIP_STORAGE_FORMAT_STRING ) )
m_nFormat = ZIP_FORMAT;
- else if ( aFormatName.equalsAscii( "OFOPXMLFormat" ) )
+ else if ( aFormatName.equals( OFOPXML_STORAGE_FORMAT_STRING ) )
m_nFormat = OFOPXML_FORMAT;
else
throw lang::IllegalArgumentException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >(), 1 );
- pRootFolder->setPackageFormat_Impl( m_nFormat );
+ m_pRootFolder->setPackageFormat_Impl( m_nFormat );
}
else if ( aNamedValue.Name.equalsAscii( "AllowRemoveOnInsert" ) )
{
aNamedValue.Value >>= m_bAllowRemoveOnInsert;
- pRootFolder->setRemoveOnInsertMode_Impl( m_bAllowRemoveOnInsert );
+ m_pRootFolder->setRemoveOnInsertMode_Impl( m_bAllowRemoveOnInsert );
}
// for now the progress handler is not used, probably it will never be
@@ -674,16 +710,16 @@ void SAL_CALL ZipPackage::initialize( const Sequence< Any >& aArguments )
try
{
- if (xContentStream.is())
+ if (m_xContentStream.is())
{
// the stream must be seekable, if it is not it will be wrapped
- xContentStream = ::comphelper::OSeekableInputWrapper::CheckSeekableCanWrap( xContentStream, xFactory );
- xContentSeek = uno::Reference < XSeekable > ( xContentStream, UNO_QUERY );
- if ( ! xContentSeek.is() )
+ m_xContentStream = ::comphelper::OSeekableInputWrapper::CheckSeekableCanWrap( m_xContentStream, m_xFactory );
+ m_xContentSeek = uno::Reference < XSeekable > ( m_xContentStream, UNO_QUERY );
+ if ( ! m_xContentSeek.is() )
throw com::sun::star::uno::Exception ( OUString( RTL_CONSTASCII_USTRINGPARAM ( OSL_LOG_PREFIX "The package component _requires_ an XSeekable interface!" ) ),
static_cast < ::cppu::OWeakObject * > ( this ) );
- if ( !xContentSeek->getLength() )
+ if ( !m_xContentSeek->getLength() )
bHaveZipFile = sal_False;
}
else
@@ -700,7 +736,7 @@ void SAL_CALL ZipPackage::initialize( const Sequence< Any >& aArguments )
{
try
{
- pZipFile = new ZipFile ( xContentStream, xFactory, sal_True, bForceRecovery, xProgressHandler );
+ m_pZipFile = new ZipFile ( m_xContentStream, m_xFactory, sal_True, m_bForceRecovery, xProgressHandler );
getZipFileContents();
}
catch ( IOException & )
@@ -713,14 +749,14 @@ void SAL_CALL ZipPackage::initialize( const Sequence< Any >& aArguments )
}
catch ( Exception & )
{
- if( pZipFile ) { delete pZipFile; pZipFile = NULL; }
+ if( m_pZipFile ) { delete m_pZipFile; m_pZipFile = NULL; }
throw;
}
if ( bBadZipFile )
{
// clean up the memory, and tell the UCB about the error
- if( pZipFile ) { delete pZipFile; pZipFile = NULL; }
+ if( m_pZipFile ) { delete m_pZipFile; m_pZipFile = NULL; }
throw com::sun::star::packages::zip::ZipIOException (
OUString( RTL_CONSTASCII_USTRINGPARAM ( OSL_LOG_PREFIX "Bad Zip File." ) ),
@@ -740,7 +776,7 @@ Any SAL_CALL ZipPackage::getByHierarchicalName( const OUString& aName )
FolderHash::iterator aIter;
if ( (nIndex = aName.getLength() ) == 1 && *aName.getStr() == '/' )
- return makeAny ( uno::Reference < XUnoTunnel > (pRootFolder) );
+ return makeAny ( uno::Reference < XUnoTunnel > (m_pRootFolder) );
else
{
nStreamIndex = aName.lastIndexOf ( '/' );
@@ -748,8 +784,8 @@ Any SAL_CALL ZipPackage::getByHierarchicalName( const OUString& aName )
if ( nStreamIndex != -1 )
{
sDirName = aName.copy ( 0, nStreamIndex);
- aIter = aRecent.find ( sDirName );
- if ( aIter != aRecent.end() )
+ aIter = m_aRecent.find ( sDirName );
+ if ( aIter != m_aRecent.end() )
{
if ( bFolder )
{
@@ -758,7 +794,7 @@ Any SAL_CALL ZipPackage::getByHierarchicalName( const OUString& aName )
if ( sTemp == (*aIter).second->getName() )
return makeAny ( uno::Reference < XUnoTunnel > ( (*aIter).second ) );
else
- aRecent.erase ( aIter );
+ m_aRecent.erase ( aIter );
}
else
{
@@ -766,17 +802,17 @@ Any SAL_CALL ZipPackage::getByHierarchicalName( const OUString& aName )
if ( (*aIter).second->hasByName( sTemp ) )
return (*aIter).second->getByName( sTemp );
else
- aRecent.erase( aIter );
+ m_aRecent.erase( aIter );
}
}
}
else
{
- if ( pRootFolder->hasByName ( aName ) )
- return pRootFolder->getByName ( aName );
+ if ( m_pRootFolder->hasByName ( aName ) )
+ return m_pRootFolder->getByName ( aName );
}
nOldIndex = 0;
- ZipPackageFolder * pCurrent = pRootFolder;
+ ZipPackageFolder * pCurrent = m_pRootFolder;
ZipPackageFolder * pPrevious = NULL;
while ( ( nIndex = aName.indexOf('/', nOldIndex)) != -1)
{
@@ -795,7 +831,7 @@ Any SAL_CALL ZipPackage::getByHierarchicalName( const OUString& aName )
if ( bFolder )
{
if (nStreamIndex != -1 )
- aRecent[sDirName] = pPrevious;
+ m_aRecent[sDirName] = pPrevious;
return makeAny ( uno::Reference < XUnoTunnel > ( pCurrent ) );
}
else
@@ -804,7 +840,7 @@ Any SAL_CALL ZipPackage::getByHierarchicalName( const OUString& aName )
if ( pCurrent->hasByName ( sTemp ) )
{
if (nStreamIndex != -1 )
- aRecent[sDirName] = pCurrent;
+ m_aRecent[sDirName] = pCurrent;
return pCurrent->getByName( sTemp );
}
else
@@ -829,8 +865,8 @@ sal_Bool SAL_CALL ZipPackage::hasByHierarchicalName( const OUString& aName )
if ( nStreamIndex != -1 )
{
sDirName = aName.copy ( 0, nStreamIndex);
- aIter = aRecent.find ( sDirName );
- if ( aIter != aRecent.end() )
+ aIter = m_aRecent.find ( sDirName );
+ if ( aIter != m_aRecent.end() )
{
if ( bFolder )
{
@@ -839,7 +875,7 @@ sal_Bool SAL_CALL ZipPackage::hasByHierarchicalName( const OUString& aName )
if ( sTemp == (*aIter).second->getName() )
return sal_True;
else
- aRecent.erase ( aIter );
+ m_aRecent.erase ( aIter );
}
else
{
@@ -847,16 +883,16 @@ sal_Bool SAL_CALL ZipPackage::hasByHierarchicalName( const OUString& aName )
if ( (*aIter).second->hasByName( sTemp ) )
return sal_True;
else
- aRecent.erase( aIter );
+ m_aRecent.erase( aIter );
}
}
}
else
{
- if ( pRootFolder->hasByName ( aName ) )
+ if ( m_pRootFolder->hasByName ( aName ) )
return sal_True;
}
- ZipPackageFolder * pCurrent = pRootFolder;
+ ZipPackageFolder * pCurrent = m_pRootFolder;
ZipPackageFolder * pPrevious = NULL;
nOldIndex = 0;
while ( ( nIndex = aName.indexOf('/', nOldIndex)) != -1)
@@ -875,7 +911,7 @@ sal_Bool SAL_CALL ZipPackage::hasByHierarchicalName( const OUString& aName )
}
if ( bFolder )
{
- aRecent[sDirName] = pPrevious;
+ m_aRecent[sDirName] = pPrevious;
return sal_True;
}
else
@@ -884,7 +920,7 @@ sal_Bool SAL_CALL ZipPackage::hasByHierarchicalName( const OUString& aName )
if ( pCurrent->hasByName( sTemp ) )
{
- aRecent[sDirName] = pCurrent;
+ m_aRecent[sDirName] = pCurrent;
return sal_True;
}
}
@@ -896,7 +932,7 @@ sal_Bool SAL_CALL ZipPackage::hasByHierarchicalName( const OUString& aName )
uno::Reference< XInterface > SAL_CALL ZipPackage::createInstance( )
throw(Exception, RuntimeException)
{
- uno::Reference < XInterface > xRef = *(new ZipPackageStream ( *this, xFactory, m_bAllowRemoveOnInsert ));
+ uno::Reference < XInterface > xRef = *(new ZipPackageStream ( *this, m_xFactory, m_bAllowRemoveOnInsert ));
return xRef;
}
uno::Reference< XInterface > SAL_CALL ZipPackage::createInstanceWithArguments( const Sequence< Any >& aArguments )
@@ -907,9 +943,9 @@ uno::Reference< XInterface > SAL_CALL ZipPackage::createInstanceWithArguments( c
if ( aArguments.getLength() )
aArguments[0] >>= bArg;
if (bArg)
- xRef = *new ZipPackageFolder ( xFactory, m_nFormat, m_bAllowRemoveOnInsert );
+ xRef = *new ZipPackageFolder ( m_xFactory, m_nFormat, m_bAllowRemoveOnInsert );
else
- xRef = *new ZipPackageStream ( *this, xFactory, m_bAllowRemoveOnInsert );
+ xRef = *new ZipPackageStream ( *this, m_xFactory, m_bAllowRemoveOnInsert );
return xRef;
}
@@ -917,17 +953,17 @@ uno::Reference< XInterface > SAL_CALL ZipPackage::createInstanceWithArguments( c
void ZipPackage::WriteMimetypeMagicFile( ZipOutputStream& aZipOut )
{
const OUString sMime ( RTL_CONSTASCII_USTRINGPARAM ( "mimetype" ) );
- if (xRootFolder->hasByName( sMime ) )
- xRootFolder->removeByName( sMime );
+ if (m_xRootFolder->hasByName( sMime ) )
+ m_xRootFolder->removeByName( sMime );
ZipEntry * pEntry = new ZipEntry;
- sal_Int32 nBufferLength = pRootFolder->GetMediaType( ).getLength();
- OString sMediaType = OUStringToOString( pRootFolder->GetMediaType(), RTL_TEXTENCODING_ASCII_US );
+ sal_Int32 nBufferLength = m_pRootFolder->GetMediaType( ).getLength();
+ OString sMediaType = OUStringToOString( m_pRootFolder->GetMediaType(), RTL_TEXTENCODING_ASCII_US );
Sequence< sal_Int8 > aType( (sal_Int8*)sMediaType.getStr(),
nBufferLength );
- pEntry->sName = sMime;
+ pEntry->sPath = sMime;
pEntry->nMethod = STORED;
pEntry->nSize = pEntry->nCompressedSize = nBufferLength;
pEntry->nTime = ZipOutputStream::getCurrentDosTime();
@@ -958,14 +994,14 @@ void ZipPackage::WriteManifest( ZipOutputStream& aZipOut, const vector< Sequence
// Write the manifest
uno::Reference < XOutputStream > xManOutStream;
OUString sManifestWriter( RTL_CONSTASCII_USTRINGPARAM ( "com.sun.star.packages.manifest.ManifestWriter" ) );
- uno::Reference < XManifestWriter > xWriter ( xFactory->createInstance( sManifestWriter ), UNO_QUERY );
+ uno::Reference < XManifestWriter > xWriter ( m_xFactory->createInstance( sManifestWriter ), UNO_QUERY );
if ( xWriter.is() )
{
ZipEntry * pEntry = new ZipEntry;
ZipPackageBuffer *pBuffer = new ZipPackageBuffer( n_ConstBufferSize );
xManOutStream = uno::Reference < XOutputStream > (*pBuffer, UNO_QUERY);
- pEntry->sName = OUString( RTL_CONSTASCII_USTRINGPARAM ( "META-INF/manifest.xml") );
+ pEntry->sPath = OUString( RTL_CONSTASCII_USTRINGPARAM ( "META-INF/manifest.xml") );
pEntry->nMethod = DEFLATED;
pEntry->nCrc = pEntry->nSize = pEntry->nCompressedSize = -1;
pEntry->nTime = ZipOutputStream::getCurrentDosTime();
@@ -1008,7 +1044,7 @@ void ZipPackage::WriteContentTypes( ZipOutputStream& aZipOut, const vector< Sequ
ZipPackageBuffer *pBuffer = new ZipPackageBuffer( n_ConstBufferSize );
uno::Reference< io::XOutputStream > xConTypeOutStream( *pBuffer, UNO_QUERY );
- pEntry->sName = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM ( "[Content_Types].xml") );
+ pEntry->sPath = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM ( "[Content_Types].xml") );
pEntry->nMethod = DEFLATED;
pEntry->nCrc = pEntry->nSize = pEntry->nCompressedSize = -1;
pEntry->nTime = ZipOutputStream::getCurrentDosTime();
@@ -1040,7 +1076,7 @@ void ZipPackage::WriteContentTypes( ZipOutputStream& aZipOut, const vector< Sequ
aOverridesSequence.realloc( nSeqLength );
::comphelper::OFOPXMLHelper::WriteContentSequence(
- xConTypeOutStream, aDefaultsSequence, aOverridesSequence, xFactory );
+ xConTypeOutStream, aDefaultsSequence, aOverridesSequence, m_xFactory );
sal_Int32 nBufferLength = static_cast < sal_Int32 > ( pBuffer->getPosition() );
pBuffer->realloc( nBufferLength );
@@ -1054,15 +1090,15 @@ void ZipPackage::WriteContentTypes( ZipOutputStream& aZipOut, const vector< Sequ
void ZipPackage::ConnectTo( const uno::Reference< io::XInputStream >& xInStream )
{
- xContentSeek.set( xInStream, uno::UNO_QUERY_THROW );
- xContentStream = xInStream;
+ m_xContentSeek.set( xInStream, uno::UNO_QUERY_THROW );
+ m_xContentStream = xInStream;
// seek back to the beginning of the temp file so we can read segments from it
- xContentSeek->seek( 0 );
- if ( pZipFile )
- pZipFile->setInputStream( xContentStream );
+ m_xContentSeek->seek( 0 );
+ if ( m_pZipFile )
+ m_pZipFile->setInputStream( m_xContentStream );
else
- pZipFile = new ZipFile ( xContentStream, xFactory, sal_False );
+ m_pZipFile = new ZipFile ( m_xContentStream, m_xFactory, sal_False );
}
uno::Reference< io::XInputStream > ZipPackage::writeTempFile()
@@ -1079,7 +1115,7 @@ uno::Reference< io::XInputStream > ZipPackage::writeTempFile()
uno::Reference < io::XOutputStream > xTempOut;
uno::Reference< io::XActiveDataStreamer > xSink;
- if ( eMode == e_IMode_URL && !pZipFile && isLocalFile_Impl( sURL ) )
+ if ( m_eMode == e_IMode_URL && !m_pZipFile && isLocalFile_Impl( m_aURL ) )
{
xSink = openOriginalForOutput();
if( xSink.is() )
@@ -1093,10 +1129,10 @@ uno::Reference< io::XInputStream > ZipPackage::writeTempFile()
}
}
}
- else if ( eMode == e_IMode_XStream && !pZipFile )
+ else if ( m_eMode == e_IMode_XStream && !m_pZipFile )
{
// write directly to an empty stream
- xTempOut = xStream->getOutputStream();
+ xTempOut = m_xStream->getOutputStream();
if( xTempOut.is() )
bUseTemp = sal_False;
}
@@ -1105,7 +1141,7 @@ uno::Reference< io::XInputStream > ZipPackage::writeTempFile()
{
// create temporary file
const OUString sServiceName ( RTL_CONSTASCII_USTRINGPARAM ( "com.sun.star.io.TempFile" ) );
- uno::Reference < io::XStream > xTempFile( xFactory->createInstance ( sServiceName ), UNO_QUERY_THROW );
+ uno::Reference < io::XStream > xTempFile( m_xFactory->createInstance ( sServiceName ), UNO_QUERY_THROW );
xTempOut.set( xTempFile->getOutputStream(), UNO_SET_THROW );
xTempIn.set( xTempFile->getInputStream(), UNO_SET_THROW );
}
@@ -1124,12 +1160,12 @@ uno::Reference< io::XInputStream > ZipPackage::writeTempFile()
// META-INF directory implicitly created if does not exist
const OUString sMeta ( RTL_CONSTASCII_USTRINGPARAM ( "META-INF" ) );
- if ( xRootFolder->hasByName( sMeta ) )
+ if ( m_xRootFolder->hasByName( sMeta ) )
{
const OUString sManifest (RTL_CONSTASCII_USTRINGPARAM( "manifest.xml") );
uno::Reference< XUnoTunnel > xTunnel;
- Any aAny = xRootFolder->getByName( sMeta );
+ Any aAny = m_xRootFolder->getByName( sMeta );
aAny >>= xTunnel;
uno::Reference< XNameContainer > xMetaInfFolder( xTunnel, UNO_QUERY );
if ( xMetaInfFolder.is() && xMetaInfFolder->hasByName( sManifest ) )
@@ -1146,8 +1182,8 @@ uno::Reference< io::XInputStream > ZipPackage::writeTempFile()
const ::rtl::OUString aContentTypes( RTL_CONSTASCII_USTRINGPARAM ( "[Content_Types].xml" ) );
- if ( xRootFolder->hasByName( aContentTypes ) )
- xRootFolder->removeByName( aContentTypes );
+ if ( m_xRootFolder->hasByName( aContentTypes ) )
+ m_xRootFolder->removeByName( aContentTypes );
}
// Create a vector to store data for the manifest.xml file
@@ -1161,9 +1197,9 @@ uno::Reference< io::XInputStream > ZipPackage::writeTempFile()
{
Sequence < PropertyValue > aPropSeq ( PKG_SIZE_NOENCR_MNFST );
aPropSeq [PKG_MNFST_MEDIATYPE].Name = sMediaType;
- aPropSeq [PKG_MNFST_MEDIATYPE].Value <<= pRootFolder->GetMediaType( );
+ aPropSeq [PKG_MNFST_MEDIATYPE].Value <<= m_pRootFolder->GetMediaType( );
aPropSeq [PKG_MNFST_VERSION].Name = sVersion;
- aPropSeq [PKG_MNFST_VERSION].Value <<= pRootFolder->GetVersion( );
+ aPropSeq [PKG_MNFST_VERSION].Value <<= m_pRootFolder->GetVersion( );
aPropSeq [PKG_MNFST_FULLPATH].Name = sFullPath;
aPropSeq [PKG_MNFST_FULLPATH].Value <<= OUString ( RTL_CONSTASCII_USTRINGPARAM ( "/" ) );
@@ -1181,12 +1217,12 @@ uno::Reference< io::XInputStream > ZipPackage::writeTempFile()
// call saveContents (it will recursively save sub-directories
OUString aEmptyString;
- pRootFolder->saveContents( aEmptyString, aManList, aZipOut, aEncryptionKey, aRandomPool );
+ m_pRootFolder->saveContents( aEmptyString, aManList, aZipOut, m_aEncryptionKey, aRandomPool );
// Clean up random pool memory
rtl_random_destroyPool ( aRandomPool );
- if( bUseManifest && m_nFormat == PACKAGE_FORMAT )
+ if( m_bUseManifest && m_nFormat == PACKAGE_FORMAT )
{
WriteManifest( aZipOut, aManList );
}
@@ -1214,10 +1250,10 @@ uno::Reference< io::XInputStream > ZipPackage::writeTempFile()
// no need to postpone switching to the new stream since the target was written directly
uno::Reference< io::XInputStream > xNewStream;
- if ( eMode == e_IMode_URL )
+ if ( m_eMode == e_IMode_URL )
xNewStream = xSink->getStream()->getInputStream();
- else if ( eMode == e_IMode_XStream && xStream.is() )
- xNewStream = xStream->getInputStream();
+ else if ( m_eMode == e_IMode_XStream && m_xStream.is() )
+ xNewStream = m_xStream->getInputStream();
if ( xNewStream.is() )
ConnectTo( xNewStream );
@@ -1258,10 +1294,10 @@ uno::Reference< io::XInputStream > ZipPackage::writeTempFile()
uno::Reference< XActiveDataStreamer > ZipPackage::openOriginalForOutput()
{
// open and truncate the original file
- Content aOriginalContent (sURL, uno::Reference < XCommandEnvironment >() );
+ Content aOriginalContent (m_aURL, uno::Reference < XCommandEnvironment >() );
uno::Reference< XActiveDataStreamer > xSink = new ActiveDataStreamer;
- if ( eMode == e_IMode_URL )
+ if ( m_eMode == e_IMode_URL )
{
try
{
@@ -1313,7 +1349,7 @@ void SAL_CALL ZipPackage::commitChanges()
// lock the component for the time of commiting
::osl::MutexGuard aGuard( m_aMutexHolder->GetMutex() );
- if ( eMode == e_IMode_XInputStream )
+ if ( m_eMode == e_IMode_XInputStream )
{
IOException aException;
throw WrappedTargetException( OUString( RTL_CONSTASCII_USTRINGPARAM ( OSL_LOG_PREFIX "This package is read only!" ) ),
@@ -1331,9 +1367,9 @@ void SAL_CALL ZipPackage::commitChanges()
uno::Reference< io::XSeekable > xTempSeek( xTempInStream, uno::UNO_QUERY_THROW );
// switch to the new temporary stream only after the transfer
- PostinitializationGuard( xTempInStream, *this );
+ PostinitializationGuard aPostInitGuard( xTempInStream, *this );
- if ( eMode == e_IMode_XStream )
+ if ( m_eMode == e_IMode_XStream )
{
// First truncate our output stream
uno::Reference < XOutputStream > xOutputStream;
@@ -1343,7 +1379,7 @@ void SAL_CALL ZipPackage::commitChanges()
{
xTempSeek->seek( 0 );
- xOutputStream = xStream->getOutputStream();
+ xOutputStream = m_xStream->getOutputStream();
uno::Reference < XTruncate > xTruncate ( xOutputStream, UNO_QUERY );
if ( !xTruncate.is() )
throw uno::RuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
@@ -1376,16 +1412,16 @@ void SAL_CALL ZipPackage::commitChanges()
DisconnectFromTargetAndThrowException_Impl( xTempInStream );
}
}
- else if ( eMode == e_IMode_URL )
+ else if ( m_eMode == e_IMode_URL )
{
uno::Reference< XOutputStream > aOrigFileStream;
sal_Bool bCanBeCorrupted = sal_False;
- if( isLocalFile_Impl( sURL ) )
+ if( isLocalFile_Impl( m_aURL ) )
{
// write directly in case of local file
uno::Reference< ::com::sun::star::ucb::XSimpleFileAccess > xSimpleAccess(
- xFactory->createInstance( ::rtl::OUString::createFromAscii( "com.sun.star.ucb.SimpleFileAccess" ) ),
+ m_xFactory->createInstance( ::rtl::OUString::createFromAscii( "com.sun.star.ucb.SimpleFileAccess" ) ),
uno::UNO_QUERY );
OSL_ENSURE( xSimpleAccess.is(), "Can't instatiate SimpleFileAccess service!\n" );
uno::Reference< io::XTruncate > xOrigTruncate;
@@ -1393,7 +1429,7 @@ void SAL_CALL ZipPackage::commitChanges()
{
try
{
- aOrigFileStream = xSimpleAccess->openFileWrite( sURL );
+ aOrigFileStream = xSimpleAccess->openFileWrite( m_aURL );
xOrigTruncate = uno::Reference< io::XTruncate >( aOrigFileStream, uno::UNO_QUERY_THROW );
// after successful truncation the file is already corrupted
xOrigTruncate->truncate();
@@ -1431,7 +1467,7 @@ void SAL_CALL ZipPackage::commitChanges()
if ( !xPropSet.is() )
throw uno::RuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
- OUString sTargetFolder = sURL.copy ( 0, sURL.lastIndexOf ( static_cast < sal_Unicode > ( '/' ) ) );
+ OUString sTargetFolder = m_aURL.copy ( 0, m_aURL.lastIndexOf ( static_cast < sal_Unicode > ( '/' ) ) );
Content aContent ( sTargetFolder, uno::Reference < XCommandEnvironment > () );
OUString sTempURL;
@@ -1442,7 +1478,7 @@ void SAL_CALL ZipPackage::commitChanges()
aInfo.NameClash = NameClash::OVERWRITE;
aInfo.MoveData = sal_False;
aInfo.SourceURL = sTempURL;
- aInfo.NewTitle = rtl::Uri::decode ( sURL.copy ( 1 + sURL.lastIndexOf ( static_cast < sal_Unicode > ( '/' ) ) ),
+ aInfo.NewTitle = rtl::Uri::decode ( m_aURL.copy ( 1 + m_aURL.lastIndexOf ( static_cast < sal_Unicode > ( '/' ) ) ),
rtl_UriDecodeWithCharset,
RTL_TEXTENCODING_UTF8 );
aAny <<= aInfo;
@@ -1472,11 +1508,11 @@ void SAL_CALL ZipPackage::commitChanges()
void ZipPackage::DisconnectFromTargetAndThrowException_Impl( const uno::Reference< io::XInputStream >& xTempStream )
{
- xStream = uno::Reference< io::XStream >( xTempStream, uno::UNO_QUERY );
- if ( xStream.is() )
- eMode = e_IMode_XStream;
+ m_xStream = uno::Reference< io::XStream >( xTempStream, uno::UNO_QUERY );
+ if ( m_xStream.is() )
+ m_eMode = e_IMode_XStream;
else
- eMode = e_IMode_XInputStream;
+ m_eMode = e_IMode_XInputStream;
::rtl::OUString aTempURL;
try {
@@ -1596,16 +1632,17 @@ void SAL_CALL ZipPackage::setPropertyValue( const OUString& aPropertyName, const
throw UnknownPropertyException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
if (aPropertyName.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("HasEncryptedEntries") )
+ ||aPropertyName.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("HasNonEncryptedEntries") )
||aPropertyName.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("MediaTypeFallbackUsed") ) )
throw PropertyVetoException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
else if (aPropertyName.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("EncryptionKey") ) )
{
- if (!( aValue >>= aEncryptionKey ) )
+ if (!( aValue >>= m_aEncryptionKey ) )
throw IllegalArgumentException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >(), 2 );
}
else if (aPropertyName.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("UseManifest") ) )
{
- if (!( aValue >>= bUseManifest ) )
+ if (!( aValue >>= m_bUseManifest ) )
throw IllegalArgumentException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >(), 2 );
}
else
@@ -1621,17 +1658,22 @@ Any SAL_CALL ZipPackage::getPropertyValue( const OUString& PropertyName )
Any aAny;
if (PropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM ( "EncryptionKey" ) ) )
{
- aAny <<= aEncryptionKey;
+ aAny <<= m_aEncryptionKey;
return aAny;
}
else if (PropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM ( "HasEncryptedEntries" ) ) )
{
- aAny <<= bHasEncryptedEntries;
+ aAny <<= m_bHasEncryptedEntries;
+ return aAny;
+ }
+ else if (PropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM ( "HasNonEncryptedEntries" ) ) )
+ {
+ aAny <<= m_bHasNonEncryptedEntries;
return aAny;
}
else if (PropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM ( "UseManifest" ) ) )
{
- aAny <<= bUseManifest;
+ aAny <<= m_bUseManifest;
return aAny;
}
else if (PropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM ( "MediaTypeFallbackUsed" ) ) )
diff --git a/package/source/zippackage/ZipPackageEntry.cxx b/package/source/zippackage/ZipPackageEntry.cxx
index 78fbb7423aa7..b233e34c2a28 100644
--- a/package/source/zippackage/ZipPackageEntry.cxx
+++ b/package/source/zippackage/ZipPackageEntry.cxx
@@ -65,20 +65,20 @@ ZipPackageEntry::~ZipPackageEntry()
OUString SAL_CALL ZipPackageEntry::getName( )
throw(RuntimeException)
{
- return aEntry.sName;
+ return msName;
}
void SAL_CALL ZipPackageEntry::setName( const OUString& aName )
throw(RuntimeException)
{
- if ( pParent && pParent->hasByName ( aEntry.sName ) )
- pParent->removeByName ( aEntry.sName );
+ if ( pParent && msName.getLength() && pParent->hasByName ( msName ) )
+ pParent->removeByName ( msName );
// unfortunately no other exception than RuntimeException can be thrown here
// usually the package is used through storage implementation, the problem should be detected there
if ( !::comphelper::OStorageHelper::IsValidZipEntryFileName( aName, sal_True ) )
throw RuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Unexpected character is used in file name." ) ), Reference< XInterface >() );
- aEntry.sName = aName;
+ msName = aName;
if ( pParent )
pParent->doInsertByName ( this, sal_False );
@@ -94,7 +94,7 @@ void ZipPackageEntry::doSetParent ( ZipPackageFolder * pNewParent, sal_Bool bIns
{
// xParent = pParent = pNewParent;
pParent = pNewParent;
- if ( bInsert && !pNewParent->hasByName ( aEntry.sName ) )
+ if ( bInsert && msName.getLength() && !pNewParent->hasByName ( msName ) )
pNewParent->doInsertByName ( this, sal_False );
}
@@ -110,8 +110,8 @@ void SAL_CALL ZipPackageEntry::setParent( const Reference< XInterface >& xNewPar
if ( pNewParent != pParent )
{
- if ( pParent && pParent->hasByName ( aEntry.sName ) && mbAllowRemoveOnInsert )
- pParent->removeByName( aEntry.sName );
+ if ( pParent && msName.getLength() && pParent->hasByName ( msName ) && mbAllowRemoveOnInsert )
+ pParent->removeByName( msName );
doSetParent ( pNewParent, sal_True );
}
}
diff --git a/package/source/zippackage/ZipPackageEntry.hxx b/package/source/zippackage/ZipPackageEntry.hxx
index 89fe4c6f225b..01b47d71f728 100644
--- a/package/source/zippackage/ZipPackageEntry.hxx
+++ b/package/source/zippackage/ZipPackageEntry.hxx
@@ -53,6 +53,7 @@ class ZipPackageEntry : public cppu::WeakImplHelper5
>
{
protected:
+ ::rtl::OUString msName;
bool mbIsFolder:1;
bool mbAllowRemoveOnInsert:1;
// com::sun::star::uno::Reference < com::sun::star::container::XNameContainer > xParent;
diff --git a/package/source/zippackage/ZipPackageFolder.cxx b/package/source/zippackage/ZipPackageFolder.cxx
index 2787ad938df9..5215c07579d2 100644
--- a/package/source/zippackage/ZipPackageFolder.cxx
+++ b/package/source/zippackage/ZipPackageFolder.cxx
@@ -93,6 +93,60 @@ ZipPackageFolder::~ZipPackageFolder()
{
}
+sal_Bool ZipPackageFolder::LookForUnexpectedODF12Streams( const ::rtl::OUString& aPath )
+{
+ sal_Bool bHasUnexpected = sal_False;
+
+ for ( ContentHash::const_iterator aCI = maContents.begin(), aEnd = maContents.end();
+ !bHasUnexpected && aCI != aEnd;
+ aCI++)
+ {
+ const OUString &rShortName = (*aCI).first;
+ const ContentInfo &rInfo = *(*aCI).second;
+
+ if ( rInfo.bFolder )
+ {
+ if ( aPath.equals( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "META-INF/" ) ) ) )
+ {
+ // META-INF is not allowed to contain subfolders
+ bHasUnexpected = sal_True;
+ }
+ else
+ {
+ OUString sOwnPath = aPath + rShortName + OUString( RTL_CONSTASCII_USTRINGPARAM ( "/" ) );
+ bHasUnexpected = rInfo.pFolder->LookForUnexpectedODF12Streams( sOwnPath );
+ }
+ }
+ else
+ {
+ if ( aPath.equals( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "META-INF/" ) ) ) )
+ {
+ if ( !rShortName.equals( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "manifest.xml" ) ) )
+ && rShortName.indexOf( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "signatures" ) ) ) == -1 )
+ {
+ // a stream from META-INF with unexpected name
+ bHasUnexpected = sal_True;
+ }
+
+ // streams from META-INF with expected names are allowed not to be registered in manifest.xml
+ }
+ else if ( !rInfo.pStream->IsFromManifest() )
+ {
+ // the stream is not in META-INF and ist notregistered in manifest.xml,
+ // check whether it is an internal part of the package format
+ if ( aPath.getLength()
+ || !rShortName.equals( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "mimetype" ) ) ) )
+ {
+ // if it is not "mimetype" from the root it is not a part of the package
+ bHasUnexpected = sal_True;
+ }
+ }
+ }
+ }
+
+ return bHasUnexpected;
+}
+
void ZipPackageFolder::setChildStreamsTypeByExtension( const beans::StringPair& aPair )
{
::rtl::OUString aExt;
@@ -112,9 +166,9 @@ void ZipPackageFolder::setChildStreamsTypeByExtension( const beans::StringPair&
rInfo.pFolder->setChildStreamsTypeByExtension( aPair );
else
{
- sal_Int32 nNameLength = rShortName.getLength();
+ sal_Int32 nPathLength = rShortName.getLength();
sal_Int32 nExtLength = aExt.getLength();
- if ( nNameLength >= nExtLength && rShortName.match( aExt, nNameLength - nExtLength ) )
+ if ( nPathLength >= nExtLength && rShortName.match( aExt, nPathLength - nExtLength ) )
rInfo.pStream->SetMediaType( aPair.Second );
}
}
@@ -130,8 +184,8 @@ void ZipPackageFolder::copyZipEntry( ZipEntry &rDest, const ZipEntry &rSource)
rDest.nCompressedSize = rSource.nCompressedSize;
rDest.nSize = rSource.nSize;
rDest.nOffset = rSource.nOffset;
- rDest.sName = rSource.sName;
- rDest.nNameLen = rSource.nNameLen;
+ rDest.sPath = rSource.sPath;
+ rDest.nPathLen = rSource.nPathLen;
rDest.nExtraLen = rSource.nExtraLen;
}
@@ -271,9 +325,9 @@ void ZipPackageFolder::saveContents(OUString &rPath, std::vector < Sequence < Pr
// it is an empty subfolder, use workaround to store it
ZipEntry* pTempEntry = new ZipEntry();
ZipPackageFolder::copyZipEntry ( *pTempEntry, aEntry );
- pTempEntry->nNameLen = (sal_Int16)( ::rtl::OUStringToOString( rPath, RTL_TEXTENCODING_UTF8 ).getLength() );
+ pTempEntry->nPathLen = (sal_Int16)( ::rtl::OUStringToOString( rPath, RTL_TEXTENCODING_UTF8 ).getLength() );
pTempEntry->nExtraLen = -1;
- pTempEntry->sName = rPath;
+ pTempEntry->sPath = rPath;
try
{
@@ -332,8 +386,8 @@ void ZipPackageFolder::saveContents(OUString &rPath, std::vector < Sequence < Pr
// store the ZipEntry data in pTempEntry
ZipPackageFolder::copyZipEntry ( *pTempEntry, pStream->aEntry );
- pTempEntry->sName = rPath + rShortName;
- pTempEntry->nNameLen = (sal_Int16)( ::rtl::OUStringToOString( pTempEntry->sName, RTL_TEXTENCODING_UTF8 ).getLength() );
+ pTempEntry->sPath = rPath + rShortName;
+ pTempEntry->nPathLen = (sal_Int16)( ::rtl::OUStringToOString( pTempEntry->sPath, RTL_TEXTENCODING_UTF8 ).getLength() );
sal_Bool bToBeEncrypted = pStream->IsToBeEncrypted() && (bHaveEncryptionKey || pStream->HasOwnKey());
sal_Bool bToBeCompressed = bToBeEncrypted ? sal_True : pStream->IsToBeCompressed();
@@ -343,7 +397,7 @@ void ZipPackageFolder::saveContents(OUString &rPath, std::vector < Sequence < Pr
pValue[PKG_MNFST_VERSION].Name = sVersionProperty;
pValue[PKG_MNFST_VERSION].Value <<= ::rtl::OUString(); // no version is stored for streams currently
pValue[PKG_MNFST_FULLPATH].Name = sFullPathProperty;
- pValue[PKG_MNFST_FULLPATH].Value <<= pTempEntry->sName;
+ pValue[PKG_MNFST_FULLPATH].Value <<= pTempEntry->sPath;
OSL_ENSURE( pStream->GetStreamMode() != PACKAGE_STREAM_NOTSET, "Unacceptable ZipPackageStream mode!" );
@@ -633,7 +687,6 @@ void ZipPackageFolder::saveContents(OUString &rPath, std::vector < Sequence < Pr
if ( pStream->IsEncrypted() )
pStream->setSize( nOwnStreamOrigSize );
- pStream->aEntry.sName = rShortName;
pStream->aEntry.nOffset *= -1;
}
}
@@ -726,9 +779,9 @@ void ZipPackageFolder::doInsertByName ( ZipPackageEntry *pEntry, sal_Bool bSetPa
throw(IllegalArgumentException, ElementExistException, WrappedTargetException, RuntimeException)
{
if ( pEntry->IsFolder() )
- maContents[pEntry->aEntry.sName] = new ContentInfo ( static_cast < ZipPackageFolder *> ( pEntry ) );
+ maContents[pEntry->getName()] = new ContentInfo ( static_cast < ZipPackageFolder *> ( pEntry ) );
else
- maContents[pEntry->aEntry.sName] = new ContentInfo ( static_cast < ZipPackageStream *> ( pEntry ) );
+ maContents[pEntry->getName()] = new ContentInfo ( static_cast < ZipPackageStream *> ( pEntry ) );
if ( bSetParent )
pEntry->setParent ( *this );
diff --git a/package/source/zippackage/ZipPackageStream.cxx b/package/source/zippackage/ZipPackageStream.cxx
index b42a0e8ecde6..242e37bfb764 100644
--- a/package/source/zippackage/ZipPackageStream.cxx
+++ b/package/source/zippackage/ZipPackageStream.cxx
@@ -76,6 +76,7 @@ ZipPackageStream::ZipPackageStream ( ZipPackage & rNewPackage,
, m_nMagicalHackSize( 0 )
, m_bHasSeekable( sal_False )
, m_bCompressedIsSetFromOutside( sal_False )
+, m_bFromManifest( sal_False )
{
OSL_ENSURE( m_xFactory.is(), "No factory is provided to ZipPackageStream!\n" );
@@ -90,7 +91,7 @@ ZipPackageStream::ZipPackageStream ( ZipPackage & rNewPackage,
aEntry.nCompressedSize = -1;
aEntry.nSize = -1;
aEntry.nOffset = -1;
- aEntry.nNameLen = -1;
+ aEntry.nPathLen = -1;
aEntry.nExtraLen = -1;
if ( !aImplementationId.getLength() )
@@ -113,8 +114,8 @@ void ZipPackageStream::setZipEntryOnLoading( const ZipEntry &rInEntry)
aEntry.nCompressedSize = rInEntry.nCompressedSize;
aEntry.nSize = rInEntry.nSize;
aEntry.nOffset = rInEntry.nOffset;
- aEntry.sName = rInEntry.sName;
- aEntry.nNameLen = rInEntry.nNameLen;
+ aEntry.sPath = rInEntry.sPath;
+ aEntry.nPathLen = rInEntry.nPathLen;
aEntry.nExtraLen = rInEntry.nExtraLen;
if ( aEntry.nMethod == STORED )
@@ -676,11 +677,11 @@ void SAL_CALL ZipPackageStream::setPropertyValue( const OUString& aPropertyName,
OUString sTempString;
if ( ( aValue >>= sTempString ) )
{
- sal_Int32 nNameLength = sTempString.getLength();
- Sequence < sal_Int8 > aSequence ( nNameLength );
+ sal_Int32 nPathLength = sTempString.getLength();
+ Sequence < sal_Int8 > aSequence ( nPathLength );
sal_Int8 *pArray = aSequence.getArray();
const sal_Unicode *pChar = sTempString.getStr();
- for ( sal_Int16 i = 0; i < nNameLength; i++)
+ for ( sal_Int16 i = 0; i < nPathLength; i++)
pArray[i] = static_cast < const sal_Int8 > (pChar[i]);
aNewKey = aSequence;
}
diff --git a/package/source/zippackage/ZipPackageStream.hxx b/package/source/zippackage/ZipPackageStream.hxx
index dd4cc7edb81b..e5aa1d24fcca 100644
--- a/package/source/zippackage/ZipPackageStream.hxx
+++ b/package/source/zippackage/ZipPackageStream.hxx
@@ -74,6 +74,8 @@ protected:
sal_Bool m_bCompressedIsSetFromOutside;
+ sal_Bool m_bFromManifest;
+
::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream >& GetOwnSeekStream();
public:
@@ -82,6 +84,10 @@ public:
sal_Bool IsToBeEncrypted () const { return bToBeEncrypted;}
sal_Bool IsEncrypted () const { return bIsEncrypted;}
sal_Bool IsPackageMember () const { return m_nStreamMode == PACKAGE_STREAM_PACKAGEMEMBER;}
+
+ sal_Bool IsFromManifest() const { return m_bFromManifest; }
+ void SetFromManifest( sal_Bool bValue ) { m_bFromManifest = bValue; }
+
vos::ORef < EncryptionData > & getEncryptionData ()
{ return xEncryptionData;}
const com::sun::star::uno::Sequence < sal_Int8 >& getKey () const
diff --git a/package/source/zippackage/makefile.mk b/package/source/zippackage/makefile.mk
index 9d18121f631f..64ddf157571f 100644
--- a/package/source/zippackage/makefile.mk
+++ b/package/source/zippackage/makefile.mk
@@ -40,6 +40,8 @@ ENABLE_EXCEPTIONS=TRUE
.INCLUDE : settings.mk
+.IF "$(L10N_framework)"==""
+
# --- Files --------------------------------------------------------
# the following flag un-inlines function calls and disables optimisations
#CFLAGS+=/Ob0 /Od
@@ -58,6 +60,8 @@ SLOFILES= \
# $(SLO)$/InteractionRequest.obj \
# $(SLO)$/InteractionContinuation.obj
+.ENDIF # L10N_framework
+
# --- Targets ------------------------------------------------------
.INCLUDE : target.mk
diff --git a/package/source/zippackage/zipfileaccess.cxx b/package/source/zippackage/zipfileaccess.cxx
index 0a70c8d32b88..42f95d3a268f 100644
--- a/package/source/zippackage/zipfileaccess.cxx
+++ b/package/source/zippackage/zipfileaccess.cxx
@@ -289,7 +289,7 @@ uno::Sequence< ::rtl::OUString > SAL_CALL OZipFileAccess::getElementNames()
aNames.realloc( nLen );
}
- aNames[nLen-1] = (*aIter).second.sName;
+ aNames[nLen-1] = (*aIter).second.sPath;
}
if ( aNames.getLength() != nLen )
@@ -368,7 +368,7 @@ uno::Reference< io::XInputStream > SAL_CALL OZipFileAccess::getStreamByPattern(
for ( EntryHash::iterator aIter = m_pZipFile->GetEntryHash().begin(); aIter != m_pZipFile->GetEntryHash().end(); aIter++ )
{
- if ( StringGoodForPattern_Impl( (*aIter).second.sName, aPattern ) )
+ if ( StringGoodForPattern_Impl( (*aIter).second.sPath, aPattern ) )
{
uno::Reference< io::XInputStream > xEntryStream( m_pZipFile->getDataStream( (*aIter).second,
new EncryptionData(),
diff --git a/package/util/makefile.mk b/package/util/makefile.mk
index 0b8d2d7604af..99573c19ffb0 100644
--- a/package/util/makefile.mk
+++ b/package/util/makefile.mk
@@ -45,6 +45,8 @@ NO_BSYMBOLIC=TRUE
.INCLUDE : settings.mk
+.IF "$(L10N_framework)"==""
+
# --- General ----------------------------------------------------
LIB1TARGET= $(SLB)$/$(TARGET).lib
@@ -71,6 +73,8 @@ SHL1DEF=$(MISC)$/$(SHL1TARGET).def
SHL1LIBS=$(LIB1TARGET)
DEF1NAME=$(SHL1TARGET)
+.ENDIF # L10N_framework
+
# --- Targets ----------------------------------------------------------
.INCLUDE : target.mk
diff --git a/setup_native/prj/build.lst b/setup_native/prj/build.lst
index e3690f14381a..8835ff0d6ad2 100644
--- a/setup_native/prj/build.lst
+++ b/setup_native/prj/build.lst
@@ -1,4 +1,4 @@
-pk setup_native : soltools xml2cmp sal officecfg unoil NULL
+pk setup_native : transex3 soltools sal xml2cmp NULL
pk setup_native usr1 - all sn_mkout NULL
pk setup_native\scripts\source nmake - u sn_source NULL
pk setup_native\scripts nmake - u sn_scripts sn_source.u NULL
@@ -17,8 +17,3 @@ pk setup_native\source\win32\customactions\languagepacks nmake - w sn_lang
pk setup_native\source\win32\customactions\patch nmake - w sn_patch sn_languagepacks.w sn_shellextensions.w sn_quickstarter.w sn_tools.w NULL
pk setup_native\source\win32\stwrapper nmake - w sn_stwrapper NULL
pk setup_native\source\ulfconv nmake - all sn_ulfconv NULL
-pk setup_native\registry\data\org\openoffice\Office nmake - all sn_regconfig NULL
-pk setup_native\source\registration\com\sun\star\servicetag\resources get - all sn_svctagres NULL
-pk setup_native\source\registration\com\sun\star\servicetag nmake - all sn_svctag NULL
-pk setup_native\source\registration\com\sun\star\registration nmake - all sn_regjob sn_svctag NULL
-
diff --git a/setup_native/prj/d.lst b/setup_native/prj/d.lst
index 3be9984f8728..a573b94fd5cb 100644
--- a/setup_native/prj/d.lst
+++ b/setup_native/prj/d.lst
@@ -46,10 +46,3 @@ mkdir: %_DEST%\bin%_EXT%\userscripts
..\inc\setup_native\qswin32.h %_DEST%\inc%_EXT%\setup_native\qswin32.h
-mkdir: %_DEST%\xml%_EXT%\registry\spool
-mkdir: %_DEST%\xml%_EXT%\registry\spool\org
-mkdir: %_DEST%\xml%_EXT%\registry\spool\org\openoffice
-mkdir: %_DEST%\xml%_EXT%\registry\spool\org\openoffice\Office
-mkdir: %_DEST%\xml%_EXT%\registry\spool\org\openoffice\Office\Jobs
-
-..\%__SRC%\misc\registry\spool\org\openoffice\Office\Jobs\*.xcu %_DEST%\xml%_EXT%\registry\spool\org\openoffice\Office\Jobs
diff --git a/setup_native/registry/data/org/openoffice/Office/Jobs.xcu b/setup_native/registry/data/org/openoffice/Office/Jobs.xcu
deleted file mode 100644
index 628e3dcdf70a..000000000000
--- a/setup_native/registry/data/org/openoffice/Office/Jobs.xcu
+++ /dev/null
@@ -1,78 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--***********************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2008 by Sun Microsystems, Inc.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * $RCSfile: Jobs.xcu,v $
- *
- * $Revision: 1.5 $
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************ -->
-<oor:component-data oor:name="Jobs" oor:package="org.openoffice.Office" xmlns:oor="http://openoffice.org/2001/registry" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
- <node oor:name="Jobs">
- <node oor:name="ProductRegistration" oor:op="replace">
- <prop oor:name="Service">
- <value>com.sun.star.comp.framework.DoRegistrationJob</value>
- </prop>
- <node oor:name="Arguments">
- <prop oor:name="ProductName" oor:op="replace" oor:type="xs:string">
- <value>${SERVICETAG_PRODUCTNAME}</value>
- </prop>
- <prop oor:name="ProductVersion" oor:op="replace" oor:type="xs:string">
- <value>${SERVICETAG_PRODUCTVERSION}</value>
- </prop>
- <prop oor:name="ProductURN" oor:op="replace" oor:type="xs:string">
- <value>${SERVICETAG_URN}</value>
- </prop>
- <prop oor:name="ProductSource" oor:op="replace" oor:type="xs:string">
- <value>${SERVICETAG_SOURCE}</value>
- </prop>
- <prop oor:name="ProductParent" oor:op="replace" oor:type="xs:string">
- <value>${SERVICETAG_PARENTNAME}</value>
- </prop>
- <prop oor:name="Vendor" oor:op="replace" oor:type="xs:string">
- <value>Sun Microsystems, Inc.</value>
- </prop>
- <prop oor:name="RegistrationData" oor:op="replace" oor:type="xs:string">
- <value>$(user)/registration.xml</value>
- </prop>
- <prop oor:name="RegistrationURL" oor:op="replace" oor:type="xs:string">
- <value>${REGISTRATION_HOST}/register/${registry_urn}?product=${REGISTRATION_PRODUCT}&amp;locale=${locale}&amp;cid=${REGISTRATION_CID}</value>
- </prop>
- </node>
- </node>
- </node>
- <node oor:name="Events">
- <node oor:name="onRegisterNow" oor:op="fuse">
- <node oor:name="JobList">
- <node oor:name="ProductRegistration" oor:op="replace"/>
- </node>
- </node>
- <node oor:name="onRegisterLater" oor:op="fuse">
- <node oor:name="JobList">
- <node oor:name="ProductRegistration" oor:op="replace"/>
- </node>
- </node>
- </node>
-</oor:component-data>
diff --git a/setup_native/registry/data/org/openoffice/Office/makefile.mk b/setup_native/registry/data/org/openoffice/Office/makefile.mk
deleted file mode 100644
index aa1c37db6eab..000000000000
--- a/setup_native/registry/data/org/openoffice/Office/makefile.mk
+++ /dev/null
@@ -1,79 +0,0 @@
-#*************************************************************************
-#
-# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-#
-# Copyright 2008 by Sun Microsystems, Inc.
-#
-# OpenOffice.org - a multi-platform office productivity suite
-#
-# $RCSfile: makefile.mk,v $
-#
-# $Revision: 1.5 $
-#
-# This file is part of OpenOffice.org.
-#
-# OpenOffice.org is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Lesser General Public License version 3
-# only, as published by the Free Software Foundation.
-#
-# OpenOffice.org is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU Lesser General Public License version 3 for more details
-# (a copy is included in the LICENSE file that accompanied this code).
-#
-# You should have received a copy of the GNU Lesser General Public License
-# version 3 along with OpenOffice.org. If not, see
-# <http://www.openoffice.org/license.html>
-# for a copy of the LGPLv3 License.
-#
-#*************************************************************************
-
-PRJ=..$/..$/..$/..$/..
-PRJNAME=setup_native
-TARGET=data_registration
-PACKAGE=org.openoffice.Office
-
-ABSXCSROOT=$(SOLARXMLDIR)
-XCSROOT=..
-DTDDIR=$(ABSXCSROOT)
-XSLDIR=$(ABSXCSROOT)$/processing
-PROCESSOUT=$(MISC)$/$(TARGET)
-PROCESSORDIR=$(SOLARBINDIR)
-
-.INCLUDE : settings.mk
-
-# --- Files -------------------------------------------------------
-
-.IF "$(BUILD_SPECIAL)"!=""
-
-XCUFILES= \
- Jobs.xcu
-
-MODULEFILES=
-
-LOCALIZEDFILES=
-
-PACKAGEDIR=$(subst,.,$/ $(PACKAGE))
-SPOOLDIR=$(MISC)$/registry$/spool
-
-MYXCUFILES= \
- $(SPOOLDIR)$/$(PACKAGEDIR)$/Jobs$/Jobs-registration.xcu
-
-.ELSE # "$(BUILD_SPECIAL)"!=""
-
-dummy:
- @echo "Nothing to build"
-
-.ENDIF # "$(BUILD_SPECIAL)"!=""
-
-# --- Targets ------------------------------------------------------
-
-.INCLUDE : target.mk
-
-ALLTAR : $(MYXCUFILES)
-
-$(SPOOLDIR)$/$(PACKAGEDIR)$/Jobs$/Jobs-registration.xcu : $(PROCESSOUT)$/registry$/data$/$/$(PACKAGEDIR)$/Jobs.xcu
- @-$(MKDIRHIER) $(@:d)
- @$(COPY) $< $@
-
diff --git a/setup_native/scripts/fake-db.spec b/setup_native/scripts/fake-db.spec
index 447e5a98babd..e6275048efe3 100644
--- a/setup_native/scripts/fake-db.spec
+++ b/setup_native/scripts/fake-db.spec
@@ -6,6 +6,7 @@ Group: dummy
License: LGPL
BuildArch: noarch
AutoReqProv: no
+%define _tmppath /tmp
#BuildRoot: %{_tmppath}/%{name}-root
Provides: libgnomevfs-2.so.0
Provides: libgconf-2.so.4
diff --git a/setup_native/scripts/makefile.mk b/setup_native/scripts/makefile.mk
index c1df2ff56026..59b310fe0e70 100644
--- a/setup_native/scripts/makefile.mk
+++ b/setup_native/scripts/makefile.mk
@@ -37,7 +37,7 @@ TARGET=install
# --- Settings -----------------------------------------------------
.INCLUDE : settings.mk
-
+.IF "$(L10N_framework)"==""
# --- Files --------------------------------------------------------
UNIXTEXT= \
@@ -59,8 +59,9 @@ FAKEDBROOT=$(COMMONMISC)/$(TARGET)/fake-db-root
# --- Targets ------------------------------------------------------
+.ENDIF # L10N_framework
.INCLUDE : target.mk
-
+.IF "$(L10N_framework)"==""
.IF "$(OS)" == "SOLARIS" || "$(OS)" == "LINUX"
ALLTAR: $(BIN)$/install $(BIN)$/uninstall
@@ -99,3 +100,4 @@ $(LB)$/getuid.so.stripped: $(LB)$/getuid.so
.ENDIF
+.ENDIF # L10N_framework
diff --git a/setup_native/source/java/javaversion.dat b/setup_native/source/java/javaversion.dat
index 120bed23d7bf..87172c3a6495 100755
--- a/setup_native/source/java/javaversion.dat
+++ b/setup_native/source/java/javaversion.dat
@@ -30,30 +30,30 @@
#*************************************************************************
# GUI String in the installer ("Java Runtime Environment (${JAVAVERSION})")
-JAVAVERSION=Java 6 Update 13
-WINDOWSJAVAVERSION=Java 6 Update 13
+JAVAVERSION=Java 6 Update 16
+WINDOWSJAVAVERSION=Java 6 Update 16
# Windows (scp2 and downloadtemplate.nsi)
-WINDOWSJAVAFILENAME=jre-6u13-windows-i586-p.exe
-WINDOWSJAVAREGISTRYENTRY=1.6.0_13
+WINDOWSJAVAFILENAME=jre-6u16-windows-i586.exe
+WINDOWSJAVAREGISTRYENTRY=1.6.0_16
# Linux (scp2)
-LINUXJAVAFILENAME=jre-6u13-linux-i586.rpm
+LINUXJAVAFILENAME=jre-6u16-linux-i586.rpm
# Linux (rpmUnit.xml, rpm -qp <filename> )
-LINUXJAVANAME=jre-1.6.0_13-fcs
+LINUXJAVANAME=jre-1.6.0_16-fcs
# Linux-x64 (scp2)
-LINUXX64JAVAFILENAME=jre-6u13-linux-amd64.rpm
+LINUXX64JAVAFILENAME=jre-6u16-linux-amd64.rpm
# Solaris Sparc (scp2)
-SOLSJAVARTPACKED=SUNWj6rt_1_6_0_13_sparc.tar.gz
-SOLSJAVACFGPACKED=SUNWj6cfg_1_6_0_13_sparc.tar.gz
-SOLSJAVAMANPACKED=SUNWj6man_1_6_0_13_sparc.tar.gz
+SOLSJAVARTPACKED=SUNWj6rt_1_6_0_16_sparc.tar.gz
+SOLSJAVACFGPACKED=SUNWj6cfg_1_6_0_16_sparc.tar.gz
+SOLSJAVAMANPACKED=SUNWj6man_1_6_0_16_sparc.tar.gz
# Solaris x86 (scp2)
-SOLIJAVARTPACKED=SUNWj6rt_1_6_0_13_x86.tar.gz
-SOLIJAVACFGPACKED=SUNWj6cfg_1_6_0_13_x86.tar.gz
-SOLIJAVAMANPACKED=SUNWj6man_1_6_0_13_x86.tar.gz
+SOLIJAVARTPACKED=SUNWj6rt_1_6_0_16_x86.tar.gz
+SOLIJAVACFGPACKED=SUNWj6cfg_1_6_0_16_x86.tar.gz
+SOLIJAVAMANPACKED=SUNWj6man_1_6_0_16_x86.tar.gz
# Solaris (pkgUnit.xml, needs only to be changed in major changes)
SOLARISJAVART=SUNWj6rt
diff --git a/setup_native/source/packinfo/spellchecker_selection.txt b/setup_native/source/packinfo/spellchecker_selection.txt
index bc53123cc325..d7f7f7d53d9f 100644
--- a/setup_native/source/packinfo/spellchecker_selection.txt
+++ b/setup_native/source/packinfo/spellchecker_selection.txt
@@ -4,6 +4,7 @@
# Second column: Assigned spellchecker languages. Comma separated list.
af = "af,en-US"
+ca = "ca,es,en,fr"
cs = "cs,en-US"
da = "da,de,en-US"
de = "de,en-US,fr,it"
@@ -17,10 +18,13 @@ it = "de,en-US,fr,it"
ja = "en-US"
ko = "en-US"
lt = "en-US,lt"
+nb = "no,en,fr,de,es"
ne = "en-US,ne"
nl = "en-US,fr,de,nl"
+nn = "no,en,fr,de,es"
pl = "de,en-US,pl,ru"
pt-BR = "en-US,es,pt"
+ro = "ro,en,de,hu"
ru = "de,en-US,ru"
sk = "en-US,sk"
sl = "en-US,sl"
diff --git a/setup_native/source/registration/com/sun/star/registration/Registration.java b/setup_native/source/registration/com/sun/star/registration/Registration.java
deleted file mode 100644
index afcb1b99660e..000000000000
--- a/setup_native/source/registration/com/sun/star/registration/Registration.java
+++ /dev/null
@@ -1,342 +0,0 @@
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2008 by Sun Microsystems, Inc.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * $RCSfile: Registration.java,v $
- * $Revision: 1.3 $
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-package com.sun.star.registration;
-
-import com.sun.star.beans.NamedValue;
-import com.sun.star.comp.loader.FactoryHelper;
-import com.sun.star.frame.DispatchResultEvent;
-import com.sun.star.frame.DispatchResultState;
-import com.sun.star.lang.XMultiServiceFactory;
-import com.sun.star.lang.XMultiComponentFactory;
-import com.sun.star.lang.XSingleServiceFactory;
-import com.sun.star.registry.*;
-import com.sun.star.servicetag.*;
-import com.sun.star.system.*;
-import com.sun.star.task.*;
-import com.sun.star.uno.*;
-import com.sun.star.uri.XExternalUriReferenceTranslator;
-import com.sun.star.util.XStringSubstitution;
-
-import java.io.*;
-import java.net.URI;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.Locale;
-import java.util.Set;
-import java.net.HttpURLConnection;
-
-public class Registration {
-
- public static XSingleServiceFactory __getServiceFactory(String implName,
- XMultiServiceFactory multiFactory, XRegistryKey regKey) {
- XSingleServiceFactory xSingleServiceFactory = null;
-
- if (implName.equals(Registration.class.getName())) {
- xSingleServiceFactory = FactoryHelper.getServiceFactory(_Registration.class, _serviceName, multiFactory, regKey);
- }
-
- return xSingleServiceFactory;
- }
-
- public static boolean __writeRegistryServiceInfo(XRegistryKey regKey) {
- return FactoryHelper.writeRegistryServiceInfo(Registration.class.getName(), _serviceName, regKey);
- }
-
- static final String _serviceName = "com.sun.star.comp.framework.DoRegistrationJob";
-
- static public class _Registration implements XJob {
- XComponentContext xComponentContext;
-
- XStringSubstitution xPathSubstService = null;
- XExternalUriReferenceTranslator xUriTranslator = null;
-
- RegistrationData theRegistrationData = null;
-
- public _Registration(XComponentContext xComponentContext) {
- this.xComponentContext = xComponentContext;
- }
-
- private String resolvePath(String path) {
- try {
- if( xPathSubstService == null || xUriTranslator == null ) {
- XMultiComponentFactory theServiceManager = xComponentContext.getServiceManager();
- if( xPathSubstService == null ) {
- Object o = theServiceManager.createInstanceWithContext(
- "com.sun.star.util.PathSubstitution",
- xComponentContext );
- xPathSubstService = (XStringSubstitution)
- UnoRuntime.queryInterface(XStringSubstitution.class, o);
- }
-
- if( xUriTranslator == null ) {
- Object o = theServiceManager.createInstanceWithContext(
- "com.sun.star.uri.ExternalUriReferenceTranslator",
- xComponentContext );
- xUriTranslator = (XExternalUriReferenceTranslator)
- UnoRuntime.queryInterface(XExternalUriReferenceTranslator.class, o);
- }
- }
-
- String s = xPathSubstService.substituteVariables(path, true);
- return xUriTranslator.translateToExternal(s);
- } catch (java.lang.Exception e) {
- return path;
- }
- }
-
- private void openBrowser(String url) {
- try {
- XMultiComponentFactory theServiceManager = xComponentContext.getServiceManager();
-
- Object o = theServiceManager.createInstanceWithContext(
- "com.sun.star.system.SystemShellExecute",
- xComponentContext );
-
- XSystemShellExecute xShellExecuteService = (XSystemShellExecute)
- UnoRuntime.queryInterface(XSystemShellExecute.class, o);
-
- xShellExecuteService.execute( url, "", SystemShellExecuteFlags.DEFAULTS );
- } catch (java.lang.Exception e) {
- }
- }
-
- private ServiceTag getServiceTagFromRegistrationData(File xmlFile, String productURN) {
- try {
- RegistrationData storedRegData = RegistrationData.loadFromXML(new FileInputStream(xmlFile));
- Set<ServiceTag> storedServiceTags = storedRegData.getServiceTags();
-
- Iterator<ServiceTag> tagIterator = storedServiceTags.iterator();
- while( tagIterator.hasNext() ) {
- ServiceTag tag = tagIterator.next();
- if( tag.getProductURN().equals(productURN) ) {
- theRegistrationData = storedRegData;
- return tag;
- }
- }
-
- // product URN has changed, remove registration data file
- xmlFile.delete();
- } catch (IOException e) {
- // fall through intentionally
- } catch (IllegalArgumentException e) {
- // file is damaged (or a name clash appeared)
- xmlFile.delete();
- }
- return null;
- }
-
- /*
- * XJob
- *
- * NOTE: as this Job hets triggered by the the JobExecutor service from first start
- * wizard and registration reminder code (because their frames do not implement
- * XDispatchProvider), making this an XAsyncJob doesn't make sense as the
- * JobExecutor waits for the jobFinished call on the listener passed.
- */
- public Object execute(NamedValue[] args)
- throws com.sun.star.lang.IllegalArgumentException, com.sun.star.uno.Exception {
-
- final NamedValue[] f_args = args;
-
- new Thread(
- new Runnable () {
- public void run() {
- try {
- executeImpl(f_args);
- } catch(com.sun.star.uno.Exception e) {
- }
- }
- }
- ).start();
-
- NamedValue ret[] = new NamedValue[1];
- ret[0] = new NamedValue( "Deactivate", new Boolean(false) );
- return ret;
- }
-
- public synchronized void executeImpl(NamedValue[] args)
- throws com.sun.star.lang.IllegalArgumentException, com.sun.star.uno.Exception {
-
- // extract the interesting part of the argument list
- NamedValue[] theJobConfig = null;
- NamedValue[] theEnvironment = null;
-
- int c = args.length;
- for (int i=0; i<c; ++i) {
- if (args[i].Name.equals("JobConfig"))
- theJobConfig = (NamedValue[]) AnyConverter.toArray(args[i].Value);
- else if (args[i].Name.equals("Environment"))
- theEnvironment = (NamedValue[]) AnyConverter.toArray(args[i].Value);
- }
-
- if (theEnvironment==null)
- throw new com.sun.star.lang.IllegalArgumentException("no environment");
-
- boolean saveConfig = false;
-
- String productName = "";
- String productVersion = "";
- String productURN = "";
- String productParent = "";
- String productParentURN = "";
- String productDefinedInstanceID = "";
- String productSource = "";
- String vendor = "";
-
- String urlRegData = null;
- String registrationURL = null;
-
- c = theJobConfig.length;
- for (int i=0; i<c; ++i) {
- if( theJobConfig[i].Name.equals("ProductName") ) {
- productName = AnyConverter.toString(theJobConfig[i].Value);
- } else if( theJobConfig[i].Name.equals("ProductVersion") ) {
- productVersion = AnyConverter.toString(theJobConfig[i].Value);
- } else if( theJobConfig[i].Name.equals("ProductURN") ) {
- productURN = AnyConverter.toString(theJobConfig[i].Value);
- } else if( theJobConfig[i].Name.equals("ProductParent") ) {
- productParent = AnyConverter.toString(theJobConfig[i].Value);
- } else if( theJobConfig[i].Name.equals("ProductParentURN") ) {
- productParentURN = AnyConverter.toString(theJobConfig[i].Value);
- } else if( theJobConfig[i].Name.equals("ProductSource") ) {
- productSource = AnyConverter.toString(theJobConfig[i].Value);
- } else if( theJobConfig[i].Name.equals("Vendor") ) {
- vendor = AnyConverter.toString(theJobConfig[i].Value);
- } else if( theJobConfig[i].Name.equals("RegistrationData") ) {
- urlRegData = resolvePath(AnyConverter.toString(theJobConfig[i].Value));
- } else if( theJobConfig[i].Name.equals("RegistrationURL") ) {
- registrationURL = AnyConverter.toString(theJobConfig[i].Value);
- } else {
- System.err.println( theJobConfig[i].Name + " = " + AnyConverter.toString(theJobConfig[i].Value) );
- }
- }
-
- if (registrationURL==null)
- throw new com.sun.star.lang.IllegalArgumentException("no registration url");
-
- boolean local_only = false;
-
- c = theEnvironment.length;
- for (int i=0; i<c; ++i) {
- if( theEnvironment[i].Name.equals("EventName") ) {
- if( ! AnyConverter.toString(theEnvironment[i].Value).equals("onRegisterNow") ) {
- local_only = true;
- }
- }
- }
-
- try {
-
- /* ensure only one thread accesses/writes registration.xml at a time
- * regardless how many instances of this Job exist.
- */
- synchronized( _serviceName ) {
-
- File xmlRegData = new File( new URI( urlRegData ) );
-
- ServiceTag tag = getServiceTagFromRegistrationData(xmlRegData, productURN);
- if( tag == null ) {
- tag = ServiceTag.newInstance(
- ServiceTag.generateInstanceURN(),
- productName,
- productVersion,
- productURN,
- productParent,
- productParentURN,
- productDefinedInstanceID,
- vendor,
- System.getProperty("os.arch"),
- Installer.getZoneName(),
- productSource);
-
- theRegistrationData = new RegistrationData();
- theRegistrationData.addServiceTag(tag);
- theRegistrationData.storeToXML( new FileOutputStream( xmlRegData ) );
- }
-
- // Store the service tag in local registry, which might have been installed later
- if( Registry.isSupported() ) {
- // ignore communication failures with local service tag client
- try {
- if( Registry.getSystemRegistry().getServiceTag(tag.getInstanceURN()) == null ) {
- Registry.getSystemRegistry().addServiceTag(tag);
- }
- } catch( java.io.IOException e) {
- e.printStackTrace();
- } catch (java.lang.RuntimeException e) {
- e.printStackTrace();
- }
- }
- }
-
- if( ! local_only ) {
- registrationURL = registrationURL.replaceAll("\\$\\{registry_urn\\}", theRegistrationData.getRegistrationURN());
- registrationURL = registrationURL.replaceAll("\\$\\{locale\\}", Locale.getDefault().getLanguage());
-
- HttpURLConnection con = (HttpURLConnection) new URL(registrationURL).openConnection();
- con.setDoInput(true);
- con.setDoOutput(true);
- con.setUseCaches(false);
- con.setAllowUserInteraction(false);
- con.setRequestMethod("POST");
-
- con.setRequestProperty("Content-Type", "text/xml;charset=\"utf-8\"");
- try {
- con.connect();
-
- OutputStream out = con.getOutputStream();
- theRegistrationData.storeToXML(out);
- out.flush();
- out.close();
-
- int returnCode = con.getResponseCode();
-// if (returnCode == HttpURLConnection.HTTP_OK);
- } catch(java.lang.Exception e) {
- // IOException and UnknownHostException
- }
- openBrowser(registrationURL);
- }
- } catch (java.net.MalformedURLException e) {
- e.printStackTrace();
- throw new com.sun.star.lang.IllegalArgumentException( e.toString() );
- } catch (java.net.URISyntaxException e) {
- e.printStackTrace();
- throw new com.sun.star.lang.IllegalArgumentException( e.toString() );
- } catch (java.io.IOException e) {
- e.printStackTrace();
- throw new com.sun.star.uno.RuntimeException( e.toString() );
- } catch (java.lang.RuntimeException e) {
- e.printStackTrace();
- throw new com.sun.star.uno.RuntimeException( e.toString() );
- }
- }
- }
-}
diff --git a/setup_native/source/registration/com/sun/star/registration/makefile.mk b/setup_native/source/registration/com/sun/star/registration/makefile.mk
deleted file mode 100644
index f20eaf71adce..000000000000
--- a/setup_native/source/registration/com/sun/star/registration/makefile.mk
+++ /dev/null
@@ -1,59 +0,0 @@
-#*************************************************************************
-#
-# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-#
-# Copyright 2008 by Sun Microsystems, Inc.
-#
-# OpenOffice.org - a multi-platform office productivity suite
-#
-# $RCSfile: makefile.mk,v $
-#
-# $Revision: 1.2 $
-#
-# This file is part of OpenOffice.org.
-#
-# OpenOffice.org is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Lesser General Public License version 3
-# only, as published by the Free Software Foundation.
-#
-# OpenOffice.org is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU Lesser General Public License version 3 for more details
-# (a copy is included in the LICENSE file that accompanied this code).
-#
-# You should have received a copy of the GNU Lesser General Public License
-# version 3 along with OpenOffice.org. If not, see
-# <http://www.openoffice.org/license.html>
-# for a copy of the LGPLv3 License.
-#
-#*************************************************************************
-
-PRJNAME = setup_native
-PRJ = ..$/..$/..$/..$/..$/..
-TARGET = productregistration
-PACKAGE = com$/sun$/star$/registration
-
-# --- Settings -----------------------------------------------------
-
-.INCLUDE : settings.mk
-
-.IF "$(ENABLE_SVCTAGS)" == "YES"
-
-JARFILES = jurt.jar unoil.jar ridl.jar
-JAVAFILES = \
- Registration.java
-
-JAVACLASSFILES= $(foreach,i,$(JAVAFILES) $(CLASSDIR)$/$(PACKAGE)$/$(i:b).class)
-
-JARTARGET = $(TARGET).jar
-JARCOMPRESS = TRUE
-JARCLASSDIRS = $(PACKAGE) com$/sun$/star$/servicetag
-CUSTOMMANIFESTFILE = manifest
-.ENDIF # "$(ENABLE_SVCTAGS)" == "YES"
-
-# --- Targets ------------------------------------------------------
-
-
-.INCLUDE : target.mk
-
diff --git a/setup_native/source/registration/com/sun/star/registration/manifest b/setup_native/source/registration/com/sun/star/registration/manifest
deleted file mode 100644
index 952aaa804e96..000000000000
--- a/setup_native/source/registration/com/sun/star/registration/manifest
+++ /dev/null
@@ -1,2 +0,0 @@
-RegistrationClassName: com.sun.star.registration.Registration
-UNO-Type-Path:
diff --git a/setup_native/source/registration/com/sun/star/servicetag/BrowserSupport.java b/setup_native/source/registration/com/sun/star/servicetag/BrowserSupport.java
deleted file mode 100644
index c97d5f2cd4f0..000000000000
--- a/setup_native/source/registration/com/sun/star/servicetag/BrowserSupport.java
+++ /dev/null
@@ -1,205 +0,0 @@
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2008 by Sun Microsystems, Inc.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * $RCSfile: BrowserSupport.java,v $
- *
- * $Revision: 1.2 $
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-package com.sun.star.servicetag;
-
-import java.lang.reflect.Field;
-import java.lang.reflect.Method;
-import java.lang.reflect.InvocationTargetException;
-import java.io.IOException;
-import java.net.URI;
-
-/**
- * BrowserSupport class.
- *
- * The implementation of the com.sun.servicetag API needs to be
- * compiled with JDK 5 as well since the consumer of this API
- * may require to support JDK 5 (e.g. NetBeans).
- *
- * The Desktop.browse() method can be backported in this class
- * if needed. The current implementation only supports JDK 6.
- */
-class BrowserSupport {
- private static boolean isBrowseSupported = false;
- private static Method browseMethod = null;
- private static Object desktop = null;
- private static volatile Boolean result = false;
-
-
- private static void initX() {
- if (desktop != null) {
- return;
- }
- boolean supported = false;
- Method browseM = null;
- Object desktopObj = null;
- try {
- // Determine if java.awt.Desktop is supported
- Class desktopCls = Class.forName("java.awt.Desktop", true, null);
- Method getDesktopM = desktopCls.getMethod("getDesktop");
- browseM = desktopCls.getMethod("browse", URI.class);
-
- Class actionCls = Class.forName("java.awt.Desktop$Action", true, null);
- final Method isDesktopSupportedMethod = desktopCls.getMethod("isDesktopSupported");
- Method isSupportedMethod = desktopCls.getMethod("isSupported", actionCls);
- Field browseField = actionCls.getField("BROWSE");
- // isDesktopSupported calls getDefaultToolkit which can block
- // infinitely, see 6636099 for details, to workaround we call
- // in a thread and time it out, noting that the issue is specific
- // to X11, it does not hurt for Windows.
- Thread xthread = new Thread() {
- public void run() {
- try {
- // support only if Desktop.isDesktopSupported() and
- // Desktop.isSupported(Desktop.Action.BROWSE) return true.
- result = (Boolean) isDesktopSupportedMethod.invoke(null);
- } catch (IllegalAccessException e) {
- // should never reach here
- InternalError x =
- new InternalError("Desktop.getDesktop() method not found");
- x.initCause(e);
- } catch (InvocationTargetException e) {
- // browser not supported
- if (Util.isVerbose()) {
- e.printStackTrace();
- }
- }
- }
- };
- // set it to daemon, so that the vm will exit.
- xthread.setDaemon(true);
- xthread.start();
- try {
- xthread.join(5 * 1000);
- } catch (InterruptedException ie) {
- // ignore the exception
- }
- if (result.booleanValue()) {
- desktopObj = getDesktopM.invoke(null);
- result = (Boolean) isSupportedMethod.invoke(desktopObj, browseField.get(null));
- supported = result.booleanValue();
- }
- } catch (ClassNotFoundException e) {
- // browser not supported
- if (Util.isVerbose()) {
- e.printStackTrace();
- }
- } catch (NoSuchMethodException e) {
- // browser not supported
- if (Util.isVerbose()) {
- e.printStackTrace();
- }
- } catch (NoSuchFieldException e) {
- // browser not supported
- if (Util.isVerbose()) {
- e.printStackTrace();
- }
- } catch (IllegalAccessException e) {
- // should never reach here
- InternalError x =
- new InternalError("Desktop.getDesktop() method not found");
- x.initCause(e);
- throw x;
- } catch (InvocationTargetException e) {
- // browser not supported
- if (Util.isVerbose()) {
- e.printStackTrace();
- }
- }
- isBrowseSupported = supported;
- browseMethod = browseM;
- desktop = desktopObj;
- }
-
- static boolean isSupported() {
- initX();
- return isBrowseSupported;
- }
-
- /**
- * Launches the default browser to display a {@code URI}.
- * If the default browser is not able to handle the specified
- * {@code URI}, the application registered for handling
- * {@code URIs} of the specified type is invoked. The application
- * is determined from the protocol and path of the {@code URI}, as
- * defined by the {@code URI} class.
- * <p>
- * This method calls the Desktop.getDesktop().browse() method.
- * <p>
- * @param uri the URI to be displayed in the user default browser
- *
- * @throws NullPointerException if {@code uri} is {@code null}
- * @throws UnsupportedOperationException if the current platform
- * does not support the {@link Desktop.Action#BROWSE} action
- * @throws IOException if the user default browser is not found,
- * or it fails to be launched, or the default handler application
- * failed to be launched
- * @throws IllegalArgumentException if the necessary permissions
- * are not available and the URI can not be converted to a {@code URL}
- */
- static void browse(URI uri) throws IOException {
- if (uri == null) {
- throw new NullPointerException("null uri");
- }
- if (!isSupported()) {
- throw new UnsupportedOperationException("Browse operation is not supported");
- }
-
- // Call Desktop.browse() method
- try {
- if (Util.isVerbose()) {
- System.out.println("desktop: " + desktop + ":browsing..." + uri);
- }
- browseMethod.invoke(desktop, uri);
- } catch (IllegalAccessException e) {
- // should never reach here
- InternalError x =
- new InternalError("Desktop.getDesktop() method not found");
- x.initCause(e);
- throw x;
- } catch (InvocationTargetException e) {
- Throwable x = e.getCause();
- if (x != null) {
- if (x instanceof UnsupportedOperationException) {
- throw (UnsupportedOperationException) x;
- } else if (x instanceof IllegalArgumentException) {
- throw (IllegalArgumentException) x;
- } else if (x instanceof IOException) {
- throw (IOException) x;
- } else if (x instanceof SecurityException) {
- throw (SecurityException) x;
- } else {
- // ignore
- }
- }
- }
- }
-}
diff --git a/setup_native/source/registration/com/sun/star/servicetag/Installer.java b/setup_native/source/registration/com/sun/star/servicetag/Installer.java
deleted file mode 100644
index 02825dfec69d..000000000000
--- a/setup_native/source/registration/com/sun/star/servicetag/Installer.java
+++ /dev/null
@@ -1,947 +0,0 @@
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2008 by Sun Microsystems, Inc.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * $RCSfile: Installer.java,v $
- *
- * $Revision: 1.2 $
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-package com.sun.star.servicetag;
-
-import java.io.*;
-import java.util.HashSet;
-import java.util.Locale;
-import java.util.Properties;
-import java.util.Set;
-import java.util.List;
-import java.util.ArrayList;
-import static com.sun.star.servicetag.Util.*;
-
-/**
- * Service Tag Installer for Java SE.
- */
-public class Installer {
- // System properties for testing
- private static String SVCTAG_DIR_PATH =
- "servicetag.dir.path";
- private static String SVCTAG_ENABLE_REGISTRATION =
- "servicetag.registration.enabled";
- private final static String SUN_VENDOR = "Sun Microsystems";
- private final static String REGISTRATION_XML = "registration.xml";
- private final static String SERVICE_TAG_FILE = "servicetag";
- private final static String REGISTRATION_HTML_NAME = "register";
-
- private final static Locale[] knownSupportedLocales =
- new Locale[] { Locale.ENGLISH,
- Locale.JAPANESE,
- Locale.SIMPLIFIED_CHINESE};
-
- private final static String javaHome = System.getProperty("java.home");
- private static File svcTagDir;
- private static File serviceTagFile;
- private static File regXmlFile;
- private static RegistrationData registration;
- private static boolean supportRegistration;
- private static String registerHtmlParent;
- private static Set<Locale> supportedLocales = new HashSet<Locale>();
- private static Properties swordfishProps = null;
- private static String[] jreArchs = null;
- static {
- String dir = System.getProperty(SVCTAG_DIR_PATH);
- if (dir == null) {
- svcTagDir = new File(getJrePath(), "lib" + File.separator + SERVICE_TAG_FILE);
- } else {
- svcTagDir = new File(dir);
- }
- serviceTagFile = new File(svcTagDir, SERVICE_TAG_FILE);
- regXmlFile = new File(svcTagDir, REGISTRATION_XML);
- if (System.getProperty(SVCTAG_ENABLE_REGISTRATION) == null) {
- supportRegistration = isJdk();
- } else {
- supportRegistration = true;
- }
- }
-
- private Installer() {
- }
-
- // Implementation of ServiceTag.getJavaServiceTag(String) method
- static ServiceTag getJavaServiceTag(String source) throws IOException {
- if (!System.getProperty("java.vendor").startsWith(SUN_VENDOR)) {
- // Products bundling this implementation may run on
- // Mac OS which is not a Sun JDK
- return null;
- }
- boolean cleanup = false;
- try {
- // Check if we have the swordfish entries for this JRE version
- if (loadSwordfishEntries() == null) {
- return null;
- }
-
- ServiceTag st = getJavaServiceTag();
- // Check if the service tag created by this bundle owner
- if (st != null && st.getSource().equals(source)) {
- // Install the system service tag if supported
- // stclient may be installed after the service tag creation
- if (Registry.isSupported()) {
- installSystemServiceTag();
- }
- return st;
- }
-
- // in case any exception thrown during the cleanup
- cleanup = true;
-
- // re-create a new one for this bundle owner
- // first delete the registration data
- deleteRegistrationData();
- cleanup = false;
-
- // create service tag and generate new register.html pages
- return createServiceTag(source);
- } finally {
- if (cleanup) {
- if (regXmlFile.exists()) {
- regXmlFile.delete();
- }
- if (serviceTagFile.exists()) {
- serviceTagFile.delete();
- }
- }
- }
- }
-
- /**
- * Returns the Java SE registration data located in
- * the <JRE>/lib/servicetag/registration.xml by default.
- *
- * @throws IllegalArgumentException if the registration data
- * is of invalid format.
- */
- private static synchronized RegistrationData getRegistrationData()
- throws IOException {
- if (registration != null) {
- return registration;
- }
- if (regXmlFile.exists()) {
- BufferedInputStream in = null;
- try {
- in = new BufferedInputStream(new FileInputStream(regXmlFile));
- registration = RegistrationData.loadFromXML(in);
- } catch (IllegalArgumentException ex) {
- System.err.println("Error: Bad registration data \"" +
- regXmlFile + "\":" + ex.getMessage());
- throw ex;
- } finally {
- if (in != null) {
- in.close();
- }
- }
- } else {
- registration = new RegistrationData();
- }
- return registration;
- }
-
- /**
- * Write the registration data to the registration.xml file.
- *
- * The offline registration page has to be regenerated with
- * the new registration data.
- *
- * @throws java.io.IOException
- */
- private static synchronized void writeRegistrationXml()
- throws IOException {
- if (!svcTagDir.exists()) {
- // This check is for NetBeans or other products that
- // bundles this com.sun.servicetag implementation for
- // pre-6u5 release.
- if (!svcTagDir.mkdir()) {
- throw new IOException("Failed to create directory: " + svcTagDir);
- }
- }
-
- // regenerate the new offline registration page
- deleteRegistrationHtmlPage();
- getRegistrationHtmlPage();
-
- BufferedOutputStream out = null;
- try {
- out = new BufferedOutputStream(new FileOutputStream(regXmlFile));
- getRegistrationData().storeToXML(out);
- } catch (IllegalArgumentException ex) {
- System.err.println("Error: Bad registration data \"" +
- regXmlFile + "\":" + ex.getMessage());
- throw ex;
- } finally {
- if (out != null) {
- out.close();
- }
- }
- }
-
- /**
- * Returns the instance urn(s) stored in the servicetag file
- * or empty set if file not exists.
- */
- private static Set<String> getInstalledURNs() throws IOException {
- Set<String> urnSet = new HashSet<String>();
- if (serviceTagFile.exists()) {
- BufferedReader in = null;
- try {
- in = new BufferedReader(new FileReader(serviceTagFile));
- String urn;
- while ((urn = in.readLine()) != null) {
- urn = urn.trim();
- if (urn.length() > 0) {
- urnSet.add(urn);
- }
- }
- } finally {
- if (in != null) {
- in.close();
- }
- }
- }
- return urnSet;
- }
-
- /**
- * Return the Java SE service tag(s) if it exists.
- * Typically only one Java SE service tag but it could have two for
- * Solaris 32-bit and 64-bit on the same install directory.
- *
- * @return the service tag(s) for Java SE
- */
- private static ServiceTag[] getJavaServiceTagArray() throws IOException {
- RegistrationData regData = getRegistrationData();
- Set<ServiceTag> svcTags = regData.getServiceTags();
- Set<ServiceTag> result = new HashSet<ServiceTag>();
-
- Properties props = loadSwordfishEntries();
- String jdkUrn = props.getProperty("servicetag.jdk.urn");
- String jreUrn = props.getProperty("servicetag.jre.urn");
- for (ServiceTag st : svcTags) {
- if (st.getProductURN().equals(jdkUrn) ||
- st.getProductURN().equals(jreUrn)) {
- result.add(st);
- }
- }
- return result.toArray(new ServiceTag[0]);
- }
-
- /**
- * Returns the Java SE service tag for this running platform;
- * or null if not exist.
- * This method will return the 64-bit service tag if the JDK
- * supports both 32-bit and 64-bit if already created.
- */
- private static ServiceTag getJavaServiceTag() throws IOException {
- String definedId = getProductDefinedId();
- for (ServiceTag st : getJavaServiceTagArray()) {
- if (st.getProductDefinedInstanceID().equals(definedId)) {
- return st;
- }
- }
- return null;
- }
-
- /**
- * Create a service tag for Java SE and install in the system
- * service tag registry if supported.
- *
- * A registration data <JRE>/lib/servicetag/registration.xml
- * will be created to storeToXML the XML entry for Java SE service tag.
- * If the system supports service tags, this method will install
- * the Java SE service tag in the system service tag registry and
- * its <tt>instance_urn</tt> will be stored to <JRE>/lib/servicetag/servicetag.
- *
- * If <JRE>/lib/servicetag/registration.xml exists but is not installed
- * in the system service tag registry (i.e. servicetag doesn't exist),
- * this method will install it as described above.
- *
- * If the system supports service tag, stclient will be used
- * to create the Java SE service tag.
- *
- * A Solaris 32-bit and 64-bit JDK will be installed in the same
- * directory but the registration.xml will have 2 service tags.
- * The servicetag file will also contain 2 instance_urns for that case.
- */
- private static ServiceTag createServiceTag(String svcTagSource)
- throws IOException {
- // determine if a new service tag is needed to be created
- ServiceTag newSvcTag = null;
- if (getJavaServiceTag() == null) {
- newSvcTag = newServiceTag(svcTagSource);
- }
-
- // Add the new service tag in the registration data
- if (newSvcTag != null) {
- RegistrationData regData = getRegistrationData();
-
- // Add the service tag to the registration data in JDK/JRE
- newSvcTag = regData.addServiceTag(newSvcTag);
-
- // add if there is a service tag for the OS
- ServiceTag osTag = SolarisServiceTag.getServiceTag();
- if (osTag != null && regData.getServiceTag(osTag.getInstanceURN()) == null) {
- regData.addServiceTag(osTag);
- }
- // write to the registration.xml
- writeRegistrationXml();
- }
-
- // Install the system service tag if supported
- if (Registry.isSupported()) {
- installSystemServiceTag();
- }
- return newSvcTag;
- }
-
- private static void installSystemServiceTag() throws IOException {
- // only install the service tag in the registry if
- // it has permission to write the servicetag file.
- if ((!serviceTagFile.exists() && !svcTagDir.canWrite()) ||
- (serviceTagFile.exists() && !serviceTagFile.canWrite())) {
- return;
- }
-
- Set<String> urns = getInstalledURNs();
- ServiceTag[] javaSvcTags = getJavaServiceTagArray();
- if (urns.size() < javaSvcTags.length) {
- for (ServiceTag st : javaSvcTags) {
- // Add the service tag in the system service tag registry
- // if not installed
- String instanceURN = st.getInstanceURN();
- if (!urns.contains(instanceURN)) {
- Registry.getSystemRegistry().addServiceTag(st);
- }
- }
- }
- writeInstalledUrns();
- }
-
- private static ServiceTag newServiceTag(String svcTagSource) throws IOException {
- // Load the swoRDFish information for the service tag creation
- Properties props = loadSwordfishEntries();
-
- // Determine the product URN and name
- String productURN;
- String productName;
-
- if (isJdk()) {
- // <HOME>/jre exists which implies it's a JDK
- productURN = props.getProperty("servicetag.jdk.urn");
- productName = props.getProperty("servicetag.jdk.name");
- } else {
- // Otherwise, it's a JRE
- productURN = props.getProperty("servicetag.jre.urn");
- productName = props.getProperty("servicetag.jre.name");
- }
-
- return ServiceTag.newInstance(ServiceTag.generateInstanceURN(),
- productName,
- System.getProperty("java.version"),
- productURN,
- props.getProperty("servicetag.parent.name"),
- props.getProperty("servicetag.parent.urn"),
- getProductDefinedId(),
- SUN_VENDOR,
- System.getProperty("os.arch"),
- getZoneName(),
- svcTagSource);
- }
-
- /**
- * Delete the registration data, the offline registration pages and
- * the service tags in the system service tag registry if installed.
- *
- * The registration.xml and servicetag file will be removed.
- */
- private static synchronized void deleteRegistrationData()
- throws IOException {
- try {
- // delete the offline registration page
- deleteRegistrationHtmlPage();
-
- // Remove the service tag from the system ST registry if exists
- Set<String> urns = getInstalledURNs();
- if (urns.size() > 0 && Registry.isSupported()) {
- for (String u : urns) {
- Registry.getSystemRegistry().removeServiceTag(u);
- }
- }
- registration = null;
- } finally {
- // Delete the registration.xml and servicetag files if exists
- if (regXmlFile.exists()) {
- if (!regXmlFile.delete()) {
- throw new IOException("Failed to delete " + regXmlFile);
- }
- }
- if (serviceTagFile.exists()) {
- if (!serviceTagFile.delete()) {
- throw new IOException("Failed to delete " + serviceTagFile);
- }
- }
- }
- }
-
- /**
- * Updates the registration data to contain one single service tag
- * for the running Java runtime.
- */
- private static synchronized void updateRegistrationData(String svcTagSource)
- throws IOException {
- RegistrationData regData = getRegistrationData();
- ServiceTag curSvcTag = newServiceTag(svcTagSource);
-
- ServiceTag[] javaSvcTags = getJavaServiceTagArray();
- Set<String> urns = getInstalledURNs();
- for (ServiceTag st : javaSvcTags) {
- if (!st.getProductDefinedInstanceID().equals(curSvcTag.getProductDefinedInstanceID())) {
- String instanceURN = st.getInstanceURN();
- regData.removeServiceTag(instanceURN);
-
- // remove it from the system service tag registry if exists
- if (urns.contains(instanceURN) && Registry.isSupported()) {
- Registry.getSystemRegistry().removeServiceTag(instanceURN);
- }
- }
- }
- writeRegistrationXml();
- writeInstalledUrns();
- }
-
- private static void writeInstalledUrns() throws IOException {
- // if the Registry is not supported,
- // remove the servicetag file
- if (!Registry.isSupported() && serviceTagFile.exists()) {
- serviceTagFile.delete();
- return;
- }
-
- PrintWriter out = null;
- try {
- out = new PrintWriter(serviceTagFile);
-
- ServiceTag[] javaSvcTags = getJavaServiceTagArray();
- for (ServiceTag st : javaSvcTags) {
- // Write the instance_run to the servicetag file
- String instanceURN = st.getInstanceURN();
- out.println(instanceURN);
- }
- } finally {
- if (out != null) {
- out.close();
- }
- }
- }
-
- /**
- * Load the values associated with the swoRDFish metadata entries
- * for Java SE. The swoRDFish metadata entries are different for
- * different release.
- *
- * @param version Version of Java SE
- */
- private static synchronized Properties loadSwordfishEntries() throws IOException {
- if (swordfishProps != null) {
- return swordfishProps;
- }
-
- // The version string for Java SE 6 is 1.6.0
- // We just need the minor number in the version string
- int version = Util.getJdkVersion();
-
- String filename = "/com/sun/servicetag/resources/javase_" +
- version + "_swordfish.properties";
- InputStream in = Installer.class.getClass().getResourceAsStream(filename);
- if (in == null) {
- return null;
- }
- swordfishProps = new Properties();
- try {
- swordfishProps.load(in);
- } finally {
- in.close();
- }
- return swordfishProps;
- }
-
- /**
- * Returns the product defined instance ID for Java SE.
- * It is a list of comma-separated name/value pairs:
- * "id=<full-version> <arch> [<arch>]*"
- * "dir=<java.home system property value>"
- *
- * where <full-version> is the full version string of the JRE,
- * <arch> is the architecture that the runtime supports
- * (i.e. "sparc", "sparcv9", "i386", "amd64" (ISA list))
- *
- * For Solaris, it can be dual mode that can support both
- * 32-bit and 64-bit. the "id" will be set to
- * "1.6.0_03-b02 sparc sparcv9"
- *
- * The "dir" property is included in the service tag to enable
- * the Service Tag software to determine if a service tag for
- * Java SE is invalid and perform appropriate service tag
- * cleanup if necessary. See RFE# 6574781 Service Tags Enhancement.
- *
- */
- private static String getProductDefinedId() {
- StringBuilder definedId = new StringBuilder();
- definedId.append("id=");
- definedId.append(System.getProperty("java.runtime.version"));
-
- String[] archs = getJreArchs();
- for (String name : archs) {
- definedId.append(" " + name);
- }
-
- String location = ",dir=" + javaHome;
- if ((definedId.length() + location.length()) < 256) {
- definedId.append(",dir=");
- definedId.append(javaHome);
- } else {
- // if it exceeds the limit, we will not include the location
- if (isVerbose()) {
- System.err.println("Warning: Product defined instance ID exceeds the field limit:");
- }
- }
-
- return definedId.toString();
- }
-
- /**
- * Returns the architectures that the runtime supports
- * (i.e. "sparc", "sparcv9", "i386", "amd64" (ISA list))
- * The directory name where libjava.so is located.
- *
- * On Windows, returns the "os.arch" system property value.
- */
- private synchronized static String[] getJreArchs() {
- if (jreArchs != null) {
- return jreArchs;
- }
-
- Set<String> archs = new HashSet<String>();
-
- String os = System.getProperty("os.name");
- if (os.equals("SunOS") || os.equals("Linux")) {
- // Traverse the directories under <JRE>/lib.
- // If <JRE>/lib/<arch>/libjava.so exists, add <arch>
- // to the product defined ID
- File dir = new File(getJrePath() + File.separator + "lib");
- if (dir.isDirectory()) {
- String[] children = dir.list();
- for (String name : children) {
- File f = new File(dir, name + File.separator + "libjava.so");
- if (f.exists()) {
- archs.add(name);
- }
- }
- }
- } else {
- // Windows - append the os.arch
- archs.add(System.getProperty("os.arch"));
- }
- jreArchs = archs.toArray(new String[0]);
- return jreArchs;
- }
-
- /**
- * Return the zonename if zone is supported; otherwise, return
- * "global".
- */
- public static String getZoneName() throws IOException {
- String zonename = "global";
-
- String command = "/usr/bin/zonename";
- File f = new File(command);
- // com.sun.servicetag package has to be compiled with JDK 5 as well
- // JDK 5 doesn't support the File.canExecute() method.
- // Risk not checking isExecute() for the zonename command is very low.
- if (f.exists()) {
- ProcessBuilder pb = new ProcessBuilder(command);
- Process p = pb.start();
- String output = commandOutput(p);
- if (p.exitValue() == 0) {
- zonename = output.trim();
- }
-
- }
- return zonename;
- }
-
- private synchronized static String getRegisterHtmlParent() throws IOException {
- if (registerHtmlParent == null) {
- File htmlDir; // register.html is put under the JDK directory
- if (getJrePath().endsWith(File.separator + "jre")) {
- htmlDir = new File(getJrePath(), "..");
- } else {
- // j2se non-image build
- htmlDir = new File(getJrePath());
- }
-
- // initialize the supported locales
- initSupportedLocales(htmlDir);
-
- // Determine the location of the offline registration page
- String path = System.getProperty(SVCTAG_DIR_PATH);
- if (path == null) {
- // Default is <JDK>/register.html
- registerHtmlParent = htmlDir.getCanonicalPath();
- } else {
- File f = new File(path);
- registerHtmlParent = f.getCanonicalPath();
- if (!f.isDirectory()) {
- throw new InternalError("Path " + path + " set in \"" +
- SVCTAG_DIR_PATH + "\" property is not a directory");
- }
- }
- }
- return registerHtmlParent;
- }
-
- /**
- * Returns the File object of the offline registration page localized
- * for the default locale in the JDK directory.
- */
- static synchronized File getRegistrationHtmlPage() throws IOException {
- if (!supportRegistration) {
- // No register.html page generated if JRE
- return null;
- }
-
- String parent = getRegisterHtmlParent();
-
- // check if the offline registration page is already generated
- File f = new File(parent, REGISTRATION_HTML_NAME + ".html");
- if (!f.exists()) {
- // Generate the localized version of the offline registration Page
- generateRegisterHtml(parent);
- }
-
- String name = REGISTRATION_HTML_NAME;
- List<Locale> candidateLocales = getCandidateLocales(Locale.getDefault());
- for (Locale l : candidateLocales) {
- if (supportedLocales.contains(l)) {
- name = REGISTRATION_HTML_NAME + "_" + l.toString();
- break;
- }
- }
- File htmlFile = new File(parent, name + ".html");
- if (isVerbose()) {
- System.out.print("Offline registration page: " + htmlFile);
- System.out.println((htmlFile.exists() ?
- "" : " not exist. Use register.html"));
- }
- if (htmlFile.exists()) {
- return htmlFile;
- } else {
- return new File(parent,
- REGISTRATION_HTML_NAME + ".html");
- }
- }
-
- private static List<Locale> getCandidateLocales(Locale locale) {
- String language = locale.getLanguage();
- String country = locale.getCountry();
- String variant = locale.getVariant();
-
- List<Locale> locales = new ArrayList<Locale>(3);
- if (variant.length() > 0) {
- locales.add(locale);
- }
- if (country.length() > 0) {
- locales.add((locales.size() == 0) ?
- locale : new Locale(language, country, ""));
- }
- if (language.length() > 0) {
- locales.add((locales.size() == 0) ?
- locale : new Locale(language, "", ""));
- }
- return locales;
- }
-
- // Remove the offline registration pages
- private static void deleteRegistrationHtmlPage() throws IOException {
- String parent = getRegisterHtmlParent();
- if (parent == null) {
- return;
- }
-
- for (Locale locale : supportedLocales) {
- String name = REGISTRATION_HTML_NAME;
- if (!locale.equals(Locale.ENGLISH)) {
- name += "_" + locale.toString();
- }
- File f = new File(parent, name + ".html");
- if (f.exists()) {
- if (!f.delete()) {
- throw new IOException("Failed to delete " + f);
- }
- }
- }
- }
-
- private static void initSupportedLocales(File jdkDir) {
- if (supportedLocales.isEmpty()) {
- // initialize with the known supported locales
- for (Locale l : knownSupportedLocales) {
- supportedLocales.add(l);
- }
- }
-
- // Determine unknown supported locales if any
- // by finding the localized version of README.html
- // This prepares if a new locale in JDK is supported in
- // e.g. in the OpenSource world
- FilenameFilter ff = new FilenameFilter() {
- public boolean accept(File dir, String name) {
- String fname = name.toLowerCase();
- if (fname.startsWith("readme") && fname.endsWith(".html")) {
- return true;
- }
- return false;
- }
- };
-
- String[] readmes = jdkDir.list(ff);
- for (String name : readmes) {
- String basename = name.substring(0, name.length() - ".html".length());
- String[] ss = basename.split("_");
- switch (ss.length) {
- case 1:
- // English version
- break;
- case 2:
- supportedLocales.add(new Locale(ss[1]));
- break;
- case 3:
- supportedLocales.add(new Locale(ss[1], ss[2]));
- break;
- default:
- // ignore
- break;
- }
- }
- if (isVerbose()) {
- System.out.println("Supported locales: ");
- for (Locale l : supportedLocales) {
- System.out.println(l);
- }
- }
- }
-
- private static final String JDK_HEADER_PNG_KEY = "@@JDK_HEADER_PNG@@";
- private static final String JDK_VERSION_KEY = "@@JDK_VERSION@@";
- private static final String REGISTRATION_URL_KEY = "@@REGISTRATION_URL@@";
- private static final String REGISTRATION_PAYLOAD_KEY = "@@REGISTRATION_PAYLOAD@@";
-
- @SuppressWarnings("unchecked")
- private static void generateRegisterHtml(String parent) throws IOException {
- int version = Util.getJdkVersion();
- int update = Util.getUpdateVersion();
- String jdkVersion = "Version " + version;
- if (update > 0) {
- // product name is not translated
- jdkVersion += " Update " + update;
- }
- RegistrationData regData = getRegistrationData();
- String registerURL = SunConnection.getRegistrationURL(
- regData.getRegistrationURN()).toString();
- // Make sure it uses the canonical path before getting the URI.
- File img = new File(svcTagDir.getCanonicalPath(), "jdk_header.png");
- String headerImageSrc = img.toURI().toString();
-
- // Format the registration data in one single line
- StringBuilder payload = new StringBuilder();
- String xml = regData.toString().replaceAll("\"", "%22");
- BufferedReader reader = new BufferedReader(new StringReader(xml));
- try {
- String line = null;
- while ((line = reader.readLine()) != null) {
- payload.append(line.trim());
- }
- } finally {
- reader.close();
- }
-
- String resourceFilename = "/com/sun/star/servicetag/resources/register";
- for (Locale locale : supportedLocales) {
- String name = REGISTRATION_HTML_NAME;
- String resource = resourceFilename;
- if (!locale.equals(Locale.ENGLISH)) {
- name += "_" + locale.toString();
- resource += "_" + locale.toString();
- }
- File f = new File(parent, name + ".html");
- InputStream in = null;
- BufferedReader br = null;
- PrintWriter pw = null;
- try {
- in = Installer.class.getClass().getResourceAsStream(resource + ".html");
- if (in == null) {
- // if the resource file is missing
- if (isVerbose()) {
- System.out.println("Missing resouce file: " + resource + ".html");
- }
- continue;
- }
- if (isVerbose()) {
- System.out.println("Generating " + f + " from " + resource + ".html");
- }
-
- br = new BufferedReader(new InputStreamReader(in, "UTF-8"));
- pw = new PrintWriter(f, "UTF-8");
- String line = null;
- while ((line = br.readLine()) != null) {
- String output = line;
- if (line.contains(JDK_VERSION_KEY)) {
- output = line.replace(JDK_VERSION_KEY, jdkVersion);
- } else if (line.contains(JDK_HEADER_PNG_KEY)) {
- output = line.replace(JDK_HEADER_PNG_KEY, headerImageSrc);
- } else if (line.contains(REGISTRATION_URL_KEY)) {
- output = line.replace(REGISTRATION_URL_KEY, registerURL);
- } else if (line.contains(REGISTRATION_PAYLOAD_KEY)) {
- output = line.replace(REGISTRATION_PAYLOAD_KEY, payload.toString());
- }
- pw.println(output);
- }
- f.setReadOnly();
- pw.flush();
- } finally {
- if (pw != null) {
- pw.close();
- }
- if (in != null) {
- in.close();
- }
- if (br!= null) {
- br.close();
- }
- }
- }
- }
-
- /**
- * A utility class to create a service tag for Java SE.
- * <p>
- * <b>Usage:</b><br>
- * <blockquote><tt>
- * &lt;JAVA_HOME&gt;/bin/java com.sun.servicetag.Installer
- * </tt></blockquote>
- * <p>
- */
- public static void main(String[] args) {
- String source = "Manual";
-
- // Parse the options (arguments starting with "-" )
- boolean delete = false;
- boolean update = false;
- boolean register = false;
- int count = 0;
- while (count < args.length) {
- String arg = args[count];
- if (arg.trim().length() == 0) {
- // skip empty arguments
- count++;
- continue;
- }
-
- if (arg.equals("-source")) {
- source = args[++count];
- } else if (arg.equals("-delete")) {
- delete = true;
- } else if (arg.equals("-register")) {
- register = true;
- } else {
- usage();
- return;
- }
- count++;
- }
- try {
- if (delete) {
- deleteRegistrationData();
- } else {
- ServiceTag[] javaSvcTags = getJavaServiceTagArray();
- String[] archs = getJreArchs();
- if (javaSvcTags.length > archs.length) {
- // 64-bit has been uninstalled
- // so remove the service tag
- updateRegistrationData(source);
- } else {
- // create the service tag
- createServiceTag(source);
- }
- }
-
- if (register) {
- // Registration is only supported by JDK
- // For testing purpose, override with a "servicetag.enable.registration" property
-
- RegistrationData regData = getRegistrationData();
- if (supportRegistration && !regData.getServiceTags().isEmpty()) {
- SunConnection.register(regData);
- }
- }
- System.exit(0);
- } catch (IOException e) {
- System.err.println("I/O Error: " + e.getMessage());
- if (isVerbose()) {
- e.printStackTrace();
- }
- } catch (IllegalArgumentException ex) {
- if (isVerbose()) {
- ex.printStackTrace();
- }
- } catch (Exception e) {
- System.err.println("Error: " + e.getMessage());
- if (isVerbose()) {
- e.printStackTrace();
- }
- }
- System.exit(1);
- }
-
- private static void usage() {
- System.out.println("Usage:");
- System.out.print(" " + Installer.class.getName());
- System.out.println(" [-delete|-source <source>|-register]");
- System.out.println(" to create a service tag for the Java platform");
- System.out.println("");
- System.out.println("Internal Options:");
- System.out.println(" -source: to specify the source of the service tag to be created");
- System.out.println(" -delete: to delete the service tag ");
- System.out.println(" -register: to register the JDK");
- System.out.println(" -help: to print this help message");
- }
-}
diff --git a/setup_native/source/registration/com/sun/star/servicetag/LinuxSystemEnvironment.java b/setup_native/source/registration/com/sun/star/servicetag/LinuxSystemEnvironment.java
deleted file mode 100644
index 90e38021c103..000000000000
--- a/setup_native/source/registration/com/sun/star/servicetag/LinuxSystemEnvironment.java
+++ /dev/null
@@ -1,194 +0,0 @@
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2008 by Sun Microsystems, Inc.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * $RCSfile: LinuxSystemEnvironment.java,v $
- *
- * $Revision: 1.2 $
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-package com.sun.star.servicetag;
-
-// The Service Tags team maintains the latest version of the implementation
-// for system environment data collection. JDK will include a copy of
-// the most recent released version for a JDK release. We rename
-// the package to com.sun.servicetag so that the Sun Connection
-// product always uses the latest version from the com.sun.scn.servicetags
-// package. JDK and users of the com.sun.servicetag API
-// (e.g. NetBeans and SunStudio) will use the version in JDK.
-
-import java.io.*;
-
-/**
- * Linux implementation of the SystemEnvironment class.
- */
-class LinuxSystemEnvironment extends SystemEnvironment {
- LinuxSystemEnvironment() {
- setHostId(getLinuxHostId());
- setSystemModel(getCommandOutput("/bin/uname", "-i"));
- setSystemManufacturer(getLinuxSystemManufacturer());
- setCpuManufacturer(getLinuxCpuManufacturer());
- setSerialNumber(getLinuxSN());
- }
- private String dmiInfo = null;
-
- private static final int SN = 1;
- private static final int SYS = 2;
- private static final int CPU = 3;
-
- private String getLinuxHostId() {
- String output = getCommandOutput("/usr/bin/hostid");
- // trim off the leading 0x
- if (output.startsWith("0x")) {
- output = output.substring(2);
- }
- return output;
- }
-
- /**
- * Tries to obtain and return the cpu manufacturer.
- * @return The cpu manufacturer (an empty string if not found or an error occurred)
- */
- private String getLinuxCpuManufacturer() {
- String tmp = getLinuxPSNInfo(CPU);
- if (tmp.length() > 0) {
- return tmp;
- }
-
- String contents = getFileContent("/proc/cpuinfo");
- for (String line : contents.split("\n")) {
- if (line.contains("vendor_id")) {
- String[] ss = line.split(":", 2);
- if (ss.length > 1) {
- return ss[1].trim();
- }
- }
- }
-
- // returns an empty string if it can't be found or an error happened
- return getLinuxDMIInfo("dmi type 4", "manufacturer");
- }
-
-
- /**
- * Tries to obtain and return the system manufacturer.
- * @return The system manufacturer (an empty string if not found or an error occurred)
- */
- private String getLinuxSystemManufacturer() {
- String tmp = getLinuxPSNInfo(SYS);
- if (tmp.length() > 0) {
- return tmp;
- }
-
- // returns an empty string if it can't be found or an error happened
- return getLinuxDMIInfo("dmi type 1", "manufacturer");
- }
-
- /**
- * Tries to obtain and return the serial number of the system.
- * @return The serial number (an empty string if not found or an error occurred)
- */
- private String getLinuxSN() {
- String tmp = getLinuxPSNInfo(SN);
- if (tmp.length() > 0) {
- return tmp;
- }
-
- // returns an empty string if it can't be found or an error happened
- return getLinuxDMIInfo("dmi type 1", "serial number");
- }
-
- private String getLinuxPSNInfo(int target) {
- // try to read from the psn file if it exists
- String contents = getFileContent("/var/run/psn");
- String[] ss = contents.split("\n");
- if (target <= ss.length) {
- return ss[target-1];
- }
-
- // default case is to return ""
- return "";
- }
-
- // reads from dmidecode with the given type and target
- // returns an empty string if nothing was found or an error occurred
- //
- // Sample output segment:
- // Handle 0x0001
- // DMI type 1, 25 bytes.
- // System Information
- // Manufacturer: System manufacturer
- // Product Name: System Product Name
- // Version: System Version
- // Serial Number: System Serial Number
- // UUID: 3091D719-B25B-D911-959D-6D1B12C7686E
- // Wake-up Type: Power Switch
-
- private synchronized String getLinuxDMIInfo(String dmiType, String target) {
- // only try to get dmidecode information once, after that, we can
- // reuse the output
- if (dmiInfo == null) {
- Thread dmidecodeThread = new Thread() {
- public void run() {
- dmiInfo = getCommandOutput("/usr/sbin/dmidecode");
- }
- };
- dmidecodeThread.start();
-
- try {
- dmidecodeThread.join(2000);
- if (dmidecodeThread.isAlive()) {
- dmidecodeThread.interrupt();
- dmiInfo = "";
- }
- } catch (InterruptedException ie) {
- dmidecodeThread.interrupt();
- }
- }
-
- if (dmiInfo.length() == 0) {
- return "";
- }
- boolean dmiFlag = false;
- for (String s : dmiInfo.split("\n")) {
- String line = s.toLowerCase();
- if (dmiFlag) {
- if (line.contains(target)) {
- String key = target + ":";
- int indx = line.indexOf(key) + key.length();
- if (line.contains(key) && indx < line.length()) {
- return line.substring(indx).trim();
- }
- String[] ss = line.split(":");
- return ss[ss.length-1];
- }
- } else if (line.contains(dmiType)) {
- dmiFlag = true;
- }
- }
- return "";
- }
-
-}
diff --git a/setup_native/source/registration/com/sun/star/servicetag/RegistrationData.java b/setup_native/source/registration/com/sun/star/servicetag/RegistrationData.java
deleted file mode 100644
index 57be724a78a3..000000000000
--- a/setup_native/source/registration/com/sun/star/servicetag/RegistrationData.java
+++ /dev/null
@@ -1,473 +0,0 @@
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2008 by Sun Microsystems, Inc.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * $RCSfile: RegistrationData.java,v $
- *
- * $Revision: 1.2 $
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-package com.sun.star.servicetag;
-
-import java.io.*;
-import java.net.UnknownHostException;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.LinkedHashMap;
-import java.util.Map;
-import java.util.Set;
-
-import static com.sun.star.servicetag.RegistrationDocument.*;
-
-/**
- * A {@code RegistrationData} object is a container of one or more
- * {@link #getServiceTags service tags} that identify the
- * components for product registration.
- * Each {@code RegistrationData} object has a {@link #getRegistrationURN
- * uniform resource name} (URN) as its identifier.
- * <a name="EnvMap"></a>
- * It also has an <i>environment map</i> with
- * the following elements:
- * <blockquote>
- * <table border=0>
- * <tr>
- * <td><tt>hostname</tt></td>
- * <td>Hostname of the system</td>
- * <td>e.g. woody</td>
- * </tr>
- * <tr>
- * <td><tt>hostId</tt></td>
- * <td>Host ID of the system</td>
- * <td>e.g. 83abc1ab</td>
- * </tr>
- * <tr>
- * <td><tt>osName</tt></td>
- * <td>Operating system name</td>
- * <td> e.g. SunOS</td>
- * </tr>
- * <tr>
- * <td><tt>osVersion</tt></td>
- * <td>Operating system version</td>
- * <td> e.g. 5.10</td>
- * </tr>
- * <tr>
- * <td><tt>osArchitecture</tt></td>
- * <td>Operating system architecture</td>
- * <td> e.g. sparc</td>
- * </tr>
- * <tr>
- * <td><tt>systemModel</tt></td>
- * <td>System model</td>
- * <td> e.g. SUNW,Sun-Fire-V440</td>
- * </tr>
- * <tr>
- * <td><tt>systemManufacturer</tt></td>
- * <td>System manufacturer</td>
- * <td> e.g. Sun Microsystems</td>
- * </tr>
- * <tr>
- * <td><tt>cpuManufacturer</tt></td>
- * <td>CPU manufacturer</td>
- * <td> e.g. Sun Microsystems</td>
- * </tr>
- * <tr>
- * <td><tt>serialNumber</tt></td>
- * <td>System serial number</td>
- * <td> e.g. BEL078932</td>
- * </tr>
- * </table>
- * </blockquote>
- * The <tt>hostname</tt> and <tt>osName</tt> element must have a non-empty value.
- * If an element is not available on a system and their value will be
- * empty.
- * <p>
- * <a name="XMLSchema">
- * <b>Registration XML Schema</b></a>
- * <p>
- * A {@code RegistrationData} object can be {@link #loadFromXML loaded} from
- * and {@link #storeToXML stored} into an XML file in the format described
- * by the
- * <a href="https://sn-tools.central.sun.com/twiki/pub/ServiceTags/RegistrationRelayService/product_registration.xsd">
- * registration data schema</a>. The registration data schema is defined by the
- * Service Tags Technology.
- * <p>
- * Typically the registration data is constructed at installation time
- * and stored in an XML file for later service tag lookup or registration.
- *
- * <p>
- * <b>Example Usage</b>
- * <p>
- * The examples below show how the {@code RegistrationData} can be
- * used for product registration.
- * Exception handling is not shown in these examples for clarity.
- * <ol>
- * <li>This example shows how the JDK creates a JDK service tag, installs it
- * in the system service tag registry and adds it to the registration data.
- * <br>
- * <blockquote><pre>
- * // create a service tag object with an instance_urn
- * ServiceTag st = ServiceTag.newInstance(ServiceTag.generateInstanceURN(),
- * ....);
- * // Adds to the system service tag registry if supported
- * if (Registry.isSupported()) {
- * Registry.getSystemRegistry().addServiceTag(st);
- * }
- *
- * // add to the registration data
- * RegistrationData registration = new RegistrationData();
- * registration.addServiceTag(st);
- * </pre></blockquote>
- * </li>
- * <li>At this point, the registration data is ready to
- * send to Sun Connection for registration. This example shows how to register
- * the JDK via the <i>Registration Relay Service</i>.
- * <p>
- * There are several registration services for Sun Connection. For example,
- * the <a href="https://sn-tools.central.sun.com/twiki/bin/view/ServiceTags/RegistrationRelayService">
- * Registration Relay Service</a> is a web application interface that
- * processes the registration data payload sent via HTTP post
- * and hosts the registration user interface for a specified
- * registration URL. Refer to the
- * Registration Relay Service Specification for details.
- * <p>
- * <blockquote><pre>
- * // Open the connection to the URL of the registration service
- * HttpsURLConnection con = (HttpsURLConnection) url.openConnection();
- * con.setDoInput(true);
- * con.setDoOutput(true);
- * con.setUseCaches(false);
- * con.setAllowUserInteraction(false);
- * con.setRequestMethod("POST");
- * con.setRequestProperty("Content-Type", "text/xml;charset=\"utf-8\"");
- * con.connect();
- *
- * // send the registration data to the registration service
- * OutputStream out = con.getOutputStream();
- * registration.storeToXML(out);
- * out.close();
- * </pre></blockquote>
- * </li>
- * <li>This example shows how to store the registration data in an XML file.
- * for later service tag lookup or registration.
- * <br>
- * <blockquote><pre>
- * BufferedOutputStream out = new BufferedOutputStream(
- * new FileOutputStream(""&lt;JAVA_HOME&gt;/lib/servicetag/registration.xml"));
- * registration.storeToXML(out);
- * out.close();
- * </pre></blockquote>
- * </li>
- * <li>This example shows how to install service tags that are in the
- * registration data in the system service tag registry when determined
- * to be available. The system service tag registry might not have existed
- * when the registration data was constructed.
- * <br>
- * <blockquote><pre>
- * if (Registry.isSupported()) {
- * Set&lt;ServiceTag&gt; svctags = registration.getServiceTags();
- * for (ServiceTag st : svctags) {
- * Registry.getSystemRegistry().addServiceTag(st);
- * }
- * }
- * </pre></blockquote>
- * </li>
- * </ol>
- *
- * @see <a href="https://sunconnection.sun.com/inventory">Sun Connection Inventory Channel</a>
- */
-public class RegistrationData {
- private final Map<String, String> environment;
- private final Map<String, ServiceTag> svcTagMap;
- private final String urn;
-
- /**
- * Creates a {@code RegistrationData} object with a generated
- * {@link #getRegistrationURN registration URN}.
- * The following keys in the {@link #getEnvironmentMap environment map}
- * will be initialized for the configuration of the
- * running system:
- * <blockquote>
- * <tt>hostname</tt>, <tt>osName</tt>, <tt>osVersion</tt> and
- * <tt>osArchitecture</tt>
- * </blockquote>
- * and the value of other keys may be empty.
- */
- public RegistrationData() {
- this(Util.generateURN());
- }
-
- // package private
- RegistrationData(String urn) {
- this.urn = urn;
- this.environment = initEnvironment();
- this.svcTagMap = new LinkedHashMap<String, ServiceTag>();
- }
-
- private Map<String, String> initEnvironment() {
- Map<String, String> map = new LinkedHashMap<String, String>();
- SystemEnvironment sysEnv = SystemEnvironment.getSystemEnvironment();
- map.put(ST_NODE_HOSTNAME, sysEnv.getHostname());
- map.put(ST_NODE_HOST_ID, sysEnv.getHostId());
- map.put(ST_NODE_OS_NAME, sysEnv.getOsName());
- map.put(ST_NODE_OS_VERSION, sysEnv.getOsVersion());
- map.put(ST_NODE_OS_ARCH, sysEnv.getOsArchitecture());
- map.put(ST_NODE_SYSTEM_MODEL, sysEnv.getSystemModel());
- map.put(ST_NODE_SYSTEM_MANUFACTURER, sysEnv.getSystemManufacturer());
- map.put(ST_NODE_CPU_MANUFACTURER, sysEnv.getCpuManufacturer());
- map.put(ST_NODE_SERIAL_NUMBER, sysEnv.getSerialNumber());
- return map;
- }
-
- /**
- * Returns the uniform resource name of this registration data
- * in this format:
- * <tt>urn:st:&lt;32-char {@link java.util.UUID uuid}&gt;</tt>
- *
- * @return the URN of this registration data.
- */
- public String getRegistrationURN() {
- return urn;
- }
-
- /**
- * Returns a map containing the environment information for this
- * registration data. See the set of <a href="#EnvMap">keys</a>
- * in the environment map. Subsequent update to the environment
- * map via the {@link #setEnvironment setEnvironment} method will not be reflected
- * in the returned map.
- *
- * @return an environment map for this registration data.
- */
- public Map<String, String> getEnvironmentMap() {
- return new LinkedHashMap<String,String>(environment);
- }
-
- /**
- * Sets an element of the specified {@code name} in the environment map
- * with the given {@code value}.
- *
- * @throws IllegalArgumentException if {@code name} is not a valid key
- * in the environment map, or {@code value} is not valid.
- */
- public void setEnvironment(String name, String value) {
- if (name == null) {
- throw new NullPointerException("name is null");
- }
- if (value == null) {
- throw new NullPointerException("value is null");
- }
- if (environment.containsKey(name)) {
- if (name.equals(ST_NODE_HOSTNAME) || name.equals(ST_NODE_OS_NAME)) {
- if (value.length() == 0) {
- throw new IllegalArgumentException("\"" +
- name + "\" requires non-empty value.");
- }
- }
- environment.put(name, value);
- } else {
- throw new IllegalArgumentException("\"" +
- name + "\" is not an environment element.");
- }
- }
-
- /**
- * Returns all service tags in this registration data.
- *
- * @return a {@link Set Set} of the service tags
- * in this registration data.
- */
- public Set<ServiceTag> getServiceTags() {
- return new HashSet<ServiceTag>(svcTagMap.values());
- }
-
- /**
- * Adds a service tag to this registration data.
- * If the given service tag has an empty <tt>instance_urn</tt>,
- * this method will generate a URN and place it in the copy
- * of the service tag in this registration data.
- * This method will return the {@code ServiceTag} object
- * added to this registration data.
- *
- * @param st {@code ServiceTag} object to be added.
- * @return a {@code ServiceTag} object added to this registration data.
- *
- * @throws IllegalArgumentException if
- * a service tag of the same {@link ServiceTag#getInstanceURN
- * <tt>instance_urn</tt>} already exists in the registry.
- */
- public synchronized ServiceTag addServiceTag(ServiceTag st) {
- ServiceTag svcTag = ServiceTag.newInstanceWithUrnTimestamp(st);
-
- String instanceURN = svcTag.getInstanceURN();
- if (svcTagMap.containsKey(instanceURN)) {
- throw new IllegalArgumentException("Instance_urn = " + instanceURN +
- " already exists in the registration data.");
- } else {
- svcTagMap.put(instanceURN, svcTag);
- }
- return svcTag;
- }
-
- /**
- * Returns a service tag of the given <tt>instance_urn</tt> in this registration
- * data.
- *
- * @param instanceURN the <tt>instance_urn</tt> of the service tag
- * @return the {@code ServiceTag} object of the given <tt>instance_urn</tt>
- * if exists; otherwise return {@code null}.
- */
- public synchronized ServiceTag getServiceTag(String instanceURN) {
- if (instanceURN == null) {
- throw new NullPointerException("instanceURN is null");
- }
- return svcTagMap.get(instanceURN);
- }
-
- /**
- * Removes a service tag of the given <tt>instance_urn</tt> from this
- * registration data.
- *
- * @param instanceURN the <tt>instance_urn</tt> of
- * the service tag to be removed.
- *
- * @return the removed {@code ServiceTag} object;
- * or {@code null} if the service tag does not exist in this
- * registration data.
- */
- public synchronized ServiceTag removeServiceTag(String instanceURN) {
- if (instanceURN == null) {
- throw new NullPointerException("instanceURN is null");
- }
-
- ServiceTag svcTag = null;
- if (svcTagMap.containsKey(instanceURN)) {
- svcTag = svcTagMap.remove(instanceURN);
- }
- return svcTag;
- }
-
- /**
- * Updates the <tt>product_defined_instance_id</tt> in the service tag
- * of the given <tt>instance_urn</tt> in this registration data.
- *
- * @param instanceURN the <tt>instance_urn</tt> of the service tag to be updated.
- * @param productDefinedInstanceID the value of the
- * <tt>product_defined_instance_id</tt> to be set.
- *
- * @return the updated {@code ServiceTag} object;
- * or {@code null} if the service tag does not exist in this
- * registration data.
- */
- public synchronized ServiceTag updateServiceTag(String instanceURN,
- String productDefinedInstanceID) {
- ServiceTag svcTag = getServiceTag(instanceURN);
- if (svcTag == null) {
- return null;
- }
-
- svcTag = ServiceTag.newInstanceWithUrnTimestamp(svcTag);
- // update the product defined instance ID field
- svcTag.setProductDefinedInstanceID(productDefinedInstanceID);
- svcTagMap.put(instanceURN, svcTag);
- return svcTag;
- }
-
- /**
- * Reads the registration data from the XML document on the
- * specified input stream. The XML document must be
- * in the format described by the <a href="#XMLSchema">
- * registration data schema</a>.
- * The specified stream is closed after this method returns.
- *
- * @param in the input stream from which to read the XML document.
- * @return a {@code RegistrationData} object read from the input
- * stream.
- *
- * @throws IllegalArgumentException if the input stream
- * contains an invalid registration data.
- *
- * @throws IOException if an error occurred when reading from the input stream.
- */
- public static RegistrationData loadFromXML(InputStream in) throws IOException {
- try {
- return RegistrationDocument.load(in);
- } finally {
- in.close();
- }
- }
-
- /**
- * Writes the registration data to the specified output stream
- * in the format described by the <a href="#XMLSchema">
- * registration data schema</a> with "UTF-8" encoding.
- * The specified stream remains open after this method returns.
- *
- * @param os the output stream on which to write the XML document.
- *
- * @throws IOException if an error occurred when writing to the output stream.
- */
- public void storeToXML(OutputStream os) throws IOException {
- RegistrationDocument.store(os, this);
- os.flush();
- }
-
- /**
- * Returns a newly allocated byte array containing the registration
- * data in XML format.
- *
- * @return a newly allocated byte array containing the registration
- * data in XML format.
- */
- public byte[] toXML() {
- try {
- ByteArrayOutputStream out = new ByteArrayOutputStream();
- storeToXML(out);
- return out.toByteArray();
- } catch (IOException e) {
- // should not reach here
- return new byte[0];
- }
- }
-
- /**
- * Returns a string representation of this registration data in XML
- * format.
- *
- * @return a string representation of this registration data in XML
- * format.
- */
- @Override
- public String toString() {
- try {
- ByteArrayOutputStream out = new ByteArrayOutputStream();
- storeToXML(out);
- return out.toString("UTF-8");
- } catch (IOException e) {
- // should not reach here
- return "Error creating the return string.";
- }
- }
-}
diff --git a/setup_native/source/registration/com/sun/star/servicetag/RegistrationDocument.java b/setup_native/source/registration/com/sun/star/servicetag/RegistrationDocument.java
deleted file mode 100644
index 240eebf4e65c..000000000000
--- a/setup_native/source/registration/com/sun/star/servicetag/RegistrationDocument.java
+++ /dev/null
@@ -1,374 +0,0 @@
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2008 by Sun Microsystems, Inc.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * $RCSfile: RegistrationDocument.java,v $
- *
- * $Revision: 1.2 $
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-package com.sun.star.servicetag;
-
-import java.io.*;
-import java.net.URL;
-import java.util.Collection;
-import java.util.Map;
-import java.util.Set;
-
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.xml.sax.SAXException;
-import org.xml.sax.InputSource;
-
-import javax.xml.XMLConstants;
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.validation.Schema;
-import javax.xml.validation.SchemaFactory;
-import javax.xml.validation.Validator;
-
-// For write operation
-import javax.xml.transform.OutputKeys;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerException;
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.TransformerConfigurationException;
-import javax.xml.transform.dom.DOMSource;
-import javax.xml.transform.stream.StreamResult;
-
-/**
- * XML Support Class for Product Registration.
- */
-class RegistrationDocument {
-
- private static final String REGISTRATION_DATA_SCHEMA =
- "/com/sun/star/servicetag/resources/product_registration.xsd";
- private static final String REGISTRATION_DATA_VERSION = "1.0";
- private static final String SERVICE_TAG_VERSION = "1.0";
- final static String ST_NODE_REGISTRATION_DATA = "registration_data";
- final static String ST_ATTR_REGISTRATION_VERSION = "version";
- final static String ST_NODE_ENVIRONMENT = "environment";
- final static String ST_NODE_HOSTNAME = "hostname";
- final static String ST_NODE_HOST_ID = "hostId";
- final static String ST_NODE_OS_NAME = "osName";
- final static String ST_NODE_OS_VERSION = "osVersion";
- final static String ST_NODE_OS_ARCH = "osArchitecture";
- final static String ST_NODE_SYSTEM_MODEL = "systemModel";
- final static String ST_NODE_SYSTEM_MANUFACTURER = "systemManufacturer";
- final static String ST_NODE_CPU_MANUFACTURER = "cpuManufacturer";
- final static String ST_NODE_SERIAL_NUMBER = "serialNumber";
- final static String ST_NODE_REGISTRY = "registry";
- final static String ST_ATTR_REGISTRY_URN = "urn";
- final static String ST_ATTR_REGISTRY_VERSION = "version";
- final static String ST_NODE_SERVICE_TAG = "service_tag";
- final static String ST_NODE_INSTANCE_URN = "instance_urn";
- final static String ST_NODE_PRODUCT_NAME = "product_name";
- final static String ST_NODE_PRODUCT_VERSION = "product_version";
- final static String ST_NODE_PRODUCT_URN = "product_urn";
- final static String ST_NODE_PRODUCT_PARENT_URN = "product_parent_urn";
- final static String ST_NODE_PRODUCT_PARENT = "product_parent";
- final static String ST_NODE_PRODUCT_DEFINED_INST_ID = "product_defined_inst_id";
- final static String ST_NODE_PRODUCT_VENDOR = "product_vendor";
- final static String ST_NODE_PLATFORM_ARCH = "platform_arch";
- final static String ST_NODE_TIMESTAMP = "timestamp";
- final static String ST_NODE_CONTAINER = "container";
- final static String ST_NODE_SOURCE = "source";
- final static String ST_NODE_INSTALLER_UID = "installer_uid";
-
- static RegistrationData load(InputStream in) throws IOException {
- Document document = initializeDocument(in);
-
- // Gets the registration URN
- Element root = getRegistrationDataRoot(document);
- Element registryRoot =
- getSingletonElementFromRoot(root, ST_NODE_REGISTRY);
- String urn = registryRoot.getAttribute(ST_ATTR_REGISTRY_URN);
-
- // Construct a new RegistrationData object from the DOM tree
- // Initialize the environment map and service tags
- RegistrationData regData = new RegistrationData(urn);
- addServiceTags(registryRoot, regData);
-
- Element envRoot = getSingletonElementFromRoot(root, ST_NODE_ENVIRONMENT);
- buildEnvironmentMap(envRoot, regData);
- return regData;
- }
-
- static void store(OutputStream os, RegistrationData registration)
- throws IOException {
- // create a new document with the root node
- Document document = initializeDocument();
-
- // create the nodes for the environment map and the service tags
- // in the registration data
- addEnvironmentNodes(document,
- registration.getEnvironmentMap());
- addServiceTagRegistry(document,
- registration.getRegistrationURN(),
- registration.getServiceTags());
- transform(document, os);
- }
-
- // initialize a document from an input stream
- private static Document initializeDocument(InputStream in) throws IOException {
- DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
- try {
- // XML schema for validation
- SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
- URL xsdUrl = RegistrationDocument.class.getResource(REGISTRATION_DATA_SCHEMA);
- Schema schema = sf.newSchema(xsdUrl);
- Validator validator = schema.newValidator();
-
- DocumentBuilder builder = factory.newDocumentBuilder();
- Document doc = builder.parse(new InputSource(in));
- validator.validate(new DOMSource(doc));
- return doc;
- } catch (SAXException sxe) {
- IllegalArgumentException e = new IllegalArgumentException("Error generated in parsing");
- e.initCause(sxe);
- throw e;
- } catch (ParserConfigurationException pce) {
- // Parser with specific options can't be built
- // should not reach here
- InternalError x = new InternalError("Error in creating the new document");
- x.initCause(pce);
- throw x;
- }
- }
-
- // initialize a new document for the registration data
- private static Document initializeDocument() throws IOException {
- DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
- try {
- DocumentBuilder builder = factory.newDocumentBuilder();
- Document doc = builder.newDocument();
-
- // initialize the document with the registration_data root
- Element root = doc.createElement(ST_NODE_REGISTRATION_DATA);
- doc.appendChild(root);
- root.setAttribute(ST_ATTR_REGISTRATION_VERSION, REGISTRATION_DATA_VERSION);
-
- return doc;
- } catch (ParserConfigurationException pce) {
- // Parser with specified options can't be built
- // should not reach here
- InternalError x = new InternalError("Error in creating the new document");
- x.initCause(pce);
- throw x;
- }
- }
-
- // Transform the current DOM tree with the given output stream.
- private static void transform(Document document, OutputStream os) {
- try {
- // Use a Transformer for output
- TransformerFactory tFactory = TransformerFactory.newInstance();
- tFactory.setAttribute("indent-number", new Integer(3));
-
- Transformer transformer = tFactory.newTransformer();
-
- transformer.setOutputProperty(OutputKeys.INDENT, "yes");
- transformer.setOutputProperty(OutputKeys.METHOD, "xml");
- transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
- transformer.setOutputProperty(OutputKeys.STANDALONE, "yes");
- transformer.transform(new DOMSource(document),
- new StreamResult(new BufferedWriter(new OutputStreamWriter(os, "UTF-8"))));
- } catch (UnsupportedEncodingException ue) {
- // Should not reach here
- InternalError x = new InternalError("Error generated during transformation");
- x.initCause(ue);
- throw x;
- } catch (TransformerConfigurationException tce) {
- // Error generated by the parser
- // Should not reach here
- InternalError x = new InternalError("Error in creating the new document");
- x.initCause(tce);
- throw x;
- } catch (TransformerException te) {
- // Error generated by the transformer
- InternalError x = new InternalError("Error generated during transformation");
- x.initCause(te);
- throw x;
- }
- }
-
- private static void addServiceTagRegistry(Document document,
- String registryURN,
- Set<ServiceTag> svcTags) {
- // add service tag registry node and its attributes
- Element reg = document.createElement(ST_NODE_REGISTRY);
- reg.setAttribute(ST_ATTR_REGISTRY_URN, registryURN);
- reg.setAttribute(ST_ATTR_REGISTRY_VERSION, SERVICE_TAG_VERSION);
-
- Element root = getRegistrationDataRoot(document);
- root.appendChild(reg);
-
- // adds the elements for the service tags
- for (ServiceTag st : svcTags) {
- addServiceTagElement(document, reg, st);
- }
- }
-
- private static void addServiceTagElement(Document document,
- Element registryRoot,
- ServiceTag st) {
- Element svcTag = document.createElement(ST_NODE_SERVICE_TAG);
- registryRoot.appendChild(svcTag);
- addChildElement(document, svcTag,
- ST_NODE_INSTANCE_URN, st.getInstanceURN());
- addChildElement(document, svcTag,
- ST_NODE_PRODUCT_NAME, st.getProductName());
- addChildElement(document, svcTag,
- ST_NODE_PRODUCT_VERSION, st.getProductVersion());
- addChildElement(document, svcTag,
- ST_NODE_PRODUCT_URN, st.getProductURN());
- addChildElement(document, svcTag,
- ST_NODE_PRODUCT_PARENT_URN, st.getProductParentURN());
- addChildElement(document, svcTag,
- ST_NODE_PRODUCT_PARENT, st.getProductParent());
- addChildElement(document, svcTag,
- ST_NODE_PRODUCT_DEFINED_INST_ID,
- st.getProductDefinedInstanceID());
- addChildElement(document, svcTag,
- ST_NODE_PRODUCT_VENDOR, st.getProductVendor());
- addChildElement(document, svcTag,
- ST_NODE_PLATFORM_ARCH, st.getPlatformArch());
- addChildElement(document, svcTag,
- ST_NODE_TIMESTAMP, Util.formatTimestamp(st.getTimestamp()));
- addChildElement(document, svcTag,
- ST_NODE_CONTAINER, st.getContainer());
- addChildElement(document, svcTag,
- ST_NODE_SOURCE, st.getSource());
- addChildElement(document, svcTag,
- ST_NODE_INSTALLER_UID,
- String.valueOf(st.getInstallerUID()));
- }
-
- private static void addChildElement(Document document, Element root,
- String element, String text) {
- Element node = document.createElement(element);
- node.appendChild(document.createTextNode(text));
- root.appendChild(node);
- }
-
- // Constructs service tags from the document
- private static void addServiceTags(Element registryRoot,
- RegistrationData registration) {
- NodeList children = registryRoot.getElementsByTagName(ST_NODE_SERVICE_TAG);
- int length = (children == null ? 0 : children.getLength());
- for (int i = 0; i < length; i++) {
- Element svcTagElement = (Element) children.item(i);
- ServiceTag st = getServiceTag(svcTagElement);
- registration.addServiceTag(st);
- }
- }
-
- // build environment map from the document
- private static void buildEnvironmentMap(Element envRoot,
- RegistrationData registration) {
- registration.setEnvironment(ST_NODE_HOSTNAME, getTextValue(envRoot, ST_NODE_HOSTNAME));
- registration.setEnvironment(ST_NODE_HOST_ID, getTextValue(envRoot, ST_NODE_HOST_ID));
- registration.setEnvironment(ST_NODE_OS_NAME, getTextValue(envRoot, ST_NODE_OS_NAME));
- registration.setEnvironment(ST_NODE_OS_VERSION, getTextValue(envRoot, ST_NODE_OS_VERSION));
- registration.setEnvironment(ST_NODE_OS_ARCH, getTextValue(envRoot, ST_NODE_OS_ARCH));
- registration.setEnvironment(ST_NODE_SYSTEM_MODEL, getTextValue(envRoot, ST_NODE_SYSTEM_MODEL));
- registration.setEnvironment(ST_NODE_SYSTEM_MANUFACTURER, getTextValue(envRoot, ST_NODE_SYSTEM_MANUFACTURER));
- registration.setEnvironment(ST_NODE_CPU_MANUFACTURER, getTextValue(envRoot, ST_NODE_CPU_MANUFACTURER));
- registration.setEnvironment(ST_NODE_SERIAL_NUMBER, getTextValue(envRoot, ST_NODE_SERIAL_NUMBER));
- }
-
- // add the nodes representing the environment map in the document
- private static void addEnvironmentNodes(Document document,
- Map<String, String> envMap) {
- Element root = getRegistrationDataRoot(document);
- Element env = document.createElement(ST_NODE_ENVIRONMENT);
- root.appendChild(env);
- Set<Map.Entry<String, String>> keys = envMap.entrySet();
- for (Map.Entry<String, String> entry : keys) {
- addChildElement(document, env, entry.getKey(), entry.getValue());
- }
- }
-
- private static Element getRegistrationDataRoot(Document doc) {
- Element root = doc.getDocumentElement();
- if (!root.getNodeName().equals(ST_NODE_REGISTRATION_DATA)) {
- throw new IllegalArgumentException("Not a " +
- ST_NODE_REGISTRATION_DATA +
- " node \"" + root.getNodeName() + "\"");
- }
- return root;
- }
-
- private static Element getSingletonElementFromRoot(Element root, String name) {
- NodeList children = root.getElementsByTagName(name);
- int length = (children == null ? 0 : children.getLength());
- if (length != 1) {
- throw new IllegalArgumentException("Invalid number of " + name +
- " nodes = " + length);
- }
- Element e = (Element) children.item(0);
- if (!e.getNodeName().equals(name)) {
- throw new IllegalArgumentException("Not a " + name +
- " node \"" + e.getNodeName() + "\"");
- }
- return e;
- }
-
- // Constructs one ServiceTag instance from a service tag element root
- private static ServiceTag getServiceTag(Element svcTagElement) {
- return new ServiceTag(
- getTextValue(svcTagElement, ST_NODE_INSTANCE_URN),
- getTextValue(svcTagElement, ST_NODE_PRODUCT_NAME),
- getTextValue(svcTagElement, ST_NODE_PRODUCT_VERSION),
- getTextValue(svcTagElement, ST_NODE_PRODUCT_URN),
- getTextValue(svcTagElement, ST_NODE_PRODUCT_PARENT),
- getTextValue(svcTagElement, ST_NODE_PRODUCT_PARENT_URN),
- getTextValue(svcTagElement, ST_NODE_PRODUCT_DEFINED_INST_ID),
- getTextValue(svcTagElement, ST_NODE_PRODUCT_VENDOR),
- getTextValue(svcTagElement, ST_NODE_PLATFORM_ARCH),
- getTextValue(svcTagElement, ST_NODE_CONTAINER),
- getTextValue(svcTagElement, ST_NODE_SOURCE),
- Util.getIntValue(getTextValue(svcTagElement, ST_NODE_INSTALLER_UID)),
- Util.parseTimestamp(getTextValue(svcTagElement, ST_NODE_TIMESTAMP))
- );
- }
-
- private static String getTextValue(Element e, String tagName) {
- String value = "";
- NodeList nl = e.getElementsByTagName(tagName);
- if (nl != null && nl.getLength() > 0) {
- Element el = (Element) nl.item(0);
- Node node = el.getFirstChild();
- if (node != null) {
- value = node.getNodeValue();
- }
- }
- return value;
- }
-}
diff --git a/setup_native/source/registration/com/sun/star/servicetag/Registry.java b/setup_native/source/registration/com/sun/star/servicetag/Registry.java
deleted file mode 100644
index c118dc2e2575..000000000000
--- a/setup_native/source/registration/com/sun/star/servicetag/Registry.java
+++ /dev/null
@@ -1,558 +0,0 @@
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2008 by Sun Microsystems, Inc.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * $RCSfile: Registry.java,v $
- *
- * $Revision: 1.2 $
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-package com.sun.star.servicetag;
-
-import java.io.*;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Properties;
-import java.util.Set;
-
-import static com.sun.star.servicetag.Util.*;
-import static com.sun.star.servicetag.RegistrationDocument.*;
-
-/**
- * A service tag registry is a XML-based registry containing
- * the list of {@link ServiceTag service tags} installed in the system.
- * The {@code Registry} class provides interfaces
- * to add, remove, update, and get a service tag from a service tag
- * registry.
- * This {@code Registry} class may not be supported
- * on all systems. The {@link #isSupported} method
- * can be called to determine if it is supported.
- * <p>
- * A registry may implement restrictions to only allow certain users
- * to {@link #updateServiceTag update} and
- * to {@link #removeServiceTag remove} a service tag record. Typically,
- * only the owner of the service tag, the owner of the registry
- * and superuser are authorized to update or remove a service tag in
- * the registry.
- *
- * @see <a href="https://sn-tools.central.sun.com/twiki/bin/view/ServiceTags/ServiceTagDevGuideHelper">
- * Service Tag User Guide</a>
- */
-public class Registry {
-
- private static final String STCLIENT_SOLARIS = "/usr/bin/stclient";
- private static final String STCLIENT_LINUX = "/opt/sun/servicetag/bin/stclient";
- // stclient exit value (see sthelper.h)
- private static final int ST_ERR_NOT_AUTH = 245;
- private static final int ST_ERR_REC_NOT_FOUND = 225;
-
- // The stclient output has to be an exported interface
- private static final String INSTANCE_URN_DESC = "Product instance URN=";
- private static boolean initialized = false;
- private static boolean supportsHelperClass = true; // default
- private static File stclient = null;
- private static String stclientPath = null;
- private static Registry registry = new Registry();
-
- // System properties for testing
- private static String SVCTAG_STCLIENT_CMD = "servicetag.stclient.cmd";
- private static String SVCTAG_STHELPER_SUPPORTED = "servicetag.sthelper.supported";
-
- private Registry() {
- }
-
- private synchronized static String getSTclient() {
- if (!initialized) {
- // the system property always overrides the default setting
- if (System.getProperty(SVCTAG_STHELPER_SUPPORTED) != null) {
- supportsHelperClass = Boolean.getBoolean(SVCTAG_STHELPER_SUPPORTED);
- }
-
- // This is only used for testing
- stclientPath = System.getProperty(SVCTAG_STCLIENT_CMD);
- if (stclientPath != null) {
- return stclientPath;
- }
-
- // Initialization to determine the platform's stclient pathname
- String os = System.getProperty("os.name");
- if (os.equals("SunOS")) {
- stclient = new File(STCLIENT_SOLARIS);
- } else if (os.equals("Linux")) {
- stclient = new File(STCLIENT_LINUX);
- } else if (os.startsWith("Windows")) {
- stclient = getWindowsStClientFile();
- } else {
- if (isVerbose()) {
- System.out.println("Running on non-Sun JDK");
- }
- }
- initialized = true;
- }
-
- // com.sun.servicetag package has to be compiled with JDK 5 as well
- // JDK 5 doesn't support the File.canExecute() method.
- // Risk not checking isExecute() for the stclient command is very low.
-
- if (stclientPath == null && stclient != null && stclient.exists()) {
- stclientPath = stclient.getAbsolutePath();
- }
- return stclientPath;
- }
-
- /**
- * Returns the system service tag registry. The {@code Registry} class
- * may not be supported on some platforms; use the {@link #isSupported}
- * method to determine if it is supported.
- *
- * @return the {@code Registry} object for the system service tag registry.
- *
- * @throws UnsupportedOperationException if the {@code Registry} class is
- * not supported.
- */
- public static Registry getSystemRegistry() {
- if (isSupported()) {
- return registry;
- } else {
- throw new UnsupportedOperationException("Registry class is not supported");
- }
- }
-
- /**
- * Returns {@code true} if the {@code Registry} class is supported on this system.
- *
- * @return {@code true} if the {@code Registry} class is supported;
- * otherwise, return {@code false}.
- */
- public static boolean isSupported() {
- return (getSTclient() != null && supportsHelperClass);
- }
-
- private static List<String> getCommandList() {
- // Set up the arguments to call stclient
- List<String> command = new ArrayList<String>();
- if (System.getProperty(SVCTAG_STCLIENT_CMD) != null) {
- // This is for jtreg testing use. This will be set to something
- // like:
- // $JAVA_HOME/bin/java -cp $TEST_DIR \
- // -Dstclient.registry.path=$TEST_DIR/registry.xml \
- // SvcTagClient
- //
- // On Windows, the JAVA_HOME and TEST_DIR path could contain
- // space e.g. c:\Program Files\Java\jdk1.6.0_05\bin\java.
- // The SVCTAG_STCLIENT_CMD must be set with a list of
- // space-separated parameters. If a parameter contains spaces,
- // it must be quoted with '"'.
-
- String cmd = getSTclient();
- int len = cmd.length();
- int i = 0;
- while (i < len) {
- char separator = ' ';
- if (cmd.charAt(i) == '"') {
- separator = '"';
- i++;
- }
- // look for the separator or matched the closing '"'
- int j;
- for (j = i+1; j < len; j++) {
- if (cmd.charAt(j) == separator) {
- break;
- }
- }
-
- if (i == j-1) {
- // add an empty parameter
- command.add("\"\"");
- } else {
- // double quotes and space are not included
- command.add(cmd.substring(i,j));
- }
-
- // skip spaces
- for (i = j+1; i < len; i++) {
- if (!Character.isSpaceChar(cmd.charAt(i))) {
- break;
- }
- }
- }
- if (isVerbose()) {
- System.out.println("Command list:");
- for (String s : command) {
- System.out.println(s);
- }
- }
- } else {
- command.add(getSTclient());
- }
- return command;
- }
-
- // Returns null if the service tag record not found;
- // or throw UnauthorizedAccessException or IOException
- // based on the exitValue.
- private static ServiceTag checkReturnError(int exitValue,
- String output,
- ServiceTag st) throws IOException {
- switch (exitValue) {
- case ST_ERR_REC_NOT_FOUND:
- return null;
- case ST_ERR_NOT_AUTH:
- if (st != null) {
- throw new UnauthorizedAccessException(
- "Not authorized to access " + st.getInstanceURN() +
- " installer_uid=" + st.getInstallerUID());
- } else {
- throw new UnauthorizedAccessException(
- "Not authorized:" + output);
- }
- default:
- throw new IOException("stclient exits with error" +
- " (" + exitValue + ")\n" + output);
- }
- }
-
- /**
- * Adds a service tag to this registry.
- * If the given service tag has an empty <tt>instance_urn</tt>,
- * this helper class will generate a URN and place it in the
- * copy of the service tag in this registry.
- * This method will return the {@code ServiceTag} representing
- * the service tag entry to this registry.
- *
- * @param st {@code ServiceTag} object
- * @return a {@code ServiceTag} object representing the service tag
- * entry to this registry.
- *
- * @throws IllegalArgumentException if a service tag of the same
- * <tt>instance_urn</tt> already exists in this registry.
- *
- * @throws java.io.IOException if an I/O error occurs in this operation.
- */
- public ServiceTag addServiceTag(ServiceTag st) throws IOException {
- List<String> command = getCommandList();
- command.add("-a");
- if (st.getInstanceURN().length() > 0) {
- ServiceTag sysSvcTag = getServiceTag(st.getInstanceURN());
- if (sysSvcTag != null) {
- throw new IllegalArgumentException("Instance_urn = " +
- st.getInstanceURN() + " already exists");
- }
- command.add("-i");
- command.add(st.getInstanceURN());
- }
- command.add("-p");
- command.add(st.getProductName());
- command.add("-e");
- command.add(st.getProductVersion());
- command.add("-t");
- command.add(st.getProductURN());
- if (st.getProductParentURN().length() > 0) {
- command.add("-F");
- command.add(st.getProductParentURN());
- }
- command.add("-P");
- command.add(st.getProductParent());
- if (st.getProductDefinedInstanceID().length() > 0) {
- command.add("-I");
- command.add(st.getProductDefinedInstanceID());
- }
- command.add("-m");
- command.add(st.getProductVendor());
- command.add("-A");
- command.add(st.getPlatformArch());
- command.add("-z");
- command.add(st.getContainer());
- command.add("-S");
- command.add(st.getSource());
-
- BufferedReader in = null;
- try {
- ProcessBuilder pb = new ProcessBuilder(command);
- Process p = pb.start();
- String output = commandOutput(p);
- if (isVerbose()) {
- System.out.println("Output from stclient -a command:");
- System.out.println(output);
- }
- String urn = "";
- if (p.exitValue() == 0) {
- // Obtain the instance urn from the stclient output
- in = new BufferedReader(new StringReader(output));
- String line = null;
- while ((line = in.readLine()) != null) {
- line = line.trim();
- if (line.startsWith(INSTANCE_URN_DESC)) {
- urn = line.substring(INSTANCE_URN_DESC.length());
- break;
- }
- }
- if (urn.length() == 0) {
- throw new IOException("Error in creating service tag:\n" +
- output);
- }
- return getServiceTag(urn);
- } else {
- return checkReturnError(p.exitValue(), output, st);
- }
- } finally {
- if (in != null) {
- in.close();
- }
- }
- }
-
- /**
- * Removes a service tag of the given <tt>instance_urn</tt> from this
- * registry.
- *
- * @param instanceURN the <tt>instance_urn</tt> of the service tag
- * to be removed.
- *
- * @return the {@code ServiceTag} object removed from this registry;
- * or {@code null} if the service tag does not exist in this registry.
- *
- * @throws UnauthorizedAccessException if the user is not authorized to
- * remove the service tag of the given <tt>instance_urn</tt>
- * from this registry.
- *
- * @throws java.io.IOException if an I/O error occurs in this operation.
- */
- public ServiceTag removeServiceTag(String instanceURN) throws IOException {
- ServiceTag st = getServiceTag(instanceURN);
- if (st == null) {
- return null;
- }
-
- List<String> command = getCommandList();
- command.add("-d");
- command.add("-i");
- command.add(instanceURN);
-
- ProcessBuilder pb = new ProcessBuilder(command);
- Process p = pb.start();
- String output = commandOutput(p);
- if (isVerbose()) {
- System.out.println("Output from stclient -d command:");
- System.out.println(output);
- }
- if (p.exitValue() == 0) {
- return st;
- } else {
- return checkReturnError(p.exitValue(), output, st);
- }
- }
-
- /**
- * Updates the <tt>product_defined_instance_id</tt> in the service tag
- * of the specified <tt>instance_urn</tt> in this registry.
- *
- * @param instanceURN the <tt>instance_urn</tt> of the service tag to be updated.
- * @param productDefinedInstanceID the value of the
- * <tt>product_defined_instance_id</tt> to be set.
- *
- * @return the updated {@code ServiceTag} object;
- * or {@code null} if the service tag does not exist in this
- * registry.
- *
- * @throws UnauthorizedAccessException if the user is not authorized to
- * update the service tag from this registry.
- *
- * @throws IOException if an I/O error occurs in this operation.
- */
- public ServiceTag updateServiceTag(String instanceURN,
- String productDefinedInstanceID)
- throws IOException {
- ServiceTag svcTag = getServiceTag(instanceURN);
- if (svcTag == null) {
- return null;
- }
-
- List<String> command = getCommandList();
- command.add("-u");
- command.add("-i");
- command.add(instanceURN);
- command.add("-I");
- if (productDefinedInstanceID.length() > 0) {
- command.add(productDefinedInstanceID);
- } else {
- command.add("\"\"");
- }
-
- ProcessBuilder pb = new ProcessBuilder(command);
- Process p = pb.start();
- String output = commandOutput(p);
- if (isVerbose()) {
- System.out.println("Output from stclient -u command:");
- System.out.println(output);
- }
-
- if (p.exitValue() == 0) {
- return getServiceTag(instanceURN);
- } else {
- return checkReturnError(p.exitValue(), output, svcTag);
- }
- }
-
- /**
- * Returns a {@code ServiceTag} object of the given <tt>instance_urn</tt>
- * in this registry.
- *
- * @param instanceURN the <tt>instance_urn</tt> of the service tag
- * @return a {@code ServiceTag} object of the given <tt>instance_urn</tt>
- * in this registry; or {@code null} if not found.
- *
- * @throws java.io.IOException if an I/O error occurs in this operation.
- */
- public ServiceTag getServiceTag(String instanceURN) throws IOException {
- if (instanceURN == null) {
- throw new NullPointerException("instanceURN is null");
- }
-
- List<String> command = getCommandList();
- command.add("-g");
- command.add("-i");
- command.add(instanceURN);
-
- ProcessBuilder pb = new ProcessBuilder(command);
- Process p = pb.start();
- String output = commandOutput(p);
- if (isVerbose()) {
- System.out.println("Output from stclient -g command:");
- System.out.println(output);
- }
- if (p.exitValue() == 0) {
- return parseServiceTag(output);
- } else {
- return checkReturnError(p.exitValue(), output, null);
- }
- }
-
- private ServiceTag parseServiceTag(String output) throws IOException {
- BufferedReader in = null;
- try {
- Properties props = new Properties();
- // parse the service tag output from stclient
- in = new BufferedReader(new StringReader(output));
- String line = null;
- while ((line = in.readLine()) != null) {
- if ((line = line.trim()).length() > 0) {
- String[] ss = line.trim().split("=", 2);
- if (ss.length == 2) {
- props.setProperty(ss[0].trim(), ss[1].trim());
- } else {
- props.setProperty(ss[0].trim(), "");
- }
- }
- }
-
- String urn = props.getProperty(ST_NODE_INSTANCE_URN);
- String productName = props.getProperty(ST_NODE_PRODUCT_NAME);
- String productVersion = props.getProperty(ST_NODE_PRODUCT_VERSION);
- String productURN = props.getProperty(ST_NODE_PRODUCT_URN);
- String productParent = props.getProperty(ST_NODE_PRODUCT_PARENT);
- String productParentURN = props.getProperty(ST_NODE_PRODUCT_PARENT_URN);
- String productDefinedInstanceID =
- props.getProperty(ST_NODE_PRODUCT_DEFINED_INST_ID);
- String productVendor = props.getProperty(ST_NODE_PRODUCT_VENDOR);
- String platformArch = props.getProperty(ST_NODE_PLATFORM_ARCH);
- String container = props.getProperty(ST_NODE_CONTAINER);
- String source = props.getProperty(ST_NODE_SOURCE);
- int installerUID =
- Util.getIntValue(props.getProperty(ST_NODE_INSTALLER_UID));
- Date timestamp =
- Util.parseTimestamp(props.getProperty(ST_NODE_TIMESTAMP));
-
- return new ServiceTag(urn,
- productName,
- productVersion,
- productURN,
- productParent,
- productParentURN,
- productDefinedInstanceID,
- productVendor,
- platformArch,
- container,
- source,
- installerUID,
- timestamp);
- } finally {
- if (in != null) {
- in.close();
- }
- }
-
- }
-
- /**
- * Returns the service tags of the specified
- * <tt>product_urn</tt> in this registry.
- *
- * @param productURN the <tt>product_urn</tt> to look up
- * @return a {@code Set} of {@code ServiceTag} objects
- * of the specified <tt>product_urn</tt> in this registry.
- *
- * @throws java.io.IOException if an I/O error occurs in this operation.
- */
- public Set<ServiceTag> findServiceTags(String productURN) throws IOException {
- if (productURN == null) {
- throw new NullPointerException("productURN is null");
- }
-
- List<String> command = getCommandList();
- command.add("-f");
- command.add("-t");
- command.add(productURN);
-
- BufferedReader in = null;
- try {
- ProcessBuilder pb = new ProcessBuilder(command);
- Process p = pb.start();
- String output = commandOutput(p);
-
- Set<ServiceTag> instances = new HashSet<ServiceTag>();
- if (p.exitValue() == 0) {
- // parse the service tag output from stclient
- in = new BufferedReader(new StringReader(output));
- String line = null;
- while ((line = in.readLine()) != null) {
- String s = line.trim();
- if (s.startsWith("urn:st:")) {
- instances.add(getServiceTag(s));
- }
- }
- } else {
- checkReturnError(p.exitValue(), output, null);
- }
- return instances;
- } finally {
- if (in != null) {
- in.close();
- }
- }
- }
-}
diff --git a/setup_native/source/registration/com/sun/star/servicetag/ServiceTag.java b/setup_native/source/registration/com/sun/star/servicetag/ServiceTag.java
deleted file mode 100644
index 4b2be9ff8cc2..000000000000
--- a/setup_native/source/registration/com/sun/star/servicetag/ServiceTag.java
+++ /dev/null
@@ -1,640 +0,0 @@
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2008 by Sun Microsystems, Inc.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * $RCSfile: ServiceTag.java,v $
- *
- * $Revision: 1.2 $
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-package com.sun.star.servicetag;
-
-import java.util.Date;
-import java.io.IOException;
-import static com.sun.star.servicetag.RegistrationDocument.*;
-
-/**
- * A service tag is an XML-based data structure that identifies a product or
- * a component on a system. The service tag schema is defined by the
- * Service Tags Technology. The location of the DTD file is platform dependent.
- * On Solaris, see <tt>/usr/share/lib/xml/dtd/servicetag.dtd</tt>.
- * <p>
- * A valid {@code ServiceTag} instance must comply to the service tag schema
- * and contain the following fields:
- * <ul>
- * <li>{@link #getInstanceURN <tt>instance_urn</tt>}</li>
- * <li>{@link #getProductName <tt>product_name</tt>}</li>
- * <li>{@link #getProductVersion <tt>product_version</tt>}</li>
- * <li>{@link #getProductURN <tt>product_urn</tt>}</li>
- * <li>{@link #getProductParent <tt>product_parent</tt>}</li>
- * <li>{@link #getProductParentURN <tt>product_parent_urn</tt>}</li>
- * <li>{@link #getProductDefinedInstanceID <tt>product_defined_inst_id</tt>}</li>
- * <li>{@link #getProductVendor <tt>product_vendor</tt>}</li>
- * <li>{@link #getPlatformArch <tt>platform_arch</tt>}</li>
- * <li>{@link #getContainer <tt>container</tt>}</li>
- * <li>{@link #getSource <tt>source</tt>}</li>
- * <li>{@link #getInstallerUID <tt>installer_uid</tt>}</li>
- * <li>{@link #getTimestamp <tt>timestamp</tt>}</li>
- * </ul>
- *
- * The <tt>instance_urn</tt> can be specified when a {@code ServiceTag}
- * object is created, or it can be generated when it is added to
- * a {@link RegistrationData} object, or {@link Registry
- * system service tag registry}. The <tt>installer_uid</tt> and
- * <tt>timestamp</tt> are set when a {@code ServiceTag} object
- * is added to a {@link RegistrationData} object, or {@link Registry
- * system service tag registry}.
- *
- * @see <a href="https://sunconnection.sun.com/FAQ/sc_faq.html">Service Tags FAQ</a>
- */
-public class ServiceTag {
-
- private String instanceURN;
- private String productName;
- private String productVersion;
- private String productURN;
- private String productParent;
- private String productParentURN;
- private String productDefinedInstanceID;
- private String productVendor;
- private String platformArch;
- private String container;
- private String source;
- private int installerUID;
- private Date timestamp;
-
- // Service Tag Field Lengths (defined in sthelper.h)
- // Since the constants defined in sthelper.h includes the null-terminated
- // character, so minus 1 from the sthelper.h defined values.
- private final int MAX_URN_LEN = 256 - 1;
- private final int MAX_PRODUCT_NAME_LEN = 256 - 1;
- private final int MAX_PRODUCT_VERSION_LEN = 64 - 1;
- private final int MAX_PRODUCT_PARENT_LEN = 256 - 1;
- private final int MAX_PRODUCT_VENDOR_LEN = 64 - 1;
- private final int MAX_PLATFORM_ARCH_LEN = 64 - 1;
- private final int MAX_CONTAINER_LEN = 64 - 1;
- private final int MAX_SOURCE_LEN = 64 - 1;
-
- // private constructors
- private ServiceTag() {
- }
- // package private
- ServiceTag(String instanceURN,
- String productName,
- String productVersion,
- String productURN,
- String productParent,
- String productParentURN,
- String productDefinedInstanceID,
- String productVendor,
- String platformArch,
- String container,
- String source,
- int installerUID,
- Date timestamp) {
- setInstanceURN(instanceURN);
- setProductName(productName);
- setProductVersion(productVersion);
- setProductURN(productURN);
- setProductParentURN(productParentURN);
- setProductParent(productParent);
- setProductDefinedInstanceID(productDefinedInstanceID);
- setProductVendor(productVendor);
- setPlatformArch(platformArch);
- setContainer(container);
- setSource(source);
- setInstallerUID(installerUID);
- setTimestamp(timestamp);
- }
-
- /**
- * Creates a service tag object with no <tt>instance_urn</tt>.
- *
- * @param productName the name of the product.
- * @param productVersion the version of the product.
- * @param productURN the uniform resource name of the product
- * @param productParent the name of the product's parent.
- * @param productParentURN the uniform resource name of the product's parent.
- * @param productDefinedInstanceID the instance identifier.
- * @param productVendor the vendor of the product.
- * @param platformArch the operating system architecture.
- * @param container the container of the product.
- * @param source the source of the product.
- *
- * @throws IllegalArgumentException if any value of the input fields
- * does not conform to the service tag XML schema.
- */
- public static ServiceTag newInstance(String productName,
- String productVersion,
- String productURN,
- String productParent,
- String productParentURN,
- String productDefinedInstanceID,
- String productVendor,
- String platformArch,
- String container,
- String source) {
- return new ServiceTag("", /* empty instance_urn */
- productName,
- productVersion,
- productURN,
- productParent,
- productParentURN,
- productDefinedInstanceID,
- productVendor,
- platformArch,
- container,
- source,
- -1,
- null);
- }
-
- /**
- * Creates a service tag object with a specified <tt>instance_urn</tt>.
- *
- * @param instanceURN the uniform resource name of this instance.
- * @param productName the name of the product.
- * @param productVersion the version of the product.
- * @param productURN the uniform resource name of the product
- * @param productParent the name of the product's parent.
- * @param productParentURN the uniform resource name of the product's parent.
- * @param productDefinedInstanceID the instance identifier.
- * @param productVendor the vendor of the product.
- * @param platformArch the operating system architecture.
- * @param container the container of the product.
- * @param source the source of the product.
- *
- * @throws IllegalArgumentException if any value of the input fields
- * does not conform to the service tag XML schema.
- */
- public static ServiceTag newInstance(String instanceURN,
- String productName,
- String productVersion,
- String productURN,
- String productParent,
- String productParentURN,
- String productDefinedInstanceID,
- String productVendor,
- String platformArch,
- String container,
- String source) {
- return new ServiceTag(instanceURN,
- productName,
- productVersion,
- productURN,
- productParent,
- productParentURN,
- productDefinedInstanceID,
- productVendor,
- platformArch,
- container,
- source,
- -1,
- null);
- }
-
- // Creates a copy of the ServiceTag instance
- // with instance_urn and timestamp initialized
- static ServiceTag newInstanceWithUrnTimestamp(ServiceTag st) {
- String instanceURN =
- (st.getInstanceURN().length() == 0 ? Util.generateURN() :
- st.getInstanceURN());
- ServiceTag svcTag = new ServiceTag(instanceURN,
- st.getProductName(),
- st.getProductVersion(),
- st.getProductURN(),
- st.getProductParent(),
- st.getProductParentURN(),
- st.getProductDefinedInstanceID(),
- st.getProductVendor(),
- st.getPlatformArch(),
- st.getContainer(),
- st.getSource(),
- st.getInstallerUID(),
- new Date());
- return svcTag;
- }
-
- /**
- * Returns a uniform resource name (URN) in this format:
- * <blockquote>
- * "<tt>urn:st:<32-char {@link java.util.UUID uuid}></tt>"
- * </blockquote>
- * @return a URN.
- */
- public static String generateInstanceURN() {
- return Util.generateURN();
- }
-
- /**
- * Returns the uniform resource name of this service tag instance.
- *
- * @return the <tt>instance_urn</tt> of this service tag.
- */
- public String getInstanceURN() {
- return instanceURN;
- }
-
- /**
- * Returns the name of the product.
- *
- * @return the product name.
- */
- public String getProductName() {
- return productName;
- }
-
- /**
- * Returns the version of the product.
- *
- * @return the product version.
- */
- public String getProductVersion() {
- return productVersion;
- }
-
- /**
- * Returns the uniform resource name of the product.
- *
- * @return the product URN.
- */
- public String getProductURN() {
- return productURN;
- }
-
- /**
- * Returns the uniform resource name of the product's parent.
- *
- * @return the product's parent URN.
- */
- public String getProductParentURN() {
- return productParentURN;
- }
-
- /**
- * Returns the name of the product's parent.
- *
- * @return the product's parent name.
- */
- public String getProductParent() {
- return productParent;
- }
-
- /**
- * Returns the identifier defined for this product instance.
- *
- * @return the identifier defined for this product instance.
- */
- public String getProductDefinedInstanceID() {
- return productDefinedInstanceID;
- }
-
- /**
- * Returns the vendor of the product.
- *
- * @return the product vendor.
- */
- public String getProductVendor() {
- return productVendor;
- }
-
- /**
- * Returns the platform architecture on which the product
- * is running on.
- *
- * @return the platform architecture on which the product is running on.
- */
- public String getPlatformArch() {
- return platformArch;
- }
-
- /**
- * Returns the timestamp. This timestamp is set when this service tag
- * is added to or updated in a {@code RegistrationData} object or
- * the system service tag registry.
- * This method may return {@code null}.
- *
- * @return timestamp when this service tag
- * is added to or updated in a {@code RegistrationData} object or
- * the system service tag registry, or {@code null}.
- */
- public Date getTimestamp() {
- if (timestamp != null) {
- return (Date) timestamp.clone();
- } else {
- return null;
- }
- }
-
-
- /**
- * Returns the container of the product.
- *
- * @return the container of the product.
- */
- public String getContainer() {
- return container;
- }
-
- /**
- * Returns the source of this service tag.
- *
- * @return source of this service tag.
- */
- public String getSource() {
- return source;
- }
-
- /**
- * Returns the UID. The UID is set when this service tag
- * is added to or updated in the system service tag registry.
- * This is platform dependent whose default value is {@code -1}.
- * When this service tag is added to a {@code RegistrationData},
- * the UID is not set.
- *
- * @return the UID of whom this service tag
- * is added to or updated in the system service tag registry,
- * or {@code -1}.
- */
- public int getInstallerUID() {
- return installerUID;
- }
-
- // The following setter methods are used to validate the
- // input field when constructing a ServiceTag instance
-
- private void setInstanceURN(String instanceURN) {
- if (instanceURN == null) {
- throw new NullPointerException("Parameter instanceURN cannot be null");
- }
- if (instanceURN.length() > MAX_URN_LEN) {
- throw new IllegalArgumentException("instanceURN \"" + instanceURN +
- "\" exceeds maximum length " + MAX_URN_LEN);
- }
- this.instanceURN = instanceURN;
- }
-
- private void setProductName(String productName) {
- if (productName == null) {
- throw new NullPointerException("Parameter productName cannot be null");
- }
- if (productName.length() == 0) {
- throw new IllegalArgumentException("product name cannot be empty");
- }
- if (productName.length() > MAX_PRODUCT_NAME_LEN) {
- throw new IllegalArgumentException("productName \"" + productName +
- "\" exceeds maximum length " + MAX_PRODUCT_NAME_LEN);
- }
- this.productName = productName;
- }
-
- private void setProductVersion(String productVersion) {
- if (productVersion == null) {
- throw new NullPointerException("Parameter productVersion cannot be null");
- }
-
- if (productVersion.length() == 0) {
- throw new IllegalArgumentException("product version cannot be empty");
- }
- if (productVersion.length() > MAX_PRODUCT_VERSION_LEN) {
- throw new IllegalArgumentException("productVersion \"" +
- productVersion + "\" exceeds maximum length " +
- MAX_PRODUCT_VERSION_LEN);
- }
- this.productVersion = productVersion;
- }
-
- private void setProductURN(String productURN) {
- if (productURN == null) {
- throw new NullPointerException("Parameter productURN cannot be null");
- }
- if (productURN.length() == 0) {
- throw new IllegalArgumentException("product URN cannot be empty");
- }
- if (productURN.length() > MAX_URN_LEN) {
- throw new IllegalArgumentException("productURN \"" + productURN +
- "\" exceeds maximum length " + MAX_URN_LEN);
- }
- this.productURN = productURN;
- }
-
- private void setProductParentURN(String productParentURN) {
- if (productParentURN == null) {
- throw new NullPointerException("Parameter productParentURN cannot be null");
- }
- // optional field - can be empty
- if (productParentURN.length() > MAX_URN_LEN) {
- throw new IllegalArgumentException("productParentURN \"" +
- productParentURN + "\" exceeds maximum length " +
- MAX_URN_LEN);
- }
- this.productParentURN = productParentURN;
- }
-
- private void setProductParent(String productParent) {
- if (productParent == null) {
- throw new NullPointerException("Parameter productParent cannot be null");
- }
- if (productParent.length() == 0) {
- throw new IllegalArgumentException("product parent cannot be empty");
- }
- if (productParent.length() > MAX_PRODUCT_PARENT_LEN) {
- throw new IllegalArgumentException("productParent \"" +
- productParent + "\" exceeds maximum length " +
- MAX_PRODUCT_PARENT_LEN);
- }
- this.productParent = productParent;
- }
-
- void setProductDefinedInstanceID(String productDefinedInstanceID) {
- if (productDefinedInstanceID == null) {
- throw new NullPointerException("Parameter productDefinedInstanceID cannot be null");
- }
- if (productDefinedInstanceID.length() > MAX_URN_LEN) {
- throw new IllegalArgumentException("productDefinedInstanceID \"" +
- productDefinedInstanceID + "\" exceeds maximum length " +
- MAX_URN_LEN);
- }
- // optional field - can be empty
- this.productDefinedInstanceID = productDefinedInstanceID;
- }
-
- private void setProductVendor(String productVendor) {
- if (productVendor == null) {
- throw new NullPointerException("Parameter productVendor cannot be null");
- }
- if (productVendor.length() == 0) {
- throw new IllegalArgumentException("product vendor cannot be empty");
- }
- if (productVendor.length() > MAX_PRODUCT_VENDOR_LEN) {
- throw new IllegalArgumentException("productVendor \"" +
- productVendor + "\" exceeds maximum length " +
- MAX_PRODUCT_VENDOR_LEN);
- }
- this.productVendor = productVendor;
- }
-
- private void setPlatformArch(String platformArch) {
- if (platformArch == null) {
- throw new NullPointerException("Parameter platformArch cannot be null");
- }
- if (platformArch.length() == 0) {
- throw new IllegalArgumentException("platform architecture cannot be empty");
- }
- if (platformArch.length() > MAX_PLATFORM_ARCH_LEN) {
- throw new IllegalArgumentException("platformArch \"" +
- platformArch + "\" exceeds maximum length " +
- MAX_PLATFORM_ARCH_LEN);
- }
- this.platformArch = platformArch;
- }
-
- private void setTimestamp(Date timestamp) {
- // can be null
- this.timestamp = timestamp;
- }
-
- private void setContainer(String container) {
- if (container == null) {
- throw new NullPointerException("Parameter container cannot be null");
- }
- if (container.length() == 0) {
- throw new IllegalArgumentException("container cannot be empty");
- }
- if (container.length() > MAX_CONTAINER_LEN) {
- throw new IllegalArgumentException("container \"" +
- container + "\" exceeds maximum length " +
- MAX_CONTAINER_LEN);
- }
- this.container = container;
- }
-
- private void setSource(String source) {
- if (source == null) {
- throw new NullPointerException("Parameter source cannot be null");
- }
- if (source.length() == 0) {
- throw new IllegalArgumentException("source cannot be empty");
- }
- if (source.length() > MAX_SOURCE_LEN) {
- throw new IllegalArgumentException("source \"" + source +
- "\" exceeds maximum length " + MAX_SOURCE_LEN);
- }
- this.source = source;
- }
-
- private void setInstallerUID(int installerUID) {
- this.installerUID = installerUID;
- }
-
- /**
- * Compares this service tag to the specified object.
- * The result is {@code true} if and only if the argument is
- * not {@code null} and is a {@code ServiceTag} object whose
- * <tt>instance_urn</tt> is the same as the
- * <tt>instance_urn</tt> of this service tag.
- *
- * @return {@code true} if this service tag is the same as
- * the specified object.
- */
- @Override
- public boolean equals(Object obj) {
- if (obj == null || !(obj instanceof ServiceTag)) {
- return false;
- }
- ServiceTag st = (ServiceTag) obj;
- if (st == this) {
- return true;
- }
- return st.getInstanceURN().equals(getInstanceURN());
- }
-
- /**
- * Returns the hash code value for this service tag.
- * @return the hash code value for this service tag.
- */
- @Override
- public int hashCode() {
- int hash = 7;
- hash = 19 * hash + (this.instanceURN != null ? this.instanceURN.hashCode() : 0);
- return hash;
- }
-
- /**
- * Returns the string representation of this service tag.
- * The format is implementation specific.
- *
- * @return the string representation of this service tag.
- */
- public String toString() {
- StringBuilder sb = new StringBuilder();
- sb.append(ST_NODE_INSTANCE_URN).append("=").append(instanceURN).append("\n");
- sb.append(ST_NODE_PRODUCT_NAME).append("=").append(productName).append("\n");
- sb.append(ST_NODE_PRODUCT_VERSION).append("=").append(productVersion).append("\n");
- sb.append(ST_NODE_PRODUCT_URN).append("=").append(productURN).append("\n");
- sb.append(ST_NODE_PRODUCT_PARENT_URN).append("=").append(productParentURN).append("\n");
- sb.append(ST_NODE_PRODUCT_PARENT).append("=").append(productParent).append("\n");
- sb.append(ST_NODE_PRODUCT_DEFINED_INST_ID).append("=").append(productDefinedInstanceID).append("\n");
- sb.append(ST_NODE_PRODUCT_VENDOR).append("=").append(productVendor).append("\n");
- sb.append(ST_NODE_PLATFORM_ARCH).append("=").append(platformArch).append("\n");
- sb.append(ST_NODE_TIMESTAMP).append("=").append(Util.formatTimestamp(timestamp)).append("\n");
- sb.append(ST_NODE_CONTAINER).append("=").append(container).append("\n");
- sb.append(ST_NODE_SOURCE).append("=").append(source).append("\n");
- sb.append(ST_NODE_INSTALLER_UID).append("=").append(String.valueOf(installerUID)).append("\n");
- return sb.toString();
- }
-
-
- /**
- * Returns the {@link ServiceTag} instance for the running Java
- * platform. The {@link ServiceTag#setSource source} field
- * of the {@code ServiceTag} will be set to the given {@code source}.
- * This method will return {@code null} if there is no service tag
- * for the running Java platform.
- * <p>
- * This method is designed for Sun software that bundles the JDK
- * or the JRE to use. It is recommended that the {@code source}
- * string contains information about the bundling software
- * such as the name and the version of the software bundle,
- * for example,
- * <blockquote>
- * <tt>NetBeans IDE 6.0 with JDK 6 Update 5 Bundle</tt>
- * </blockquote>
- * in a NetBeans/JDK bundle.
- * <p>
- * At the first time to call this method the application
- * is required to have the write permission to the installed
- * directory of this running JDK or JRE instance.
- *
- * @param source the source that bundles the JDK or the JRE.
- * @return a {@code ServiceTag} object for the Java platform,
- * or {@code null} if not supported.
- * @throws IOException if an error occurs in this operation.
- */
- public static ServiceTag getJavaServiceTag(String source) throws IOException {
- return Installer.getJavaServiceTag(source);
- }
-
-}
diff --git a/setup_native/source/registration/com/sun/star/servicetag/SolarisServiceTag.java b/setup_native/source/registration/com/sun/star/servicetag/SolarisServiceTag.java
deleted file mode 100644
index 245b993b086e..000000000000
--- a/setup_native/source/registration/com/sun/star/servicetag/SolarisServiceTag.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2008 by Sun Microsystems, Inc.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * $RCSfile: SolarisServiceTag.java,v $
- *
- * $Revision: 1.2 $
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-package com.sun.star.servicetag;
-
-import java.io.IOException;
-import java.util.Set;
-
-/**
- * Utility class to obtain the service tag for the Solaris Operating System.
- */
-class SolarisServiceTag {
- private final static String[] SolarisProductURNs = new String[] {
- "urn:uuid:a7a38948-2bd5-11d6-98ce-9d3ac1c0cfd7", /* Solaris 8 */
- "urn:uuid:4f82caac-36f3-11d6-866b-85f428ef944e", /* Solaris 9 */
- "urn:uuid:a19de03b-48bc-11d9-9607-080020a9ed93", /* Solaris 9 sparc */
- "urn:uuid:4c35c45b-4955-11d9-9607-080020a9ed93", /* Solaris 9 x86 */
- "urn:uuid:5005588c-36f3-11d6-9cec-fc96f718e113", /* Solaris 10 */
- "urn:uuid:6df19e63-7ef5-11db-a4bd-080020a9ed93" /* Solaris 11 */
- };
-
- /**
- * Returns null if not found.
- *
- * There is only one service tag for the operating system.
- */
- static ServiceTag getServiceTag() throws IOException {
- if (Registry.isSupported()) {
- Registry streg = Registry.getSystemRegistry();
- for (String parentURN : SolarisProductURNs) {
- Set<ServiceTag> instances = streg.findServiceTags(parentURN);
- for (ServiceTag st : instances) {
- // there should have only one service tag for the OS
- return st;
- }
- }
- }
- return null;
- }
-}
diff --git a/setup_native/source/registration/com/sun/star/servicetag/SolarisSystemEnvironment.java b/setup_native/source/registration/com/sun/star/servicetag/SolarisSystemEnvironment.java
deleted file mode 100644
index 1ce5f5697bcb..000000000000
--- a/setup_native/source/registration/com/sun/star/servicetag/SolarisSystemEnvironment.java
+++ /dev/null
@@ -1,159 +0,0 @@
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2008 by Sun Microsystems, Inc.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * $RCSfile: SolarisSystemEnvironment.java,v $
- *
- * $Revision: 1.2 $
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-package com.sun.star.servicetag;
-
-// The Service Tags team maintains the latest version of the implementation
-// for system environment data collection. JDK will include a copy of
-// the most recent released version for a JDK release. We rename
-// the package to com.sun.servicetag so that the Sun Connection
-// product always uses the latest version from the com.sun.scn.servicetags
-// package. JDK and users of the com.sun.servicetag API
-// (e.g. NetBeans and SunStudio) will use the version in JDK.
-
-import java.io.*;
-
-/**
- * Solaris implementation of the SystemEnvironment class.
- */
-class SolarisSystemEnvironment extends SystemEnvironment {
- SolarisSystemEnvironment() {
- setHostId(getCommandOutput("/usr/bin/hostid"));
- setSystemModel(getCommandOutput("/usr/bin/uname", "-i"));
- setSystemManufacturer(getSolarisSystemManufacturer());
- setCpuManufacturer(getSolarisCpuManufacturer());
- setSerialNumber(getSolarisSN());
- }
-
- /**
- * Tries to obtain the cpu manufacturer.
- * @return The cpu manufacturer (an empty string if not found or an error occurred)
- */
- private String getSolarisCpuManufacturer() {
- // not fully accurate, this could be another manufacturer (fujitsu for example)
- if ("sparc".equalsIgnoreCase(System.getProperty("os.arch"))) {
- return "Sun Microsystems, Inc";
- }
-
- // if we're here, then we'll try smbios (type 3)
- return getSmbiosData("3", "Manufacturer: ");
- }
-
- /**
- * Tries to obtain the system manufacturer.
- * @return The system manufacturer (an empty string if not found or an error occurred)
- */
- private String getSolarisSystemManufacturer() {
- // not fully accurate, this could be another manufacturer (fujitsu for example)
- if ("sparc".equalsIgnoreCase(System.getProperty("os.arch"))) {
- return "Sun Microsystems, Inc";
- }
-
- // if we're here, then we'll try smbios (type 1)
- return getSmbiosData("1", "Manufacturer: ");
- }
-
- /**
- * Tries to obtain the serial number.
- * @return The serial number (empty string if not found or an error occurred)
- */
- private String getSolarisSN() {
- // try to read from the psn file if it exists
- String tmp = getFileContent("/var/run/psn");
- if (tmp.length() > 0) {
- return tmp.trim();
- }
-
- // if we're here, then we'll try sneep
- String tmpSN = getSneepSN();
- if (tmpSN.length() > 0) {
- return tmpSN;
- }
-
- // if we're here, then we'll try smbios (type 1)
- tmpSN = getSmbiosData("1", "Serial Number: ");
- if (tmpSN.length() > 0) {
- return tmpSN;
- }
-
- // if we're here, then we'll try smbios (type 3)
- tmpSN = getSmbiosData("3", "Serial Number: ");
- if (tmpSN.length() > 0) {
- return tmpSN;
- }
-
- // give up and return
- return "";
- }
-
- // Sample smbios output segment:
- // ID SIZE TYPE
- // 1 150 SMB_TYPE_SYSTEM (system information)
- //
- // Manufacturer: Sun Microsystems
- // Product: Sun Fire X4600
- // Version: To Be Filled By O.E.M.
- // Serial Number: 00:14:4F:45:0C:2A
- private String getSmbiosData(String type, String target) {
- String output = getCommandOutput("/usr/sbin/smbios", "-t", type);
- for (String s : output.split("\n")) {
- if (s.contains(target)) {
- int indx = s.indexOf(target) + target.length();
- if (indx < s.length()) {
- String tmp = s.substring(indx).trim();
- String lowerCaseStr = tmp.toLowerCase();
- if (!lowerCaseStr.startsWith("not available")
- && !lowerCaseStr.startsWith("to be filled by o.e.m")) {
- return tmp;
- }
- }
- }
- }
-
- return "";
- }
-
- private String getSneepSN() {
- String basedir = getCommandOutput("pkgparam","SUNWsneep","BASEDIR");
- File f = new File(basedir + "/bin/sneep");
- if (f.exists()) {
- String sneepSN = getCommandOutput(basedir + "/bin/sneep");
- if (sneepSN.equalsIgnoreCase("unknown")) {
- return "";
- } else {
- return sneepSN;
- }
- } else {
- return "";
- }
- }
-
-}
diff --git a/setup_native/source/registration/com/sun/star/servicetag/SunConnection.java b/setup_native/source/registration/com/sun/star/servicetag/SunConnection.java
deleted file mode 100644
index 4a3d2ee9722f..000000000000
--- a/setup_native/source/registration/com/sun/star/servicetag/SunConnection.java
+++ /dev/null
@@ -1,296 +0,0 @@
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2008 by Sun Microsystems, Inc.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * $RCSfile: SunConnection.java,v $
- *
- * $Revision: 1.2 $
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-package com.sun.star.servicetag;
-
-import java.io.*;
-import java.net.URISyntaxException;
-import java.net.URL;
-import java.net.HttpURLConnection;
-import java.net.MalformedURLException;
-import java.io.OutputStreamWriter;
-import java.util.Locale;
-import javax.net.ssl.HttpsURLConnection;
-
-/**
- * Sun Connection Class for Product Registration.
- *
- * Registration Web Application Interface
- * 1) POST the product registry to the output stream of the registration
- * relay service.
- * 2) Open the webapp URL from a browser with the following parameters:
- * registry-urn
- * product=jdk
- * locale=<locale-lang>
- *
- * @see https://sn-tools.central.sun.com/twiki/pub/ServiceTags/RegistrationRelayService/
- *
- */
-class SunConnection {
-
- private static String JDK_REGISTRATION_URL =
- "https://inventory.sun.com/RegistrationWeb/register";
- private static String SANDBOX_TESTING_URL =
- "https://connection-tst.sun.com/RegistrationWeb/register";
-
- // System properties for testing
- private static String SVCTAG_REGISTER_TESTING = "servicetag.register.testing";
- private static String SVCTAG_REGISTRATION_URL = "servicetag.registration.url";
- private static String SVCTAG_CONNECTION_TIMEOUT = "servicetag.connection.timeout";
-
- private SunConnection() {
- }
-
- /**
- * Returns a URL for JDK registration interfacing with the Sun Connection
- * registration relay service in this form:
- * <registration-url>/<registry_urn>?product=jdk&locale=<locale-lang>
- *
- * The <registration-url> can be overridden by an environment
- * variable or a system property.
- *
- * 1) "servicetag.register.testing" system property to switch to the
- * Sun Connection registration sandbox testing.
- * 2) "servicetag.registration.url" system property to override
- * the URL
- * 3) Default production URL
- *
- */
- static URL getRegistrationURL(String registrationURN) {
- String url = System.getProperty(SVCTAG_REGISTRATION_URL);
- if (url == null) {
- if (System.getProperty(SVCTAG_REGISTER_TESTING) != null) {
- url = SANDBOX_TESTING_URL;
- } else {
- url = JDK_REGISTRATION_URL;
- }
- }
-
- // trim whitespaces
- url = url.trim();
- if (url.length() == 0) {
- throw new InternalError("Empty registration url set");
- }
-
- // Add the registry_urn in the URL's query
- String registerURL = rewriteURL(url, registrationURN);
- try {
- return new URL(registerURL);
- } catch (MalformedURLException ex) {
- // should never reach here
- InternalError x =
- new InternalError(ex.getMessage());
- x.initCause(ex);
- throw x;
- }
- }
-
- private static String rewriteURL(String url, String registryURN) {
- StringBuilder sb = new StringBuilder(url.trim());
- int len = sb.length();
- if (sb.charAt(len-1) != '/') {
- sb.append('/');
- }
- sb.append(registryURN);
- sb.append("?");
- sb.append("product=jdk");
- sb.append("&");
- sb.append("locale=").append(Locale.getDefault().getLanguage());
- return sb.toString();
- }
-
- /**
- * Registers all products in the given product registry. If it fails
- * to post the service tag registry, open the browser with the offline
- * registration page.
- *
- * @param regData registration data to be posted to the Sun Connection
- * for registration.
- *
- * @throws IOException if I/O error occurs in this operation
- */
- public static void register(RegistrationData regData) throws IOException {
- // Gets the URL for SunConnection registration relay service
- URL url = getRegistrationURL(regData.getRegistrationURN());
-
- // Post the Product Registry to Sun Connection
- boolean succeed = postRegistrationData(url, regData);
- if (succeed) {
- // service tags posted successfully
- // now prompt for registration
- openBrowser(url);
- } else {
- // open browser with the offline registration page
- openOfflineRegisterPage();
- }
- }
-
- /**
- * Opens a browser for JDK product registration.
- * @param url Registration Webapp URL
- */
- private static void openBrowser(URL url) throws IOException {
- if (!BrowserSupport.isSupported()) {
- if (Util.isVerbose()) {
- System.out.println("Browser is not supported");
- }
- return;
- }
-
- try {
- BrowserSupport.browse(url.toURI());
- } catch (URISyntaxException ex) {
- InternalError x = new InternalError("Error in registering: " + ex.getMessage());
- x.initCause(ex);
- throw x;
- } catch (IllegalArgumentException ex) {
- if (Util.isVerbose()) {
- ex.printStackTrace();
- }
- } catch (UnsupportedOperationException ex) {
- // ignore if not supported
- if (Util.isVerbose()) {
- ex.printStackTrace();
- }
- }
- }
-
- /**
- * POST service tag registry to Sun Connection
- * @param loc the URL of the webapp to handle the POST request
- * @param streg the Service Tag registry
- * @return true if posting succeeds; otherwise, false.
- */
- private static boolean postRegistrationData(URL url,
- RegistrationData registration) {
- try {
- HttpsURLConnection con = (HttpsURLConnection) url.openConnection();
- con.setDoInput(true);
- con.setDoOutput(true);
- con.setUseCaches(false);
- con.setAllowUserInteraction(false);
-
- // default 10 seconds timeout
- String timeout = System.getProperty(SVCTAG_CONNECTION_TIMEOUT, "10");
- con.setConnectTimeout(Util.getIntValue(timeout) * 1000);
-
- if (Util.isVerbose()) {
- System.out.println("Connecting to post registration data at " + url);
- }
-
- con.setRequestMethod("POST");
- con.setRequestProperty("Content-Type", "text/xml;charset=\"utf-8\"");
- con.connect();
-
- OutputStream out = con.getOutputStream();
- registration.storeToXML(out);
- out.flush();
- out.close();
-
- int returnCode = con.getResponseCode();
- if (Util.isVerbose()) {
- System.out.println("POST return status = " + returnCode);
- printReturnData(con, returnCode);
- }
- return (returnCode == HttpURLConnection.HTTP_OK);
- } catch (MalformedURLException me) {
- // should never reach here
- InternalError x = new InternalError("Error in registering: " + me.getMessage());
- x.initCause(me);
- throw x;
- } catch (Exception ioe) {
- // SocketTimeoutException, IOException or UnknownHostException
- if (Util.isVerbose()) {
- ioe.printStackTrace();
- }
- return false;
- }
- }
-
- /**
- * Opens the offline registratioin page in the browser.
- *
- */
- private static void openOfflineRegisterPage()
- throws IOException {
- if (!BrowserSupport.isSupported()) {
- if (Util.isVerbose()) {
- System.out.println("Browser is not supported");
- }
- return;
- }
-
- File registerPage = Installer.getRegistrationHtmlPage();
- try {
- BrowserSupport.browse(registerPage.toURI());
- } catch (FileNotFoundException ex) {
- // should never reach here
- InternalError x =
- new InternalError("Error in launching " + registerPage + ": " + ex.getMessage());
- x.initCause(ex);
- throw x;
- } catch (IllegalArgumentException ex) {
- if (Util.isVerbose()) {
- ex.printStackTrace();
- }
- } catch (UnsupportedOperationException ex) {
- // ignore if not supported
- if (Util.isVerbose()) {
- ex.printStackTrace();
- }
- }
- }
-
- private static void printReturnData(HttpURLConnection con, int returnCode)
- throws IOException {
- BufferedReader reader = null;
- try {
- if (returnCode < 400) {
- reader = new BufferedReader(
- new InputStreamReader(con.getInputStream()));
- } else {
- reader = new BufferedReader(
- new InputStreamReader(con.getErrorStream()));
- }
- StringBuilder sb = new StringBuilder();
- String line;
- while ((line = reader.readLine()) != null) {
- sb.append(line).append("\n");
- }
- System.out.println("Response is : ");
- System.out.println(sb.toString());
- } finally {
- if (reader != null) {
- reader.close();
- }
- }
- }
-}
diff --git a/setup_native/source/registration/com/sun/star/servicetag/SysnetRegistryHelper.java b/setup_native/source/registration/com/sun/star/servicetag/SysnetRegistryHelper.java
deleted file mode 100644
index d50104e827ed..000000000000
--- a/setup_native/source/registration/com/sun/star/servicetag/SysnetRegistryHelper.java
+++ /dev/null
@@ -1,380 +0,0 @@
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2008 by Sun Microsystems, Inc.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * $RCSfile: SysnetRegistryHelper.java,v $
- *
- * $Revision: 1.2 $
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-package com.sun.star.servicetag;
-
-import java.io.*;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Properties;
-import java.util.Set;
-
-import static com.sun.star.servicetag.Util.*;
-import static com.sun.star.servicetag.RegistrationDocument.*;
-
-/**
- * Class containing additional methods that are not yet
- * in the JDK Registry class. Note that all methods in this class
- * will be superceeded by the JDK classes.
- */
-public class SysnetRegistryHelper {
-
- private static final String STCLIENT_SOLARIS = "/usr/bin/stclient";
- private static final String STCLIENT_LINUX = "/opt/sun/servicetag/bin/stclient";
- // stclient exit value (see sthelper.h)
- private static final int ST_ERR_NOT_AUTH = 245;
- private static final int ST_ERR_REC_NOT_FOUND = 225;
-
- // The stclient output has to be an exported interface
- private static final String INSTANCE_URN_OPEN_ELEMENT = "<instance_urn>";
- private static final String INSTANCE_URN_CLOSE_ELEMENT = "</instance_urn>";
- private static final String REGISTRY_URN = "<registry urn=\"";
- private static final String INSTANCE_URN_DESC = "Product instance URN=";
- private static boolean initialized = false;
- private static boolean supportsHelperClass = true; // default
- private static File stclient = null;
- private static String stclientPath = null;
-
- // System properties for testing
- private static String SVCTAG_STCLIENT_CMD = "servicetag.stclient.cmd";
- private static String SVCTAG_STHELPER_SUPPORTED = "servicetag.sthelper.supported";
-
- private synchronized static String getSTclient() {
- if (!initialized) {
- // the system property always overrides the default setting
- if (System.getProperty(SVCTAG_STHELPER_SUPPORTED) != null) {
- supportsHelperClass = Boolean.getBoolean(SVCTAG_STHELPER_SUPPORTED);
- }
-
- // This is only used for testing
- stclientPath = System.getProperty(SVCTAG_STCLIENT_CMD);
- if (stclientPath != null) {
- return stclientPath;
- }
-
- // Initialization to determine the platform's stclient pathname
- String os = System.getProperty("os.name");
- if (os.equals("SunOS")) {
- stclient = new File(STCLIENT_SOLARIS);
- } else if (os.equals("Linux")) {
- stclient = new File(STCLIENT_LINUX);
- } else if (os.startsWith("Windows")) {
- stclient = getWindowsStClientFile();
- } else {
- if (isVerbose()) {
- System.out.println("Running on non-Sun JDK");
- }
- }
- initialized = true;
- }
-
- // com.sun.servicetag package has to be compiled with JDK 5 as well
- // JDK 5 doesn't support the File.canExecute() method.
- // Risk not checking isExecute() for the stclient command is very low.
-
- if (stclientPath == null && stclient != null && stclient.exists()) {
- stclientPath = stclient.getAbsolutePath();
- }
- return stclientPath;
- }
-
- private static List<String> getCommandList() {
- // Set up the arguments to call stclient
- List<String> command = new ArrayList<String>();
- if (System.getProperty(SVCTAG_STCLIENT_CMD) != null) {
- // This is for jtreg testing use. This will be set to something
- // like:
- // $JAVA_HOME/bin/java -cp $TEST_DIR \
- // -Dstclient.registry.path=$TEST_DIR/registry.xml \
- // SvcTagClient
- //
- // On Windows, the JAVA_HOME and TEST_DIR path could contain
- // space e.g. c:\Program Files\Java\jdk1.6.0_05\bin\java.
- // The SVCTAG_STCLIENT_CMD must be set with a list of
- // space-separated parameters. If a parameter contains spaces,
- // it must be quoted with '"'.
-
- String cmd = getSTclient();
- int len = cmd.length();
- int i = 0;
- while (i < len) {
- char separator = ' ';
- if (cmd.charAt(i) == '"') {
- separator = '"';
- i++;
- }
- // look for the separator or matched the closing '"'
- int j;
- for (j = i+1; j < len; j++) {
- if (cmd.charAt(j) == separator) {
- break;
- }
- }
-
- if (i == j-1) {
- // add an empty parameter
- command.add("\"\"");
- } else {
- // double quotes and space are not included
- command.add(cmd.substring(i,j));
- }
-
- // skip spaces
- for (i = j+1; i < len; i++) {
- if (!Character.isSpaceChar(cmd.charAt(i))) {
- break;
- }
- }
- }
- if (isVerbose()) {
- System.out.println("Command list:");
- for (String s : command) {
- System.out.println(s);
- }
- }
- } else {
- command.add(getSTclient());
- }
- return command;
- }
-
- // Returns null if the service tag record not found;
- // or throw UnauthorizedAccessException or IOException
- // based on the exitValue.
- private static ServiceTag checkReturnError(int exitValue,
- String output,
- ServiceTag st) throws IOException {
- switch (exitValue) {
- case ST_ERR_REC_NOT_FOUND:
- return null;
- case ST_ERR_NOT_AUTH:
- if (st != null) {
- throw new UnauthorizedAccessException(
- "Not authorized to access " + st.getInstanceURN() +
- " installer_uid=" + st.getInstallerUID());
- } else {
- throw new UnauthorizedAccessException(
- "Not authorized:" + output);
- }
- default:
- throw new IOException("stclient exits with error" +
- " (" + exitValue + ")\n" + output);
- }
- }
-
- /**
- * Returns a {@code ServiceTag} object of the given <tt>instance_urn</tt>
- * in this registry.
- *
- * @param instanceURN the <tt>instance_urn</tt> of the service tag
- * @return a {@code ServiceTag} object of the given <tt>instance_urn</tt>
- * in this registry; or {@code null} if not found.
- *
- * @throws java.io.IOException if an I/O error occurs in this operation.
- */
- private static ServiceTag getServiceTag(String instanceURN) throws IOException {
- if (instanceURN == null) {
- throw new NullPointerException("instanceURN is null");
- }
-
- List<String> command = getCommandList();
- command.add("-g");
- command.add("-i");
- command.add(instanceURN);
-
- ProcessBuilder pb = new ProcessBuilder(command);
- Process p = pb.start();
- String output = commandOutput(p);
- if (isVerbose()) {
- System.out.println("Output from stclient -g command:");
- System.out.println(output);
- }
- if (p.exitValue() == 0) {
- return parseServiceTag(output);
- } else {
- return checkReturnError(p.exitValue(), output, null);
- }
- }
-
- private static ServiceTag parseServiceTag(String output) throws IOException {
- BufferedReader in = null;
- try {
- Properties props = new Properties();
- // parse the service tag output from stclient
- in = new BufferedReader(new StringReader(output));
- String line = null;
- while ((line = in.readLine()) != null) {
- if ((line = line.trim()).length() > 0) {
- String[] ss = line.trim().split("=", 2);
- if (ss.length == 2) {
- props.setProperty(ss[0].trim(), ss[1].trim());
- } else {
- props.setProperty(ss[0].trim(), "");
- }
- }
- }
-
- String urn = props.getProperty(ST_NODE_INSTANCE_URN);
- String productName = props.getProperty(ST_NODE_PRODUCT_NAME);
- String productVersion = props.getProperty(ST_NODE_PRODUCT_VERSION);
- String productURN = props.getProperty(ST_NODE_PRODUCT_URN);
- String productParent = props.getProperty(ST_NODE_PRODUCT_PARENT);
- String productParentURN = props.getProperty(ST_NODE_PRODUCT_PARENT_URN);
- String productDefinedInstanceID =
- props.getProperty(ST_NODE_PRODUCT_DEFINED_INST_ID);
- String productVendor = props.getProperty(ST_NODE_PRODUCT_VENDOR);
- String platformArch = props.getProperty(ST_NODE_PLATFORM_ARCH);
- String container = props.getProperty(ST_NODE_CONTAINER);
- String source = props.getProperty(ST_NODE_SOURCE);
- int installerUID =
- Util.getIntValue(props.getProperty(ST_NODE_INSTALLER_UID));
- Date timestamp =
- Util.parseTimestamp(props.getProperty(ST_NODE_TIMESTAMP));
-
- return new ServiceTag(urn,
- productName,
- productVersion,
- productURN,
- productParent,
- productParentURN,
- productDefinedInstanceID,
- productVendor,
- platformArch,
- container,
- source,
- installerUID,
- timestamp);
- } finally {
- if (in != null) {
- in.close();
- }
- }
-
- }
-
- /**
- * Returns the urn of this registry.
- *
- * @return a {@code String} for the urn of this registry.
- *
- * @throws java.io.IOException if an I/O error occurs in this operation.
- */
- // Once JDK makes this method available, we'll deprecate this method
- // @deprecated Use the JDK version when available.
- public static String getRegistryURN() throws IOException {
- List<String> command = getCommandList();
- command.add("-x");
-
- BufferedReader in = null;
- try {
- ProcessBuilder pb = new ProcessBuilder(command);
- Process p = pb.start();
- String output = commandOutput(p);
-
- String registryURN = null;
- if (p.exitValue() == 0) {
- // parse the service tag output from stclient
- in = new BufferedReader(new StringReader(output));
- String line = null;
- while ((line = in.readLine()) != null) {
- String s = line.trim();
- if (s.indexOf(REGISTRY_URN) != -1) {
- s = s.substring(s.indexOf(REGISTRY_URN)
- + REGISTRY_URN.length());
- if (s.indexOf("\"") != -1) {
- s = s.substring(0, s.indexOf("\""));
- registryURN = s;
- break;
- }
- }
- }
- } else {
- checkReturnError(p.exitValue(), output, null);
- }
- return registryURN;
- } finally {
- if (in != null) {
- in.close();
- }
- }
- }
-
- /**
- * Returns all the service tags in this registry.
- *
- * @return a {@code Set} of {@code ServiceTag} objects
- * in this registry.
- *
- * @throws java.io.IOException if an I/O error occurs in this operation.
- */
- // Once JDK makes this method available, we'll deprecate this method
- // @deprecated Use the JDK version when available.
- public static Set<ServiceTag> getServiceTags() throws IOException {
- List<String> command = getCommandList();
- command.add("-x");
-
- BufferedReader in = null;
- try {
- ProcessBuilder pb = new ProcessBuilder(command);
- Process p = pb.start();
- String output = commandOutput(p);
-
- Set<ServiceTag> instances = new HashSet<ServiceTag>();
- if (p.exitValue() == 0) {
- // parse the service tag output from stclient
- in = new BufferedReader(new StringReader(output));
- String line = null;
- while ((line = in.readLine()) != null) {
- String s = line.trim();
- if (s.indexOf(INSTANCE_URN_OPEN_ELEMENT) != -1
- && s.indexOf(INSTANCE_URN_CLOSE_ELEMENT) != -1) {
- s = s.substring(s.indexOf(INSTANCE_URN_OPEN_ELEMENT)
- + INSTANCE_URN_OPEN_ELEMENT.length(),
- s.indexOf(INSTANCE_URN_CLOSE_ELEMENT));
- try {
- instances.add(getServiceTag(s));
- } catch (Exception e) {
- }
- }
- }
- } else {
- checkReturnError(p.exitValue(), output, null);
- }
- return instances;
- } finally {
- if (in != null) {
- in.close();
- }
- }
- }
-}
diff --git a/setup_native/source/registration/com/sun/star/servicetag/SystemEnvironment.java b/setup_native/source/registration/com/sun/star/servicetag/SystemEnvironment.java
deleted file mode 100644
index e5b9e0e3b4fe..000000000000
--- a/setup_native/source/registration/com/sun/star/servicetag/SystemEnvironment.java
+++ /dev/null
@@ -1,341 +0,0 @@
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2008 by Sun Microsystems, Inc.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * $RCSfile: SystemEnvironment.java,v $
- *
- * $Revision: 1.2 $
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-package com.sun.star.servicetag;
-
-// The Service Tags team maintains the latest version of the implementation
-// for system environment data collection. JDK will include a copy of
-// the most recent released version for a JDK release. We rename
-// the package to com.sun.servicetag so that the Sun Connection
-// product always uses the latest version from the com.sun.scn.servicetags
-// package. JDK and users of the com.sun.servicetag API
-// (e.g. NetBeans and SunStudio) will use the version in JDK.
-
-import java.io.*;
-import java.net.InetAddress;
-import java.net.UnknownHostException;
-
-/**
- * SystemEnvironment class collects the environment data with the
- * best effort from the underlying platform.
- */
-public class SystemEnvironment {
- private String hostname;
- private String hostId;
- private String osName;
- private String osVersion;
- private String osArchitecture;
- private String systemModel;
- private String systemManufacturer;
- private String cpuManufacturer;
- private String serialNumber;
- private static SystemEnvironment sysEnv = null;
-
- public static synchronized SystemEnvironment getSystemEnvironment() {
- if (sysEnv == null) {
- String os = System.getProperty("os.name");
- if (os.equals("SunOS")) {
- sysEnv = new SolarisSystemEnvironment();
- } else if (os.equals("Linux")) {
- sysEnv = new LinuxSystemEnvironment();
- } else if (os.startsWith("Windows")) {
- sysEnv = new WindowsSystemEnvironment();
- } else {
- sysEnv = new SystemEnvironment();
- }
- }
- return sysEnv;
- }
-
- // package-private
- SystemEnvironment() {
- try {
- this.hostname = InetAddress.getLocalHost().getHostName();
- } catch (UnknownHostException ex) {
- this.hostname = "Unknown host";
- }
- this.hostId = "";
- this.osName = System.getProperty("os.name");
- this.osVersion = System.getProperty("os.version");
- this.osArchitecture = System.getProperty("os.arch");
- this.systemModel = "";
- this.systemManufacturer = "";
- this.cpuManufacturer = "";
- this.serialNumber = "";
- }
-
-
- /**
- * Sets the hostname.
- * @param hostname The hostname to set.
- */
- public void setHostname(String hostname) {
- this.hostname = hostname;
- }
-
- /**
- * Sets the OS name.
- * @param osName The osName to set.
- */
- public void setOsName(String osName) {
- this.osName = osName;
- }
-
- /**
- * Sets the OS version.
- * @param osVersion The osVersion to set.
- */
- public void setOsVersion(String osVersion) {
- this.osVersion = osVersion;
- }
-
- /**
- * Sets the OS architecture.
- * @param osArchitecture The osArchitecture to set.
- */
- public void setOsArchitecture(String osArchitecture) {
- this.osArchitecture = osArchitecture;
- }
-
- /**
- * Sets the system model.
- * @param systemModel The systemModel to set.
- */
- public void setSystemModel(String systemModel) {
- this.systemModel = systemModel;
- }
-
- /**
- * Sets the system manufacturer.
- * @param systemManufacturer The systemManufacturer to set.
- */
- public void setSystemManufacturer(String systemManufacturer) {
- this.systemManufacturer = systemManufacturer;
- }
-
- /**
- * Sets the cpu manufacturer.
- * @param cpuManufacturer The cpuManufacturer to set.
- */
- public void setCpuManufacturer(String cpuManufacturer) {
- this.cpuManufacturer = cpuManufacturer;
- }
-
- /**
- * Sets the serial number.
- * @param serialNumber The serialNumber to set.
- */
- public void setSerialNumber(String serialNumber) {
- this.serialNumber = serialNumber;
- }
-
- /**
- * Sets the hostid. Truncates to a max length of 16 chars.
- * @param hostId The hostid to set.
- */
- public void setHostId(String hostId) {
- if (hostId == null || hostId.equals("null")) {
- hostId = "";
- }
- if (hostId.length() > 16) {
- hostId = hostId.substring(0,16);
- }
- this.hostId = hostId;
- }
-
- /**
- * Returns the hostname.
- * @return The hostname.
- */
- public String getHostname() {
- return hostname;
- }
-
- /**
- * Returns the osName.
- * @return The osName.
- */
- public String getOsName() {
- return osName;
- }
-
- /**
- * Returns the osVersion.
- * @return The osVersion.
- */
- public String getOsVersion() {
- return osVersion;
- }
-
- /**
- * Returns the osArchitecture.
- * @return The osArchitecture.
- */
- public String getOsArchitecture() {
- return osArchitecture;
- }
-
- /**
- * Returns the systemModel.
- * @return The systemModel.
- */
- public String getSystemModel() {
- return systemModel;
- }
-
- /**
- * Returns the systemManufacturer.
- * @return The systemManufacturer.
- */
- public String getSystemManufacturer() {
- return systemManufacturer;
- }
-
- /**
- * Returns the serialNumber.
- * @return The serialNumber.
- */
- public String getSerialNumber() {
- return serialNumber;
- }
-
- /**
- * Returns the hostId.
- * @return The hostId.
- */
- public String getHostId() {
- return hostId;
- }
-
- /**
- * Returns the cpuManufacturer.
- * @return The cpuManufacturer.
- */
- public String getCpuManufacturer() {
- return cpuManufacturer;
- }
-
- protected String getCommandOutput(String... command) {
- StringBuilder sb = new StringBuilder();
- BufferedReader br = null;
- Process p = null;
- try {
- ProcessBuilder pb = new ProcessBuilder(command);
- p = pb.start();
- p.waitFor();
-
- if (p.exitValue() == 0) {
- br = new BufferedReader(new InputStreamReader(p.getInputStream()));
- String line = null;
- while ((line = br.readLine()) != null) {
- line = line.trim();
- if (line.length() > 0) {
- if (sb.length() > 0) {
- sb.append("\n");
- }
- sb.append(line);
- }
- }
- }
- return sb.toString();
- } catch (InterruptedException ie) {
- // in case the command hangs
- if (p != null) {
- p.destroy();
- }
- return "";
- } catch (Exception e) {
- // ignore exception
- return "";
- } finally {
- if (p != null) {
- try {
- p.getErrorStream().close();
- } catch (IOException e) {
- // ignore
- }
- try {
- p.getInputStream().close();
- } catch (IOException e) {
- // ignore
- }
- try {
- p.getOutputStream().close();
- } catch (IOException e) {
- // ignore
- }
- p = null;
- }
- if (br != null) {
- try {
- br.close();
- } catch (IOException e) {
- // ignore
- }
- }
- }
- }
-
- protected String getFileContent(String filename) {
- File f = new File(filename);
- if (!f.exists()) {
- return "";
- }
-
- StringBuilder sb = new StringBuilder();
- BufferedReader br = null;
- try {
- br = new BufferedReader(new FileReader(f));
- String line = null;
- while ((line = br.readLine()) != null) {
- line = line.trim();
- if (line.length() > 0) {
- if (sb.length() > 0) {
- sb.append("\n");
- }
- sb.append(line);
- }
- }
- return sb.toString();
- } catch (Exception e) {
- // ignore exception
- return "";
- } finally {
- if (br != null) {
- try {
- br.close();
- } catch (IOException e) {
- // ignore
- }
- }
- }
- }
-}
diff --git a/setup_native/source/registration/com/sun/star/servicetag/Util.java b/setup_native/source/registration/com/sun/star/servicetag/Util.java
deleted file mode 100644
index 55fa097297e6..000000000000
--- a/setup_native/source/registration/com/sun/star/servicetag/Util.java
+++ /dev/null
@@ -1,297 +0,0 @@
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2008 by Sun Microsystems, Inc.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * $RCSfile: Util.java,v $
- *
- * $Revision: 1.2 $
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-package com.sun.star.servicetag;
-
-import java.io.*;
-import java.util.Date;
-import java.text.SimpleDateFormat;
-import java.text.ParseException;
-import java.util.TimeZone;
-import java.util.UUID;
-import java.lang.reflect.Field;
-import java.lang.reflect.Method;
-
-// Utility class for com.sun.star.servicetag package
-class Util {
- private static boolean verbose = (System.getProperty("servicetag.verbose") != null);
- private static String jrepath = null;
-
- // for debugging and tracing
- static boolean isVerbose() {
- return verbose;
- }
-
- /**
- * Gets the pathname of JRE in the running platform
- * This can be a JDK or JRE.
- */
- static synchronized String getJrePath() {
- if (jrepath == null) {
- // Determine the JRE path by checking the existence of
- // <HOME>/jre/lib and <HOME>/lib.
- String javaHome = System.getProperty("java.home");
- jrepath = javaHome + File.separator + "jre";
- File f = new File(jrepath, "lib");
- if (!f.exists()) {
- // java.home usually points to the JRE path
- jrepath = javaHome;
- }
- }
- return jrepath;
- }
-
- /**
- * Tests if the running platform is a JDK.
- */
- static boolean isJdk() {
- // <HOME>/jre exists which implies it's a JDK
- return getJrePath().endsWith(File.separator + "jre");
- }
-
- /**
- * Generates the URN string of "urn:st" namespace
- */
- static String generateURN() {
- return "urn:st:" + UUID.randomUUID().toString();
- }
-
- static int getIntValue(String value) {
- try {
- return Integer.parseInt(value);
- } catch (NumberFormatException e) {
- throw new IllegalArgumentException("\"" + value + "\"" +
- " expected to be an integer");
- }
- }
-
- /**
- * Formats the Date into a timestamp string in YYYY-MM-dd HH:mm:ss GMT.
- * @param timestamp Date
- * @return a string representation of the timestamp
- * in the YYYY-MM-dd HH:mm:ss GMT format.
- */
- static String formatTimestamp(Date timestamp) {
- if (timestamp == null) {
- return "[No timestamp]";
- }
- SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z");
- df.setTimeZone(TimeZone.getTimeZone("GMT"));
- return df.format(timestamp);
- }
-
- /**
- * Parses a timestamp string in YYYY-MM-dd HH:mm:ss GMT format.
- * @param timestamp Timestamp in the YYYY-MM-dd HH:mm:ss GMT format.
- * @return Date
- */
- static Date parseTimestamp(String timestamp) {
- SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z");
- df.setTimeZone(TimeZone.getTimeZone("GMT"));
- try {
- return df.parse(timestamp);
- } catch (ParseException e) {
- // should not reach here
- e.printStackTrace();
- return new Date();
- }
- }
-
- static String commandOutput(Process p) throws IOException {
- Reader r = null;
- Reader err = null;
- try {
- r = new InputStreamReader(p.getInputStream());
- err = new InputStreamReader(p.getErrorStream());
- String output = commandOutput(r);
- String errorMsg = commandOutput(err);
- p.waitFor();
- return output + errorMsg.trim();
- } catch (InterruptedException e) {
- if (isVerbose()) {
- e.printStackTrace();
- }
- return e.getMessage();
- } finally {
- if (r != null) {
- r.close();
- }
- if (err != null) {
- err.close();
- }
- }
- }
-
- static String commandOutput(Reader r) throws IOException {
- StringBuilder sb = new StringBuilder();
- int c;
- while ((c = r.read()) > 0) {
- if (c != '\r') {
- sb.append((char) c);
- }
- }
- return sb.toString();
- }
-
- static int getJdkVersion() {
- parseVersion();
- return jdkVersion;
- }
-
- static int getUpdateVersion() {
- parseVersion();
- return jdkUpdate;
- }
-
- private static int jdkVersion = 0;
- private static int jdkUpdate = 0;
- private static synchronized void parseVersion() {
- if (jdkVersion > 0) {
- return;
- }
-
- // parse java.runtime.version
- // valid format of the version string is:
- // n.n.n[_uu[c]][-<identifer>]-bxx
- String cs = System.getProperty("java.runtime.version");
- if (cs.length() >= 5 &&
- Character.isDigit(cs.charAt(0)) && cs.charAt(1) == '.' &&
- Character.isDigit(cs.charAt(2)) && cs.charAt(3) == '.' &&
- Character.isDigit(cs.charAt(4))) {
- jdkVersion = Character.digit(cs.charAt(2), 10);
- cs = cs.substring(5, cs.length());
- if (cs.charAt(0) == '_' && cs.length() >= 3 &&
- Character.isDigit(cs.charAt(1)) &&
- Character.isDigit(cs.charAt(2))) {
- int nextChar = 3;
- try {
- String uu = cs.substring(1, 3);
- jdkUpdate = Integer.valueOf(uu).intValue();
- } catch (NumberFormatException e) {
- // not conforming to the naming convention
- return;
- }
- }
- } else {
- throw new InternalError("Invalid java.runtime.version" + cs);
- }
- }
-
- /**
- * Returns this java string as a null-terminated byte array
- */
- private static byte[] stringToByteArray(String str) {
- return (str + "\u0000").getBytes();
- }
-
- /**
- * Converts a null-terminated byte array to java string
- */
- private static String byteArrayToString(byte[] array) {
- return new String(array, 0, array.length -1);
- }
-
- /**
- * Gets the stclient path using a well known location from
- * the Windows platform Registry, otherwise it will return null.
- */
- static File getWindowsStClientFile() {
- File out = null;
- String regKey = "software\\microsoft\\windows\\currentversion\\app paths\\stclient.exe";
- String keyName = "" ; // use the default key
- String path = getRegistryKey(regKey, keyName);
-
- if (path != null && (new File(path)).exists()) {
- out = new File(path);
- }
- if (isVerbose()) {
- System.out.println("stclient=" + out);
- }
- return out;
- }
-
- /**
- * This uses reflection to access a private java windows registry
- * interface, any changes to that Class must be appropriately adjusted.
- * Returns a null if unsuccessful.
- */
- private static String getRegistryKey(String regKey, String keyName) {
- String out = null;
- try {
- Class<?> clazz = Class.forName("java.util.prefs.WindowsPreferences");
-
- // Get the registry methods
- Method winRegOpenKeyM = clazz.getDeclaredMethod("WindowsRegOpenKey",
- int.class, byte[].class, int.class);
- winRegOpenKeyM.setAccessible(true);
-
- Method winRegCloseKeyM = clazz.getDeclaredMethod("WindowsRegCloseKey",
- int.class);
- winRegCloseKeyM.setAccessible(true);
-
- Method winRegQueryValueM = clazz.getDeclaredMethod("WindowsRegQueryValueEx",
- int.class, byte[].class);
- winRegQueryValueM.setAccessible(true);
-
- // Get all the constants we need
- int HKLM = getValueFromStaticField("HKEY_LOCAL_MACHINE", clazz);
- int KEY_READ = getValueFromStaticField("KEY_READ", clazz);
- int ERROR_CODE = getValueFromStaticField("ERROR_CODE", clazz);
- int NATIVE_HANDLE = getValueFromStaticField("NATIVE_HANDLE", clazz);
- int ERROR_SUCCESS = getValueFromStaticField("ERROR_SUCCESS", clazz);
-
- // Convert keys
- byte[] reg = stringToByteArray(regKey);
- byte[] key = stringToByteArray(keyName);
-
- // Open the registry
- int[] result = (int[]) winRegOpenKeyM.invoke(null, HKLM, reg, KEY_READ);
-
- if (result[ERROR_CODE] == ERROR_SUCCESS) {
- byte[] stvalue = (byte[]) winRegQueryValueM.invoke(null,
- result[NATIVE_HANDLE], key);
- out = byteArrayToString(stvalue);
- winRegCloseKeyM.invoke(null, result[NATIVE_HANDLE]);
- }
- } catch (Exception ex) {
- if (isVerbose()) {
- ex.printStackTrace();
- }
- }
- return out;
- }
-
- private static int getValueFromStaticField(String fldName, Class<?> klass) throws Exception {
- Field f = klass.getDeclaredField(fldName);
- f.setAccessible(true);
- return f.getInt(null);
- }
-}
diff --git a/setup_native/source/registration/com/sun/star/servicetag/WindowsSystemEnvironment.java b/setup_native/source/registration/com/sun/star/servicetag/WindowsSystemEnvironment.java
deleted file mode 100644
index cdc374f4a993..000000000000
--- a/setup_native/source/registration/com/sun/star/servicetag/WindowsSystemEnvironment.java
+++ /dev/null
@@ -1,145 +0,0 @@
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2008 by Sun Microsystems, Inc.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * $RCSfile: WindowsSystemEnvironment.java,v $
- *
- * $Revision: 1.2 $
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-package com.sun.star.servicetag;
-
-// The Service Tags team maintains the latest version of the implementation
-// for system environment data collection. JDK will include a copy of
-// the most recent released version for a JDK release. We rename
-// the package to com.sun.servicetag so that the Sun Connection
-// product always uses the latest version from the com.sun.scn.servicetags
-// package. JDK and users of the com.sun.servicetag API
-// (e.g. NetBeans and SunStudio) will use the version in JDK.
-
-import java.io.*;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Windows implementation of the SystemEnvironment class.
- */
-class WindowsSystemEnvironment extends SystemEnvironment {
- WindowsSystemEnvironment() {
- super();
-
- // run a call to make sure things are initialized
- // ignore the first call result as the system may
- // give inconsistent data on the first invocation ever
- getWmicResult("computersystem", "get", "model");
-
- setSystemModel(getWmicResult("computersystem", "get", "model"));
- setSystemManufacturer(getWmicResult("computersystem", "get", "manufacturer"));
- setSerialNumber(getWmicResult("bios", "get", "serialnumber"));
-
- String cpuMfr = getWmicResult("cpu", "get", "manufacturer");
- // this isn't as good an option, but if we couldn't get anything
- // from wmic, try the processor_identifier
- if (cpuMfr.length() == 0) {
- String procId = System.getenv("processor_identifer");
- if (procId != null) {
- String[] s = procId.split(",");
- cpuMfr = s[s.length - 1].trim();
- }
- }
- setCpuManufacturer(cpuMfr);
-
- // try to remove the temp file that gets created from running wmic cmds
- try {
- // look in the current working directory
- File f = new File("TempWmicBatchFile.bat");
- if (f.exists()) {
- f.delete();
- }
- } catch (Exception e) {
- // ignore the exception
- }
- }
-
-
- /**
- * This method invokes wmic outside of the normal environment
- * collection routines.
- *
- * An initial call to wmic can be costly in terms of time.
- *
- * <code>
- * Details of why the first call is costly can be found at:
- *
- * http://support.microsoft.com/kb/290216/en-us
- *
- * "When you run the Wmic.exe utility for the first time, the utility
- * compiles its .mof files into the repository. To save time during
- * Windows installation, this operation takes place as necessary."
- * </code>
- */
- private String getWmicResult(String alias, String verb, String property) {
- String res = "";
- BufferedReader in = null;
- try {
- ProcessBuilder pb = new ProcessBuilder("cmd", "/C", "WMIC", alias, verb, property);
- Process p = pb.start();
- // need this for executing windows commands (at least
- // needed for executing wmic command)
- BufferedWriter bw = new BufferedWriter(
- new OutputStreamWriter(p.getOutputStream()));
- bw.write(13);
- bw.flush();
- bw.close();
-
- p.waitFor();
- if (p.exitValue() == 0) {
- in = new BufferedReader(new InputStreamReader(p.getInputStream()));
- String line = null;
- while ((line = in.readLine()) != null) {
- line = line.trim();
- if (line.length() == 0) {
- continue;
- }
- res = line;
- }
- // return the *last* line read
- return res;
- }
-
- } catch (Exception e) {
- // ignore the exception
- } finally {
- if (in != null) {
- try {
- in.close();
- } catch (IOException e) {
- // ignore
- }
- }
- }
- return res.trim();
- }
-}
diff --git a/setup_native/source/registration/com/sun/star/servicetag/makefile.mk b/setup_native/source/registration/com/sun/star/servicetag/makefile.mk
deleted file mode 100644
index d4ebbed2f0c4..000000000000
--- a/setup_native/source/registration/com/sun/star/servicetag/makefile.mk
+++ /dev/null
@@ -1,83 +0,0 @@
-#*************************************************************************
-#
-# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-#
-# Copyright 2008 by Sun Microsystems, Inc.
-#
-# OpenOffice.org - a multi-platform office productivity suite
-#
-# $RCSfile: makefile.mk,v $
-#
-# $Revision: 1.2 $
-#
-# This file is part of OpenOffice.org.
-#
-# OpenOffice.org is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Lesser General Public License version 3
-# only, as published by the Free Software Foundation.
-#
-# OpenOffice.org is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU Lesser General Public License version 3 for more details
-# (a copy is included in the LICENSE file that accompanied this code).
-#
-# You should have received a copy of the GNU Lesser General Public License
-# version 3 along with OpenOffice.org. If not, see
-# <http://www.openoffice.org/license.html>
-# for a copy of the LGPLv3 License.
-#
-#*************************************************************************
-
-PRJNAME = setup_native
-PRJ = ..$/..$/..$/..$/..$/..
-TARGET = servicetag
-PACKAGE = com$/sun$/star$/servicetag
-
-# --- Settings -----------------------------------------------------
-
-.INCLUDE : settings.mk
-
-.IF "$(ENABLE_SVCTAGS)" == "YES"
-
-JARFILES = jurt.jar unoil.jar ridl.jar
-JAVAFILES = \
- BrowserSupport.java \
- Installer.java \
- LinuxSystemEnvironment.java \
- RegistrationData.java \
- RegistrationDocument.java \
- Registry.java \
- ServiceTag.java \
- SolarisServiceTag.java \
- SolarisSystemEnvironment.java \
- SunConnection.java \
- SysnetRegistryHelper.java \
- SystemEnvironment.java \
- UnauthorizedAccessException.java \
- Util.java \
- WindowsSystemEnvironment.java
-
-JAVACLASSFILES= $(foreach,i,$(JAVAFILES) $(CLASSDIR)$/$(PACKAGE)$/$(i:b).class)
-
-JARTARGET = $(TARGET).jar
-JARCOMPRESS = TRUE
-JARCLASSDIRS = $(PACKAGE)
-
-JAVARES= $(CLASSDIR)$/$(PACKAGE)$/resources$/product_registration.xsd
-
-.ENDIF # "$(ENABLE_SVCTAGS)" == "YES"
-
-# --- Targets ------------------------------------------------------
-
-
-.INCLUDE : target.mk
-
-.IF "$(ENABLE_SVCTAGS)" == "YES"
-ALLTAR: $(JAVARES)
-
-$(JAVARES) : $$(@:d:d:f)$/$$(@:f)
- $(MKDIRHIER) $(@:d)
- $(COPY) $< $@
-
-.ENDIF # "$(ENABLE_SVCTAGS)" == "YES"
diff --git a/setup_native/source/registration/com/sun/star/servicetag/resources/product_registration.xsd b/setup_native/source/registration/com/sun/star/servicetag/resources/product_registration.xsd
deleted file mode 100644
index e9b34417d9ae..000000000000
--- a/setup_native/source/registration/com/sun/star/servicetag/resources/product_registration.xsd
+++ /dev/null
@@ -1,301 +0,0 @@
-<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
-
-<xs:element name="registration_data">
- <xs:complexType>
- <xs:sequence>
- <xs:element name="environment"
- minOccurs="1"
- maxOccurs="1">
- <xs:complexType>
- <xs:sequence>
- <xs:element ref="hostname"
- minOccurs='1'
- maxOccurs='1'/>
- <xs:element ref="hostId"
- minOccurs='1'
- maxOccurs='1'/>
- <xs:element ref="osName"
- minOccurs='1'
- maxOccurs='1'/>
- <xs:element ref="osVersion"
- minOccurs='1'
- maxOccurs='1'/>
- <xs:element ref="osArchitecture"
- minOccurs='1'
- maxOccurs='1'/>
- <xs:element ref="systemModel"
- minOccurs='1'
- maxOccurs='1'/>
- <xs:element ref="systemManufacturer"
- minOccurs='1'
- maxOccurs='1'/>
- <xs:element ref="cpuManufacturer"
- minOccurs='1'
- maxOccurs='1'/>
- <xs:element ref="serialNumber"
- minOccurs='1'
- maxOccurs='1'/>
- </xs:sequence>
- </xs:complexType>
- </xs:element>
- <xs:element name="registry"
- minOccurs="1"
- maxOccurs="1">
- <xs:complexType>
- <xs:sequence>
- <xs:element name="service_tag"
- minOccurs="0"
- maxOccurs="1024">
- <xs:complexType>
- <xs:sequence>
- <xs:element ref="instance_urn"
- minOccurs='1'
- maxOccurs='1'/>
- <xs:element ref="product_name"
- minOccurs='1'
- maxOccurs='1'/>
- <xs:element ref="product_version"
- minOccurs='1'
- maxOccurs='1'/>
- <xs:element ref="product_urn"
- minOccurs='1'
- maxOccurs='1'/>
- <xs:element ref="product_parent_urn"
- minOccurs='1'
- maxOccurs='1'/>
- <xs:element ref="product_parent"
- minOccurs='1'
- maxOccurs='1'/>
- <xs:element ref="product_defined_inst_id"
- minOccurs='1'
- maxOccurs='1'/>
- <xs:element ref="product_vendor"
- minOccurs='1'
- maxOccurs='1'/>
- <xs:element ref="platform_arch"
- minOccurs='1'
- maxOccurs='1'/>
- <xs:element ref="timestamp"
- minOccurs='1'
- maxOccurs='1'/>
- <xs:element ref="container"
- minOccurs='1'
- maxOccurs='1'/>
- <xs:element ref="source"
- minOccurs='1'
- maxOccurs='1'/>
- <xs:element ref="installer_uid"
- minOccurs='1'
- maxOccurs='1'/>
- </xs:sequence>
- </xs:complexType>
- </xs:element>
- </xs:sequence>
- <xs:attribute name="urn"
- type="xs:string"
- use="required"/>
- <xs:attribute name="version"
- type="xs:string"
- use="required"/>
- </xs:complexType>
- </xs:element>
- </xs:sequence>
- <xs:attribute name="version"
- type="xs:string"
- use="required"/>
- </xs:complexType>
-</xs:element>
-
- <!-- definition of simple elements -->
- <xs:element name="hostname">
- <xs:simpleType>
- <xs:restriction base="xs:string">
- <xs:minLength value="1"/>
- <xs:maxLength value="255"/>
- </xs:restriction>
- </xs:simpleType>
- </xs:element>
-
- <xs:element name="hostId">
- <xs:simpleType>
- <xs:restriction base="xs:string">
- <xs:minLength value="0"/>
- <xs:maxLength value="16"/>
- </xs:restriction>
- </xs:simpleType>
- </xs:element>
-
- <xs:element name="osName">
- <xs:simpleType>
- <xs:restriction base="xs:string">
- <xs:minLength value="1"/>
- <xs:maxLength value="256"/>
- </xs:restriction>
- </xs:simpleType>
- </xs:element>
-
- <xs:element name="osVersion">
- <xs:simpleType>
- <xs:restriction base="xs:string">
- <xs:minLength value="0"/>
- <xs:maxLength value="50"/>
- </xs:restriction>
- </xs:simpleType>
- </xs:element>
-
- <xs:element name="osArchitecture">
- <xs:simpleType>
- <xs:restriction base="xs:string">
- <xs:minLength value="0"/>
- <xs:maxLength value="256"/>
- </xs:restriction>
- </xs:simpleType>
- </xs:element>
-
- <xs:element name="systemModel">
- <xs:simpleType>
- <xs:restriction base="xs:string">
- <xs:minLength value="0"/>
- <xs:maxLength value="50"/>
- </xs:restriction>
- </xs:simpleType>
- </xs:element>
-
- <xs:element name="systemManufacturer">
- <xs:simpleType>
- <xs:restriction base="xs:string">
- <xs:minLength value="0"/>
- <xs:maxLength value="50"/>
- </xs:restriction>
- </xs:simpleType>
- </xs:element>
-
- <xs:element name="cpuManufacturer">
- <xs:simpleType>
- <xs:restriction base="xs:string">
- <xs:minLength value="0"/>
- <xs:maxLength value="50"/>
- </xs:restriction>
- </xs:simpleType>
- </xs:element>
-
- <xs:element name="serialNumber">
- <xs:simpleType>
- <xs:restriction base="xs:string">
- <xs:minLength value="0"/>
- <xs:maxLength value="256"/>
- </xs:restriction>
- </xs:simpleType>
- </xs:element>
-
- <xs:element name="instance_urn">
- <xs:simpleType>
- <xs:restriction base="xs:string">
- <xs:minLength value="1"/>
- <xs:maxLength value="255"/>
- </xs:restriction>
- </xs:simpleType>
- </xs:element>
-
- <xs:element name="product_name">
- <xs:simpleType>
- <xs:restriction base="xs:string">
- <xs:maxLength value="255"/>
- </xs:restriction>
- </xs:simpleType>
- </xs:element>
-
- <xs:element name="product_version">
- <xs:simpleType>
- <xs:restriction base="xs:string">
- <xs:maxLength value="63"/>
- </xs:restriction>
- </xs:simpleType>
- </xs:element>
-
- <xs:element name="product_urn">
- <xs:simpleType>
- <xs:restriction base="xs:string">
- <xs:minLength value="1"/>
- <xs:maxLength value="255"/>
- </xs:restriction>
- </xs:simpleType>
- </xs:element>
-
- <xs:element name="product_parent_urn">
- <xs:simpleType>
- <xs:restriction base="xs:string">
- <xs:minLength value="0"/>
- <xs:maxLength value="255"/>
- </xs:restriction>
- </xs:simpleType>
- </xs:element>
-
- <xs:element name="product_parent">
- <xs:simpleType>
- <xs:restriction base="xs:string">
- <xs:minLength value="1"/>
- <xs:maxLength value="255"/>
- </xs:restriction>
- </xs:simpleType>
- </xs:element>
-
- <xs:element name="product_defined_inst_id">
- <xs:simpleType>
- <xs:restriction base="xs:string">
- <xs:minLength value="0"/>
- <xs:maxLength value="255"/>
- </xs:restriction>
- </xs:simpleType>
- </xs:element>
-
- <xs:element name="product_vendor">
- <xs:simpleType>
- <xs:restriction base="xs:string">
- <xs:minLength value="1"/>
- <xs:maxLength value="63"/>
- </xs:restriction>
- </xs:simpleType>
- </xs:element>
-
- <xs:element name="platform_arch">
- <xs:simpleType>
- <xs:restriction base="xs:string">
- <xs:minLength value="1"/>
- <xs:maxLength value="63"/>
- </xs:restriction>
- </xs:simpleType>
- </xs:element>
-
- <xs:element name="timestamp">
- <xs:simpleType>
- <xs:restriction base="xs:string">
- <xs:maxLength value="24"/>
- </xs:restriction>
- </xs:simpleType>
- </xs:element>
-
- <xs:element name="container">
- <xs:simpleType>
- <xs:restriction base="xs:string">
- <xs:maxLength value="63"/>
- </xs:restriction>
- </xs:simpleType>
- </xs:element>
-
- <xs:element name="source">
- <xs:simpleType>
- <xs:restriction base="xs:string">
- <xs:maxLength value="63"/>
- </xs:restriction>
- </xs:simpleType>
- </xs:element>
-
- <xs:element name="installer_uid">
- <xs:simpleType>
- <xs:restriction base="xs:integer">
- </xs:restriction>
- </xs:simpleType>
- </xs:element>
-
-</xs:schema>
diff --git a/setup_native/source/win32/customactions/shellextensions/vistaspecial.cxx b/setup_native/source/win32/customactions/shellextensions/vistaspecial.cxx
index 5b5d649ea334..b014188f91d2 100644
--- a/setup_native/source/win32/customactions/shellextensions/vistaspecial.cxx
+++ b/setup_native/source/win32/customactions/shellextensions/vistaspecial.cxx
@@ -194,6 +194,18 @@ extern "C" UINT __stdcall RenamePrgFolder( MSIHANDLE handle )
// MessageBox(NULL, sRenameSrc.c_str(), "OFFICEINSTALLLOCATION", MB_OK);
bool bSuccess = MoveFile( sRenameSrc.c_str(), sRenameDst.c_str() );
+ if ( !bSuccess )
+ {
+ TCHAR sAppend[2] = TEXT("0");
+ for ( int i = 0; i < 10; i++ )
+ {
+ sRenameDst = sOfficeInstallPath + TEXT("program_old") + sAppend;
+ bSuccess = MoveFile( sRenameSrc.c_str(), sRenameDst.c_str() );
+ if ( bSuccess )
+ break;
+ sAppend[0] += 1;
+ }
+ }
#if 0
if ( !bSuccess )
@@ -214,6 +226,14 @@ extern "C" UINT __stdcall RemovePrgFolder( MSIHANDLE handle )
bool bSuccess = RemoveCompleteDirectory( sRemoveDir );
+ TCHAR sAppend[2] = TEXT("0");
+ for ( int i = 0; i < 10; i++ )
+ {
+ sRemoveDir = sOfficeInstallPath + TEXT("program_old") + sAppend;
+ bSuccess = RemoveCompleteDirectory( sRemoveDir );
+ sAppend[0] += 1;
+ }
+
#if 0
if ( bSuccess )
MessageBox(NULL, "Removing folder successful", "RemovePrgFolder", MB_OK);
diff --git a/wizards/com/sun/star/wizards/ui/WizardDialog.java b/wizards/com/sun/star/wizards/ui/WizardDialog.java
index 2e101ff3398a..15b840fa9c89 100644
--- a/wizards/com/sun/star/wizards/ui/WizardDialog.java
+++ b/wizards/com/sun/star/wizards/ui/WizardDialog.java
@@ -232,14 +232,29 @@ public abstract class WizardDialog extends UnoDialog2 implements VetoableChangeL
{
int iDialogHeight = ((Integer) Helper.getUnoPropertyValue(this.xDialogModel, "Height")).intValue();
+ // the roadmap control has got no real TabIndex ever
+ // that is not correct, but changing this would need time, so it is used
+ // without TabIndex as before
oRoadmap = insertControlModel("com.sun.star.awt.UnoControlRoadmapModel", "rdmNavi",
new String[]
{
- "Height", "PositionX", "PositionY", "Step", "TabIndex", "Width"
+ "Height",
+ "PositionX",
+ "PositionY",
+ "Step",
+ "TabIndex",
+ "Tabstop",
+ "Width"
},
new Object[]
{
- new Integer(iDialogHeight - 26), new Integer(0), new Integer(0), new Integer(0), new Short((short) 0), new Integer(85)
+ new Integer(iDialogHeight - 26),
+ new Integer(0),
+ new Integer(0),
+ new Integer(0),
+ new Short((short)0),
+ Boolean.TRUE,
+ new Integer(85)
});
XPropertySet xPSet = (XPropertySet) UnoRuntime.queryInterface(XPropertySet.class, oRoadmap);
xPSet.setPropertyValue("Name", "rdmNavi");
diff --git a/wizards/source/euro/Init.xba b/wizards/source/euro/Init.xba
index baedb650a0f9..45fdafdbafe5 100644
--- a/wizards/source/euro/Init.xba
+++ b/wizards/source/euro/Init.xba
@@ -68,6 +68,9 @@ Public sCurrAUSTRIAN as String
Public sCurrFINNISH as String
Public sCurrGREEK as String
Public sCurrSLOVENIAN as String
+Public sCurrCYPRIOT as String
+Public sCurrMALTESE as String
+Public sCurrSLOVAK as String
Public sCurrUNKNOWN as String
Public sCurrSYSUNKNOWN as String
@@ -76,7 +79,7 @@ Public sPrgsCONVERTING as String
Public sPrgsUNPROTECT as String
Public sInclusiveSubDir as String
-Public Const SBCOUNTRYCOUNT = 12
+Public Const SBCOUNTRYCOUNT = 15
Public CurMimeType as String
Public CurCellCount as Long
Public oSheets as Object
@@ -112,8 +115,8 @@ Public CurExtension(2) as String
Public Currfactor as Double
Public CurrSymbolList(2) as String
Public CurrLanguage as String
-Public CurrValue(12,5)
-Public LangIDValue(12,2,2) as String
+Public CurrValue(15,5)
+Public LangIDValue(15,2,2) as String
Public PreName as String
Public Separator as String
Public BitmapDir as String
@@ -189,8 +192,11 @@ Dim LocWorkPath as String
sCurrFINNISH = GetResText(1510)
sCurrGREEK = GetResText(1511)
sCurrSLOVENIAN = GetResText(1512)
- sCurrUNKNOWN = GetResText(1513)
- sCurrSYSUNKNOWN = GetResText(1514)
+ sCurrCYPRIOT = GetResText(1513)
+ sCurrMALTESE = GetResText(1514)
+ sCurrSLOVAK = GetResText(1515)
+ sCurrUNKNOWN = GetResText(1516)
+ sCurrSYSUNKNOWN = GetResText(1517)
.cmdCancel.Label = sCANCEL
.cmdHelp.Label = sHELP
.cmdBack.Label = GetResText(1002)
@@ -299,6 +305,10 @@ Sub InitializeLanguages()
LangIDValue(7,0,1) = &quot;IE&quot;
LangIDValue(7,0,2) = &quot;-1809&quot;
+ LangIDValue(7,1,0) = &quot;ga&quot;
+ LangIDValue(7,1,1) = &quot;IE&quot;
+ LangIDValue(7,1,2) = &quot;-83C&quot;
+
&apos; CURRENCIES_LUXEMBOURG
LangIDValue(8,0,0) = &quot;fr&quot;
LangIDValue(8,0,1) = &quot;LU&quot;
@@ -330,7 +340,23 @@ Sub InitializeLanguages()
&apos; CURRENCIES_SLOVENIAN
LangIDValue(12,0,0) = &quot;sl&quot;
LangIDValue(12,0,1) = &quot;SI&quot;
- LangIDValue(12,0,2) = &quot;-408&quot;
+ LangIDValue(12,0,2) = &quot;-424&quot;
+
+&apos; CURRENCIES_CYPRIOT
+ LangIDValue(13,0,0) = &quot;el&quot;
+ LangIDValue(13,0,1) = &quot;CY&quot;
+ LangIDValue(13,0,2) = &quot;-408&quot;
+
+&apos; CURRENCIES_MALTESE
+ LangIDValue(14,0,0) = &quot;mt&quot;
+ LangIDValue(14,0,1) = &quot;MT&quot;
+ LangIDValue(14,0,2) = &quot;-43A&quot;
+
+&apos; CURRENCIES_SLOVAK
+ LangIDValue(15,0,0) = &quot;sk&quot;
+ LangIDValue(15,0,1) = &quot;SK&quot;
+ LangIDValue(15,0,2) = &quot;-41B&quot;
+
End Sub
@@ -456,6 +482,33 @@ Dim i as Integer
CurrValue(12,4) = &quot;SIT&quot;
CurrValue(12,5) = &quot;SIT&quot;
+ CurrValue(13,0) = sCurrCYPRIOT
+ &apos; real conversion rate
+ CurrValue(13,1) = 0.585274
+ &apos; rounded conversion rate
+ CurrValue(13,2) = 0.6
+ CurrValue(13,3) = &quot;£C&quot;
+ CurrValue(13,4) = &quot;£&quot;
+ CurrValue(13,5) = &quot;CYP&quot;
+
+ CurrValue(14,0) = sCurrMALTESE
+ &apos; real conversion rate
+ CurrValue(14,1) = 0.429300
+ &apos; rounded conversion rate
+ CurrValue(14,2) = 0.4
+ CurrValue(14,3) = chr(8356)
+ CurrValue(14,4) = &quot;Lm&quot;
+ CurrValue(14,5) = &quot;MTL&quot;
+
+ CurrValue(15,0) = sCurrSLOVAK
+ &apos; real conversion rate
+ CurrValue(15,1) = 30.1260
+ &apos; rounded conversion rate
+ CurrValue(15,2) = 30
+ CurrValue(15,3) = &quot;Sk&quot;
+ CurrValue(15,4) = &quot;Sk&quot;
+ CurrValue(15,5) = &quot;SKK&quot;
+
i = -1
CurrSymbolList(0) = &quot;&quot;
CurrSymbolList(1) = &quot;&quot;
diff --git a/wizards/source/euro/euro.src b/wizards/source/euro/euro.src
index c62a756d1733..227c11203792 100644
--- a/wizards/source/euro/euro.src
+++ b/wizards/source/euro/euro.src
@@ -429,11 +429,26 @@ Text [ en-US ] = "Slovenian Tolar";
String CURRENCIES + 13
{
-Text [ en-US ] = "The currency set for the document is not a European currency!";
+Text [ en-US ] = "Cypriot Pound";
};
String CURRENCIES + 14
{
+Text [ en-US ] = "Maltese Lira";
+};
+
+String CURRENCIES + 15
+{
+Text [ en-US ] = "Slovak Koruna";
+};
+
+String CURRENCIES + 16
+{
+Text [ en-US ] = "The currency set for the document is not a European currency!";
+};
+
+String CURRENCIES + 17
+{
Text [ en-US ] = "The language set for your operating system is not a language of the European Monetary Union.";
};
diff --git a/wizards/source/importwizard/ImportDialog.xdl b/wizards/source/importwizard/ImportDialog.xdl
index dbc7e118c99e..082c06bc8970 100644
--- a/wizards/source/importwizard/ImportDialog.xdl
+++ b/wizards/source/importwizard/ImportDialog.xdl
@@ -89,7 +89,7 @@
<dlg:fixedline dlg:id="hlnDocuments" dlg:tab-index="42" dlg:left="6" dlg:top="110" dlg:width="258" dlg:height="8" dlg:page="2" dlg:value="hlnDocuments"/>
<dlg:fixedline dlg:id="FixedLine1" dlg:tab-index="43" dlg:left="6" dlg:top="181" dlg:width="258" dlg:height="6"/>
<dlg:fixedline dlg:id="hlnProgress" dlg:tab-index="44" dlg:left="6" dlg:top="55" dlg:width="258" dlg:height="8" dlg:page="4" dlg:value="hlnProgress"/>
- <dlg:button dlg:id="cmdShowLogFile" dlg:tab-index="45" dlg:disabled="true" dlg:left="105" dlg:top="142" dlg:width="60" dlg:height="14" dlg:page="4" dlg:value="cmdShowLogFile">
+ <dlg:button dlg:id="cmdShowLogFile" dlg:tab-index="45" dlg:disabled="true" dlg:left="75" dlg:top="142" dlg:width="120" dlg:height="14" dlg:page="4" dlg:value="cmdShowLogFile">
<script:event script:event-name="on-performaction" script:macro-name="vnd.sun.star.script:ImportWizard.FilesModul.OpenLogDocument?language=Basic&amp;location=application" script:language="Script"/>
</dlg:button>
</dlg:bulletinboard>
diff --git a/wizards/source/schedule/LocalHolidays.xba b/wizards/source/schedule/LocalHolidays.xba
index 7c7d46ce664d..0b347c03f031 100644
--- a/wizards/source/schedule/LocalHolidays.xba
+++ b/wizards/source/schedule/LocalHolidays.xba
@@ -13,8 +13,10 @@ Dim lDate&amp;
CalInsertBankholiday(DateSerial(YearInt, 1, 1), &quot;Jour de l&apos;an&quot;, cHolidayType_Full)
lEasterDate = CalEasterTable(YearInt)
CalInsertBankholiday(lEasterDate, &quot;Pâques&quot;, cHolidayType_Full)
- CalInsertBankholiday(lEasterDate + 10, &quot;Pentecôte&quot;, cHolidayType_Full)
+ CalInsertBankholiday(lEasterDate + 1, &quot;Lundi de Pâques&quot;, cHolidayType_Full)
CalInsertBankholiday(lEasterDate + 39, &quot;Ascension&quot;, cHolidayType_Full)
+ CalInsertBankholiday(lEasterDate + 49, &quot;Pentecôte&quot;, cHolidayType_Full)
+ CalInsertBankholiday(lEasterDate + 50, &quot;Lundi de Pentecôte&quot;, cHolidayType_Full)
CalInsertBankholiday(DateSerial(YearInt, 5, 1), &quot;Fête du travail&quot;, cHolidayType_Full)
CalInsertBankholiday(DateSerial(YearInt, 5, 8), &quot;Victoire 1945&quot;, cHolidayType_Full)
CalInsertBankholiday(DateSerial(YearInt, 7, 14), &quot;Fête Nationale&quot;, cHolidayType_Full)
diff --git a/xmlsecurity/inc/xmlsecurity/digitalsignaturesdialog.hxx b/xmlsecurity/inc/xmlsecurity/digitalsignaturesdialog.hxx
index 9e1f8d1667c2..a6e4afac417f 100644
--- a/xmlsecurity/inc/xmlsecurity/digitalsignaturesdialog.hxx
+++ b/xmlsecurity/inc/xmlsecurity/digitalsignaturesdialog.hxx
@@ -36,10 +36,12 @@
#include <vcl/button.hxx>
#include <svtools/stdctrl.hxx>
#include <svx/simptabl.hxx>
+#include <com/sun/star/beans/PropertyValue.hpp>
#include <xmlsecurity/documentsignaturehelper.hxx>
#include <xmlsecurity/xmlsignaturehelper.hxx>
+
#ifndef _STLP_VECTOR
#include <vector>
#endif
@@ -53,6 +55,8 @@ namespace io {
class XStream; }
namespace embed {
class XStorage; }
+namespace xml { namespace dom {
+ class XDocumentBuilder; } }
}}}
namespace css = com::sun::star;
@@ -68,10 +72,12 @@ private:
css::uno::Reference < css::embed::XStorage > mxStore;
css::uno::Reference < css::io::XStream > mxSignatureStream;
+ css::uno::Reference < css::io::XStream > mxTempSignatureStream;
SignatureInformations maCurrentSignatureInformations;
bool mbVerifySignatures;
bool mbSignaturesChanged;
DocumentSignatureMode meSignatureMode;
+ css::uno::Sequence < css::uno::Sequence < css::beans::PropertyValue > > m_manifest;
FixedText maHintDocFT;
FixedText maHintBasicFT;
@@ -83,6 +89,7 @@ private:
FixedInfo maSigsInvalidFI;
FixedImage maSigsNotvalidatedImg;
FixedInfo maSigsNotvalidatedFI;
+ FixedInfo maSigsOldSignatureFI;
PushButton maViewBtn;
PushButton maAddBtn;
@@ -93,17 +100,24 @@ private:
CancelButton maCancelBtn;
HelpButton maHelpBtn;
+ ::rtl::OUString m_sODFVersion;
+ //Signals if the document contains already a document signature. This is only
+ //importent when we are signing macros and if the value is true.
+ bool m_bHasDocumentSignature;
+ bool m_bWarningShowSignMacro;
+
DECL_LINK( ViewButtonHdl, Button* );
DECL_LINK( AddButtonHdl, Button* );
DECL_LINK( RemoveButtonHdl, Button* );
DECL_LINK( SignatureHighlightHdl, void* );
DECL_LINK( SignatureSelectHdl, void* );
DECL_LINK( StartVerifySignatureHdl, void* );
+ DECL_LINK( OKButtonHdl, void* );
- void ImplGetSignatureInformations();
+ void ImplGetSignatureInformations(bool bUseTempStream);
void ImplFillSignaturesBox();
void ImplShowSignaturesDetails();
- SignatureStreamHelper ImplOpenSignatureStream( sal_Int32 eStreamMode );
+ SignatureStreamHelper ImplOpenSignatureStream( sal_Int32 eStreamMode, bool bTempStream );
//Checks if adding is allowed.
//See the spec at specs/www/appwide/security/Electronic_Signatures_and_Security.sxw
@@ -111,10 +125,15 @@ private:
bool canAdd();
bool canRemove();
+ //Checks if a particular stream is a valid xml stream. Those are treated differently
+ //when they are signed (c14n transformation)
+ bool isXML(const ::rtl::OUString& rURI );
+ bool canAddRemove();
+
public:
DigitalSignaturesDialog( Window* pParent, cssu::Reference<
cssu::XComponentContext >& rxCtx, DocumentSignatureMode eMode,
- sal_Bool bReadOnly );
+ sal_Bool bReadOnly, const ::rtl::OUString& sODFVersion, bool bHasDocumentSignature);
~DigitalSignaturesDialog();
// Initialize the dialog and the security environment, returns TRUE on success
diff --git a/xmlsecurity/inc/xmlsecurity/documentsignaturehelper.hxx b/xmlsecurity/inc/xmlsecurity/documentsignaturehelper.hxx
index 615776b023b7..6fb4ac80badd 100644
--- a/xmlsecurity/inc/xmlsecurity/documentsignaturehelper.hxx
+++ b/xmlsecurity/inc/xmlsecurity/documentsignaturehelper.hxx
@@ -33,7 +33,7 @@
#include <com/sun/star/uno/Reference.h>
#include <rtl/ustring.hxx>
-
+#include "xmlsecurity/sigstruct.hxx"
#ifndef _STLP_VECTOR
#include <vector>
@@ -64,6 +64,13 @@ namespace css = com::sun::star;
enum DocumentSignatureMode { SignatureModeDocumentContent, SignatureModeMacros, SignatureModePackage };
+enum DocumentSignatureAlgorithm
+{
+ OOo2Document,
+ OOo3_0Document,
+ OOo3_2Document
+};
+
struct SignatureStreamHelper
{
css::uno::Reference < css::embed::XStorage > xSignatureStorage;
@@ -75,14 +82,24 @@ class DocumentSignatureHelper
{
public:
- static SignatureStreamHelper OpenSignatureStream( const css::uno::Reference < css::embed::XStorage >& rxStore, sal_Int32 nOpenMode, DocumentSignatureMode eDocSigMode );
- static std::vector< rtl::OUString > CreateElementList( const css::uno::Reference < css::embed::XStorage >& rxStore, const ::rtl::OUString rRootStorageName, DocumentSignatureMode eMode );
-
+ static SignatureStreamHelper OpenSignatureStream(
+ const css::uno::Reference < css::embed::XStorage >& rxStore, sal_Int32 nOpenMode,
+ DocumentSignatureMode eDocSigMode );
+ static std::vector< rtl::OUString > CreateElementList(
+ const css::uno::Reference < css::embed::XStorage >& rxStore,
+ const ::rtl::OUString rRootStorageName, DocumentSignatureMode eMode,
+ const DocumentSignatureAlgorithm mode);
+ static bool isODFPre_1_2(const ::rtl::OUString & sODFVersion);
+ static bool isOOo3_2_Signature(const SignatureInformation & sigInfo);
+ static DocumentSignatureAlgorithm getDocumentAlgorithm(
+ const ::rtl::OUString & sODFVersion, const SignatureInformation & sigInfo);
+ static bool checkIfAllFilesAreSigned( const ::std::vector< ::rtl::OUString > & sElementList,
+ const SignatureInformation & sigInfo, const DocumentSignatureAlgorithm alg);
+ static bool equalsReferenceUriManifestPath(
+ const ::rtl::OUString & rUri, const ::rtl::OUString & rPath);
static ::rtl::OUString GetDocumentContentSignatureDefaultStreamName();
static ::rtl::OUString GetScriptingContentSignatureDefaultStreamName();
static ::rtl::OUString GetPackageSignatureDefaultStreamName();
- static bool isODFPre_1_2(const ::com::sun::star::uno::Reference <
- ::com::sun::star::embed::XStorage >& /*rxStore*/);
};
diff --git a/xmlsecurity/inc/xmlsecurity/global.hrc b/xmlsecurity/inc/xmlsecurity/global.hrc
index 35e2f3910cef..ef59a9dafa01 100644
--- a/xmlsecurity/inc/xmlsecurity/global.hrc
+++ b/xmlsecurity/inc/xmlsecurity/global.hrc
@@ -47,8 +47,6 @@
#define RID_XMLSECTP_LOCK 1011
#define RID_XMLSECTP_LOCK_HC 1012
#define RID_XMLSECWB_NO_MOZILLA_PROFILE 1013
-#define RID_XMLSECDLG_OLD_ODF_FORMAT 1014
-
#endif
diff --git a/xmlsecurity/inc/xmlsecurity/xmlsignaturehelper.hxx b/xmlsecurity/inc/xmlsecurity/xmlsignaturehelper.hxx
index 0b98ae55306f..53455b652fa5 100644
--- a/xmlsecurity/inc/xmlsecurity/xmlsignaturehelper.hxx
+++ b/xmlsecurity/inc/xmlsecurity/xmlsignaturehelper.hxx
@@ -145,9 +145,10 @@ public:
void SetUriBinding( com::sun::star::uno::Reference< com::sun::star::xml::crypto::XUriBinding >& rxUriBinding );
com::sun::star::uno::Reference< com::sun::star::xml::crypto::XUriBinding > GetUriBinding() const;
- // Set the storage which should be used by the default UriBinding
- // Must be set before StatrtMission().
- void SetStorage( const com::sun::star::uno::Reference < com::sun::star::embed::XStorage >& rxStorage );
+ // Set the storage which should be used by the default UriBinding
+ // Must be set before StatrtMission().
+ //sODFVersion indicates the ODF version
+ void SetStorage( const com::sun::star::uno::Reference < com::sun::star::embed::XStorage >& rxStorage, ::rtl::OUString sODFVersion );
// Argument for the Link is a uno::Reference< xml::sax::XAttributeList >*
// Return 1 to verify, 0 to skip.
diff --git a/xmlsecurity/source/component/documentdigitalsignatures.cxx b/xmlsecurity/source/component/documentdigitalsignatures.cxx
index c65aed21dd3f..dde41a4ac636 100644
--- a/xmlsecurity/source/component/documentdigitalsignatures.cxx
+++ b/xmlsecurity/source/component/documentdigitalsignatures.cxx
@@ -54,11 +54,14 @@
#include <tools/urlobj.hxx>
#include <vcl/msgbox.hxx>
#include <svtools/securityoptions.hxx>
-#include <com/sun/star/security/CertificateValidity.hdl>
+#include <com/sun/star/security/CertificateValidity.hpp>
#include <com/sun/star/security/SerialNumberAdapter.hpp>
#include <ucbhelper/contentbroker.hxx>
#include <unotools/ucbhelper.hxx>
#include <comphelper/componentcontext.hxx>
+#include "comphelper/documentconstants.hxx"
+
+#include "com/sun/star/lang/IllegalArgumentException.hpp"
#include <stdio.h>
@@ -67,74 +70,145 @@ using namespace ::com::sun::star;
using namespace ::com::sun::star::uno;
namespace css = ::com::sun::star;
-DocumentDigitalSignatures::DocumentDigitalSignatures( const Reference< XComponentContext >& rxCtx )
+#define OUSTR(x) ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(x) )
+
+DocumentDigitalSignatures::DocumentDigitalSignatures( const Reference< XComponentContext >& rxCtx ):
+ mxCtx(rxCtx),
+ m_sODFVersion(ODFVER_012_TEXT),
+ m_nArgumentsCount(0),
+ m_bHasDocumentSignature(false)
+{
+}
+
+void DocumentDigitalSignatures::initialize( const Sequence< Any >& aArguments)
+ throw (css::uno::Exception, css::uno::RuntimeException)
{
- mxCtx = rxCtx;
+ if (aArguments.getLength() == 0 || aArguments.getLength() > 2)
+ throw css::lang::IllegalArgumentException(
+ OUSTR("DocumentDigitalSignatures::initialize requires one or two arguments"),
+ Reference<XInterface>(static_cast<XInitialization*>(this), UNO_QUERY), 0);
+
+ m_nArgumentsCount = aArguments.getLength();
+
+ if (!(aArguments[0] >>= m_sODFVersion))
+ throw css::lang::IllegalArgumentException(
+ OUSTR("DocumentDigitalSignatures::initialize: the first arguments must be a string"),
+ Reference<XInterface>(static_cast<XInitialization*>(this), UNO_QUERY), 0);
+
+ if (aArguments.getLength() == 2
+ && !(aArguments[1] >>= m_bHasDocumentSignature))
+ throw css::lang::IllegalArgumentException(
+ OUSTR("DocumentDigitalSignatures::initialize: the second arguments must be a bool"),
+ Reference<XInterface>(static_cast<XInitialization*>(this), UNO_QUERY), 1);
+
+ //the Version is supported as of ODF1.2, so for and 1.1 document or older we will receive the
+ //an empty string. In this case we set it to ODFVER_010_TEXT. Then we can later check easily
+ //if initialize was called. Only then m_sODFVersion.getLength() is greater than 0
+ if (m_sODFVersion.getLength() == 0)
+ m_sODFVersion = ODFVER_010_TEXT;
}
-sal_Bool DocumentDigitalSignatures::signDocumentContent( const Reference< ::com::sun::star::embed::XStorage >& rxStorage, const ::com::sun::star::uno::Reference< ::com::sun::star::io::XStream >& xSignStream ) throw (RuntimeException)
+sal_Bool DocumentDigitalSignatures::signDocumentContent(
+ const Reference< css::embed::XStorage >& rxStorage,
+ const Reference< css::io::XStream >& xSignStream)
+ throw (RuntimeException)
{
+ OSL_ENSURE(m_sODFVersion.getLength(), "DocumentDigitalSignatures: ODF Version not set, assuming minimum 1.2");
return ImplViewSignatures( rxStorage, xSignStream, SignatureModeDocumentContent, false );
}
-Sequence< ::com::sun::star::security::DocumentSignatureInformation > DocumentDigitalSignatures::verifyDocumentContentSignatures( const Reference< ::com::sun::star::embed::XStorage >& rxStorage, const ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream >& xSignInStream ) throw (RuntimeException)
+Sequence< css::security::DocumentSignatureInformation >
+DocumentDigitalSignatures::verifyDocumentContentSignatures(
+ const Reference< css::embed::XStorage >& rxStorage,
+ const Reference< css::io::XInputStream >& xSignInStream ) throw (RuntimeException)
{
+ OSL_ENSURE(m_sODFVersion.getLength(),"DocumentDigitalSignatures: ODF Version not set, assuming minimum 1.2");
return ImplVerifySignatures( rxStorage, xSignInStream, SignatureModeDocumentContent );
}
-void DocumentDigitalSignatures::showDocumentContentSignatures( const Reference< ::com::sun::star::embed::XStorage >& rxStorage, const ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream >& xSignInStream ) throw (RuntimeException)
+void DocumentDigitalSignatures::showDocumentContentSignatures(
+ const Reference< css::embed::XStorage >& rxStorage,
+ const Reference< css::io::XInputStream >& xSignInStream ) throw (RuntimeException)
{
+ OSL_ENSURE(m_sODFVersion.getLength(),"DocumentDigitalSignatures: ODF Version not set, assuming minimum 1.2");
ImplViewSignatures( rxStorage, xSignInStream, SignatureModeDocumentContent, true );
}
-::rtl::OUString DocumentDigitalSignatures::getDocumentContentSignatureDefaultStreamName() throw (::com::sun::star::uno::RuntimeException)
+::rtl::OUString DocumentDigitalSignatures::getDocumentContentSignatureDefaultStreamName()
+ throw (css::uno::RuntimeException)
{
return DocumentSignatureHelper::GetDocumentContentSignatureDefaultStreamName();
}
-sal_Bool DocumentDigitalSignatures::signScriptingContent( const Reference< ::com::sun::star::embed::XStorage >& rxStorage, const ::com::sun::star::uno::Reference< ::com::sun::star::io::XStream >& xSignStream ) throw (RuntimeException)
+sal_Bool DocumentDigitalSignatures::signScriptingContent(
+ const Reference< css::embed::XStorage >& rxStorage,
+ const Reference< css::io::XStream >& xSignStream ) throw (RuntimeException)
{
+ OSL_ENSURE(m_sODFVersion.getLength(),"DocumentDigitalSignatures: ODF Version not set, assuming minimum 1.2");
+ OSL_ENSURE(m_nArgumentsCount == 2, "DocumentDigitalSignatures: Service was not initialized properly");
return ImplViewSignatures( rxStorage, xSignStream, SignatureModeMacros, false );
}
-Sequence< ::com::sun::star::security::DocumentSignatureInformation > DocumentDigitalSignatures::verifyScriptingContentSignatures( const Reference< ::com::sun::star::embed::XStorage >& rxStorage, const ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream >& xSignInStream ) throw (RuntimeException)
+Sequence< css::security::DocumentSignatureInformation >
+DocumentDigitalSignatures::verifyScriptingContentSignatures(
+ const Reference< css::embed::XStorage >& rxStorage,
+ const Reference< css::io::XInputStream >& xSignInStream ) throw (RuntimeException)
{
+ OSL_ENSURE(m_sODFVersion.getLength(),"DocumentDigitalSignatures: ODF Version not set, assuming minimum 1.2");
return ImplVerifySignatures( rxStorage, xSignInStream, SignatureModeMacros );
}
-void DocumentDigitalSignatures::showScriptingContentSignatures( const Reference< ::com::sun::star::embed::XStorage >& rxStorage, const ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream >& xSignInStream ) throw (RuntimeException)
+void DocumentDigitalSignatures::showScriptingContentSignatures(
+ const Reference< css::embed::XStorage >& rxStorage,
+ const Reference< css::io::XInputStream >& xSignInStream ) throw (RuntimeException)
{
+ OSL_ENSURE(m_sODFVersion.getLength(),"DocumentDigitalSignatures: ODF Version not set, assuming minimum 1.2");
ImplViewSignatures( rxStorage, xSignInStream, SignatureModeMacros, true );
}
-::rtl::OUString DocumentDigitalSignatures::getScriptingContentSignatureDefaultStreamName() throw (::com::sun::star::uno::RuntimeException)
+::rtl::OUString DocumentDigitalSignatures::getScriptingContentSignatureDefaultStreamName()
+ throw (css::uno::RuntimeException)
{
return DocumentSignatureHelper::GetScriptingContentSignatureDefaultStreamName();
}
-sal_Bool DocumentDigitalSignatures::signPackage( const Reference< ::com::sun::star::embed::XStorage >& rxStorage, const ::com::sun::star::uno::Reference< ::com::sun::star::io::XStream >& xSignStream ) throw (RuntimeException)
+sal_Bool DocumentDigitalSignatures::signPackage(
+ const Reference< css::embed::XStorage >& rxStorage,
+ const Reference< css::io::XStream >& xSignStream ) throw (RuntimeException)
{
+ OSL_ENSURE(m_sODFVersion.getLength(),"DocumentDigitalSignatures: ODF Version not set, assuming minimum 1.2");
return ImplViewSignatures( rxStorage, xSignStream, SignatureModePackage, false );
}
-Sequence< ::com::sun::star::security::DocumentSignatureInformation > DocumentDigitalSignatures::verifyPackageSignatures( const Reference< ::com::sun::star::embed::XStorage >& rxStorage, const ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream >& xSignInStream ) throw (RuntimeException)
+Sequence< css::security::DocumentSignatureInformation >
+DocumentDigitalSignatures::verifyPackageSignatures(
+ const Reference< css::embed::XStorage >& rxStorage,
+ const Reference< css::io::XInputStream >& xSignInStream ) throw (RuntimeException)
{
+ OSL_ENSURE(m_sODFVersion.getLength(),"DocumentDigitalSignatures: ODF Version not set, assuming minimum 1.2");
return ImplVerifySignatures( rxStorage, xSignInStream, SignatureModePackage );
}
-void DocumentDigitalSignatures::showPackageSignatures( const Reference< ::com::sun::star::embed::XStorage >& rxStorage, const ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream >& xSignInStream ) throw (RuntimeException)
+void DocumentDigitalSignatures::showPackageSignatures(
+ const Reference< css::embed::XStorage >& rxStorage,
+ const Reference< css::io::XInputStream >& xSignInStream ) throw (RuntimeException)
{
+ OSL_ENSURE(m_sODFVersion.getLength(),"DocumentDigitalSignatures: ODF Version not set, assuming minimum 1.2");
ImplViewSignatures( rxStorage, xSignInStream, SignatureModePackage, true );
}
-::rtl::OUString DocumentDigitalSignatures::getPackageSignatureDefaultStreamName( ) throw (::com::sun::star::uno::RuntimeException)
+::rtl::OUString DocumentDigitalSignatures::getPackageSignatureDefaultStreamName( )
+ throw (::com::sun::star::uno::RuntimeException)
{
return DocumentSignatureHelper::GetPackageSignatureDefaultStreamName();
}
-sal_Bool DocumentDigitalSignatures::ImplViewSignatures( const Reference< ::com::sun::star::embed::XStorage >& rxStorage, const ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream >& xSignStream, DocumentSignatureMode eMode, bool bReadOnly ) throw (RuntimeException)
+sal_Bool DocumentDigitalSignatures::ImplViewSignatures(
+ const Reference< css::embed::XStorage >& rxStorage,
+ const Reference< css::io::XInputStream >& xSignStream,
+ DocumentSignatureMode eMode, bool bReadOnly ) throw (RuntimeException)
{
Reference< io::XStream > xStream;
if ( xSignStream.is() )
@@ -142,10 +216,13 @@ sal_Bool DocumentDigitalSignatures::ImplViewSignatures( const Reference< ::com::
return ImplViewSignatures( rxStorage, xStream, eMode, bReadOnly );
}
-sal_Bool DocumentDigitalSignatures::ImplViewSignatures( const Reference< ::com::sun::star::embed::XStorage >& rxStorage, const ::com::sun::star::uno::Reference< ::com::sun::star::io::XStream >& xSignStream, DocumentSignatureMode eMode, bool bReadOnly ) throw (RuntimeException)
+sal_Bool DocumentDigitalSignatures::ImplViewSignatures(
+ const Reference< css::embed::XStorage >& rxStorage, const Reference< css::io::XStream >& xSignStream,
+ DocumentSignatureMode eMode, bool bReadOnly ) throw (RuntimeException)
{
sal_Bool bChanges = sal_False;
- DigitalSignaturesDialog aSignaturesDialog( NULL, mxCtx, eMode, bReadOnly );
+ DigitalSignaturesDialog aSignaturesDialog(
+ NULL, mxCtx, eMode, bReadOnly, m_sODFVersion, m_bHasDocumentSignature);
bool bInit = aSignaturesDialog.Init( rtl::OUString() );
DBG_ASSERT( bInit, "Error initializing security context!" );
if ( bInit )
@@ -175,7 +252,10 @@ sal_Bool DocumentDigitalSignatures::ImplViewSignatures( const Reference< ::com::
return bChanges;
}
-Sequence< ::com::sun::star::security::DocumentSignatureInformation > DocumentDigitalSignatures::ImplVerifySignatures( const Reference< ::com::sun::star::embed::XStorage >& rxStorage, const ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream >& xSignStream, DocumentSignatureMode eMode ) throw (RuntimeException)
+Sequence< css::security::DocumentSignatureInformation >
+DocumentDigitalSignatures::ImplVerifySignatures(
+ const Reference< css::embed::XStorage >& rxStorage,
+ const Reference< css::io::XInputStream >& xSignStream, DocumentSignatureMode eMode ) throw (RuntimeException)
{
if (!rxStorage.is())
{
@@ -206,7 +286,7 @@ Sequence< ::com::sun::star::security::DocumentSignatureInformation > DocumentDig
if ( !bInit )
return Sequence< ::com::sun::star::security::DocumentSignatureInformation >(0);
- aSignatureHelper.SetStorage( rxStorage );
+ aSignatureHelper.SetStorage(rxStorage, m_sODFVersion);
aSignatureHelper.StartMission();
@@ -223,12 +303,17 @@ Sequence< ::com::sun::star::security::DocumentSignatureInformation > DocumentDig
if ( nInfos )
{
- std::vector< rtl::OUString > aElementsToBeVerified = DocumentSignatureHelper::CreateElementList( rxStorage, ::rtl::OUString(), eMode );
- Reference<security::XSerialNumberAdapter> xSerialNumberAdapter =
+ Reference<security::XSerialNumberAdapter> xSerialNumberAdapter =
::com::sun::star::security::SerialNumberAdapter::create(mxCtx);
for( int n = 0; n < nInfos; ++n )
{
+ DocumentSignatureAlgorithm mode = DocumentSignatureHelper::getDocumentAlgorithm(
+ m_sODFVersion, aSignInfos[n]);
+ const std::vector< rtl::OUString > aElementsToBeVerified =
+ DocumentSignatureHelper::CreateElementList(
+ rxStorage, ::rtl::OUString(), eMode, mode);
+
const SignatureInformation& rInfo = aSignInfos[n];
css::security::DocumentSignatureInformation& rSigInfo = arInfos[n];
@@ -273,17 +358,13 @@ Sequence< ::com::sun::star::security::DocumentSignatureInformation > DocumentDig
if ( rSigInfo.SignatureIsValid )
{
- // Can only be valid if ALL streams are signed, which means real stream count == signed stream count
- unsigned int nRealCount = 0;
- for ( int i = rInfo.vSignatureReferenceInfors.size(); i; )
- {
- const SignatureReferenceInformation& rInf = rInfo.vSignatureReferenceInfors[--i];
- // There is also an extra entry of type TYPE_SAMEDOCUMENT_REFERENCE because of signature date.
- if ( ( rInf.nType == TYPE_BINARYSTREAM_REFERENCE ) || ( rInf.nType == TYPE_XMLSTREAM_REFERENCE ) )
- nRealCount++;
- }
- rSigInfo.SignatureIsValid = ( aElementsToBeVerified.size() == nRealCount );
+ rSigInfo.SignatureIsValid =
+ DocumentSignatureHelper::checkIfAllFilesAreSigned(
+ aElementsToBeVerified, rInfo, mode);
}
+ if (eMode == SignatureModeDocumentContent)
+ rSigInfo.PartialDocumentSignature =
+ ! DocumentSignatureHelper::isOOo3_2_Signature(aSignInfos[n]);
}
}
@@ -298,7 +379,7 @@ void DocumentDigitalSignatures::manageTrustedSources( ) throw (RuntimeException
// Macro Security also has some options where no security environment is needed, so raise dialog anyway.
// Later I should change the code so the Dialog creates the SecEnv on demand...
- cssu::Reference< dcss::xml::crypto::XSecurityEnvironment > xSecEnv;
+ Reference< dcss::xml::crypto::XSecurityEnvironment > xSecEnv;
XMLSignatureHelper aSignatureHelper( mxCtx );
if ( aSignatureHelper.Init( rtl::OUString() ) )
@@ -308,7 +389,8 @@ void DocumentDigitalSignatures::manageTrustedSources( ) throw (RuntimeException
aDlg.Execute();
}
-void DocumentDigitalSignatures::showCertificate( const Reference< ::com::sun::star::security::XCertificate >& _Certificate ) throw (RuntimeException)
+void DocumentDigitalSignatures::showCertificate(
+ const Reference< css::security::XCertificate >& _Certificate ) throw (RuntimeException)
{
XMLSignatureHelper aSignatureHelper( mxCtx );
@@ -324,7 +406,8 @@ void DocumentDigitalSignatures::showCertificate( const Reference< ::com::sun::st
}
-::sal_Bool DocumentDigitalSignatures::isAuthorTrusted( const Reference< ::com::sun::star::security::XCertificate >& Author ) throw (RuntimeException)
+::sal_Bool DocumentDigitalSignatures::isAuthorTrusted(
+ const Reference< css::security::XCertificate >& Author ) throw (RuntimeException)
{
sal_Bool bFound = sal_False;
@@ -377,7 +460,8 @@ void DocumentDigitalSignatures::showCertificate( const Reference< ::com::sun::st
return bFound;
}
-void DocumentDigitalSignatures::addAuthorToTrustedSources( const Reference< ::com::sun::star::security::XCertificate >& Author ) throw (RuntimeException)
+void DocumentDigitalSignatures::addAuthorToTrustedSources(
+ const Reference< css::security::XCertificate >& Author ) throw (RuntimeException)
{
SvtSecurityOptions aSecOpts;
diff --git a/xmlsecurity/source/component/documentdigitalsignatures.hxx b/xmlsecurity/source/component/documentdigitalsignatures.hxx
index fb0328bc2347..35d22c62ca6a 100644
--- a/xmlsecurity/source/component/documentdigitalsignatures.hxx
+++ b/xmlsecurity/source/component/documentdigitalsignatures.hxx
@@ -31,21 +31,35 @@
#ifndef _XMLSECURITY_DOCUMENTDIGITALSIGNATURES_HXX
#define _XMLSECURITY_DOCUMENTDIGITALSIGNATURES_HXX
-#include <cppuhelper/implbase1.hxx>
+#include <cppuhelper/implbase2.hxx>
+#include "com/sun/star/lang/XInitialization.hpp"
#include <com/sun/star/security/XDocumentDigitalSignatures.hpp>
#include <com/sun/star/io/XStream.hpp>
#include <com/sun/star/io/XInputStream.hpp>
#include <xmlsecurity/documentsignaturehelper.hxx>
+namespace com { namespace sun { namespace star {
-class DocumentDigitalSignatures : public cppu::WeakImplHelper1
+ namespace uno {
+ class XComponentContext;
+ }
+}}}
+
+class DocumentDigitalSignatures : public cppu::WeakImplHelper2
<
- com::sun::star::security::XDocumentDigitalSignatures
+ com::sun::star::security::XDocumentDigitalSignatures,
+ com::sun::star::lang::XInitialization
>
{
private:
com::sun::star::uno::Reference< com::sun::star::uno::XComponentContext > mxCtx;
+ // will be set by XInitialization. If not we assume true. false means an earlier version.
+ ::rtl::OUString m_sODFVersion;
+ //The number of arguments which were passed in XInitialization::initialize
+ int m_nArgumentsCount;
+ //Indicates if the document already contains a document signature
+ bool m_bHasDocumentSignature;
sal_Bool ImplViewSignatures( const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >& rxStorage, const ::com::sun::star::uno::Reference< ::com::sun::star::io::XStream >& xSignStream, DocumentSignatureMode eMode, bool bReadOnly ) throw (::com::sun::star::uno::RuntimeException);
sal_Bool ImplViewSignatures( const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >& rxStorage, const ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream >& xSignStream, DocumentSignatureMode eMode, bool bReadOnly ) throw (::com::sun::star::uno::RuntimeException);
@@ -58,6 +72,10 @@ public:
static ::rtl::OUString GetImplementationName() throw (com::sun::star::uno::RuntimeException);
static ::com::sun::star::uno::Sequence < ::rtl::OUString > GetSupportedServiceNames() throw (com::sun::star::uno::RuntimeException);
+ //XInitialization
+ void SAL_CALL initialize( const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any >& aArguments )
+ throw (::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException);
+
// XDocumentDigitalSignatures
::sal_Bool SAL_CALL signDocumentContent( const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >& xStorage, const ::com::sun::star::uno::Reference< ::com::sun::star::io::XStream >& xSignStream ) throw (::com::sun::star::uno::RuntimeException);
::com::sun::star::uno::Sequence< ::com::sun::star::security::DocumentSignatureInformation > SAL_CALL verifyDocumentContentSignatures( const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >& xStorage, const ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream >& xSignInStream ) throw (::com::sun::star::uno::RuntimeException);
diff --git a/xmlsecurity/source/dialogs/certificateviewer.cxx b/xmlsecurity/source/dialogs/certificateviewer.cxx
index fb9b41d5f637..7f04872f7a63 100644
--- a/xmlsecurity/source/dialogs/certificateviewer.cxx
+++ b/xmlsecurity/source/dialogs/certificateviewer.cxx
@@ -311,8 +311,10 @@ CertificateViewerDetailsTP::CertificateViewerDetailsTP( Window* _pParent, Certif
aDetails = XmlSec::GetHexString( aSeq, pHexSep, nLineBreak );
InsertElement( String( XMLSEC_RES( STR_SERIALNUM ) ), aLBEntry, aDetails, true );
- aLBEntry = XmlSec::GetPureContent( xCert->getIssuerName(), ", " );
- aDetails = XmlSec::GetPureContent( xCert->getIssuerName(), "\n", true );
+ std::pair< ::rtl::OUString, ::rtl::OUString> pairIssuer =
+ XmlSec::GetDNForCertDetailsView(xCert->getIssuerName());
+ aLBEntry = pairIssuer.first;
+ aDetails = pairIssuer.second;
InsertElement( String( XMLSEC_RES( STR_ISSUER ) ), aLBEntry, aDetails );
/*
aSeq = xCert->getIssuerUniqueID();
@@ -333,8 +335,10 @@ CertificateViewerDetailsTP::CertificateViewerDetailsTP( Window* _pParent, Certif
aLBEntry += GetSettings().GetUILocaleDataWrapper().getTime( aDateTime.GetTime() );
InsertElement( String( XMLSEC_RES( STR_VALIDTO ) ), aLBEntry, aLBEntry );
- aLBEntry = XmlSec::GetPureContent( xCert->getSubjectName(), ", " );
- aDetails = XmlSec::GetPureContent( xCert->getSubjectName(), "\n", true );
+ std::pair< ::rtl::OUString, ::rtl::OUString > pairSubject =
+ XmlSec::GetDNForCertDetailsView(xCert->getSubjectName());
+ aLBEntry = pairSubject.first;
+ aDetails = pairSubject.second;
InsertElement( String( XMLSEC_RES( STR_SUBJECT ) ), aLBEntry, aDetails );
/*
aSeq = xCert->getSubjectUniqueID();
diff --git a/xmlsecurity/source/dialogs/dialogs.hrc b/xmlsecurity/source/dialogs/dialogs.hrc
index ca329fabf71d..f62a2a422eaf 100644
--- a/xmlsecurity/source/dialogs/dialogs.hrc
+++ b/xmlsecurity/source/dialogs/dialogs.hrc
@@ -88,6 +88,7 @@
#define IMG_STATE_VALID_HC 13
#define IMG_STATE_BROKEN_HC 14
#define IMG_STATE_NOTVALIDATED_HC 15
+#define FI_STATE_OLDSIGNATURE 16
//#define DS_WIDTH DLGS_WIDTH
//#define DS_HEIGHT DLGS_HEIGHT
diff --git a/xmlsecurity/source/dialogs/digitalsignaturesdialog.cxx b/xmlsecurity/source/dialogs/digitalsignaturesdialog.cxx
index 109959be1554..cf07edb7023e 100644
--- a/xmlsecurity/source/dialogs/digitalsignaturesdialog.cxx
+++ b/xmlsecurity/source/dialogs/digitalsignaturesdialog.cxx
@@ -48,13 +48,19 @@
#include <com/sun/star/security/CertificateValidity.hdl>
#include <com/sun/star/packages/WrongPasswordException.hpp>
#include <com/sun/star/security/SerialNumberAdapter.hpp>
+#include <com/sun/star/security/XDocumentDigitalSignatures.hpp>
+#include <com/sun/star/xml/dom/XDocumentBuilder.hpp>
+#include <com/sun/star/packages/manifest/XManifestReader.hpp>
+
#include <rtl/ustrbuf.hxx>
+#include <rtl/uri.hxx>
#include <tools/date.hxx>
#include <tools/time.hxx>
#include "dialogs.hrc"
+#include "digitalsignaturesdialog.hrc"
#include "helpids.hrc"
#include "resourcemanager.hxx"
@@ -62,18 +68,20 @@
#include <unotools/configitem.hxx>
#include <comphelper/componentcontext.hxx>
+#define OUSTR(x) ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(x) )
-using namespace ::com::sun::star::security;
-namespace css = ::com::sun::star;
/* HACK: disable some warnings for MS-C */
#ifdef _MSC_VER
#pragma warning (disable : 4355) // 4355: this used in initializer-list
#endif
+using namespace ::com::sun::star::security;
+using namespace ::com::sun::star::uno;
using namespace ::com::sun::star;
-using ::com::sun::star::uno::Sequence;
+namespace css = ::com::sun::star;
using ::rtl::OUString;
+
namespace
{
class SaveODFItem: public utl::ConfigItem
@@ -109,49 +117,70 @@ namespace
OUString(RTL_CONSTASCII_USTRINGPARAM(
"[xmlsecurity] Could not open property Office.Common/Save/ODF/DefaultVersion")), 0);
}
-
}
-sal_Bool HandleStreamAsXML_Impl( const uno::Reference < embed::XStorage >& rxStore, const rtl::OUString& rURI )
+/* Using the zip storage, we cannot get the properties "MediaType" and "IsEncrypted"
+ We use the manifest to find out if a file is xml and if it is encrypted.
+ The parameter is an encoded uri. However, the manifest contains paths. Therefore
+ the path is encoded as uri, so they can be compared.
+*/
+bool DigitalSignaturesDialog::isXML(const rtl::OUString& rURI )
{
- sal_Bool bResult = sal_False;
+ OSL_ASSERT(mxStore.is());
- try
+ bool bIsXML = false;
+ bool bPropsAvailable = false;
+ const OUString sPropFullPath(RTL_CONSTASCII_USTRINGPARAM("FullPath"));
+ const OUString sPropMediaType(RTL_CONSTASCII_USTRINGPARAM("MediaType"));
+ const OUString sPropDigest(RTL_CONSTASCII_USTRINGPARAM("Digest"));
+
+ for (int i = 0; i < m_manifest.getLength(); i++)
{
- sal_Int32 nSepPos = rURI.indexOf( '/' );
- if ( nSepPos == -1 )
+ Any digest;
+ const Sequence< css::beans::PropertyValue >& entry = m_manifest[i];
+ OUString sPath, sMediaType;
+ bool bEncrypted = false;
+ for (int j = 0; j < entry.getLength(); j++)
{
- uno::Reference< io::XStream > xStream;
- xStream = rxStore->cloneStreamElement( rURI );
- if ( !xStream.is() )
- throw uno::RuntimeException();
-
- ::rtl::OUString aMediaType;
- sal_Bool bEncrypted = sal_False;
- uno::Reference< beans::XPropertySet > xProps( xStream, uno::UNO_QUERY_THROW );
- xProps->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "MediaType" ) ) ) >>= aMediaType;
- xProps->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "IsEncrypted" ) ) ) >>= bEncrypted;
- bResult = ( aMediaType.equals( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "text/xml" ) ) ) && !bEncrypted );
+ const css::beans::PropertyValue & prop = entry[j];
+
+ if (prop.Name.equals( sPropFullPath ) )
+ prop.Value >>= sPath;
+ else if (prop.Name.equals( sPropMediaType ) )
+ prop.Value >>= sMediaType;
+ else if (prop.Name.equals( sPropDigest ) )
+ bEncrypted = true;
}
- else
+ if (DocumentSignatureHelper::equalsReferenceUriManifestPath(rURI, sPath))
{
- rtl::OUString aStoreName = rURI.copy( 0, nSepPos );
- rtl::OUString aElement = rURI.copy( nSepPos+1 );
- uno::Reference < embed::XStorage > xSubStore = rxStore->openStorageElement( aStoreName, embed::ElementModes::READ );
- bResult = HandleStreamAsXML_Impl( xSubStore, aElement );
+ bIsXML = sMediaType.equals(OUSTR("text/xml")) && ! bEncrypted;
+ bPropsAvailable = true;
+ break;
}
}
- catch( uno::Exception& )
+ if (!bPropsAvailable)
{
- }
-
- return bResult;
+ //This would be the case for at least mimetype, META-INF/manifest.xml
+ //META-INF/macrosignatures.xml.
+ //Files can only be encrypted if they are in the manifest.xml.
+ //That is, the current file cannot be encrypted, otherwise bPropsAvailable
+ //would be true.
+ OUString aXMLExt( RTL_CONSTASCII_USTRINGPARAM( "XML" ) );
+ sal_Int32 nSep = rURI.lastIndexOf( '.' );
+ if ( nSep != (-1) )
+ {
+ OUString aExt = rURI.copy( nSep+1 );
+ if (aExt.equalsIgnoreAsciiCase(aXMLExt ))
+ bIsXML = true;
+ }
+ }
+ return bIsXML;
}
DigitalSignaturesDialog::DigitalSignaturesDialog(
Window* pParent,
uno::Reference< uno::XComponentContext >& rxCtx, DocumentSignatureMode eMode,
- sal_Bool bReadOnly)
+ sal_Bool bReadOnly, const ::rtl::OUString& sODFVersion, bool bHasDocumentSignature)
:ModalDialog ( pParent, XMLSEC_RES( RID_XMLSECDLG_DIGSIG ) )
,mxCtx ( rxCtx )
,maSignatureHelper ( rxCtx )
@@ -166,6 +195,7 @@ DigitalSignaturesDialog::DigitalSignaturesDialog(
,maSigsInvalidFI ( this, XMLSEC_RES( FI_STATE_BROKEN ) )
,maSigsNotvalidatedImg( this, XMLSEC_RES( IMG_STATE_NOTVALIDATED ) )
,maSigsNotvalidatedFI ( this, XMLSEC_RES( FI_STATE_NOTVALIDATED ) )
+ ,maSigsOldSignatureFI ( this, XMLSEC_RES( FI_STATE_OLDSIGNATURE) )
,maViewBtn ( this, XMLSEC_RES( BTN_VIEWCERT ) )
,maAddBtn ( this, XMLSEC_RES( BTN_ADDCERT ) )
,maRemoveBtn ( this, XMLSEC_RES( BTN_REMOVECERT ) )
@@ -173,6 +203,9 @@ DigitalSignaturesDialog::DigitalSignaturesDialog(
,maOKBtn ( this, XMLSEC_RES( BTN_OK ) )
,maCancelBtn ( this, XMLSEC_RES( BTN_CANCEL ) )
,maHelpBtn ( this, XMLSEC_RES( BTN_HELP ) )
+ ,m_sODFVersion (sODFVersion)
+ ,m_bHasDocumentSignature(bHasDocumentSignature)
+ ,m_bWarningShowSignMacro(false)
{
// --> PB #i48253 the tablistbox needs its own unique id
maSignaturesLB.Window::SetUniqueId( HID_XMLSEC_TREE_SIGNATURESDLG );
@@ -209,6 +242,8 @@ DigitalSignaturesDialog::DigitalSignaturesDialog(
maRemoveBtn.SetClickHdl( LINK( this, DigitalSignaturesDialog, RemoveButtonHdl ) );
maRemoveBtn.Disable();
+ maOKBtn.SetClickHdl( LINK( this, DigitalSignaturesDialog, OKButtonHdl) );
+
switch( meSignatureMode )
{
case SignatureModeDocumentContent: maHintDocFT.Show(); break;
@@ -220,6 +255,7 @@ DigitalSignaturesDialog::DigitalSignaturesDialog(
XmlSec::AlignAndFitImageAndControl( maSigsValidImg, maSigsValidFI, 5 );
XmlSec::AlignAndFitImageAndControl( maSigsInvalidImg, maSigsInvalidFI, 5 );
XmlSec::AlignAndFitImageAndControl( maSigsNotvalidatedImg, maSigsNotvalidatedFI, 5 );
+ XmlSec::AlignAndFitImageAndControl( maSigsNotvalidatedImg, maSigsOldSignatureFI, 5 );
}
DigitalSignaturesDialog::~DigitalSignaturesDialog()
@@ -243,7 +279,21 @@ BOOL DigitalSignaturesDialog::Init( const rtl::OUString& rTokenName )
void DigitalSignaturesDialog::SetStorage( const com::sun::star::uno::Reference < com::sun::star::embed::XStorage >& rxStore )
{
mxStore = rxStore;
- maSignatureHelper.SetStorage( mxStore );
+ maSignatureHelper.SetStorage( mxStore, m_sODFVersion);
+
+ Reference < css::packages::manifest::XManifestReader > xReader(
+ mxCtx->getServiceManager()->createInstanceWithContext(
+ OUSTR("com.sun.star.packages.manifest.ManifestReader"), mxCtx), UNO_QUERY_THROW);
+
+ //Get the manifest.xml
+ Reference < css::embed::XStorage > xSubStore(rxStore->openStorageElement(
+ OUSTR("META-INF"), css::embed::ElementModes::READ), UNO_QUERY_THROW);
+
+ Reference< css::io::XInputStream > xStream(
+ xSubStore->openStreamElement(OUSTR("manifest.xml"), css::embed::ElementModes::READ),
+ UNO_QUERY_THROW);
+
+ m_manifest = xReader->readManifestSequence(xStream);
}
void DigitalSignaturesDialog::SetSignatureStream( const cssu::Reference < css::io::XStream >& rxStream )
@@ -251,40 +301,70 @@ void DigitalSignaturesDialog::SetSignatureStream( const cssu::Reference < css::i
mxSignatureStream = rxStream;
}
-
-bool DigitalSignaturesDialog::canAdd()
+bool DigitalSignaturesDialog::canAddRemove()
{
- bool ret = false;
+ //m56
+ bool ret = true;
OSL_ASSERT(mxStore.is());
- bool bDoc1_1 = DocumentSignatureHelper::isODFPre_1_2(mxStore);
+ bool bDoc1_1 = DocumentSignatureHelper::isODFPre_1_2(m_sODFVersion);
SaveODFItem item;
bool bSave1_1 = item.isLessODF1_2();
// see specification
//cvs: specs/www/appwide/security/Electronic_Signatures_and_Security.sxw
//Paragraph 'Behavior with regard to ODF 1.2'
+ //For both, macro and document
if ( (!bSave1_1 && bDoc1_1) || (bSave1_1 && bDoc1_1) )
{
//#4
ErrorBox err(NULL, XMLSEC_RES(RID_XMLSECDLG_OLD_ODF_FORMAT));
err.Execute();
+ ret = false;
}
- else
- ret = true;
+ //As of OOo 3.2 the document signature includes in macrosignatures.xml. That is
+ //adding a macro signature will break an existing document signature.
+ //The sfx2 will remove the documentsignature when the user adds a macro signature
+ if (meSignatureMode == SignatureModeMacros
+ && ret)
+ {
+ if (m_bHasDocumentSignature && !m_bWarningShowSignMacro)
+ {
+ //The warning says that the document signatures will be removed if the user
+ //continues. He can then either press 'OK' or 'NO'
+ //It the user presses 'Add' or 'Remove' several times then, then the warning
+ //is shown every time until the user presses 'OK'. From then on, the warning
+ //is not displayed anymore as long as the signatures dialog is alive.
+ if (QueryBox(
+ NULL, XMLSEC_RES(MSG_XMLSECDLG_QUERY_REMOVEDOCSIGNBEFORESIGN)).Execute() == RET_NO)
+ ret = false;
+ else
+ m_bWarningShowSignMacro = true;
+
+ }
+ }
return ret;
}
+bool DigitalSignaturesDialog::canAdd()
+{
+ if (canAddRemove())
+ return true;
+ return false;
+}
+
bool DigitalSignaturesDialog::canRemove()
{
- return canAdd();
+ if (canAddRemove())
+ return true;
+ return false;
}
short DigitalSignaturesDialog::Execute()
{
// Verify Signatures and add certificates to ListBox...
mbVerifySignatures = true;
- ImplGetSignatureInformations();
+ ImplGetSignatureInformations(false);
ImplFillSignaturesBox();
// Only verify once, content will not change.
@@ -304,6 +384,35 @@ IMPL_LINK( DigitalSignaturesDialog, SignatureHighlightHdl, void*, EMPTYARG )
return 0;
}
+IMPL_LINK( DigitalSignaturesDialog, OKButtonHdl, void*, EMPTYARG )
+{
+ // Export all other signatures...
+ SignatureStreamHelper aStreamHelper = ImplOpenSignatureStream(
+ embed::ElementModes::WRITE|embed::ElementModes::TRUNCATE, false );
+ uno::Reference< io::XOutputStream > xOutputStream(
+ aStreamHelper.xSignatureStream, uno::UNO_QUERY );
+ uno::Reference< com::sun::star::xml::sax::XDocumentHandler> xDocumentHandler =
+ maSignatureHelper.CreateDocumentHandlerWithHeader( xOutputStream );
+
+ int nInfos = maCurrentSignatureInformations.size();
+ for( int n = 0 ; n < nInfos ; ++n )
+ maSignatureHelper.ExportSignature(
+ xDocumentHandler, maCurrentSignatureInformations[ n ] );
+
+ maSignatureHelper.CloseDocumentHandler( xDocumentHandler);
+
+ // If stream was not provided, we are responsible for committing it....
+ if ( !mxSignatureStream.is() )
+ {
+ uno::Reference< embed::XTransactedObject > xTrans(
+ aStreamHelper.xSignatureStorage, uno::UNO_QUERY );
+ xTrans->commit();
+ }
+
+ EndDialog(RET_OK);
+ return 0;
+}
+
IMPL_LINK( DigitalSignaturesDialog, SignatureSelectHdl, void*, EMPTYARG )
{
ImplShowSignaturesDetails();
@@ -353,34 +462,33 @@ IMPL_LINK( DigitalSignaturesDialog, AddButtonHdl, Button*, EMPTYARG )
xCert->getIssuerName(), aCertSerial,
aStrBuffer.makeStringAndClear());
+ std::vector< rtl::OUString > aElements =
+ DocumentSignatureHelper::CreateElementList(
+ mxStore, rtl::OUString(), meSignatureMode, OOo3_2Document);
- std::vector< rtl::OUString > aElements = DocumentSignatureHelper::CreateElementList( mxStore, rtl::OUString(), meSignatureMode );
-
- ::rtl::OUString aXMLExt( RTL_CONSTASCII_USTRINGPARAM( "XML" ) );
sal_Int32 nElements = aElements.size();
for ( sal_Int32 n = 0; n < nElements; n++ )
{
- bool bBinaryMode = true;
- sal_Int32 nSep = aElements[n].lastIndexOf( '.' );
- if ( nSep != (-1) )
- {
- ::rtl::OUString aExt = aElements[n].copy( nSep+1 );
- if ( aExt.equalsIgnoreAsciiCase( aXMLExt ) )
- {
- bBinaryMode = !HandleStreamAsXML_Impl( mxStore, aElements[n] );
- }
- }
+ bool bBinaryMode = !isXML(aElements[n]);
maSignatureHelper.AddForSigning( nSecurityId, aElements[n], aElements[n], bBinaryMode );
}
maSignatureHelper.SetDateTime( nSecurityId, Date(), Time() );
- SignatureStreamHelper aStreamHelper = ImplOpenSignatureStream( embed::ElementModes::WRITE|embed::ElementModes::TRUNCATE );
- uno::Reference< io::XOutputStream > xOutputStream( aStreamHelper.xSignatureStream, uno::UNO_QUERY );
- uno::Reference< com::sun::star::xml::sax::XDocumentHandler> xDocumentHandler = maSignatureHelper.CreateDocumentHandlerWithHeader( xOutputStream );
+ // We open a signature stream in which the existing and the new
+ //signature is written. ImplGetSignatureInformation (later in this function) will
+ //then read the stream an will fill maCurrentSignatureInformations. The final signature
+ //is written when the user presses OK. Then only maCurrentSignatureInformation and
+ //a sax writer are used to write the information.
+ SignatureStreamHelper aStreamHelper = ImplOpenSignatureStream(
+ css::embed::ElementModes::WRITE|css::embed::ElementModes::TRUNCATE, true);
+ Reference< css::io::XOutputStream > xOutputStream(
+ aStreamHelper.xSignatureStream, UNO_QUERY_THROW);
+ Reference< css::xml::sax::XDocumentHandler> xDocumentHandler =
+ maSignatureHelper.CreateDocumentHandlerWithHeader( xOutputStream );
// Export old signatures...
- int nInfos = maCurrentSignatureInformations.size();
+ int nInfos = maCurrentSignatureInformations.size();
for ( int n = 0; n < nInfos; n++ )
maSignatureHelper.ExportSignature( xDocumentHandler, maCurrentSignatureInformations[n]);
@@ -392,15 +500,10 @@ IMPL_LINK( DigitalSignaturesDialog, AddButtonHdl, Button*, EMPTYARG )
maSignatureHelper.EndMission();
- // If stream was not provided, we are responsible for committing it....
- if ( !mxSignatureStream.is() )
- {
- uno::Reference< embed::XTransactedObject > xTrans( aStreamHelper.xSignatureStorage, uno::UNO_QUERY );
- xTrans->commit();
- }
-
aStreamHelper = SignatureStreamHelper(); // release objects...
+ mbSignaturesChanged = true;
+
sal_Int32 nStatus = maSignatureHelper.GetSignatureInformation( nSecurityId ).nStatus;
if ( nStatus == ::com::sun::star::xml::crypto::SecurityOperationStatus_OPERATION_SUCCEEDED )
@@ -412,7 +515,7 @@ IMPL_LINK( DigitalSignaturesDialog, AddButtonHdl, Button*, EMPTYARG )
// will not contain
// SecurityOperationStatus_OPERATION_SUCCEEDED
mbVerifySignatures = true;
- ImplGetSignatureInformations();
+ ImplGetSignatureInformations(true);
ImplFillSignaturesBox();
}
}
@@ -421,7 +524,7 @@ IMPL_LINK( DigitalSignaturesDialog, AddButtonHdl, Button*, EMPTYARG )
{
DBG_ERROR( "Exception while adding a signature!" );
// Don't keep invalid entries...
- ImplGetSignatureInformations();
+ ImplGetSignatureInformations(true);
ImplFillSignaturesBox();
}
@@ -440,9 +543,12 @@ IMPL_LINK( DigitalSignaturesDialog, RemoveButtonHdl, Button*, EMPTYARG )
maCurrentSignatureInformations.erase( maCurrentSignatureInformations.begin()+nSelected );
// Export all other signatures...
- SignatureStreamHelper aStreamHelper = ImplOpenSignatureStream( embed::ElementModes::WRITE|embed::ElementModes::TRUNCATE );
- uno::Reference< io::XOutputStream > xOutputStream( aStreamHelper.xSignatureStream, uno::UNO_QUERY );
- uno::Reference< com::sun::star::xml::sax::XDocumentHandler> xDocumentHandler = maSignatureHelper.CreateDocumentHandlerWithHeader( xOutputStream );
+ SignatureStreamHelper aStreamHelper = ImplOpenSignatureStream(
+ css::embed::ElementModes::WRITE | css::embed::ElementModes::TRUNCATE, true);
+ Reference< css::io::XOutputStream > xOutputStream(
+ aStreamHelper.xSignatureStream, UNO_QUERY_THROW);
+ Reference< css::xml::sax::XDocumentHandler> xDocumentHandler =
+ maSignatureHelper.CreateDocumentHandlerWithHeader( xOutputStream );
int nInfos = maCurrentSignatureInformations.size();
for( int n = 0 ; n < nInfos ; ++n )
@@ -452,13 +558,6 @@ IMPL_LINK( DigitalSignaturesDialog, RemoveButtonHdl, Button*, EMPTYARG )
mbSignaturesChanged = true;
- // If stream was not provided, we are responsible for committing it....
- if ( !mxSignatureStream.is() )
- {
- uno::Reference< embed::XTransactedObject > xTrans( aStreamHelper.xSignatureStorage, uno::UNO_QUERY );
- xTrans->commit();
- }
-
aStreamHelper = SignatureStreamHelper(); // release objects...
ImplFillSignaturesBox();
@@ -467,7 +566,7 @@ IMPL_LINK( DigitalSignaturesDialog, RemoveButtonHdl, Button*, EMPTYARG )
{
DBG_ERROR( "Exception while removing a signature!" );
// Don't keep invalid entries...
- ImplGetSignatureInformations();
+ ImplGetSignatureInformations(true);
ImplFillSignaturesBox();
}
}
@@ -493,12 +592,18 @@ void DigitalSignaturesDialog::ImplFillSignaturesBox()
String aNullStr;
int nInfos = maCurrentSignatureInformations.size();
int nValidSigs = 0, nValidCerts = 0;
+ bool bAllNewSignatures = true;
if( nInfos )
{
- std::vector< rtl::OUString > aElementsToBeVerified = DocumentSignatureHelper::CreateElementList( mxStore, ::rtl::OUString(), meSignatureMode );
for( int n = 0; n < nInfos; ++n )
{
+ DocumentSignatureAlgorithm mode = DocumentSignatureHelper::getDocumentAlgorithm(
+ m_sODFVersion, maCurrentSignatureInformations[n]);
+ std::vector< rtl::OUString > aElementsToBeVerified =
+ DocumentSignatureHelper::CreateElementList(
+ mxStore, ::rtl::OUString(), meSignatureMode, mode);
+
const SignatureInformation& rInfo = maCurrentSignatureInformations[n];
//First we try to get the certificate which is embedded in the XML Signature
if (rInfo.ouX509Certificate.getLength())
@@ -559,28 +664,42 @@ void DigitalSignaturesDialog::ImplFillSignaturesBox()
if ( bSigValid )
{
- // Can only be valid if ALL streams are signed, which means real stream count == signed stream count
- unsigned int nRealCount = 0;
- for ( int i = rInfo.vSignatureReferenceInfors.size(); i; )
- {
- const SignatureReferenceInformation& rInf = rInfo.vSignatureReferenceInfors[--i];
- // There is also an extra entry of type TYPE_SAMEDOCUMENT_REFERENCE because of signature date.
- if ( ( rInf.nType == TYPE_BINARYSTREAM_REFERENCE ) || ( rInf.nType == TYPE_XMLSTREAM_REFERENCE ) )
- nRealCount++;
- }
- bSigValid = ( aElementsToBeVerified.size() == nRealCount );
+ bSigValid = DocumentSignatureHelper::checkIfAllFilesAreSigned(
+ aElementsToBeVerified, rInfo, mode);
if( bSigValid )
nValidSigs++;
}
Image aImage;
- if ( bSigValid && bCertValid )
- aImage = maSigsValidImg.GetImage();
- else if ( bSigValid && !bCertValid )
- aImage = maSigsNotvalidatedImg.GetImage();
- else if ( !bSigValid )
+ if (!bSigValid)
+ {
aImage = maSigsInvalidImg.GetImage();
+ }
+ else if (bSigValid && !bCertValid)
+ {
+ aImage = maSigsNotvalidatedImg.GetImage();
+ }
+ //Check if the signature is a "old" document signature, that is, which was created
+ //by an version of OOo previous to 3.2
+ else if (meSignatureMode == SignatureModeDocumentContent
+ && bSigValid && bCertValid && !DocumentSignatureHelper::isOOo3_2_Signature(
+ maCurrentSignatureInformations[n]))
+ {
+ aImage = maSigsNotvalidatedImg.GetImage();
+ bAllNewSignatures &= false;
+ }
+ else if (meSignatureMode == SignatureModeDocumentContent
+ && bSigValid && bCertValid && DocumentSignatureHelper::isOOo3_2_Signature(
+ maCurrentSignatureInformations[n]))
+ {
+ aImage = maSigsValidImg.GetImage();
+ }
+ else if (meSignatureMode == SignatureModeMacros
+ && bSigValid && bCertValid)
+ {
+ aImage = aImage = maSigsValidImg.GetImage();
+ }
SvLBoxEntry* pEntry = maSignaturesLB.InsertEntry( aNullStr, aImage, aImage );
maSignaturesLB.SetEntryText( aSubject, pEntry, 1 );
@@ -590,28 +709,37 @@ void DigitalSignaturesDialog::ImplFillSignaturesBox()
}
}
- bool bAllSigsValid = ( nValidSigs == nInfos );
- bool bAllCertsValid = ( nValidCerts == nInfos );
- bool bShowValidState = nInfos && ( bAllSigsValid && bAllCertsValid );
- bool bShowNotValidatedState = nInfos && ( bAllSigsValid && !bAllCertsValid );
+ bool bAllSigsValid = (nValidSigs == nInfos);
+ bool bAllCertsValid = (nValidCerts == nInfos);
+ bool bShowValidState = nInfos && (bAllSigsValid && bAllCertsValid && bAllNewSignatures);
+
+ bool bShowNotValidatedState = nInfos && (bAllSigsValid && (!bAllCertsValid || !bAllNewSignatures));
bool bShowInvalidState = nInfos && !bAllSigsValid;
- maSigsValidImg.Show( bShowValidState );
+
+ maSigsValidImg.Show( bShowValidState);
maSigsValidFI.Show( bShowValidState );
maSigsInvalidImg.Show( bShowInvalidState );
maSigsInvalidFI.Show( bShowInvalidState );
- maSigsNotvalidatedImg.Show( bShowNotValidatedState );
- maSigsNotvalidatedFI.Show( bShowNotValidatedState );
+
+ maSigsNotvalidatedImg.Show(bShowNotValidatedState);
+ //bAllNewSignatures is always true if we are not in document mode
+ maSigsNotvalidatedFI.Show(nInfos && bAllSigsValid && ! bAllCertsValid);
+ maSigsOldSignatureFI.Show(nInfos && bAllSigsValid && bAllCertsValid && !bAllNewSignatures);
SignatureHighlightHdl( NULL );
}
-void DigitalSignaturesDialog::ImplGetSignatureInformations()
+
+//If bUseTempStream is true then the temporary signature stream is used.
+//Otherwise the real signature stream is used.
+void DigitalSignaturesDialog::ImplGetSignatureInformations(bool bUseTempStream)
{
maCurrentSignatureInformations.clear();
maSignatureHelper.StartMission();
- SignatureStreamHelper aStreamHelper = ImplOpenSignatureStream( embed::ElementModes::READ );
+ SignatureStreamHelper aStreamHelper = ImplOpenSignatureStream(
+ css::embed::ElementModes::READ, bUseTempStream);
if ( aStreamHelper.xSignatureStream.is() )
{
uno::Reference< io::XInputStream > xInputStream( aStreamHelper.xSignatureStream, uno::UNO_QUERY );
@@ -651,30 +779,72 @@ void DigitalSignaturesDialog::ImplShowSignaturesDetails()
}
}
-SignatureStreamHelper DigitalSignaturesDialog::ImplOpenSignatureStream( sal_Int32 nStreamOpenMode )
+//If bTempStream is true, then a temporary stream is return. If it is false then, the actual
+//signature stream is used.
+//Everytime the user presses Add a new temporary stream is created.
+//We keep the temporary stream as member because ImplGetSignatureInformations
+//will later access the stream to create DocumentSignatureInformation objects
+//which are stored in maCurrentSignatureInformations.
+SignatureStreamHelper DigitalSignaturesDialog::ImplOpenSignatureStream(
+ sal_Int32 nStreamOpenMode, bool bTempStream)
{
SignatureStreamHelper aHelper;
- if ( !mxSignatureStream.is() )
+ if (bTempStream)
{
- aHelper = DocumentSignatureHelper::OpenSignatureStream( mxStore, nStreamOpenMode, meSignatureMode );
+ if (nStreamOpenMode & css::embed::ElementModes::TRUNCATE)
+ {
+ //We write always into a new temporary stream.
+ mxTempSignatureStream = Reference < css::io::XStream >(
+ mxCtx->getServiceManager()->createInstanceWithContext(
+ OUSTR( "com.sun.star.io.TempFile" ), mxCtx) ,
+ UNO_QUERY_THROW);
+ aHelper.xSignatureStream = mxTempSignatureStream;
+ }
+ else
+ {
+ //When we read from the temp stream, then we must have previously
+ //created one.
+ OSL_ASSERT(mxTempSignatureStream.is());
+ }
+ aHelper.xSignatureStream = mxTempSignatureStream;
}
else
{
- aHelper.xSignatureStream = mxSignatureStream;
- if ( nStreamOpenMode & embed::ElementModes::TRUNCATE )
+ //No temporary stream
+ if (!mxSignatureStream.is())
{
- css::uno::Reference < css::io::XTruncate > xTruncate( mxSignatureStream, uno::UNO_QUERY );
- DBG_ASSERT( xTruncate.is(), "ImplOpenSignatureStream - Stream does not support xTruncate!" );
- xTruncate->truncate();
+ //We may not have a dedicated stream for writing the signature
+ //So we take one directly from the storage
+ //Or DocumentDigitalSignatures::showDocumentContentSignatures was called,
+ //in which case Add/Remove is not allowed. This is done, for example, if the
+ //document is readonly
+ aHelper = DocumentSignatureHelper::OpenSignatureStream(
+ mxStore, nStreamOpenMode, meSignatureMode );
}
else
{
- css::uno::Reference < css::io::XSeekable > xSeek( mxSignatureStream, uno::UNO_QUERY );
- DBG_ASSERT( xSeek.is(), "ImplOpenSignatureStream - Stream does not support xSeekable!" );
- xSeek->seek( 0 );
+ aHelper.xSignatureStream = mxSignatureStream;
}
}
+ if (nStreamOpenMode & css::embed::ElementModes::TRUNCATE)
+ {
+ css::uno::Reference < css::io::XTruncate > xTruncate(
+ aHelper.xSignatureStream, UNO_QUERY_THROW);
+ DBG_ASSERT( xTruncate.is(), "ImplOpenSignatureStream - Stream does not support xTruncate!" );
+ xTruncate->truncate();
+ }
+ else if ( bTempStream || mxSignatureStream.is())
+ {
+ //In case we read the signature stream from the storage directly,
+ //which is the case when DocumentDigitalSignatures::showDocumentContentSignatures
+ //then XSeakable is not supported
+ css::uno::Reference < css::io::XSeekable > xSeek(
+ aHelper.xSignatureStream, UNO_QUERY_THROW);
+ DBG_ASSERT( xSeek.is(), "ImplOpenSignatureStream - Stream does not support xSeekable!" );
+ xSeek->seek( 0 );
+ }
+
return aHelper;
}
diff --git a/setup_native/source/registration/com/sun/star/servicetag/UnauthorizedAccessException.java b/xmlsecurity/source/dialogs/digitalsignaturesdialog.hrc
index 785cb35777ae..19054bd0399b 100644
--- a/setup_native/source/registration/com/sun/star/servicetag/UnauthorizedAccessException.java
+++ b/xmlsecurity/source/dialogs/digitalsignaturesdialog.hrc
@@ -1,59 +1,36 @@
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2008 by Sun Microsystems, Inc.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * $RCSfile: UnauthorizedAccessException.java,v $
- *
- * $Revision: 1.2 $
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-package com.sun.star.servicetag;
-
-/**
- * Thrown if the user is not authorized to
- * {@link Registry#updateServiceTag update} or
- * {@link Registry#removeServiceTag remove}
- * a service tag from a {@link Registry}.
- */
-public class UnauthorizedAccessException extends RuntimeException {
-
- /**
- * Constructs an <code>UnauthorizedAccessException</code> object
- * without detail message.
- */
- public UnauthorizedAccessException() {
- }
-
-
- /**
- * Constructs an <code>UnauthorizedAccessException</code> object
- * with the specified detail message.
- *
- * @param msg the detail message.
- */
- public UnauthorizedAccessException(String msg) {
- super(msg);
- }
-}
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#if ! defined INCLUDED_DIGITALSIGNATURESDIALOG_HRC
+#define INCLUDED_DIGITALSIGNATURESDIALOG_HRC
+
+//global.hrc in xmlsecurity/inc starts at 1000
+#define RID_DIGITALSIGNATUREDLG_START 2000
+
+#define RID_XMLSECDLG_OLD_ODF_FORMAT RID_DIGITALSIGNATUREDLG_START
+#define MSG_XMLSECDLG_QUERY_REMOVEDOCSIGNBEFORESIGN (RID_DIGITALSIGNATUREDLG_START + 1)
+#endif
diff --git a/xmlsecurity/source/dialogs/digitalsignaturesdialog.src b/xmlsecurity/source/dialogs/digitalsignaturesdialog.src
index f102053ce615..016014fbb582 100644
--- a/xmlsecurity/source/dialogs/digitalsignaturesdialog.src
+++ b/xmlsecurity/source/dialogs/digitalsignaturesdialog.src
@@ -30,6 +30,7 @@
#include "dialogs.hrc"
#include "helpids.hrc"
+#include "digitalsignaturesdialog.hrc"
ModalDialog RID_XMLSECDLG_DIGSIG
{
@@ -87,6 +88,7 @@ ModalDialog RID_XMLSECDLG_DIGSIG
{
Text [ en-US ] = "The signatures in this document are invalid";
};
+
FixedImage IMG_STATE_VALID
{
Pos = MAP_APPFONT( DS_COL_0, DS_ROW_2A );
@@ -104,6 +106,13 @@ ModalDialog RID_XMLSECDLG_DIGSIG
Hide = TRUE;
Text [ en-US ] = "The signatures in this document are valid";
};
+ FixedText FI_STATE_OLDSIGNATURE
+ {
+ Pos = MAP_APPFONT( DS_COL_0, DS_ROW_2A );
+ Size = MAP_APPFONT( DS_COL_7-DS_COL_0, RSC_CD_FIXEDTEXT_HEIGHT );
+ Hide = TRUE;
+ Text [ en-US ] = "Not all parts of the document are signed";
+ };
FixedImage IMG_STATE_BROKEN
{
Pos = MAP_APPFONT( DS_COL_0, DS_ROW_2A );
@@ -205,3 +214,13 @@ ErrorBox RID_XMLSECDLG_OLD_ODF_FORMAT
"Save document in ODF 1.2 format and add all desired signatures again.";
};
+
+QueryBox MSG_XMLSECDLG_QUERY_REMOVEDOCSIGNBEFORESIGN
+{
+ Buttons = WB_YES_NO ;
+ DefButton = WB_DEF_NO ;
+ Message [ en-US ] = "Adding or removing a macro signature will remove all document signatures.\n"
+ "Do you really want to continue?";
+};
+
+
diff --git a/xmlsecurity/source/dialogs/resourcemanager.cxx b/xmlsecurity/source/dialogs/resourcemanager.cxx
index d8d444a24d18..693d003b0d77 100644
--- a/xmlsecurity/source/dialogs/resourcemanager.cxx
+++ b/xmlsecurity/source/dialogs/resourcemanager.cxx
@@ -38,7 +38,12 @@
#include <svtools/stdctrl.hxx>
#include <svtools/solar.hrc>
#include <svtools/syslocale.hxx>
+#include <rtl/ustring.h>
+#include <rtl/ustrbuf.h>
+#include <vector>
+using ::rtl::OUString;
+using namespace std;
namespace XmlSec
{
@@ -110,122 +115,249 @@ namespace XmlSec
return GetLocaleData().getDate( GetDateTime( _rDT ) );
}
- String GetPureContent( const String& _rRawString, const char* _pCommaReplacement, bool _bPreserveId )
+ /*
+ Creates two strings based on the distinguished name which are displayed in the
+ certificate details view. The first string contains only the values of the attribute
+ and valudes pairs, which are separated by commas. All escape characters ('"') are
+ removed.
+ The second string is for the details view at the bottom. It shows the attribute/value
+ pairs on different lines. All escape characters ('"') are removed.
+ */
+ pair< OUString, OUString> GetDNForCertDetailsView( const OUString & rRawString)
{
- enum STATE { PRE_ID, ID, EQUALSIGN, PRE_CONT, CONT };
- String s;
- STATE e = _bPreserveId? PRE_ID : ID;
-
- const sal_Unicode* p = _rRawString.GetBuffer();
- sal_Unicode c;
- const sal_Unicode cComma = ',';
- const sal_Unicode cEqualSign = '=';
- const sal_Unicode cSpace = ' ';
- String aCommaReplacement;
- if( _pCommaReplacement )
- aCommaReplacement = String::CreateFromAscii( _pCommaReplacement );
-
- while( *p )
+ vector< pair< OUString, OUString > > vecAttrValueOfDN = parseDN(rRawString);
+ ::rtl::OUStringBuffer s1, s2;
+ OUString sEqual(RTL_CONSTASCII_USTRINGPARAM(" = "));
+ typedef vector< pair < OUString, OUString > >::const_iterator CIT;
+ for (CIT i = vecAttrValueOfDN.begin(); i < vecAttrValueOfDN.end(); i ++)
{
- c = *p;
- switch( e )
+ if (i != vecAttrValueOfDN.begin())
{
- case PRE_ID:
- if( c != cSpace )
- {
- s += c;
- e = ID;
- }
- break;
- case ID:
- if( _bPreserveId )
- s += c;
-
- if( c == cEqualSign )
- e = _bPreserveId? PRE_CONT : CONT;
- break;
- case EQUALSIGN:
- break;
- case PRE_CONT:
- if( c != cSpace )
- {
- s += c;
- e = CONT;
- }
- break;
- case CONT:
- if( c == cComma )
- {
- s += aCommaReplacement;
- e = _bPreserveId? PRE_ID : ID;
- }
- else
- s += c;
- break;
+ s1.append(static_cast<sal_Unicode>(','));
+ s2.append(static_cast<sal_Unicode>('\n'));
}
-
- ++p;
+ s1.append(i->second);
+ s2.append(i->first);
+ s2.append(sEqual);
+ s2.append(i->second);
}
-
-// xub_StrLen nEquPos = _rRawString.SearchAscii( "=" );
-// if( nEquPos == STRING_NOTFOUND )
-// s = _rRawString;
-// else
-// {
-// ++nEquPos;
-// s = String( _rRawString, nEquPos, STRING_MAXLEN );
-// s.EraseLeadingAndTrailingChars();
-// }
-
- return s;
+ return make_pair(s1.makeStringAndClear(), s2.makeStringAndClear());
}
- String GetContentPart( const String& _rRawString, const String& _rPartId )
+/*
+ Whenever the attribute value contains special characters, such as '"' or ',' (without '')
+ then the value will be enclosed in double quotes by the respective Windows or NSS function
+ which we use to retrieve, for example, the subject name. If double quotes appear in the value then
+ they are escaped with a double quote. This function removes the escape characters.
+*/
+#ifdef WNT
+vector< pair< OUString, OUString> > parseDN(const OUString& rRawString)
{
- String s;
-
- xub_StrLen nContStart = _rRawString.Search( _rPartId );
- if( nContStart != STRING_NOTFOUND )
+ vector< pair<OUString, OUString> > retVal;
+ bool bInEscape = false;
+ bool bInValue = false;
+ bool bInType = true;
+ sal_Int32 nTypeNameStart = 0;
+ OUString sType;
+ ::rtl::OUStringBuffer sbufValue;
+ sal_Int32 length = rRawString.getLength();
+
+ for (sal_Int32 i = 0; i < length; i++)
{
- nContStart = nContStart + _rPartId.Len();
- ++nContStart; // now it's start of content, directly after Id
-
- xub_StrLen nContEnd = _rRawString.Search( sal_Unicode( ',' ), nContStart );
+ sal_Unicode c = rRawString[i];
- s = String( _rRawString, nContStart, nContEnd - nContStart );
+ if (c == '=')
+ {
+ if (! bInValue)
+ {
+ sType = rRawString.copy(nTypeNameStart, i - nTypeNameStart);
+ sType = sType.trim();
+ bInType = false;
+ }
+ else
+ {
+ sbufValue.append(c);
+ }
+ }
+ else if (c == '"')
+ {
+ if (!bInEscape)
+ {
+ //If this is the quote is the first of the couple which enclose the
+ //whole value, because the value contains special characters
+ //then we just drop it. That is, this character must be followed by
+ //a character which is not '"'.
+ if ( i + 1 < length && rRawString[i+1] == '"')
+ bInEscape = true;
+ else
+ bInValue = !bInValue; //value is enclosed in " "
+ }
+ else
+ {
+ //This quote is escaped by a preceding quote and therefore is
+ //part of the value
+ sbufValue.append(c);
+ bInEscape = false;
+ }
+ }
+ else if (c == ',')
+ {
+ //The comma separate the attribute value pairs.
+ //If the comma is not part of a value (the value would then be enclosed in '"'),
+ //then we have reached the end of the value
+ if (!bInValue)
+ {
+ OSL_ASSERT(sType.getLength());
+ retVal.push_back(make_pair(sType, sbufValue.makeStringAndClear()));
+ sType = OUString();
+ //The next char is the start of the new type
+ nTypeNameStart = i + 1;
+ bInType = true;
+ }
+ else
+ {
+ //The whole string is enclosed because it contains special characters.
+ //The enclosing '"' are not part of certificate but will be added by
+ //the function (Windows or NSS) which retrieves DN
+ sbufValue.append(c);
+ }
+ }
+ else
+ {
+ if (!bInType)
+ sbufValue.append(c);
+ }
+ }
+ if (sbufValue.getLength())
+ {
+ OSL_ASSERT(sType.getLength());
+ retVal.push_back(make_pair(sType, sbufValue.makeStringAndClear()));
}
+ return retVal;
+ }
+#else
+vector< pair< OUString, OUString> > parseDN(const OUString& rRawString)
+ {
+ vector< pair<OUString, OUString> > retVal;
+ //bInEscape == true means that the preceding character is an escape character
+ bool bInEscape = false;
+ bool bInValue = false;
+ bool bInType = true;
+ sal_Int32 nTypeNameStart = 0;
+ OUString sType;
+ ::rtl::OUStringBuffer sbufValue;
+ sal_Int32 length = rRawString.getLength();
+
+ for (sal_Int32 i = 0; i < length; i++)
+ {
+ sal_Unicode c = rRawString[i];
- return s;
+ if (c == '=')
+ {
+ if (! bInValue)
+ {
+ sType = rRawString.copy(nTypeNameStart, i - nTypeNameStart);
+ sType = sType.trim();
+ bInType = false;
+ }
+ else
+ {
+ sbufValue.append(c);
+ }
+ }
+ else if (c == '\\')
+ {
+ if (!bInEscape)
+ {
+ bInEscape = true;
+ }
+ else
+ { // bInEscape is true
+ sbufValue.append(c);
+ bInEscape = false;
+ }
+ }
+ else if (c == '"')
+ {
+ //an unescaped '"' is either at the beginning or end of the value
+ if (!bInEscape)
+ {
+ if ( !bInValue)
+ bInValue = true;
+ else if (bInValue)
+ bInValue = false;
+ }
+ else
+ {
+ //This quote is escaped by a preceding quote and therefore is
+ //part of the value
+ sbufValue.append(c);
+ bInEscape = false;
+ }
+ }
+ else if (c == ',')
+ {
+ //The comma separate the attribute value pairs.
+ //If the comma is not part of a value (the value would then be enclosed in '"'),
+ //then we have reached the end of the value
+ if (!bInValue)
+ {
+ OSL_ASSERT(sType.getLength());
+ retVal.push_back(make_pair(sType, sbufValue.makeStringAndClear()));
+ sType = OUString();
+ //The next char is the start of the new type
+ nTypeNameStart = i + 1;
+ bInType = true;
+ }
+ else
+ {
+ //The whole string is enclosed because it contains special characters.
+ //The enclosing '"' are not part of certificate but will be added by
+ //the function (Windows or NSS) which retrieves DN
+ sbufValue.append(c);
+ }
+ }
+ else
+ {
+ if (!bInType)
+ {
+ sbufValue.append(c);
+ bInEscape = false;
+ }
+ }
+ }
+ if (sbufValue.getLength())
+ {
+ OSL_ASSERT(sType.getLength());
+ retVal.push_back(make_pair(sType, sbufValue.makeStringAndClear()));
+ }
+ return retVal;
}
- /**
- * This Method should consider some string like "C=CN-XXX , O=SUN-XXX , CN=Jack" ,
- * here the first CN represent china , and the second CN represent the common name ,
- * so I changed the method to handle this .
- * By CP , mailto : chandler.peng@sun.com
- **/
+#endif
+
String GetContentPart( const String& _rRawString )
{
- // search over some parts to find a string
- //static char* aIDs[] = { "CN", "OU", "O", "E", NULL };
- static char const * aIDs[] = { "CN=", "OU=", "O=", "E=", NULL };// By CP
- String sPart;
+ char const * aIDs[] = { "CN", "OU", "O", "E", NULL };
+ OUString retVal;
int i = 0;
+ vector< pair< OUString, OUString > > vecAttrValueOfDN = parseDN(_rRawString);
while ( aIDs[i] )
{
- String sPartId = String::CreateFromAscii( aIDs[i++] );
- xub_StrLen nContStart = _rRawString.Search( sPartId );
- if ( nContStart != STRING_NOTFOUND )
+ OUString sPartId = OUString::createFromAscii( aIDs[i++] );
+ typedef vector< pair < OUString, OUString > >::const_iterator CIT;
+ for (CIT idn = vecAttrValueOfDN.begin(); idn != vecAttrValueOfDN.end(); idn++)
{
- nContStart = nContStart + sPartId.Len();
- //++nContStart; // now it's start of content, directly after Id // delete By CP
- xub_StrLen nContEnd = _rRawString.Search( sal_Unicode( ',' ), nContStart );
- sPart = String( _rRawString, nContStart, nContEnd - nContStart );
- break;
+ if (idn->first.equals(sPartId))
+ {
+ retVal = idn->second;
+ break;
+ }
}
+ if (retVal.getLength())
+ break;
}
-
- return sPart;
+ return retVal;
}
String GetHexString( const ::com::sun::star::uno::Sequence< sal_Int8 >& _rSeq, const char* _pSep, UINT16 _nLineBreak )
diff --git a/xmlsecurity/source/dialogs/resourcemanager.hxx b/xmlsecurity/source/dialogs/resourcemanager.hxx
index 500ba6501c39..0525010f0abe 100644
--- a/xmlsecurity/source/dialogs/resourcemanager.hxx
+++ b/xmlsecurity/source/dialogs/resourcemanager.hxx
@@ -36,6 +36,8 @@
#include <com/sun/star/util/DateTime.hpp>
#include <com/sun/star/uno/Sequence.hxx>
+#include <vector>
+
class FixedImage;
class FixedInfo;
class Control;
@@ -51,10 +53,10 @@ namespace XmlSec
String GetDateTimeString( const rtl::OUString& _rDate, const rtl::OUString& _rTime );
String GetDateString( const ::com::sun::star::util::DateTime& _rDT );
- String GetPureContent( const String& _rRawString,
- const char* _pCommaReplacement = ", ",
- bool _bPreserveId = false ); // strips "CN=" and so from string
- String GetContentPart( const String& _rRawString, const String& _rPartId );
+ std::vector< std::pair< ::rtl::OUString, ::rtl::OUString> >
+ parseDN(const ::rtl::OUString& rRawString);
+ std::pair< ::rtl::OUString, ::rtl::OUString> GetDNForCertDetailsView(
+ const ::rtl::OUString & rRawString);
String GetContentPart( const String& _rRawString );
String GetHexString( const ::com::sun::star::uno::Sequence< sal_Int8 >& _rSeq, const char* _pSep = ":", UINT16 _nLineBreak = 0xFFFF );
diff --git a/xmlsecurity/source/helper/documentsignaturehelper.cxx b/xmlsecurity/source/helper/documentsignaturehelper.cxx
index 37186bd2515c..ca2cfe941f4d 100644
--- a/xmlsecurity/source/helper/documentsignaturehelper.cxx
+++ b/xmlsecurity/source/helper/documentsignaturehelper.cxx
@@ -1,291 +1,465 @@
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2008 by Sun Microsystems, Inc.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * $RCSfile: documentsignaturehelper.cxx,v $
- * $Revision: 1.11 $
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-// MARKER(update_precomp.py): autogen include statement, do not remove
-#include "precompiled_xmlsecurity.hxx"
-
-#include <xmlsecurity/documentsignaturehelper.hxx>
-
-#include <com/sun/star/container/XNameAccess.hpp>
-#include <com/sun/star/lang/XComponent.hpp>
-#include <com/sun/star/lang/DisposedException.hpp>
-#include <com/sun/star/embed/XStorage.hpp>
-#include <com/sun/star/embed/ElementModes.hpp>
-#include "com/sun/star/beans/XPropertySet.hpp"
-
-#include "comphelper/documentconstants.hxx"
-#include <tools/debug.hxx>
-#include "rtl/uri.hxx"
-
-using namespace ::com::sun::star;
-namespace css = ::com::sun::star;
-
-namespace
-{
-::rtl::OUString getElement(::rtl::OUString const & version, ::sal_Int32 * index)
-{
- while (*index < version.getLength() && version[*index] == '0') {
- ++*index;
- }
- return version.getToken(0, '.', *index);
-}
-
-
-
-// Return 1 if version1 is greater then version 2, 0 if they are equal
-//and -1 if version1 is less version 2
-int compareVersions(
- ::rtl::OUString const & version1, ::rtl::OUString const & version2)
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: documentsignaturehelper.cxx,v $
+ * $Revision: 1.11 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_xmlsecurity.hxx"
+
+#include <xmlsecurity/documentsignaturehelper.hxx>
+
+#include <com/sun/star/container/XNameAccess.hpp>
+#include <com/sun/star/lang/XComponent.hpp>
+#include <com/sun/star/lang/DisposedException.hpp>
+#include <com/sun/star/embed/XStorage.hpp>
+#include <com/sun/star/embed/ElementModes.hpp>
+#include "com/sun/star/beans/XPropertySet.hpp"
+
+#include "comphelper/documentconstants.hxx"
+#include <tools/debug.hxx>
+#include "rtl/uri.hxx"
+
+using namespace ::com::sun::star::uno;
+//using namespace ::com::sun::star;
+namespace css = ::com::sun::star;
+using rtl::OUString;
+
+
+namespace
+{
+::rtl::OUString getElement(::rtl::OUString const & version, ::sal_Int32 * index)
+{
+ while (*index < version.getLength() && version[*index] == '0') {
+ ++*index;
+ }
+ return version.getToken(0, '.', *index);
+}
+
+
+
+// Return 1 if version1 is greater then version 2, 0 if they are equal
+//and -1 if version1 is less version 2
+int compareVersions(
+ ::rtl::OUString const & version1, ::rtl::OUString const & version2)
+{
+ for (::sal_Int32 i1 = 0, i2 = 0; i1 >= 0 || i2 >= 0;) {
+ ::rtl::OUString e1(getElement(version1, &i1));
+ ::rtl::OUString e2(getElement(version2, &i2));
+ if (e1.getLength() < e2.getLength()) {
+ return -1;
+ } else if (e1.getLength() > e2.getLength()) {
+ return 1;
+ } else if (e1 < e2) {
+ return -1;
+ } else if (e1 > e2) {
+ return 1;
+ }
+ }
+ return 0;
+}
+}
+//If the OOo 3.0 mode is used then we exclude
+//'mimetype' and all content of 'META-INF'.
+//If the argument 'bSigning' is true then the element list is created for a signing
+//operation in which case we use the latest signing algorithm. That is all elements
+//we find in the zip storage are added to the list. We do not support the old signatures
+//which did not contain all files.
+//If 'bSigning' is false, then we validate. If the user enabled validating according to OOo 3.0
+//then mimetype and all content of META-INF must be excluded.
+void ImplFillElementList(
+ std::vector< rtl::OUString >& rList, const Reference < css::embed::XStorage >& rxStore,
+ const ::rtl::OUString rRootStorageName, const bool bRecursive,
+ const DocumentSignatureAlgorithm mode)
+{
+ ::rtl::OUString aMetaInfName( RTL_CONSTASCII_USTRINGPARAM( "META-INF" ) );
+ ::rtl::OUString sMimeTypeName (RTL_CONSTASCII_USTRINGPARAM("mimetype"));
+ ::rtl::OUString aSep( RTL_CONSTASCII_USTRINGPARAM( "/" ) );
+
+ Reference < css::container::XNameAccess > xElements( rxStore, UNO_QUERY );
+ Sequence< ::rtl::OUString > aElements = xElements->getElementNames();
+ sal_Int32 nElements = aElements.getLength();
+ const ::rtl::OUString* pNames = aElements.getConstArray();
+
+ for ( sal_Int32 n = 0; n < nElements; n++ )
+ {
+ if (mode != OOo3_2Document
+ && (pNames[n] == aMetaInfName
+ || pNames[n] == sMimeTypeName))
+ {
+ continue;
+ }
+ else
+ {
+ ::rtl::OUString sEncName = ::rtl::Uri::encode(
+ pNames[n], rtl_UriCharClassRelSegment,
+ rtl_UriEncodeStrict, RTL_TEXTENCODING_UTF8);
+ if (sEncName.getLength() == 0 && pNames[n].getLength() != 0)
+ throw css::uno::Exception(::rtl::OUString(
+ RTL_CONSTASCII_USTRINGPARAM("Failed to encode element name of XStorage")), 0);
+
+ if ( rxStore->isStreamElement( pNames[n] ) )
+ {
+ //Exclude documentsignatures.xml!
+ if (pNames[n].equals(
+ DocumentSignatureHelper::GetDocumentContentSignatureDefaultStreamName()))
+ continue;
+ ::rtl::OUString aFullName( rRootStorageName + sEncName );
+ rList.push_back(aFullName);
+ }
+ else if ( bRecursive && rxStore->isStorageElement( pNames[n] ) )
+ {
+ Reference < css::embed::XStorage > xSubStore = rxStore->openStorageElement( pNames[n], css::embed::ElementModes::READ );
+ rtl::OUString aFullRootName( rRootStorageName + sEncName + aSep );
+ ImplFillElementList(rList, xSubStore, aFullRootName, bRecursive, mode);
+ }
+ }
+ }
+}
+
+
+bool DocumentSignatureHelper::isODFPre_1_2(const ::rtl::OUString & sVersion)
+{
+ //The property version exists only if the document is at least version 1.2
+ //That is, if the document has version 1.1 and sVersion is empty.
+ //The constant is defined in comphelper/documentconstants.hxx
+ if (compareVersions(sVersion, ODFVER_012_TEXT) == -1)
+ return true;
+ return false;
+}
+
+bool DocumentSignatureHelper::isOOo3_2_Signature(const SignatureInformation & sigInfo)
+{
+ ::rtl::OUString sManifestURI(RTL_CONSTASCII_USTRINGPARAM("META-INF/manifest.xml"));
+ bool bOOo3_2 = false;
+ typedef ::std::vector< SignatureReferenceInformation >::const_iterator CIT;
+ for (CIT i = sigInfo.vSignatureReferenceInfors.begin();
+ i < sigInfo.vSignatureReferenceInfors.end(); i++)
+ {
+ if (i->ouURI.equals(sManifestURI))
+ {
+ bOOo3_2 = true;
+ break;
+ }
+ }
+ return bOOo3_2;
+}
+
+DocumentSignatureAlgorithm
+DocumentSignatureHelper::getDocumentAlgorithm(
+ const ::rtl::OUString & sODFVersion, const SignatureInformation & sigInfo)
+{
+ OSL_ASSERT(sODFVersion.getLength());
+ DocumentSignatureAlgorithm mode = OOo3_2Document;
+ if (!isOOo3_2_Signature(sigInfo))
+ {
+ if (isODFPre_1_2(sODFVersion))
+ mode = OOo2Document;
+ else
+ mode = OOo3_0Document;
+ }
+ return mode;
+}
+
+//The function creates a list of files which are to be signed or for which
+//the signature is to be validated. The strings are UTF8 encoded URIs which
+//contain '/' as path separators.
+//
+//The algorithm how document signatures are created and validated has
+//changed over time. The change affects only which files within the document
+//are changed. Document signatures created by OOo 2.x only used particular files. Since
+//OOo 3.0 everything except "mimetype" and "META-INF" are signed. As of OOo 3.2 everything
+//except META-INF/documentsignatures.xml is signed.
+//Signatures are validated according to the algorithm which was then used for validation.
+//That is, when validating a signature which was created by OOo 3.0, then mimetype and
+//META-INF are not used.
+//
+//When a signature is created then we always use the latest algorithm. That is, we use
+//that of OOo 3.2
+std::vector< rtl::OUString >
+DocumentSignatureHelper::CreateElementList(
+ const Reference < css::embed::XStorage >& rxStore,
+ const ::rtl::OUString /*rRootStorageName*/, DocumentSignatureMode eMode,
+ const DocumentSignatureAlgorithm mode)
+{
+ std::vector< rtl::OUString > aElements;
+ ::rtl::OUString aSep( RTL_CONSTASCII_USTRINGPARAM( "/" ) );
+
+ switch ( eMode )
+ {
+ case SignatureModeDocumentContent:
+ {
+ if (mode == OOo2Document) //that is, ODF 1.0, 1.1
+ {
+ // 1) Main content
+ ImplFillElementList(aElements, rxStore, ::rtl::OUString(), false, mode);
+
+ // 2) Pictures...
+ rtl::OUString aSubStorageName( rtl::OUString::createFromAscii( "Pictures" ) );
+ try
+ {
+ Reference < css::embed::XStorage > xSubStore = rxStore->openStorageElement( aSubStorageName, css::embed::ElementModes::READ );
+ ImplFillElementList(aElements, xSubStore, aSubStorageName+aSep, true, mode);
+ }
+ catch(css::io::IOException& )
+ {
+ ; // Doesn't have to exist...
+ }
+ // 3) OLE....
+ aSubStorageName = rtl::OUString::createFromAscii( "ObjectReplacements" );
+ try
+ {
+ Reference < css::embed::XStorage > xSubStore = rxStore->openStorageElement( aSubStorageName, css::embed::ElementModes::READ );
+ ImplFillElementList(aElements, xSubStore, aSubStorageName+aSep, true, mode);
+ xSubStore.clear();
+
+ // Object folders...
+ rtl::OUString aMatchStr( rtl::OUString::createFromAscii( "Object " ) );
+ Reference < css::container::XNameAccess > xElements( rxStore, UNO_QUERY );
+ Sequence< ::rtl::OUString > aElementNames = xElements->getElementNames();
+ sal_Int32 nElements = aElementNames.getLength();
+ const ::rtl::OUString* pNames = aElementNames.getConstArray();
+ for ( sal_Int32 n = 0; n < nElements; n++ )
+ {
+ if ( ( pNames[n].match( aMatchStr ) ) && rxStore->isStorageElement( pNames[n] ) )
+ {
+ Reference < css::embed::XStorage > xTmpSubStore = rxStore->openStorageElement( pNames[n], css::embed::ElementModes::READ );
+ ImplFillElementList(aElements, xTmpSubStore, pNames[n]+aSep, true, mode);
+ }
+ }
+ }
+ catch( com::sun::star::io::IOException& )
+ {
+ ; // Doesn't have to exist...
+ }
+ }
+ else
+ {
+ // Everything except META-INF
+ ImplFillElementList(aElements, rxStore, ::rtl::OUString(), true, mode);
+ }
+ }
+ break;
+ case SignatureModeMacros:
+ {
+ // 1) Macros
+ rtl::OUString aSubStorageName( rtl::OUString::createFromAscii( "Basic" ) );
+ try
+ {
+ Reference < css::embed::XStorage > xSubStore = rxStore->openStorageElement( aSubStorageName, css::embed::ElementModes::READ );
+ ImplFillElementList(aElements, xSubStore, aSubStorageName+aSep, true, mode);
+ }
+ catch( com::sun::star::io::IOException& )
+ {
+ ; // Doesn't have to exist...
+ }
+
+ // 2) Dialogs
+ aSubStorageName = rtl::OUString::createFromAscii( "Dialogs") ;
+ try
+ {
+ Reference < css::embed::XStorage > xSubStore = rxStore->openStorageElement( aSubStorageName, css::embed::ElementModes::READ );
+ ImplFillElementList(aElements, xSubStore, aSubStorageName+aSep, true, mode);
+ }
+ catch( com::sun::star::io::IOException& )
+ {
+ ; // Doesn't have to exist...
+ }
+ // 3) Scripts
+ aSubStorageName = rtl::OUString::createFromAscii( "Scripts") ;
+ try
+ {
+ Reference < css::embed::XStorage > xSubStore = rxStore->openStorageElement( aSubStorageName, css::embed::ElementModes::READ );
+ ImplFillElementList(aElements, xSubStore, aSubStorageName+aSep, true, mode);
+ }
+ catch( css::io::IOException& )
+ {
+ ; // Doesn't have to exist...
+ }
+ }
+ break;
+ case SignatureModePackage:
+ {
+ // Everything except META-INF
+ ImplFillElementList(aElements, rxStore, ::rtl::OUString(), true, mode);
+ }
+ break;
+ }
+
+ return aElements;
+}
+
+SignatureStreamHelper DocumentSignatureHelper::OpenSignatureStream(
+ const Reference < css::embed::XStorage >& rxStore, sal_Int32 nOpenMode, DocumentSignatureMode eDocSigMode )
+{
+ sal_Int32 nSubStorageOpenMode = css::embed::ElementModes::READ;
+ if ( nOpenMode & css::embed::ElementModes::WRITE )
+ nSubStorageOpenMode = css::embed::ElementModes::WRITE;
+
+ SignatureStreamHelper aHelper;
+
+ try
+ {
+ ::rtl::OUString aSIGStoreName( RTL_CONSTASCII_USTRINGPARAM( "META-INF" ) );
+ aHelper.xSignatureStorage = rxStore->openStorageElement( aSIGStoreName, nSubStorageOpenMode );
+ if ( aHelper.xSignatureStorage.is() )
+ {
+ ::rtl::OUString aSIGStreamName;
+ if ( eDocSigMode == SignatureModeDocumentContent )
+ aSIGStreamName = DocumentSignatureHelper::GetDocumentContentSignatureDefaultStreamName();
+ else if ( eDocSigMode == SignatureModeMacros )
+ aSIGStreamName = DocumentSignatureHelper::GetScriptingContentSignatureDefaultStreamName();
+ else
+ aSIGStreamName = DocumentSignatureHelper::GetPackageSignatureDefaultStreamName();
+
+ aHelper.xSignatureStream = aHelper.xSignatureStorage->openStreamElement( aSIGStreamName, nOpenMode );
+ }
+ }
+ catch(css::io::IOException& )
+ {
+ // Doesn't have to exist...
+ DBG_ASSERT( nOpenMode == css::embed::ElementModes::READ, "Error creating signature stream..." );
+ }
+
+ return aHelper;
+}
+
+//sElementList contains all files which are expected to be signed. Only those files must me signed,
+//no more, no less.
+//The DocumentSignatureAlgorithm indicates if the document was created with OOo 2.x. Then
+//the uri s in the Reference elements in the signature, were not properly encoded.
+// For example: <Reference URI="ObjectReplacements/Object 1">
+bool DocumentSignatureHelper::checkIfAllFilesAreSigned(
+ const ::std::vector< ::rtl::OUString > & sElementList,
+ const SignatureInformation & sigInfo,
+ const DocumentSignatureAlgorithm alg)
+{
+ // Can only be valid if ALL streams are signed, which means real stream count == signed stream count
+ unsigned int nRealCount = 0;
+ for ( int i = sigInfo.vSignatureReferenceInfors.size(); i; )
+ {
+ const SignatureReferenceInformation& rInf = sigInfo.vSignatureReferenceInfors[--i];
+ // There is also an extra entry of type TYPE_SAMEDOCUMENT_REFERENCE because of signature date.
+ if ( ( rInf.nType == TYPE_BINARYSTREAM_REFERENCE ) || ( rInf.nType == TYPE_XMLSTREAM_REFERENCE ) )
+ {
+ ::rtl::OUString sReferenceURI = rInf.ouURI;
+ if (alg == OOo2Document)
+ {
+ //Comparing URIs is a difficult. Therefore we kind of normalize
+ //it before comparing. We assume that our URI do not have a leading "./"
+ //and fragments at the end (...#...)
+ sReferenceURI = ::rtl::Uri::encode(
+ sReferenceURI, rtl_UriCharClassPchar,
+ rtl_UriEncodeCheckEscapes, RTL_TEXTENCODING_UTF8);
+ }
+
+ //find the file in the element list
+ typedef ::std::vector< ::rtl::OUString >::const_iterator CIT;
+ for (CIT aIter = sElementList.begin(); aIter < sElementList.end(); aIter++)
+ {
+ ::rtl::OUString sElementListURI = *aIter;
+ if (alg == OOo2Document)
+ {
+ sElementListURI =
+ ::rtl::Uri::encode(
+ sElementListURI, rtl_UriCharClassPchar,
+ rtl_UriEncodeCheckEscapes, RTL_TEXTENCODING_UTF8);
+ }
+ if (sElementListURI.equals(sReferenceURI))
+ {
+ nRealCount++;
+ break;
+ }
+ }
+ }
+ }
+ return sElementList.size() == nRealCount;
+}
+
+/*Compares the Uri which are obtained from CreateElementList with
+ the path obtained from the manifest.xml.
+ Returns true if both strings are equal.
+*/
+bool DocumentSignatureHelper::equalsReferenceUriManifestPath(
+ const OUString & rUri, const OUString & rPath)
{
- for (::sal_Int32 i1 = 0, i2 = 0; i1 >= 0 || i2 >= 0;) {
- ::rtl::OUString e1(getElement(version1, &i1));
- ::rtl::OUString e2(getElement(version2, &i2));
- if (e1.getLength() < e2.getLength()) {
- return -1;
- } else if (e1.getLength() > e2.getLength()) {
- return 1;
- } else if (e1 < e2) {
- return -1;
- } else if (e1 > e2) {
- return 1;
- }
- }
- return 0;
-}
-}
-
-void ImplFillElementList( std::vector< rtl::OUString >& rList, const uno::Reference < embed::XStorage >& rxStore, const ::rtl::OUString rRootStorageName, bool bRecursive )
-{
- ::rtl::OUString aMetaInfName( RTL_CONSTASCII_USTRINGPARAM( "META-INF" ) );
- ::rtl::OUString aSep( RTL_CONSTASCII_USTRINGPARAM( "/" ) );
-
- uno::Reference < container::XNameAccess > xElements( rxStore, uno::UNO_QUERY );
- uno::Sequence< ::rtl::OUString > aElements = xElements->getElementNames();
- sal_Int32 nElements = aElements.getLength();
- const ::rtl::OUString* pNames = aElements.getConstArray();
- for ( sal_Int32 n = 0; n < nElements; n++ )
- {
- if ( pNames[n] != aMetaInfName )
- {
- ::rtl::OUString sEncName = ::rtl::Uri::encode(
- pNames[n], rtl_UriCharClassRelSegment,
- rtl_UriEncodeStrict, RTL_TEXTENCODING_UTF8);
- if (sEncName.getLength() == 0 && pNames[n].getLength() != 0)
- throw css::uno::Exception(::rtl::OUString(
- RTL_CONSTASCII_USTRINGPARAM("Failed to encode element name of XStorage")), 0);
-
- if ( rxStore->isStreamElement( pNames[n] ) )
- {
- ::rtl::OUString aFullName( rRootStorageName + sEncName );
- rList.push_back(aFullName);
- }
- else if ( bRecursive && rxStore->isStorageElement( pNames[n] ) )
- {
- uno::Reference < embed::XStorage > xSubStore = rxStore->openStorageElement( pNames[n], embed::ElementModes::READ );
- rtl::OUString aFullRootName( rRootStorageName + sEncName + aSep );
- ImplFillElementList( rList, xSubStore, aFullRootName, bRecursive );
- }
- }
- }
-}
-
-
-bool DocumentSignatureHelper::isODFPre_1_2(const uno::Reference < embed::XStorage >& rxStore)
-{
- ::rtl::OUString sVersion;
- uno::Reference< beans::XPropertySet > xProps(rxStore, uno::UNO_QUERY_THROW );
- xProps->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Version" ) ) ) >>= sVersion;
- //The property version exists only if the document is at least version 1.2
- //The constant is defined in comphelper/documentconstants.hxx
- if (compareVersions(sVersion, ODFVER_012_TEXT) == -1)
- return true;
- return false;
-}
-
+ bool retVal = false;
+ //split up the uri and path into segments. Both are separated by '/'
+ std::vector<OUString> vUriSegments;
+ sal_Int32 nIndex = 0;
+ do
+ {
+ OUString aToken = rUri.getToken( 0, '/', nIndex );
+ vUriSegments.push_back(aToken);
+ }
+ while (nIndex >= 0);
+
+ std::vector<OUString> vPathSegments;
+ nIndex = 0;
+ do
+ {
+ OUString aToken = rPath.getToken( 0, '/', nIndex );
+ vPathSegments.push_back(aToken);
+ }
+ while (nIndex >= 0);
+
+ //Now compare each segment of the uri with its counterpart from the path
+ if (vUriSegments.size() == vPathSegments.size())
+ {
+ retVal = true;
+ typedef std::vector<OUString>::const_iterator CIT;
+ for (CIT i = vUriSegments.begin(), j = vPathSegments.begin();
+ i != vUriSegments.end(); i++, j++)
+ {
+ //Decode the uri segment, so that %20 becomes ' ', etc.
+ OUString sDecUri = ::rtl::Uri::decode(
+ *i, rtl_UriDecodeWithCharset, RTL_TEXTENCODING_UTF8);
+ if (!sDecUri.equals(*j))
+ {
+ retVal = false;
+ break;
+ }
+ }
+ }
-std::vector< rtl::OUString > DocumentSignatureHelper::CreateElementList( const uno::Reference < embed::XStorage >& rxStore, const ::rtl::OUString /*rRootStorageName*/, DocumentSignatureMode eMode )
-{
- std::vector< rtl::OUString > aElements;
- ::rtl::OUString aSep( RTL_CONSTASCII_USTRINGPARAM( "/" ) );
-
- bool bPre1_2 = isODFPre_1_2(rxStore);
-
- switch ( eMode )
- {
- case SignatureModeDocumentContent:
- {
- if (bPre1_2)
- {
- // 1) Main content
- ImplFillElementList( aElements, rxStore, ::rtl::OUString(), false );
-
- // 2) Pictures...
- rtl::OUString aSubStorageName( rtl::OUString::createFromAscii( "Pictures" ) );
- try
- {
- uno::Reference < embed::XStorage > xSubStore = rxStore->openStorageElement( aSubStorageName, embed::ElementModes::READ );
- ImplFillElementList( aElements, xSubStore, aSubStorageName+aSep, true );
- }
- catch( com::sun::star::io::IOException& )
- {
- ; // Doesn't have to exist...
- }
- // 3) OLE....
- aSubStorageName = rtl::OUString::createFromAscii( "ObjectReplacements" );
- try
- {
- uno::Reference < embed::XStorage > xSubStore = rxStore->openStorageElement( aSubStorageName, embed::ElementModes::READ );
- ImplFillElementList( aElements, xSubStore, aSubStorageName+aSep, true );
- xSubStore.clear();
-
- // Object folders...
- rtl::OUString aMatchStr( rtl::OUString::createFromAscii( "Object " ) );
- uno::Reference < container::XNameAccess > xElements( rxStore, uno::UNO_QUERY );
- uno::Sequence< ::rtl::OUString > aElementNames = xElements->getElementNames();
- sal_Int32 nElements = aElementNames.getLength();
- const ::rtl::OUString* pNames = aElementNames.getConstArray();
- for ( sal_Int32 n = 0; n < nElements; n++ )
- {
- if ( ( pNames[n].match( aMatchStr ) ) && rxStore->isStorageElement( pNames[n] ) )
- {
- uno::Reference < embed::XStorage > xTmpSubStore = rxStore->openStorageElement( pNames[n], embed::ElementModes::READ );
- ImplFillElementList( aElements, xTmpSubStore, pNames[n]+aSep, true );
- }
- }
- }
- catch( com::sun::star::io::IOException& )
- {
- ; // Doesn't have to exist...
- }
- }
- else
- {
- // Everything except META-INF
- ImplFillElementList( aElements, rxStore, ::rtl::OUString(), true );
- }
- }
- break;
- case SignatureModeMacros:
- {
- // 1) Macros
- rtl::OUString aSubStorageName( rtl::OUString::createFromAscii( "Basic" ) );
- try
- {
- uno::Reference < embed::XStorage > xSubStore = rxStore->openStorageElement( aSubStorageName, embed::ElementModes::READ );
- ImplFillElementList( aElements, xSubStore, aSubStorageName+aSep, true );
- }
- catch( com::sun::star::io::IOException& )
- {
- ; // Doesn't have to exist...
- }
-
- // 2) Dialogs
- aSubStorageName = rtl::OUString::createFromAscii( "Dialogs") ;
- try
- {
- uno::Reference < embed::XStorage > xSubStore = rxStore->openStorageElement( aSubStorageName, embed::ElementModes::READ );
- ImplFillElementList( aElements, xSubStore, aSubStorageName+aSep, true );
- }
- catch( com::sun::star::io::IOException& )
- {
- ; // Doesn't have to exist...
- }
- // 3) Scripts
- aSubStorageName = rtl::OUString::createFromAscii( "Scripts") ;
- try
- {
- uno::Reference < embed::XStorage > xSubStore = rxStore->openStorageElement( aSubStorageName, embed::ElementModes::READ );
- ImplFillElementList( aElements, xSubStore, aSubStorageName+aSep, true );
- }
- catch( com::sun::star::io::IOException& )
- {
- ; // Doesn't have to exist...
- }
- }
- break;
- case SignatureModePackage:
- {
- // Everything except META-INF
- ImplFillElementList( aElements, rxStore, ::rtl::OUString(), true );
- }
- break;
- }
-
- return aElements;
-}
-
-SignatureStreamHelper DocumentSignatureHelper::OpenSignatureStream( const uno::Reference < embed::XStorage >& rxStore, sal_Int32 nOpenMode, DocumentSignatureMode eDocSigMode )
-{
- sal_Int32 nSubStorageOpenMode = embed::ElementModes::READ;
- if ( nOpenMode & embed::ElementModes::WRITE )
- nSubStorageOpenMode = embed::ElementModes::WRITE;
-
- SignatureStreamHelper aHelper;
-
- try
- {
- ::rtl::OUString aSIGStoreName( RTL_CONSTASCII_USTRINGPARAM( "META-INF" ) );
- aHelper.xSignatureStorage = rxStore->openStorageElement( aSIGStoreName, nSubStorageOpenMode );
- if ( aHelper.xSignatureStorage.is() )
- {
- ::rtl::OUString aSIGStreamName;
- if ( eDocSigMode == SignatureModeDocumentContent )
- aSIGStreamName = DocumentSignatureHelper::GetDocumentContentSignatureDefaultStreamName();
- else if ( eDocSigMode == SignatureModeMacros )
- aSIGStreamName = DocumentSignatureHelper::GetScriptingContentSignatureDefaultStreamName();
- else
- aSIGStreamName = DocumentSignatureHelper::GetPackageSignatureDefaultStreamName();
-
- aHelper.xSignatureStream = aHelper.xSignatureStorage->openStreamElement( aSIGStreamName, nOpenMode );
- }
- }
- catch( com::sun::star::io::IOException& )
- {
- // Doesn't have to exist...
- DBG_ASSERT( nOpenMode == embed::ElementModes::READ, "Error creating signature stream..." );
- }
-
- return aHelper;
-}
-
-::rtl::OUString DocumentSignatureHelper::GetDocumentContentSignatureDefaultStreamName()
-{
- return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "documentsignatures.xml" ) );
-}
-
-::rtl::OUString DocumentSignatureHelper::GetScriptingContentSignatureDefaultStreamName()
-{
- return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "macrosignatures.xml" ) );
-}
-
-::rtl::OUString DocumentSignatureHelper::GetPackageSignatureDefaultStreamName()
-{
- return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "packagesignatures.xml" ) );
+ return retVal;
}
+
+::rtl::OUString DocumentSignatureHelper::GetDocumentContentSignatureDefaultStreamName()
+{
+ return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "documentsignatures.xml" ) );
+}
+
+::rtl::OUString DocumentSignatureHelper::GetScriptingContentSignatureDefaultStreamName()
+{
+ return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "macrosignatures.xml" ) );
+}
+
+::rtl::OUString DocumentSignatureHelper::GetPackageSignatureDefaultStreamName()
+{
+ return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "packagesignatures.xml" ) );
+}
diff --git a/xmlsecurity/source/helper/xmlsignaturehelper.cxx b/xmlsecurity/source/helper/xmlsignaturehelper.cxx
index 8ef7c21dd39b..a5890544be00 100644
--- a/xmlsecurity/source/helper/xmlsignaturehelper.cxx
+++ b/xmlsecurity/source/helper/xmlsignaturehelper.cxx
@@ -64,6 +64,7 @@
#define NS_DOCUMENTSIGNATURES_ODF_1_2 "urn:oasis:names:tc:opendocument:xmlns:digitalsignature:1.0"
using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
XMLSignatureHelper::XMLSignatureHelper( const uno::Reference< uno::XComponentContext >& rxCtx)
: mxCtx(rxCtx), mbODFPre1_2(false)
@@ -110,12 +111,14 @@ com::sun::star::uno::Reference< com::sun::star::xml::crypto::XUriBinding > XMLSi
return mxUriBinding;
}
-void XMLSignatureHelper::SetStorage( const com::sun::star::uno::Reference < com::sun::star::embed::XStorage >& rxStorage )
+void XMLSignatureHelper::SetStorage(
+ const Reference < css::embed::XStorage >& rxStorage,
+ ::rtl::OUString sODFVersion)
{
DBG_ASSERT( !mxUriBinding.is(), "SetStorage - UriBinding already set!" );
mxUriBinding = new UriBindingHelper( rxStorage );
DBG_ASSERT(rxStorage.is(), "SetStorage - empty storage!");
- mbODFPre1_2 = DocumentSignatureHelper::isODFPre_1_2(rxStorage);
+ mbODFPre1_2 = DocumentSignatureHelper::isODFPre_1_2(sODFVersion);
}
@@ -194,6 +197,7 @@ void XMLSignatureHelper::AddForSigning( sal_Int32 nSecurityId, const rtl::OUStri
mpXSecController->signAStream( nSecurityId, uri, objectURL, bBinary );
}
+
uno::Reference<xml::sax::XDocumentHandler> XMLSignatureHelper::CreateDocumentHandlerWithHeader(
const com::sun::star::uno::Reference< com::sun::star::io::XOutputStream >& xOutputStream )
{
diff --git a/xmlsecurity/source/helper/xmlsignaturehelper2.cxx b/xmlsecurity/source/helper/xmlsignaturehelper2.cxx
index 24738c0b6e98..9baa6d7061c4 100644
--- a/xmlsecurity/source/helper/xmlsignaturehelper2.cxx
+++ b/xmlsecurity/source/helper/xmlsignaturehelper2.cxx
@@ -204,42 +204,17 @@ uno::Reference < io::XInputStream > UriBindingHelper::OpenInputStream( const uno
{
// Cloning because of I can't keep all storage references open
// MBA with think about a better API...
- sal_Bool bEncrypted = sal_False;
-
const ::rtl::OUString sName = ::rtl::Uri::decode(
rURI, rtl_UriDecodeStrict, rtl_UriCharClassRelSegment);
if (sName.getLength() == 0 && rURI.getLength() != 0)
throw uno::Exception(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(
"Could not decode URI for stream element.")), 0);
- try
- {
- uno::Reference< io::XStream > xStream;
- xStream = rxStore->cloneStreamElement( sName );
- if ( !xStream.is() )
- throw uno::RuntimeException();
-
- try {
- uno::Reference< beans::XPropertySet > xProps( xStream, uno::UNO_QUERY_THROW );
- xProps->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "IsEncrypted" ) ) ) >>= bEncrypted;
- } catch( uno::Exception )
- {}
-
- if ( !bEncrypted )
- xInStream = xStream->getInputStream();
- }
- catch ( packages::WrongPasswordException& )
- {
- bEncrypted = sal_True;
- }
- if ( bEncrypted )
- {
- // this is an encrypted stream that should be handled accordingly
- uno::Reference< embed::XStorageRawAccess > xRawStore( rxStore, uno::UNO_QUERY );
- OSL_ENSURE( xRawStore.is(), "Strange storage implementation is used for signing!\n" );
- if ( xRawStore.is() )
- xInStream = xRawStore->getPlainRawStreamElement( sName );
- }
+ uno::Reference< io::XStream > xStream;
+ xStream = rxStore->cloneStreamElement( sName );
+ if ( !xStream.is() )
+ throw uno::RuntimeException();
+ xInStream = xStream->getInputStream();
}
else
{
diff --git a/xmlsecurity/source/xmlsec/mscrypt/x509certificate_mscryptimpl.cxx b/xmlsecurity/source/xmlsec/mscrypt/x509certificate_mscryptimpl.cxx
index 00049d2901fc..41dbd6232bce 100644
--- a/xmlsecurity/source/xmlsec/mscrypt/x509certificate_mscryptimpl.cxx
+++ b/xmlsecurity/source/xmlsec/mscrypt/x509certificate_mscryptimpl.cxx
@@ -43,6 +43,7 @@
#include <rtl/locale.h>
#include <osl/nlsupport.h>
#include <osl/process.h>
+#include <utility>
//CP : end
@@ -53,36 +54,130 @@ using ::rtl::OUString ;
using ::com::sun::star::security::XCertificate ;
using ::com::sun::star::util::DateTime ;
-/*
- * mmi : because MS Crypto use the 'S' tag (equal to the 'ST' tag in NSS), but the NSS can't recognise
- * it, so the 'S' tag should be changed to 'ST' tag
- *
- */
-OUString replaceTagSWithTagST(OUString oldDN)
+#define OUSTR(x) ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(x) )
+
+/*Resturns the index withing rRawString where sTypeName starts and where it ends.
+ The starting index is pair.first. The ending index in pair.second points
+ one char after the last character of the type.
+ sTypeName can be
+ "S" or "CN" (without ""). Do not use spaces at the beginning of the type name.
+ If the type name is not found then pair.first and pair.second are -1.
+*/
+std::pair< sal_Int32, sal_Int32 >
+findTypeInDN(const OUString& rRawString, const OUString& sTypeName)
{
-
- sal_Int32 nIndex = 0;
- OUString newDN;
- do
+ std::pair< sal_Int32, sal_Int32 > retVal;
+ bool bInEscape = false;
+ bool bInValue = false;
+ bool bFound = false;
+ sal_Int32 nTypeNameStart = 0;
+ sal_Int32 length = rRawString.getLength();
+
+ for (sal_Int32 i = 0; i < length; i++)
{
- OUString aToken = oldDN.getToken( 0, ',', nIndex ).trim();
- if (aToken.compareToAscii("S=",2) == 0)
+ sal_Unicode c = rRawString[i];
+
+ if (c == '=')
{
- newDN+=OUString::createFromAscii("ST=");
- newDN+=aToken.copy(2);
+ if (! bInValue)
+ {
+ OUString sType = rRawString.copy(nTypeNameStart, i - nTypeNameStart);
+ sType = sType.trim();
+ if (sType.equalsIgnoreAsciiCase(sTypeName))
+ {
+ bFound = true;
+ break;
+ }
+ }
}
- else
+ else if (c == '"')
{
- newDN+=aToken;
+ if (!bInEscape)
+ {
+ //If this is the quote is the first of the couple which enclose the
+ //whole value, because the value contains special characters
+ //then we just drop it. That is, this character must be followed by
+ //a character which is not '"'.
+ if ( i + 1 < length && rRawString[i+1] == '"')
+ bInEscape = true;
+ else
+ bInValue = !bInValue; //value is enclosed in " "
+ }
+ else
+ {
+ //This quote is escaped by a preceding quote and therefore is
+ //part of the value
+ bInEscape = false;
+ }
}
+ else if (c == ',')
+ {
+ //The comma separate the attribute value pairs.
+ //If the comma is not part of a value (the value would then be enclosed in '"'),
+ //then we have reached the end of the value
+ if (!bInValue)
+ {
+ //The next char is the start of the new type
+ nTypeNameStart = i + 1;
+ }
+ }
+ }
- if (nIndex >= 0)
+ //Found the Type Name, but there can still be spaces after the last comma
+ //and the beginning of the type.
+ if (bFound)
+ {
+ while (true)
+ {
+ sal_Unicode c = rRawString[nTypeNameStart];
+ if (c != ' ' && c != '\t')
+ //found
+ break;
+ nTypeNameStart ++;
+ }
+ // search end (one after last letter)
+ sal_Int32 nTypeNameEnd = nTypeNameStart;
+ nTypeNameEnd++;
+ while (true)
{
- newDN+=OUString::createFromAscii(",");
+ sal_Unicode c = rRawString[nTypeNameEnd];
+ if (c == ' ' || c == '\t' || c == '=')
+ break;
+ nTypeNameEnd++;
}
- } while ( nIndex >= 0 );
+ retVal = std::make_pair(nTypeNameStart, nTypeNameEnd);
+ }
+ else
+ {
+ retVal = std::make_pair(-1, -1);
+ }
+ return retVal;
+}
+
- return newDN;
+/*
+ MS Crypto uses the 'S' tag (equal to the 'ST' tag in NSS), but the NSS can't recognise
+ it, so the 'S' tag should be changed to 'ST' tag. However I am not sure if this is necessary
+ anymore, because we provide always the signers certificate when signing. So libmlsec can find
+ the private key based on the provided certificate (X509Certificate element) and does not need
+ the issuer name (X509IssuerName element). The issuer name in the xml signature has also no
+ effect for the signature nor the certificate validation.
+ In many RFCs, for example 4519, on speaks of 'ST'. However, the certificate does not contain
+ strings for type names. Instead it uses OIDs.
+ */
+
+OUString replaceTagSWithTagST(OUString oldDN)
+{
+ std::pair<sal_Int32, sal_Int32 > pairIndex = findTypeInDN(oldDN, OUSTR("S"));
+
+ if (pairIndex.first != -1)
+ {
+ OUString newDN = oldDN.copy(0, pairIndex.first);
+ newDN += OUSTR("ST");
+ newDN += oldDN.copy(pairIndex.second);
+ return newDN;
+ }
+ return oldDN;
}
/* end */
@@ -159,7 +254,7 @@ sal_Int16 SAL_CALL X509Certificate_MSCryptImpl :: getVersion() throw ( ::com::su
OUString xIssuer(issuer , cbIssuer ,encoding ) ; //By CP
delete issuer ;
- return replaceTagSWithTagST(xIssuer) ;
+ return replaceTagSWithTagST(xIssuer);
} else {
return OUString() ;
}
@@ -208,7 +303,7 @@ sal_Int16 SAL_CALL X509Certificate_MSCryptImpl :: getVersion() throw ( ::com::su
OUString xSubject(subject , cbSubject ,encoding ) ; //By CP
delete subject ;
- return replaceTagSWithTagST(xSubject) ;
+ return replaceTagSWithTagST(xSubject);
} else {
return OUString() ;
}