Conflicts: avmedia/inc/avmedia/mediaitem.hxx avmedia/prj/build.lst avmedia/source/framework/mediaitem.cxx avmedia/source/gstreamer/gstcommon.hxx avmedia/source/gstreamer/gstframegrabber.cxx avmedia/source/gstreamer/gstframegrabber.hxx avmedia/source/gstreamer/gstmanager.cxx avmedia/source/gstreamer/gstmanager.hxx avmedia/source/gstreamer/gstplayer.cxx avmedia/source/gstreamer/gstplayer.hxx avmedia/source/gstreamer/gstuno.cxx avmedia/source/gstreamer/gstwindow.cxx avmedia/source/gstreamer/gstwindow.hxx avmedia/source/gstreamer/makefile.mk avmedia/source/quicktime/quicktimeuno.cxx avmedia/source/viewer/mediawindow.cxx avmedia/source/viewer/mediawindow_impl.cxx avmedia/source/viewer/mediawindow_impl.hxx avmedia/source/viewer/mediawindowbase_impl.cxx avmedia/source/win/winuno.cxx basic/inc/basic/basmgr.hxx basic/inc/basic/mybasic.hxx basic/inc/basic/process.hxx basic/inc/basic/sbmeth.hxx basic/inc/basic/sbmod.hxx basic/inc/basic/sbxdef.hxx basic/inc/basic/sbxvar.hxx basic/source/app/app.cxx basic/source/app/app.hxx basic/source/app/appbased.cxx basic/source/app/appedit.cxx basic/source/app/appwin.cxx basic/source/app/appwin.hxx basic/source/app/brkpnts.cxx basic/source/app/brkpnts.hxx basic/source/app/dialogs.cxx basic/source/app/dialogs.hxx basic/source/app/msgedit.cxx basic/source/app/mybasic.cxx basic/source/app/process.cxx basic/source/app/processw.hxx basic/source/app/textedit.cxx basic/source/basmgr/basicmanagerrepository.cxx basic/source/basmgr/basmgr.cxx basic/source/classes/disas.cxx basic/source/classes/eventatt.cxx basic/source/classes/image.cxx basic/source/classes/sb.cxx basic/source/classes/sbunoobj.cxx basic/source/classes/sbxmod.cxx basic/source/comp/codegen.cxx basic/source/comp/dim.cxx basic/source/comp/exprgen.cxx basic/source/comp/exprnode.cxx basic/source/comp/exprtree.cxx basic/source/comp/sbcomp.cxx basic/source/inc/expr.hxx basic/source/inc/object.hxx basic/source/inc/sbunoobj.hxx basic/source/runtime/dllmgr-x86.cxx basic/source/runtime/iosys.cxx basic/source/runtime/makefile.mk basic/source/runtime/methods.cxx basic/source/runtime/methods1.cxx basic/source/runtime/runtime.cxx basic/source/runtime/stdobj.cxx basic/source/runtime/step0.cxx basic/source/runtime/step1.cxx basic/source/runtime/step2.cxx basic/source/sbx/sbxarray.cxx basic/source/sbx/sbxbase.cxx basic/source/sbx/sbxbool.cxx basic/source/sbx/sbxbyte.cxx basic/source/sbx/sbxcoll.cxx basic/source/sbx/sbxconv.hxx basic/source/sbx/sbxcurr.cxx basic/source/sbx/sbxexec.cxx basic/source/sbx/sbxint.cxx basic/source/sbx/sbxobj.cxx basic/source/sbx/sbxscan.cxx basic/source/sbx/sbxstr.cxx basic/source/sbx/sbxvals.cxx basic/source/sbx/sbxvalue.cxx basic/source/sbx/sbxvar.cxx basic/workben/mgrtest.cxx configmgr/prj/build.lst configmgr/source/access.cxx configmgr/source/configurationprovider.cxx configmgr/source/defaultprovider.cxx configmgr/source/pad.cxx configmgr/source/services.cxx configmgr/source/update.cxx configmgr/source/xmlreader.cxx configmgr/source/xmlreader.hxx connectivity/prj/build.lst connectivity/qa/complex/connectivity/TestCase.java connectivity/source/cpool/Zregistration.cxx connectivity/source/drivers/adabas/Bservices.cxx connectivity/source/drivers/ado/Aservices.cxx connectivity/source/drivers/calc/Cservices.cxx connectivity/source/drivers/calc/makefile.mk connectivity/source/drivers/dbase/DIndex.cxx connectivity/source/drivers/dbase/DIndexIter.cxx connectivity/source/drivers/dbase/DNoException.cxx connectivity/source/drivers/dbase/DTable.cxx connectivity/source/drivers/dbase/Dservices.cxx connectivity/source/drivers/dbase/dindexnode.cxx connectivity/source/drivers/evoab/LNoException.cxx connectivity/source/drivers/evoab/LServices.cxx connectivity/source/drivers/evoab2/NServices.cxx connectivity/source/drivers/file/FNoException.cxx connectivity/source/drivers/file/FPreparedStatement.cxx connectivity/source/drivers/file/FResultSet.cxx connectivity/source/drivers/file/FStatement.cxx connectivity/source/drivers/file/quotedstring.cxx connectivity/source/drivers/flat/ETable.cxx connectivity/source/drivers/flat/Eservices.cxx connectivity/source/drivers/hsqldb/Hservices.cxx connectivity/source/drivers/jdbc/jservices.cxx connectivity/source/drivers/kab/KServices.cxx connectivity/source/drivers/macab/MacabServices.cxx connectivity/source/drivers/mozab/MResultSet.cxx connectivity/source/drivers/mozab/bootstrap/MNSFolders.cxx connectivity/source/drivers/mozab/bootstrap/MNSProfileDiscover.cxx connectivity/source/drivers/mysql/Yservices.cxx connectivity/source/drivers/odbc/OFunctions.cxx connectivity/source/drivers/odbc/oservices.cxx connectivity/source/inc/dbase/DIndexPage.hxx connectivity/source/inc/file/FTable.hxx connectivity/source/manager/mregistration.cxx connectivity/source/parse/PColumn.cxx desktop/prj/build.lst desktop/qa/deployment_misc/test_dp_version.cxx desktop/source/app/app.cxx desktop/source/app/appfirststart.cxx desktop/source/app/cmdlineargs.cxx desktop/source/app/cmdlineargs.hxx desktop/source/app/sofficemain.cxx desktop/source/deployment/gui/dp_gui.hrc desktop/source/deployment/gui/dp_gui_dialog2.cxx desktop/source/deployment/gui/dp_gui_dialog2.hxx desktop/source/deployment/gui/dp_gui_updatedialog.cxx desktop/source/deployment/gui/dp_gui_updatedialog.hxx desktop/source/deployment/manager/dp_extensionmanager.cxx desktop/source/deployment/manager/dp_extensionmanager.hxx desktop/source/deployment/misc/dp_misc.src desktop/source/deployment/registry/component/dp_component.cxx desktop/source/deployment/registry/configuration/dp_configuration.cxx desktop/source/deployment/registry/dp_backend.cxx desktop/source/deployment/registry/help/dp_help.cxx desktop/source/deployment/registry/script/dp_script.cxx desktop/source/migration/pages.cxx desktop/source/migration/pages.hxx desktop/source/migration/wizard.cxx desktop/source/migration/wizard.hrc desktop/source/migration/wizard.hxx desktop/source/migration/wizard.src desktop/source/pkgchk/unopkg/unopkg_shared.h desktop/source/so_comp/services.cxx desktop/source/splash/makefile.mk desktop/source/splash/services_spl.cxx desktop/source/splash/splash.cxx drawinglayer/source/processor2d/vclmetafileprocessor2d.cxx editeng/inc/editeng/adjitem.hxx editeng/inc/editeng/bolnitem.hxx editeng/inc/editeng/borderline.hxx editeng/inc/editeng/boxitem.hxx editeng/inc/editeng/brkitem.hxx editeng/inc/editeng/brshitem.hxx editeng/inc/editeng/bulitem.hxx editeng/inc/editeng/charreliefitem.hxx editeng/inc/editeng/charrotateitem.hxx editeng/inc/editeng/charscaleitem.hxx editeng/inc/editeng/cmapitem.hxx editeng/inc/editeng/colritem.hxx editeng/inc/editeng/crsditem.hxx editeng/inc/editeng/editdata.hxx editeng/inc/editeng/editeng.hxx editeng/inc/editeng/editobj.hxx editeng/inc/editeng/editstat.hxx editeng/inc/editeng/editview.hxx editeng/inc/editeng/emphitem.hxx editeng/inc/editeng/escpitem.hxx editeng/inc/editeng/fhgtitem.hxx editeng/inc/editeng/flstitem.hxx editeng/inc/editeng/fontitem.hxx editeng/inc/editeng/frmdiritem.hxx editeng/inc/editeng/fwdtitem.hxx editeng/inc/editeng/hyznitem.hxx editeng/inc/editeng/kernitem.hxx editeng/inc/editeng/langitem.hxx editeng/inc/editeng/lrspitem.hxx editeng/inc/editeng/lspcitem.hxx editeng/inc/editeng/numitem.hxx editeng/inc/editeng/outliner.hxx editeng/inc/editeng/paravertalignitem.hxx editeng/inc/editeng/pmdlitem.hxx editeng/inc/editeng/postitem.hxx editeng/inc/editeng/protitem.hxx editeng/inc/editeng/shaditem.hxx editeng/inc/editeng/sizeitem.hxx editeng/inc/editeng/svxacorr.hxx editeng/inc/editeng/svxfont.hxx editeng/inc/editeng/svxrtf.hxx editeng/inc/editeng/swafopt.hxx editeng/inc/editeng/tstpitem.hxx editeng/inc/editeng/twolinesitem.hxx editeng/inc/editeng/txtrange.hxx editeng/inc/editeng/udlnitem.hxx editeng/inc/editeng/ulspitem.hxx editeng/inc/editeng/wghtitem.hxx editeng/inc/editeng/writingmodeitem.hxx editeng/inc/editeng/xmlcnitm.hxx editeng/inc/helpid.hrc editeng/inc/pch/precompiled_editeng.hxx editeng/source/editeng/editdbg.cxx editeng/source/editeng/editdoc.cxx editeng/source/editeng/editdoc.hxx editeng/source/editeng/editdoc2.cxx editeng/source/editeng/editeng.cxx editeng/source/editeng/editobj.cxx editeng/source/editeng/editobj2.hxx editeng/source/editeng/editsel.cxx editeng/source/editeng/editundo.cxx editeng/source/editeng/editundo.hxx editeng/source/editeng/editview.cxx editeng/source/editeng/edtspell.hxx editeng/source/editeng/eehtml.cxx editeng/source/editeng/eehtml.hxx editeng/source/editeng/eeobj.cxx editeng/source/editeng/eerdll.cxx editeng/source/editeng/eertfpar.cxx editeng/source/editeng/impedit.cxx editeng/source/editeng/impedit.hxx editeng/source/editeng/impedit2.cxx editeng/source/editeng/impedit3.cxx editeng/source/editeng/impedit4.cxx editeng/source/editeng/impedit5.cxx editeng/source/editeng/makefile.mk editeng/source/items/bulitem.cxx editeng/source/items/charhiddenitem.cxx editeng/source/items/flditem.cxx editeng/source/items/frmitems.cxx editeng/source/items/makefile.mk editeng/source/items/numitem.cxx editeng/source/items/paraitem.cxx editeng/source/items/svxfont.cxx editeng/source/items/textitem.cxx editeng/source/items/writingmodeitem.cxx editeng/source/items/xmlcnitm.cxx editeng/source/misc/SvXMLAutoCorrectImport.cxx editeng/source/misc/svxacorr.cxx editeng/source/misc/txtrange.cxx editeng/source/misc/unolingu.cxx editeng/source/outliner/outleeng.cxx editeng/source/outliner/outliner.cxx editeng/source/outliner/outlundo.hxx editeng/source/outliner/outlvw.cxx editeng/source/outliner/paralist.cxx editeng/source/outliner/paralist.hxx editeng/source/rtf/rtfgrf.cxx editeng/source/rtf/rtfitem.cxx editeng/source/rtf/svxrtf.cxx editeng/source/uno/unoipset.cxx editeng/util/makefile.mk embeddedobj/prj/build.lst embeddedobj/source/commonembedding/miscobj.cxx eventattacher/prj/build.lst fileaccess/source/FileAccess.cxx formula/inc/formula/FormulaCompiler.hxx formula/inc/formula/token.hxx formula/inc/formula/tokenarray.hxx formula/source/core/api/FormulaCompiler.cxx formula/source/core/api/token.cxx formula/source/ui/dlg/FormulaHelper.cxx formula/source/ui/dlg/formula.cxx formula/source/ui/dlg/parawin.cxx formula/source/ui/dlg/structpg.cxx fpicker/prj/d.lst fpicker/source/aqua/FPentry.cxx fpicker/source/office/OfficeControlAccess.cxx fpicker/source/office/iodlg.cxx fpicker/source/office/iodlg.hxx fpicker/source/office/iodlg.src fpicker/source/office/iodlgimp.cxx fpicker/source/unx/gnome/FPentry.cxx fpicker/source/unx/gnome/SalGtkFilePicker.cxx fpicker/source/unx/gnome/SalGtkPicker.cxx fpicker/source/unx/kde4/KDE4FPEntry.cxx fpicker/source/win32/filepicker/FPentry.cxx framework/AllLangResTarget_fwe.mk framework/inc/dispatch/interaction.hxx framework/inc/framework/addonmenu.hxx framework/inc/framework/addonsoptions.hxx framework/inc/framework/bmkmenu.hxx framework/inc/framework/imageproducer.hxx framework/inc/framework/sfxhelperfunctions.hxx framework/inc/framework/statusbarconfiguration.hxx framework/inc/framework/titlehelper.hxx framework/inc/framework/toolboxconfiguration.hxx framework/inc/threadhelp/lockhelper.hxx framework/inc/xml/eventsdocumenthandler.hxx framework/inc/xml/statusbardocumenthandler.hxx framework/inc/xml/toolboxconfiguration.hxx framework/inc/xml/toolboxconfigurationdefines.hxx framework/inc/xml/toolboxdocumenthandler.hxx framework/prj/build.lst framework/qa/complex/ModuleManager/makefile.mk framework/qa/complex/accelerators/makefile.mk framework/qa/complex/framework/recovery/makefile.mk framework/qa/complex/imageManager/_XInitialization.java framework/source/classes/menumanager.cxx framework/source/dispatch/interaction.cxx framework/source/fwe/classes/bmkmenu.cxx framework/source/fwe/helper/actiontriggerhelper.cxx framework/source/fwe/helper/imageproducer.cxx framework/source/fwe/xml/menuconfiguration.cxx framework/source/fwe/xml/toolboxdocumenthandler.cxx framework/source/helper/uiconfigelementwrapperbase.cxx framework/source/helper/uielementwrapperbase.cxx framework/source/inc/pattern/window.hxx framework/source/jobs/jobdata.cxx framework/source/layoutmanager/layoutmanager.cxx framework/source/layoutmanager/panel.hxx framework/source/loadenv/loadenv.cxx framework/source/register/registerservices.cxx framework/source/services/menudocumenthandler.cxx framework/source/uiconfiguration/moduleuiconfigurationmanager.cxx framework/source/uiconfiguration/uiconfigurationmanager.cxx framework/source/uiconfiguration/uiconfigurationmanagerimpl.cxx framework/source/uielement/addonstoolbarmanager.cxx framework/source/uielement/controlmenucontroller.cxx framework/source/uielement/fontsizemenucontroller.cxx framework/source/uielement/imagebuttontoolbarcontroller.cxx framework/source/uielement/macrosmenucontroller.cxx framework/source/uielement/menubarmanager.cxx framework/source/uielement/newmenucontroller.cxx framework/source/uielement/togglebuttontoolbarcontroller.cxx framework/source/uielement/toolbarmanager.cxx framework/source/uielement/toolbarsmenucontroller.cxx framework/test/makefile.mk framework/test/threadtest/makefile.mk framework/test/typecfg/makefile.mk framework/util/guiapps/makefile.mk framework/util/makefile.mk idl/inc/bastype.hxx idl/inc/hash.hxx idl/inc/lex.hxx idl/inc/module.hxx idl/inc/object.hxx idl/inc/slot.hxx idl/inc/types.hxx idl/source/cmptools/hash.cxx idl/source/cmptools/lex.cxx idl/source/objects/basobj.cxx idl/source/objects/bastype.cxx idl/source/objects/module.cxx idl/source/objects/object.cxx idl/source/objects/slot.cxx idl/source/objects/types.cxx idl/source/prj/command.cxx idl/source/prj/database.cxx idl/source/prj/globals.cxx idl/source/prj/svidl.cxx linguistic/inc/linguistic/misc.hxx linguistic/prj/build.lst linguistic/source/convdic.cxx linguistic/source/convdiclist.cxx linguistic/source/dicimp.cxx linguistic/source/dlistimp.cxx linguistic/source/gciterator.cxx linguistic/source/iprcache.cxx linguistic/source/lngopt.cxx linguistic/source/lngprophelp.cxx linguistic/source/lngsvcmgr.cxx linguistic/source/lngsvcmgr.hxx linguistic/source/misc2.cxx linguistic/workben/sprophelp.cxx officecfg/registry/data/org/openoffice/VCL.xcu officecfg/util/makefile.mk oovbaapi/ooo/vba/XApplicationBase.idl oovbaapi/ooo/vba/XVBAAppService.idl oovbaapi/ooo/vba/XVBADocService.idl oovbaapi/ooo/vba/excel/XApplication.idl oovbaapi/ooo/vba/excel/XRange.idl oovbaapi/ooo/vba/excel/XWorkbook.idl oovbaapi/ooo/vba/excel/XWorksheet.idl oovbaapi/ooo/vba/word/XApplication.idl oovbaapi/ooo/vba/word/XGlobals.idl oovbaapi/ooo/vba/word/XTableOfContents.idl readlicense_oo/prj/build.lst scripting/prj/build.lst scripting/prj/d.lst scripting/source/basprov/basprov.cxx scripting/source/basprov/basscript.cxx scripting/source/basprov/basscript.hxx scripting/source/dlgprov/dlgprov.cxx scripting/source/inc/util/util.hxx scripting/source/protocolhandler/scripthandler.cxx scripting/source/provider/ProviderCache.cxx scripting/source/pyprov/makefile.mk scripting/source/runtimemgr/ScriptNameResolverImpl.cxx scripting/source/runtimemgr/ScriptRuntimeManager.cxx scripting/source/runtimemgr/StorageBridge.cxx scripting/source/storage/ScriptMetadataImporter.cxx scripting/source/storage/ScriptSecurityManager.cxx scripting/source/storage/ScriptStorage.cxx scripting/source/storage/ScriptStorageManager.cxx sfx2/inc/about.hxx sfx2/inc/brokenpackageint.hxx sfx2/inc/docvor.hxx sfx2/inc/pch/precompiled_sfx2.hxx sfx2/inc/sfx2/app.hxx sfx2/inc/sfx2/basmgr.hxx sfx2/inc/sfx2/bindings.hxx sfx2/inc/sfx2/childwin.hxx sfx2/inc/sfx2/ctrlitem.hxx sfx2/inc/sfx2/dinfdlg.hxx sfx2/inc/sfx2/dispatch.hxx sfx2/inc/sfx2/docfilt.hxx sfx2/inc/sfx2/evntconf.hxx sfx2/inc/sfx2/fcontnr.hxx sfx2/inc/sfx2/frame.hxx sfx2/inc/sfx2/imagemgr.hxx sfx2/inc/sfx2/imgmgr.hxx sfx2/inc/sfx2/linksrc.hxx sfx2/inc/sfx2/macrconf.hxx sfx2/inc/sfx2/macropg.hxx sfx2/inc/sfx2/mnuitem.hxx sfx2/inc/sfx2/mnumgr.hxx sfx2/inc/sfx2/module.hxx sfx2/inc/sfx2/msg.hxx sfx2/inc/sfx2/objsh.hxx sfx2/inc/sfx2/passwd.hxx sfx2/inc/sfx2/prnmon.hxx sfx2/inc/sfx2/request.hxx sfx2/inc/sfx2/sfx.hrc sfx2/inc/sfx2/sfxbasemodel.hxx sfx2/inc/sfx2/sfxhtml.hxx sfx2/inc/sfx2/sfxresid.hxx sfx2/inc/sfx2/sfxsids.hrc sfx2/inc/sfx2/sfxuno.hxx sfx2/inc/sfx2/shell.hxx sfx2/inc/sfx2/stbitem.hxx sfx2/inc/sfx2/styfitem.hxx sfx2/inc/sfx2/tabdlg.hxx sfx2/inc/sfx2/tbxctrl.hxx sfx2/inc/sfx2/tplpitem.hxx sfx2/inc/sfx2/viewfrm.hxx sfx2/inc/sfx2/viewsh.hxx sfx2/inc/sfxbasic.hxx sfx2/inc/sorgitm.hxx sfx2/prj/build.lst sfx2/qa/complex/docinfo/makefile.mk sfx2/qa/cppunit/makefile.mk sfx2/sdi/makefile.mk sfx2/source/appl/app.cxx sfx2/source/appl/app.hrc sfx2/source/appl/app.src sfx2/source/appl/appbas.cxx sfx2/source/appl/appcfg.cxx sfx2/source/appl/appchild.cxx sfx2/source/appl/appmain.cxx sfx2/source/appl/appmisc.cxx sfx2/source/appl/appopen.cxx sfx2/source/appl/appquit.cxx sfx2/source/appl/appserv.cxx sfx2/source/appl/appuno.cxx sfx2/source/appl/childwin.cxx sfx2/source/appl/fileobj.cxx sfx2/source/appl/helpinterceptor.cxx sfx2/source/appl/imagemgr.cxx sfx2/source/appl/impldde.cxx sfx2/source/appl/impldde.hxx sfx2/source/appl/linkmgr2.cxx sfx2/source/appl/lnkbase2.cxx sfx2/source/appl/makefile.mk sfx2/source/appl/module.cxx sfx2/source/appl/newhelp.cxx sfx2/source/appl/opengrf.cxx sfx2/source/appl/sfxdll.cxx sfx2/source/appl/sfxhelp.cxx sfx2/source/appl/shutdownicon.cxx sfx2/source/appl/shutdowniconunx.cxx sfx2/source/appl/workwin.cxx sfx2/source/bastyp/fltfnc.cxx sfx2/source/bastyp/frmhtml.cxx sfx2/source/bastyp/frmhtmlw.cxx sfx2/source/bastyp/helper.cxx sfx2/source/bastyp/minarray.cxx sfx2/source/bastyp/progress.cxx sfx2/source/bastyp/sfxhtml.cxx sfx2/source/config/evntconf.cxx sfx2/source/control/bindings.cxx sfx2/source/control/ctrlitem.cxx sfx2/source/control/dispatch.cxx sfx2/source/control/macrconf.cxx sfx2/source/control/macro.cxx sfx2/source/control/makefile.mk sfx2/source/control/minfitem.cxx sfx2/source/control/msg.cxx sfx2/source/control/msgpool.cxx sfx2/source/control/objface.cxx sfx2/source/control/request.cxx sfx2/source/control/shell.cxx sfx2/source/control/sorgitm.cxx sfx2/source/dialog/about.cxx sfx2/source/dialog/basedlgs.cxx sfx2/source/dialog/dinfdlg.cxx sfx2/source/dialog/dinfedt.cxx sfx2/source/dialog/dockwin.cxx sfx2/source/dialog/filedlghelper.cxx sfx2/source/dialog/mailmodel.cxx sfx2/source/dialog/mailmodelapi.cxx sfx2/source/dialog/makefile.mk sfx2/source/dialog/mgetempl.cxx sfx2/source/dialog/passwd.cxx sfx2/source/dialog/passwd.hrc sfx2/source/dialog/printopt.cxx sfx2/source/dialog/securitypage.cxx sfx2/source/dialog/splitwin.cxx sfx2/source/dialog/styfitem.cxx sfx2/source/dialog/tabdlg.cxx sfx2/source/dialog/taskpane.cxx sfx2/source/dialog/templdlg.cxx sfx2/source/dialog/tplpitem.cxx sfx2/source/dialog/versdlg.cxx sfx2/source/doc/QuerySaveDocument.cxx sfx2/source/doc/SfxDocumentMetaData.cxx sfx2/source/doc/applet.cxx sfx2/source/doc/doc.hrc sfx2/source/doc/doc.src sfx2/source/doc/docfile.cxx sfx2/source/doc/docinf.cxx sfx2/source/doc/doctempl.cxx sfx2/source/doc/doctemplates.cxx sfx2/source/doc/docvor.cxx sfx2/source/doc/guisaveas.cxx sfx2/source/doc/makefile.mk sfx2/source/doc/objcont.cxx sfx2/source/doc/objitem.cxx sfx2/source/doc/objmisc.cxx sfx2/source/doc/objserv.cxx sfx2/source/doc/printhelper.cxx sfx2/source/doc/sfxacldetect.cxx sfx2/source/doc/sfxbasemodel.cxx sfx2/source/inc/applet.hxx sfx2/source/inc/fltoptint.hxx sfx2/source/inc/sfxlocal.hrc sfx2/source/inc/virtmenu.hxx sfx2/source/inc/workwin.hxx sfx2/source/menu/mnuitem.cxx sfx2/source/menu/objmnctl.cxx sfx2/source/menu/virtmenu.cxx sfx2/source/notify/eventsupplier.cxx sfx2/source/notify/makefile.mk sfx2/source/toolbox/imgmgr.cxx sfx2/source/toolbox/tbxitem.cxx sfx2/source/view/frame.cxx sfx2/source/view/orgmgr.cxx sfx2/source/view/printer.cxx sfx2/source/view/prnmon.cxx sfx2/source/view/viewfrm.cxx sfx2/source/view/viewprn.cxx sfx2/source/view/viewsh.cxx sfx2/util/makefile.mk sfx2/workben/custompanel/makefile.mk shell/source/backends/desktopbe/desktopbackend.cxx shell/source/backends/gconfbe/gconfbackend.cxx shell/source/backends/kde4be/kde4backend.cxx shell/source/backends/kdebe/kdebackend.cxx shell/source/win32/SysShentry.cxx shell/source/win32/shlxthandler/propsheets/propsheets.cxx shell/source/win32/simplemail/smplmailentry.cxx svx/inc/float3d.hrc svx/inc/fmhelp.hrc svx/inc/globlmn_tmpl.hrc svx/inc/helpid.hrc svx/inc/pch/precompiled_svx.hxx svx/inc/sjctrl.hxx svx/inc/srchitem.hxx svx/inc/svdibrow.hxx svx/inc/svx/SmartTagItem.hxx svx/inc/svx/algitem.hxx svx/inc/svx/camera3d.hxx svx/inc/svx/chrtitem.hxx svx/inc/svx/clipfmtitem.hxx svx/inc/svx/ctredlin.hxx svx/inc/svx/dbtoolsclient.hxx svx/inc/svx/deflt3d.hxx svx/inc/svx/dialogs.hrc svx/inc/svx/drawitem.hxx svx/inc/svx/e3ditem.hxx svx/inc/svx/extrud3d.hxx svx/inc/svx/flagsdef.hxx svx/inc/svx/float3d.hxx svx/inc/svx/frmsel.hxx svx/inc/svx/gallery.hxx svx/inc/svx/gallery1.hxx svx/inc/svx/galtheme.hxx svx/inc/svx/grfcrop.hxx svx/inc/svx/hdft.hxx svx/inc/svx/hlnkitem.hxx svx/inc/svx/hyprlink.hxx svx/inc/svx/itemwin.hxx svx/inc/svx/lathe3d.hxx svx/inc/svx/linkwarn.hxx svx/inc/svx/modctrl.hxx svx/inc/svx/msdffdef.hxx svx/inc/svx/obj3d.hxx svx/inc/svx/optgenrl.hxx svx/inc/svx/optgrid.hxx svx/inc/svx/pageitem.hxx svx/inc/svx/paraprev.hxx svx/inc/svx/postattr.hxx svx/inc/svx/rotmodit.hxx svx/inc/svx/ruler.hxx svx/inc/svx/rulritem.hxx svx/inc/svx/scene3d.hxx svx/inc/svx/sdasaitm.hxx svx/inc/svx/sdasitm.hxx svx/inc/svx/sdggaitm.hxx svx/inc/svx/sdmetitm.hxx svx/inc/svx/sdtaaitm.hxx svx/inc/svx/sdtaditm.hxx svx/inc/svx/sdtaitm.hxx svx/inc/svx/sdtakitm.hxx svx/inc/svx/sdtfchim.hxx svx/inc/svx/sdtfsitm.hxx svx/inc/svx/srchdlg.hxx svx/inc/svx/svddrag.hxx svx/inc/svx/svdetc.hxx svx/inc/svx/svdglue.hxx svx/inc/svx/svdhlpln.hxx svx/inc/svx/svdlayer.hxx svx/inc/svx/svdmark.hxx svx/inc/svx/svdmodel.hxx svx/inc/svx/svdoashp.hxx svx/inc/svx/svdobj.hxx svx/inc/svx/svdocirc.hxx svx/inc/svx/svdoedge.hxx svx/inc/svx/svdogrp.hxx svx/inc/svx/svdomeas.hxx svx/inc/svx/svdoole2.hxx svx/inc/svx/svdorect.hxx svx/inc/svx/svdotable.hxx svx/inc/svx/svdotext.hxx svx/inc/svx/svdovirt.hxx svx/inc/svx/svdpage.hxx svx/inc/svx/svdsnpv.hxx svx/inc/svx/svdtrans.hxx svx/inc/svx/svdundo.hxx svx/inc/svx/svimbase.hxx svx/inc/svx/svx3ditems.hxx svx/inc/svx/svxdlg.hxx svx/inc/svx/sxcikitm.hxx svx/inc/svx/sxekitm.hxx svx/inc/svx/sxelditm.hxx svx/inc/svx/sxenditm.hxx svx/inc/svx/sxmkitm.hxx svx/inc/svx/sxmtpitm.hxx svx/inc/svx/sxmuitm.hxx svx/inc/svx/tabarea.hxx svx/inc/svx/tabline.hxx svx/inc/svx/unoprov.hxx svx/inc/svx/viewlayoutitem.hxx svx/inc/svx/xbitmap.hxx svx/inc/svx/xbtmpit.hxx svx/inc/svx/xcolit.hxx svx/inc/svx/xfillit0.hxx svx/inc/svx/xflclit.hxx svx/inc/svx/xflftrit.hxx svx/inc/svx/xflgrit.hxx svx/inc/svx/xflhtit.hxx svx/inc/svx/xftadit.hxx svx/inc/svx/xftsfit.hxx svx/inc/svx/xftshit.hxx svx/inc/svx/xlineit0.hxx svx/inc/svx/xlinjoit.hxx svx/inc/svx/xlnclit.hxx svx/inc/svx/xlndsit.hxx svx/inc/svx/xlnedcit.hxx svx/inc/svx/xlnedit.hxx svx/inc/svx/xlnedwit.hxx svx/inc/svx/xlnstcit.hxx svx/inc/svx/xlnstit.hxx svx/inc/svx/xlnstwit.hxx svx/inc/svx/xlnwtit.hxx svx/inc/svx/xtextit0.hxx svx/inc/svx/zoomitem.hxx svx/inc/svx/zoomslideritem.hxx svx/inc/xpolyimp.hxx svx/inc/zoom_def.hxx svx/prj/d.lst svx/source/accessibility/AccessibleShape.cxx svx/source/accessibility/DescriptionGenerator.cxx svx/source/customshapes/EnhancedCustomShapeEngine.cxx svx/source/customshapes/EnhancedCustomShapeFontWork.cxx svx/source/dialog/_bmpmask.cxx svx/source/dialog/_contdlg.cxx svx/source/dialog/connctrl.cxx svx/source/dialog/contwnd.cxx svx/source/dialog/ctredlin.cxx svx/source/dialog/ctredlin.hrc svx/source/dialog/ctredlin.src svx/source/dialog/dialcontrol.cxx svx/source/dialog/dlgctrl.cxx svx/source/dialog/docrecovery.cxx svx/source/dialog/fntctrl.cxx svx/source/dialog/fontwork.cxx svx/source/dialog/frmsel.cxx svx/source/dialog/graphctl.cxx svx/source/dialog/grfflt.cxx svx/source/dialog/hdft.cxx svx/source/dialog/hyperdlg.cxx svx/source/dialog/hyprdlg.hxx svx/source/dialog/hyprlink.cxx svx/source/dialog/hyprlink.hxx svx/source/dialog/hyprlink.src svx/source/dialog/imapdlg.cxx svx/source/dialog/imapwnd.cxx svx/source/dialog/linkwarn.hrc svx/source/dialog/makefile.mk svx/source/dialog/optgrid.cxx svx/source/dialog/orienthelper.cxx svx/source/dialog/pagectrl.cxx svx/source/dialog/prtqry.cxx svx/source/dialog/rlrcitem.cxx svx/source/dialog/rubydialog.cxx svx/source/dialog/rulritem.cxx svx/source/dialog/simptabl.cxx svx/source/dialog/srchdlg.cxx svx/source/dialog/svxbmpnumvalueset.cxx svx/source/dialog/svxruler.cxx svx/source/dialog/swframeexample.cxx svx/source/engine3d/float3d.cxx svx/source/engine3d/float3d.src svx/source/engine3d/svx3ditems.cxx svx/source/fmcomp/gridctrl.cxx svx/source/fmcomp/trace.cxx svx/source/form/ParseContext.cxx svx/source/form/datanavi.cxx svx/source/form/filtnav.cxx svx/source/form/fmexch.cxx svx/source/form/fmexpl.cxx svx/source/form/fmobjfac.cxx svx/source/form/fmpage.cxx svx/source/form/fmshell.cxx svx/source/form/fmshimp.cxx svx/source/form/fmsrcimp.cxx svx/source/form/fmvwimp.cxx svx/source/form/makefile.mk svx/source/form/tabwin.cxx svx/source/form/tbxform.cxx svx/source/form/typemap.cxx svx/source/gallery2/galbrws1.cxx svx/source/gallery2/galbrws2.cxx svx/source/gallery2/galexpl.cxx svx/source/gallery2/gallery1.cxx svx/source/gallery2/galtheme.cxx svx/source/gallery2/makefile.mk svx/source/gengal/gengal.cxx svx/source/gengal/makefile.mk svx/source/inc/fmgroup.hxx svx/source/intro/about_ooo.hrc svx/source/intro/iso.src svx/source/intro/ooo.src svx/source/items/SmartTagItem.cxx svx/source/items/algitem.cxx svx/source/items/chrtitem.cxx svx/source/items/clipfmtitem.cxx svx/source/items/customshapeitem.cxx svx/source/items/drawitem.cxx svx/source/items/e3ditem.cxx svx/source/items/grfitem.cxx svx/source/items/hlnkitem.cxx svx/source/items/makefile.mk svx/source/items/pageitem.cxx svx/source/items/rotmodit.cxx svx/source/items/viewlayoutitem.cxx svx/source/items/zoomitem.cxx svx/source/items/zoomslideritem.cxx svx/source/src/app.hrc svx/source/stbctrls/makefile.mk svx/source/stbctrls/modctrl.cxx svx/source/stbctrls/xmlsecctrl.cxx svx/source/stbctrls/zoomctrl.cxx svx/source/svdraw/clonelist.cxx svx/source/svdraw/svdattr.cxx svx/source/svdraw/svdcrtv.cxx svx/source/svdraw/svdedtv1.cxx svx/source/svdraw/svdedtv2.cxx svx/source/svdraw/svdedxv.cxx svx/source/svdraw/svdetc.cxx svx/source/svdraw/svdfmtf.cxx svx/source/svdraw/svdfmtf.hxx svx/source/svdraw/svdglue.cxx svx/source/svdraw/svdhdl.cxx svx/source/svdraw/svdhlpln.cxx svx/source/svdraw/svdibrow.cxx svx/source/svdraw/svdlayer.cxx svx/source/svdraw/svdmodel.cxx svx/source/svdraw/svdoashp.cxx svx/source/svdraw/svdobj.cxx svx/source/svdraw/svdocapt.cxx svx/source/svdraw/svdocirc.cxx svx/source/svdraw/svdoedge.cxx svx/source/svdraw/svdograf.cxx svx/source/svdraw/svdogrp.cxx svx/source/svdraw/svdomeas.cxx svx/source/svdraw/svdomedia.cxx svx/source/svdraw/svdopath.cxx svx/source/svdraw/svdotext.cxx svx/source/svdraw/svdotxdr.cxx svx/source/svdraw/svdotxed.cxx svx/source/svdraw/svdotxfl.cxx svx/source/svdraw/svdotxln.cxx svx/source/svdraw/svdotxtr.cxx svx/source/svdraw/svdoutl.cxx svx/source/svdraw/svdpage.cxx svx/source/svdraw/svdpagv.cxx svx/source/svdraw/svdpntv.cxx svx/source/svdraw/svdpoev.cxx svx/source/svdraw/svdsnpv.cxx svx/source/svdraw/svdstr.src svx/source/svdraw/svdtrans.cxx svx/source/svdraw/svdundo.cxx svx/source/svdraw/svdview.cxx svx/source/svdraw/svdxcgv.cxx svx/source/table/svdotable.cxx svx/source/tbxctrls/colorwindow.hxx svx/source/tbxctrls/extrusioncontrols.cxx svx/source/tbxctrls/fillctrl.cxx svx/source/tbxctrls/grafctrl.cxx svx/source/tbxctrls/itemwin.cxx svx/source/tbxctrls/layctrl.cxx svx/source/tbxctrls/lboxctrl.cxx svx/source/tbxctrls/linectrl.cxx svx/source/tbxctrls/tbcontrl.cxx svx/source/tbxctrls/verttexttbxctrl.cxx svx/source/unodraw/unomod.cxx svx/source/unodraw/unopage.cxx svx/source/unodraw/unoprov.cxx svx/source/unodraw/unoshape.cxx svx/source/unodraw/unoshtxt.cxx svx/source/xml/xmlxtexp.cxx svx/source/xoutdev/_xpoly.cxx svx/source/xoutdev/xattr.cxx svx/source/xoutdev/xattr2.cxx svx/source/xoutdev/xattrbmp.cxx svx/source/xoutdev/xtabcolr.cxx svx/util/makefile.mk svx/workben/edittest.cxx sysui/desktop/productversion.mk ucb/prj/build.lst ucb/source/cacher/cacheserv.cxx ucb/source/core/ucb1.component ucb/source/core/ucbserv.cxx ucb/source/core/ucbstore.cxx ucb/source/core/ucbstore.hxx ucb/source/sorter/sortmain.cxx ucb/source/ucp/file/prov.cxx ucb/source/ucp/file/shell.cxx ucb/source/ucp/ftp/ftpservices.cxx ucb/source/ucp/gio/gio_provider.cxx ucb/source/ucp/gvfs/gvfs_provider.cxx ucb/source/ucp/hierarchy/hierarchyservices.cxx ucb/source/ucp/odma/odma_lib.cxx ucb/source/ucp/odma/odma_services.cxx ucb/source/ucp/package/pkgservices.cxx ucb/source/ucp/tdoc/tdoc_services.cxx ucb/source/ucp/webdav/ContentProperties.cxx ucb/source/ucp/webdav/NeonHeadRequest.cxx ucb/source/ucp/webdav/webdavcontent.cxx ucb/source/ucp/webdav/webdavservices.cxx uui/source/iahndl.cxx uui/source/iahndl.hxx uui/source/loginerr.hxx uui/source/nameclashdlg.hxx uui/source/passcrtdlg.cxx uui/source/passworddlg.cxx uui/source/passworddlg.hxx uui/source/services.cxx vbahelper/inc/vbahelper/vbahelper.hxx vbahelper/prj/build.lst vbahelper/prj/d.lst vbahelper/source/msforms/makefile.mk vbahelper/source/msforms/vbauserform.cxx vbahelper/source/vbahelper/makefile.mk vbahelper/source/vbahelper/vbaapplicationbase.cxx vbahelper/source/vbahelper/vbacommandbarcontrol.cxx vbahelper/source/vbahelper/vbadocumentbase.cxx vbahelper/source/vbahelper/vbadocumentsbase.cxx vbahelper/source/vbahelper/vbahelper.cxx vbahelper/util/makefile.mk xmlhelp/source/cxxhelp/provider/databases.cxx xmlhelp/source/cxxhelp/provider/services.cxx xmlhelp/source/treeview/tvfactory.cxx xmloff/JunitTest_xmloff_unoapi.mk xmloff/inc/functional.hxx xmloff/inc/xmloff/formlayerexport.hxx xmloff/inc/xmloff/formlayerimport.hxx xmloff/inc/xmloff/functional.hxx xmloff/inc/xmloff/shapeimport.hxx xmloff/inc/xmloff/xmlcnitm.hxx xmloff/inc/xmloff/xmlnumfi.hxx xmloff/prj/build.lst xmloff/source/chart/SchXMLChartContext.cxx xmloff/source/chart/SchXMLExport.cxx xmloff/source/chart/SchXMLImport.cxx xmloff/source/chart/SchXMLLegendContext.hxx xmloff/source/chart/SchXMLPlotAreaContext.cxx xmloff/source/core/xmluconv.cxx xmloff/source/draw/sdxmlexp.cxx xmloff/source/draw/shapeexport4.cxx xmloff/source/draw/ximp3dobject.cxx xmloff/source/draw/ximp3dscene.cxx xmloff/source/forms/formlayerexport.cxx xmloff/source/forms/formlayerimport.cxx xmloff/source/forms/handler/vcl_time_handler.hxx xmloff/source/forms/layerimport.cxx xmloff/source/forms/layerimport.hxx xmloff/source/forms/property_meta_data.hxx xmloff/source/style/PageHeaderFooterContext.cxx xmloff/source/style/PageMasterStyleMap.cxx xmloff/source/style/prstylei.cxx xmloff/source/style/xmlimppr.cxx xmloff/source/style/xmlnumfi.cxx xmloff/source/style/xmlstyle.cxx xmloff/source/table/tabledesignsimporter.cxx xmloff/source/text/XMLTextNumRuleInfo.cxx xmloff/source/text/XMLTextShapeStyleContext.cxx xmloff/source/text/txtstyle.cxx xmloff/source/transform/ChartOOoTContext.cxx xmloff/source/transform/EventOOoTContext.cxx xmloff/source/transform/TransformerBase.cxx xmloff/util/makefile.mk xmlscript/util/xcr.component
3092 lines
103 KiB
C++
Executable File
3092 lines
103 KiB
C++
Executable File
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
|
/*************************************************************************
|
|
*
|
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
|
*
|
|
* Copyright 2000, 2010 Oracle and/or its affiliates.
|
|
*
|
|
* 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.
|
|
*
|
|
************************************************************************/
|
|
|
|
// MARKER(update_precomp.py): autogen include statement, do not remove
|
|
#include "precompiled_scripting.hxx"
|
|
#include "stringresource.hxx"
|
|
#include <com/sun/star/io/XTextInputStream.hpp>
|
|
#include <com/sun/star/io/XTextOutputStream.hpp>
|
|
#include <com/sun/star/io/XActiveDataSink.hpp>
|
|
#include <com/sun/star/io/XActiveDataSource.hpp>
|
|
#include <com/sun/star/io/XStream.hpp>
|
|
#include <com/sun/star/io/XSeekable.hpp>
|
|
#include <com/sun/star/embed/ElementModes.hpp>
|
|
#include <com/sun/star/lang/XMultiComponentFactory.hpp>
|
|
#include <cppuhelper/implementationentry.hxx>
|
|
#include <com/sun/star/beans/XPropertySet.hpp>
|
|
#include <com/sun/star/container/XNameAccess.hpp>
|
|
|
|
|
|
#include <rtl/ustrbuf.hxx>
|
|
#include <rtl/strbuf.hxx>
|
|
#include <tools/urlobj.hxx>
|
|
|
|
using namespace ::com::sun::star;
|
|
using namespace ::com::sun::star::lang;
|
|
using namespace ::com::sun::star::uno;
|
|
using namespace ::com::sun::star::ucb;
|
|
using namespace ::com::sun::star::util;
|
|
using namespace ::com::sun::star::embed;
|
|
using namespace ::com::sun::star::container;
|
|
|
|
|
|
//.........................................................................
|
|
namespace stringresource
|
|
{
|
|
//.........................................................................
|
|
|
|
// =============================================================================
|
|
// mutex
|
|
// =============================================================================
|
|
|
|
::osl::Mutex& getMutex()
|
|
{
|
|
static ::osl::Mutex* s_pMutex = 0;
|
|
if ( !s_pMutex )
|
|
{
|
|
::osl::MutexGuard aGuard( ::osl::Mutex::getGlobalMutex() );
|
|
if ( !s_pMutex )
|
|
{
|
|
static ::osl::Mutex s_aMutex;
|
|
s_pMutex = &s_aMutex;
|
|
}
|
|
}
|
|
return *s_pMutex;
|
|
}
|
|
|
|
|
|
// =============================================================================
|
|
// StringResourceImpl
|
|
// =============================================================================
|
|
|
|
// component operations
|
|
static Sequence< ::rtl::OUString > getSupportedServiceNames_StringResourceImpl()
|
|
{
|
|
Sequence< ::rtl::OUString > names(1);
|
|
names[0] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.resource.StringResource") );
|
|
return names;
|
|
}
|
|
|
|
static ::rtl::OUString getImplementationName_StringResourceImpl()
|
|
{
|
|
return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.scripting.StringResource") );
|
|
}
|
|
|
|
static Reference< XInterface > SAL_CALL create_StringResourceImpl(
|
|
Reference< XComponentContext > const & xContext )
|
|
SAL_THROW( () )
|
|
{
|
|
return static_cast< ::cppu::OWeakObject * >( new StringResourcePersistenceImpl( xContext ) );
|
|
}
|
|
|
|
|
|
// =============================================================================
|
|
|
|
StringResourceImpl::StringResourceImpl( const Reference< XComponentContext >& rxContext )
|
|
: m_xContext( rxContext )
|
|
, m_pCurrentLocaleItem( NULL )
|
|
, m_pDefaultLocaleItem( NULL )
|
|
, m_bDefaultModified( false )
|
|
, m_aListenerContainer( getMutex() )
|
|
, m_bModified( false )
|
|
, m_bReadOnly( false )
|
|
, m_nNextUniqueNumericId( UNIQUE_NUMBER_NEEDS_INITIALISATION )
|
|
{
|
|
}
|
|
|
|
// =============================================================================
|
|
|
|
StringResourceImpl::~StringResourceImpl()
|
|
{
|
|
for( LocaleItemVectorIt it = m_aLocaleItemVector.begin(); it != m_aLocaleItemVector.end(); it++ )
|
|
{
|
|
LocaleItem* pLocaleItem = *it;
|
|
delete pLocaleItem;
|
|
}
|
|
|
|
for( LocaleItemVectorIt it = m_aDeletedLocaleItemVector.begin(); it != m_aDeletedLocaleItemVector.end(); it++ )
|
|
{
|
|
LocaleItem* pLocaleItem = *it;
|
|
delete pLocaleItem;
|
|
}
|
|
}
|
|
|
|
|
|
// =============================================================================
|
|
// XServiceInfo
|
|
|
|
::rtl::OUString StringResourceImpl::getImplementationName( ) throw (RuntimeException)
|
|
{
|
|
return getImplementationName_StringResourceImpl();
|
|
}
|
|
|
|
sal_Bool StringResourceImpl::supportsService( const ::rtl::OUString& rServiceName ) throw (RuntimeException)
|
|
{
|
|
Sequence< ::rtl::OUString > aNames( getSupportedServiceNames() );
|
|
const ::rtl::OUString* pNames = aNames.getConstArray();
|
|
const ::rtl::OUString* pEnd = pNames + aNames.getLength();
|
|
for ( ; pNames != pEnd && !pNames->equals( rServiceName ); ++pNames )
|
|
;
|
|
|
|
return pNames != pEnd;
|
|
}
|
|
|
|
Sequence< ::rtl::OUString > StringResourceImpl::getSupportedServiceNames( ) throw (RuntimeException)
|
|
{
|
|
return getSupportedServiceNames_StringResourceImpl();
|
|
}
|
|
|
|
|
|
// =============================================================================
|
|
// XModifyBroadcaster
|
|
|
|
void StringResourceImpl::addModifyListener( const Reference< XModifyListener >& aListener )
|
|
throw (RuntimeException)
|
|
{
|
|
if( !aListener.is() )
|
|
throw RuntimeException();
|
|
|
|
::osl::MutexGuard aGuard( getMutex() );
|
|
Reference< XInterface > xIface( aListener, UNO_QUERY );
|
|
m_aListenerContainer.addInterface( xIface );
|
|
}
|
|
|
|
void StringResourceImpl::removeModifyListener( const Reference< XModifyListener >& aListener )
|
|
throw (RuntimeException)
|
|
{
|
|
if( !aListener.is() )
|
|
throw RuntimeException();
|
|
|
|
::osl::MutexGuard aGuard( getMutex() );
|
|
Reference< XInterface > xIface( aListener, UNO_QUERY );
|
|
m_aListenerContainer.removeInterface( xIface );
|
|
}
|
|
|
|
|
|
// =============================================================================
|
|
// XStringResourceResolver
|
|
|
|
::rtl::OUString StringResourceImpl::implResolveString
|
|
( const ::rtl::OUString& ResourceID, LocaleItem* pLocaleItem )
|
|
throw (::com::sun::star::resource::MissingResourceException)
|
|
{
|
|
::rtl::OUString aRetStr;
|
|
bool bSuccess = false;
|
|
if( pLocaleItem != NULL && loadLocale( pLocaleItem ) )
|
|
{
|
|
IdToStringMap::iterator it = pLocaleItem->m_aIdToStringMap.find( ResourceID );
|
|
if( !( it == pLocaleItem->m_aIdToStringMap.end() ) )
|
|
{
|
|
aRetStr = (*it).second;
|
|
bSuccess = true;
|
|
}
|
|
}
|
|
if( !bSuccess )
|
|
{
|
|
::rtl::OUString errorMsg(RTL_CONSTASCII_USTRINGPARAM("StringResourceImpl: No entry for ResourceID: "));
|
|
errorMsg.concat( ResourceID );
|
|
throw ::com::sun::star::resource::MissingResourceException( errorMsg, Reference< XInterface >() );
|
|
}
|
|
return aRetStr;
|
|
}
|
|
|
|
::rtl::OUString StringResourceImpl::resolveString( const ::rtl::OUString& ResourceID )
|
|
throw (::com::sun::star::resource::MissingResourceException, RuntimeException)
|
|
{
|
|
::osl::MutexGuard aGuard( getMutex() );
|
|
return implResolveString( ResourceID, m_pCurrentLocaleItem );
|
|
}
|
|
|
|
::rtl::OUString StringResourceImpl::resolveStringForLocale( const ::rtl::OUString& ResourceID, const Locale& locale )
|
|
throw ( ::com::sun::star::resource::MissingResourceException, RuntimeException)
|
|
{
|
|
::osl::MutexGuard aGuard( getMutex() );
|
|
LocaleItem* pLocaleItem = getItemForLocale( locale, false );
|
|
return implResolveString( ResourceID, pLocaleItem );
|
|
}
|
|
|
|
sal_Bool StringResourceImpl::implHasEntryForId( const ::rtl::OUString& ResourceID, LocaleItem* pLocaleItem )
|
|
{
|
|
bool bSuccess = false;
|
|
if( pLocaleItem != NULL && loadLocale( pLocaleItem ) )
|
|
{
|
|
IdToStringMap::iterator it = pLocaleItem->m_aIdToStringMap.find( ResourceID );
|
|
if( !( it == pLocaleItem->m_aIdToStringMap.end() ) )
|
|
bSuccess = true;
|
|
}
|
|
return bSuccess;
|
|
}
|
|
|
|
sal_Bool StringResourceImpl::hasEntryForId( const ::rtl::OUString& ResourceID )
|
|
throw (RuntimeException)
|
|
{
|
|
::osl::MutexGuard aGuard( getMutex() );
|
|
return implHasEntryForId( ResourceID, m_pCurrentLocaleItem );
|
|
}
|
|
|
|
sal_Bool StringResourceImpl::hasEntryForIdAndLocale( const ::rtl::OUString& ResourceID,
|
|
const Locale& locale )
|
|
throw (RuntimeException)
|
|
{
|
|
::osl::MutexGuard aGuard( getMutex() );
|
|
LocaleItem* pLocaleItem = getItemForLocale( locale, false );
|
|
return implHasEntryForId( ResourceID, pLocaleItem );
|
|
}
|
|
|
|
Sequence< ::rtl::OUString > StringResourceImpl::implGetResourceIDs( LocaleItem* pLocaleItem )
|
|
{
|
|
Sequence< ::rtl::OUString > aIDSeq( 0 );
|
|
if( pLocaleItem && loadLocale( pLocaleItem ) )
|
|
{
|
|
const IdToStringMap& rHashMap = pLocaleItem->m_aIdToStringMap;
|
|
sal_Int32 nResourceIDCount = rHashMap.size();
|
|
aIDSeq.realloc( nResourceIDCount );
|
|
::rtl::OUString* pStrings = aIDSeq.getArray();
|
|
|
|
IdToStringMap::const_iterator it;
|
|
int iTarget = 0;
|
|
for( it = rHashMap.begin(); it != rHashMap.end(); ++it )
|
|
{
|
|
::rtl::OUString aStr = (*it).first;
|
|
pStrings[iTarget] = aStr;
|
|
iTarget++;
|
|
}
|
|
}
|
|
return aIDSeq;
|
|
}
|
|
|
|
Sequence< ::rtl::OUString > StringResourceImpl::getResourceIDsForLocale
|
|
( const Locale& locale ) throw (::com::sun::star::uno::RuntimeException)
|
|
{
|
|
::osl::MutexGuard aGuard( getMutex() );
|
|
LocaleItem* pLocaleItem = getItemForLocale( locale, false );
|
|
return implGetResourceIDs( pLocaleItem );
|
|
}
|
|
|
|
Sequence< ::rtl::OUString > StringResourceImpl::getResourceIDs( )
|
|
throw (RuntimeException)
|
|
{
|
|
::osl::MutexGuard aGuard( getMutex() );
|
|
return implGetResourceIDs( m_pCurrentLocaleItem );
|
|
}
|
|
|
|
Locale StringResourceImpl::getCurrentLocale()
|
|
throw (RuntimeException)
|
|
{
|
|
::osl::MutexGuard aGuard( getMutex() );
|
|
|
|
Locale aRetLocale;
|
|
if( m_pCurrentLocaleItem != NULL )
|
|
aRetLocale = m_pCurrentLocaleItem->m_locale;
|
|
return aRetLocale;
|
|
}
|
|
|
|
Locale StringResourceImpl::getDefaultLocale( )
|
|
throw (RuntimeException)
|
|
{
|
|
::osl::MutexGuard aGuard( getMutex() );
|
|
|
|
Locale aRetLocale;
|
|
if( m_pDefaultLocaleItem != NULL )
|
|
aRetLocale = m_pDefaultLocaleItem->m_locale;
|
|
return aRetLocale;
|
|
}
|
|
|
|
Sequence< Locale > StringResourceImpl::getLocales( )
|
|
throw (RuntimeException)
|
|
{
|
|
::osl::MutexGuard aGuard( getMutex() );
|
|
|
|
sal_Int32 nSize = m_aLocaleItemVector.size();
|
|
Sequence< Locale > aLocalSeq( nSize );
|
|
Locale* pLocales = aLocalSeq.getArray();
|
|
int iTarget = 0;
|
|
for( LocaleItemVectorConstIt it = m_aLocaleItemVector.begin(); it != m_aLocaleItemVector.end(); it++ )
|
|
{
|
|
LocaleItem* pLocaleItem = *it;
|
|
pLocales[iTarget] = pLocaleItem->m_locale;
|
|
iTarget++;
|
|
}
|
|
return aLocalSeq;
|
|
}
|
|
|
|
|
|
// =============================================================================
|
|
// XStringResourceManager
|
|
|
|
void StringResourceImpl::implCheckReadOnly( const sal_Char* pExceptionMsg )
|
|
throw (NoSupportException)
|
|
{
|
|
if( m_bReadOnly )
|
|
{
|
|
::rtl::OUString errorMsg = ::rtl::OUString::createFromAscii( pExceptionMsg );
|
|
throw NoSupportException( errorMsg, Reference< XInterface >() );
|
|
}
|
|
}
|
|
|
|
sal_Bool StringResourceImpl::isReadOnly()
|
|
throw (RuntimeException)
|
|
{
|
|
return m_bReadOnly;
|
|
}
|
|
|
|
void StringResourceImpl::implSetCurrentLocale( const Locale& locale,
|
|
sal_Bool FindClosestMatch, sal_Bool bUseDefaultIfNoMatch )
|
|
throw (IllegalArgumentException, RuntimeException)
|
|
{
|
|
::osl::MutexGuard aGuard( getMutex() );
|
|
|
|
LocaleItem* pLocaleItem = NULL;
|
|
if( FindClosestMatch )
|
|
pLocaleItem = getClosestMatchItemForLocale( locale );
|
|
else
|
|
pLocaleItem = getItemForLocale( locale, true );
|
|
|
|
if( pLocaleItem == NULL && bUseDefaultIfNoMatch )
|
|
pLocaleItem = m_pDefaultLocaleItem;
|
|
|
|
if( pLocaleItem != NULL )
|
|
{
|
|
loadLocale( pLocaleItem );
|
|
m_pCurrentLocaleItem = pLocaleItem;
|
|
|
|
// Only notify without modifying
|
|
implNotifyListeners();
|
|
}
|
|
}
|
|
|
|
void StringResourceImpl::setCurrentLocale( const Locale& locale, sal_Bool FindClosestMatch )
|
|
throw (IllegalArgumentException, RuntimeException)
|
|
{
|
|
sal_Bool bUseDefaultIfNoMatch = false;
|
|
implSetCurrentLocale( locale, FindClosestMatch, bUseDefaultIfNoMatch );
|
|
}
|
|
|
|
void StringResourceImpl::setDefaultLocale( const Locale& locale )
|
|
throw (IllegalArgumentException, RuntimeException,NoSupportException)
|
|
{
|
|
::osl::MutexGuard aGuard( getMutex() );
|
|
implCheckReadOnly( "StringResourceImpl::setDefaultLocale(): Read only" );
|
|
|
|
LocaleItem* pLocaleItem = getItemForLocale( locale, true );
|
|
if( pLocaleItem && pLocaleItem != m_pDefaultLocaleItem )
|
|
{
|
|
if( m_pDefaultLocaleItem )
|
|
{
|
|
LocaleItem* pChangedDefaultLocaleItem = new LocaleItem( m_pDefaultLocaleItem->m_locale );
|
|
m_aChangedDefaultLocaleVector.push_back( pChangedDefaultLocaleItem );
|
|
}
|
|
|
|
m_pDefaultLocaleItem = pLocaleItem;
|
|
m_bDefaultModified = true;
|
|
implModified();
|
|
}
|
|
}
|
|
|
|
void StringResourceImpl::implSetString( const ::rtl::OUString& ResourceID,
|
|
const ::rtl::OUString& Str, LocaleItem* pLocaleItem )
|
|
{
|
|
if( pLocaleItem != NULL && loadLocale( pLocaleItem ) )
|
|
{
|
|
IdToStringMap& rHashMap = pLocaleItem->m_aIdToStringMap;
|
|
|
|
IdToStringMap::iterator it = rHashMap.find( ResourceID );
|
|
bool bNew = ( it == rHashMap.end() );
|
|
if( bNew )
|
|
{
|
|
IdToIndexMap& rIndexMap = pLocaleItem->m_aIdToIndexMap;
|
|
rIndexMap[ ResourceID ] = pLocaleItem->m_nNextIndex++;
|
|
implScanIdForNumber( ResourceID );
|
|
}
|
|
rHashMap[ ResourceID ] = Str;
|
|
pLocaleItem->m_bModified = true;
|
|
implModified();
|
|
}
|
|
}
|
|
|
|
void StringResourceImpl::setString( const ::rtl::OUString& ResourceID, const ::rtl::OUString& Str )
|
|
throw (NoSupportException, RuntimeException)
|
|
{
|
|
::osl::MutexGuard aGuard( getMutex() );
|
|
implCheckReadOnly( "StringResourceImpl::setString(): Read only" );
|
|
implSetString( ResourceID, Str, m_pCurrentLocaleItem );
|
|
}
|
|
|
|
void StringResourceImpl::setStringForLocale
|
|
( const ::rtl::OUString& ResourceID, const ::rtl::OUString& Str, const Locale& locale )
|
|
throw (NoSupportException, RuntimeException)
|
|
{
|
|
::osl::MutexGuard aGuard( getMutex() );
|
|
implCheckReadOnly( "StringResourceImpl::setStringForLocale(): Read only" );
|
|
LocaleItem* pLocaleItem = getItemForLocale( locale, false );
|
|
implSetString( ResourceID, Str, pLocaleItem );
|
|
}
|
|
|
|
void StringResourceImpl::implRemoveId( const ::rtl::OUString& ResourceID, LocaleItem* pLocaleItem )
|
|
throw (::com::sun::star::resource::MissingResourceException)
|
|
{
|
|
if( pLocaleItem != NULL && loadLocale( pLocaleItem ) )
|
|
{
|
|
IdToStringMap& rHashMap = pLocaleItem->m_aIdToStringMap;
|
|
IdToStringMap::iterator it = rHashMap.find( ResourceID );
|
|
if( it == rHashMap.end() )
|
|
{
|
|
::rtl::OUString errorMsg(RTL_CONSTASCII_USTRINGPARAM("StringResourceImpl: No entries for ResourceID: "));
|
|
errorMsg.concat( ResourceID );
|
|
throw ::com::sun::star::resource::MissingResourceException( errorMsg, Reference< XInterface >() );
|
|
}
|
|
rHashMap.erase( it );
|
|
pLocaleItem->m_bModified = true;
|
|
implModified();
|
|
}
|
|
}
|
|
|
|
void StringResourceImpl::removeId( const ::rtl::OUString& ResourceID )
|
|
throw (::com::sun::star::resource::MissingResourceException, RuntimeException, NoSupportException)
|
|
{
|
|
::osl::MutexGuard aGuard( getMutex() );
|
|
implCheckReadOnly( "StringResourceImpl::removeId(): Read only" );
|
|
implRemoveId( ResourceID, m_pCurrentLocaleItem );
|
|
}
|
|
|
|
void StringResourceImpl::removeIdForLocale( const ::rtl::OUString& ResourceID, const Locale& locale )
|
|
throw (::com::sun::star::resource::MissingResourceException, RuntimeException, NoSupportException)
|
|
{
|
|
::osl::MutexGuard aGuard( getMutex() );
|
|
implCheckReadOnly( "StringResourceImpl::removeIdForLocale(): Read only" );
|
|
LocaleItem* pLocaleItem = getItemForLocale( locale, false );
|
|
implRemoveId( ResourceID, pLocaleItem );
|
|
}
|
|
|
|
void StringResourceImpl::newLocale( const Locale& locale )
|
|
throw (ElementExistException, IllegalArgumentException, RuntimeException, NoSupportException)
|
|
{
|
|
::osl::MutexGuard aGuard( getMutex() );
|
|
implCheckReadOnly( "StringResourceImpl::newLocale(): Read only" );
|
|
|
|
if( getItemForLocale( locale, false ) != NULL )
|
|
{
|
|
::rtl::OUString errorMsg(RTL_CONSTASCII_USTRINGPARAM("StringResourceImpl: locale already exists"));
|
|
throw ElementExistException( errorMsg, Reference< XInterface >() );
|
|
}
|
|
|
|
// TODO?: Check if locale is valid? How?
|
|
bool bValid = true;
|
|
if( bValid )
|
|
{
|
|
LocaleItem* pLocaleItem = new LocaleItem( locale );
|
|
m_aLocaleItemVector.push_back( pLocaleItem );
|
|
pLocaleItem->m_bModified = true;
|
|
|
|
// Copy strings from default locale
|
|
LocaleItem* pCopyFromItem = m_pDefaultLocaleItem;
|
|
if( pCopyFromItem == NULL )
|
|
pCopyFromItem = m_pCurrentLocaleItem;
|
|
if( pCopyFromItem != NULL && loadLocale( pCopyFromItem ) )
|
|
{
|
|
const IdToStringMap& rSourceMap = pCopyFromItem->m_aIdToStringMap;
|
|
IdToStringMap& rTargetMap = pLocaleItem->m_aIdToStringMap;
|
|
IdToStringMap::const_iterator it;
|
|
for( it = rSourceMap.begin(); it != rSourceMap.end(); ++it )
|
|
{
|
|
::rtl::OUString aId = (*it).first;
|
|
::rtl::OUString aStr = (*it).second;
|
|
rTargetMap[ aId ] = aStr;
|
|
}
|
|
|
|
const IdToIndexMap& rSourceIndexMap = pCopyFromItem->m_aIdToIndexMap;
|
|
IdToIndexMap& rTargetIndexMap = pLocaleItem->m_aIdToIndexMap;
|
|
IdToIndexMap::const_iterator it_index;
|
|
for( it_index = rSourceIndexMap.begin(); it_index != rSourceIndexMap.end(); ++it_index )
|
|
{
|
|
::rtl::OUString aId = (*it_index).first;
|
|
sal_Int32 nIndex = (*it_index).second;
|
|
rTargetIndexMap[ aId ] = nIndex;
|
|
}
|
|
pLocaleItem->m_nNextIndex = pCopyFromItem->m_nNextIndex;
|
|
}
|
|
|
|
if( m_pCurrentLocaleItem == NULL )
|
|
m_pCurrentLocaleItem = pLocaleItem;
|
|
|
|
if( m_pDefaultLocaleItem == NULL )
|
|
{
|
|
m_pDefaultLocaleItem = pLocaleItem;
|
|
m_bDefaultModified = true;
|
|
}
|
|
|
|
implModified();
|
|
}
|
|
else
|
|
{
|
|
::rtl::OUString errorMsg(RTL_CONSTASCII_USTRINGPARAM("StringResourceImpl: Invalid locale"));
|
|
throw IllegalArgumentException( errorMsg, Reference< XInterface >(), 0 );
|
|
}
|
|
}
|
|
|
|
void StringResourceImpl::removeLocale( const Locale& locale )
|
|
throw (IllegalArgumentException, RuntimeException, NoSupportException)
|
|
{
|
|
::osl::MutexGuard aGuard( getMutex() );
|
|
implCheckReadOnly( "StringResourceImpl::removeLocale(): Read only" );
|
|
|
|
LocaleItem* pRemoveItem = getItemForLocale( locale, true );
|
|
if( pRemoveItem )
|
|
{
|
|
// Last locale?
|
|
sal_Int32 nLocaleCount = m_aLocaleItemVector.size();
|
|
if( nLocaleCount > 1 )
|
|
{
|
|
LocaleItem* pFallbackItem = NULL;
|
|
if( m_pCurrentLocaleItem == pRemoveItem ||
|
|
m_pDefaultLocaleItem == pRemoveItem )
|
|
{
|
|
for( LocaleItemVectorIt it = m_aLocaleItemVector.begin(); it != m_aLocaleItemVector.end(); it++ )
|
|
{
|
|
LocaleItem* pLocaleItem = *it;
|
|
if( pLocaleItem != pRemoveItem )
|
|
{
|
|
pFallbackItem = pLocaleItem;
|
|
break;
|
|
}
|
|
}
|
|
if( m_pCurrentLocaleItem == pRemoveItem )
|
|
{
|
|
sal_Bool FindClosestMatch = false;
|
|
setCurrentLocale( pFallbackItem->m_locale, FindClosestMatch );
|
|
}
|
|
if( m_pDefaultLocaleItem == pRemoveItem )
|
|
{
|
|
setDefaultLocale( pFallbackItem->m_locale );
|
|
}
|
|
}
|
|
}
|
|
for( LocaleItemVectorIt it = m_aLocaleItemVector.begin(); it != m_aLocaleItemVector.end(); it++ )
|
|
{
|
|
LocaleItem* pLocaleItem = *it;
|
|
if( pLocaleItem == pRemoveItem )
|
|
{
|
|
// Remember locale item to delete file while storing
|
|
m_aDeletedLocaleItemVector.push_back( pLocaleItem );
|
|
|
|
// Last locale?
|
|
if( nLocaleCount == 1 )
|
|
{
|
|
m_nNextUniqueNumericId = 0;
|
|
if( m_pDefaultLocaleItem )
|
|
{
|
|
LocaleItem* pChangedDefaultLocaleItem = new LocaleItem( m_pDefaultLocaleItem->m_locale );
|
|
m_aChangedDefaultLocaleVector.push_back( pChangedDefaultLocaleItem );
|
|
}
|
|
m_pCurrentLocaleItem = NULL;
|
|
m_pDefaultLocaleItem = NULL;
|
|
}
|
|
|
|
m_aLocaleItemVector.erase( it );
|
|
|
|
implModified();
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void StringResourceImpl::implScanIdForNumber( const ::rtl::OUString& ResourceID )
|
|
{
|
|
const sal_Unicode* pSrc = ResourceID.getStr();
|
|
sal_Int32 nLen = ResourceID.getLength();
|
|
|
|
sal_Int32 nNumber = 0;
|
|
for( sal_Int32 i = 0 ; i < nLen ; i++ )
|
|
{
|
|
sal_Unicode c = pSrc[i];
|
|
if( c >= '0' && c <= '9' )
|
|
{
|
|
sal_uInt16 nDigitVal = c - '0';
|
|
nNumber = 10*nNumber + nDigitVal;
|
|
}
|
|
else
|
|
break;
|
|
}
|
|
|
|
if( m_nNextUniqueNumericId < nNumber + 1 )
|
|
m_nNextUniqueNumericId = nNumber + 1;
|
|
}
|
|
|
|
sal_Int32 StringResourceImpl::getUniqueNumericId( )
|
|
throw (RuntimeException, NoSupportException)
|
|
{
|
|
if( m_nNextUniqueNumericId == UNIQUE_NUMBER_NEEDS_INITIALISATION )
|
|
{
|
|
implLoadAllLocales();
|
|
m_nNextUniqueNumericId = 0;
|
|
}
|
|
|
|
if( m_nNextUniqueNumericId < UNIQUE_NUMBER_NEEDS_INITIALISATION )
|
|
{
|
|
::rtl::OUString errorMsg(RTL_CONSTASCII_USTRINGPARAM("getUniqueNumericId: Extended sal_Int32 range"));
|
|
throw NoSupportException( errorMsg, Reference< XInterface >() );
|
|
}
|
|
return m_nNextUniqueNumericId;
|
|
}
|
|
|
|
|
|
// =============================================================================
|
|
// Private helper methods
|
|
|
|
LocaleItem* StringResourceImpl::getItemForLocale
|
|
( const Locale& locale, sal_Bool bException )
|
|
throw (::com::sun::star::lang::IllegalArgumentException)
|
|
{
|
|
LocaleItem* pRetItem = NULL;
|
|
|
|
// Search for locale
|
|
for( LocaleItemVectorConstIt it = m_aLocaleItemVector.begin(); it != m_aLocaleItemVector.end(); it++ )
|
|
{
|
|
LocaleItem* pLocaleItem = *it;
|
|
if( pLocaleItem )
|
|
{
|
|
Locale& cmp_locale = pLocaleItem->m_locale;
|
|
if( cmp_locale.Language == locale.Language &&
|
|
cmp_locale.Country == locale.Country &&
|
|
cmp_locale.Variant == locale.Variant )
|
|
{
|
|
pRetItem = pLocaleItem;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
if( pRetItem == NULL && bException )
|
|
{
|
|
::rtl::OUString errorMsg(RTL_CONSTASCII_USTRINGPARAM("StringResourceImpl: Invalid locale"));
|
|
throw IllegalArgumentException( errorMsg, Reference< XInterface >(), 0 );
|
|
}
|
|
return pRetItem;
|
|
}
|
|
|
|
// Returns the LocalItem for a given locale, if it exists, otherwise NULL
|
|
// This method performes a closest match search, at least the language must match
|
|
LocaleItem* StringResourceImpl::getClosestMatchItemForLocale( const Locale& locale )
|
|
{
|
|
LocaleItem* pRetItem = NULL;
|
|
|
|
// Search for locale
|
|
for( sal_Int32 iPass = 0 ; iPass <= 2 ; ++iPass )
|
|
{
|
|
for( LocaleItemVectorConstIt it = m_aLocaleItemVector.begin(); it != m_aLocaleItemVector.end(); it++ )
|
|
{
|
|
LocaleItem* pLocaleItem = *it;
|
|
if( pLocaleItem )
|
|
{
|
|
Locale& cmp_locale = pLocaleItem->m_locale;
|
|
if( cmp_locale.Language == locale.Language &&
|
|
(iPass > 1 || cmp_locale.Country == locale.Country) &&
|
|
(iPass > 0 || cmp_locale.Variant == locale.Variant) )
|
|
{
|
|
pRetItem = pLocaleItem;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
if( pRetItem )
|
|
break;
|
|
}
|
|
|
|
return pRetItem;
|
|
}
|
|
|
|
void StringResourceImpl::implModified( void )
|
|
{
|
|
m_bModified = true;
|
|
implNotifyListeners();
|
|
}
|
|
|
|
void StringResourceImpl::implNotifyListeners( void )
|
|
{
|
|
EventObject aEvent;
|
|
aEvent.Source = static_cast< XInterface* >( (OWeakObject*)this );
|
|
|
|
::cppu::OInterfaceIteratorHelper it( m_aListenerContainer );
|
|
while( it.hasMoreElements() )
|
|
{
|
|
Reference< XInterface > xIface = it.next();
|
|
Reference< XModifyListener > xListener( xIface, UNO_QUERY );
|
|
try
|
|
{
|
|
xListener->modified( aEvent );
|
|
}
|
|
catch(RuntimeException&)
|
|
{
|
|
it.remove();
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
// =============================================================================
|
|
// Loading
|
|
|
|
bool StringResourceImpl::loadLocale( LocaleItem* pLocaleItem )
|
|
{
|
|
// Base implementation has nothing to load
|
|
(void)pLocaleItem;
|
|
return true;
|
|
}
|
|
|
|
void StringResourceImpl::implLoadAllLocales( void )
|
|
{
|
|
// Base implementation has nothing to load
|
|
}
|
|
|
|
|
|
Reference< XMultiComponentFactory > StringResourceImpl::getMultiComponentFactory( void )
|
|
{
|
|
::osl::MutexGuard aGuard( getMutex() );
|
|
|
|
if( !m_xMCF.is() )
|
|
{
|
|
Reference< XMultiComponentFactory > xSMgr( m_xContext->getServiceManager(), UNO_QUERY );
|
|
if( !xSMgr.is() )
|
|
{
|
|
throw RuntimeException(
|
|
::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "StringResourceImpl::getMultiComponentFactory: Couldn't instantiate MultiComponentFactory" ) ),
|
|
Reference< XInterface >() );
|
|
}
|
|
m_xMCF = xSMgr;
|
|
}
|
|
return m_xMCF;
|
|
}
|
|
|
|
|
|
// =============================================================================
|
|
// StringResourcePersistenceImpl
|
|
// =============================================================================
|
|
|
|
StringResourcePersistenceImpl::StringResourcePersistenceImpl( const Reference< XComponentContext >& rxContext )
|
|
: StringResourcePersistenceImpl_BASE( rxContext )
|
|
{
|
|
}
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
StringResourcePersistenceImpl::~StringResourcePersistenceImpl()
|
|
{
|
|
}
|
|
|
|
// -----------------------------------------------------------------------------
|
|
// XServiceInfo
|
|
// -----------------------------------------------------------------------------
|
|
|
|
::rtl::OUString StringResourcePersistenceImpl::getImplementationName( )
|
|
throw (RuntimeException)
|
|
{
|
|
return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM
|
|
( "com.sun.star.comp.scripting.StringResourceWithLocation") );
|
|
}
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
sal_Bool StringResourcePersistenceImpl::supportsService( const ::rtl::OUString& rServiceName )
|
|
throw (RuntimeException)
|
|
{
|
|
return StringResourceImpl::supportsService( rServiceName );
|
|
}
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
Sequence< ::rtl::OUString > StringResourcePersistenceImpl::getSupportedServiceNames( )
|
|
throw (RuntimeException)
|
|
{
|
|
return StringResourceImpl::getSupportedServiceNames();
|
|
}
|
|
|
|
// -----------------------------------------------------------------------------
|
|
// XInitialization base functionality for derived classes
|
|
// -----------------------------------------------------------------------------
|
|
|
|
static ::rtl::OUString aNameBaseDefaultStr(RTL_CONSTASCII_USTRINGPARAM("strings"));
|
|
|
|
void StringResourcePersistenceImpl::implInitializeCommonParameters
|
|
( const Sequence< Any >& aArguments )
|
|
throw (Exception, RuntimeException)
|
|
{
|
|
bool bReadOnlyOk = (aArguments[1] >>= m_bReadOnly);
|
|
if( !bReadOnlyOk )
|
|
{
|
|
::rtl::OUString errorMsg(RTL_CONSTASCII_USTRINGPARAM("XInitialization::initialize: Expected ReadOnly flag"));
|
|
throw IllegalArgumentException( errorMsg, Reference< XInterface >(), 1 );
|
|
}
|
|
|
|
com::sun::star::lang::Locale aCurrentLocale;
|
|
bool bLocaleOk = (aArguments[2] >>= aCurrentLocale);
|
|
if( !bLocaleOk )
|
|
{
|
|
::rtl::OUString errorMsg(RTL_CONSTASCII_USTRINGPARAM("XInitialization::initialize: Expected Locale"));
|
|
throw IllegalArgumentException( errorMsg, Reference< XInterface >(), 2 );
|
|
}
|
|
|
|
bool bNameBaseOk = (aArguments[3] >>= m_aNameBase);
|
|
if( !bNameBaseOk )
|
|
{
|
|
::rtl::OUString errorMsg(RTL_CONSTASCII_USTRINGPARAM("XInitialization::initialize: Expected NameBase string"));
|
|
throw IllegalArgumentException( errorMsg, Reference< XInterface >(), 3 );
|
|
}
|
|
if( m_aNameBase.getLength() == 0 )
|
|
m_aNameBase = aNameBaseDefaultStr;
|
|
|
|
bool bCommentOk = (aArguments[4] >>= m_aComment);
|
|
if( !bCommentOk )
|
|
{
|
|
::rtl::OUString errorMsg(RTL_CONSTASCII_USTRINGPARAM("XInitialization::initialize: Expected Comment string"));
|
|
throw IllegalArgumentException( errorMsg, Reference< XInterface >(), 4 );
|
|
}
|
|
|
|
implScanLocales();
|
|
|
|
sal_Bool FindClosestMatch = true;
|
|
sal_Bool bUseDefaultIfNoMatch = true;
|
|
implSetCurrentLocale( aCurrentLocale, FindClosestMatch, bUseDefaultIfNoMatch );
|
|
}
|
|
|
|
// -----------------------------------------------------------------------------
|
|
// Forwarding calls to base class
|
|
|
|
// XModifyBroadcaster
|
|
void StringResourcePersistenceImpl::addModifyListener( const Reference< XModifyListener >& aListener )
|
|
throw (RuntimeException)
|
|
{
|
|
StringResourceImpl::addModifyListener( aListener );
|
|
}
|
|
void StringResourcePersistenceImpl::removeModifyListener( const Reference< XModifyListener >& aListener )
|
|
throw (RuntimeException)
|
|
{
|
|
StringResourceImpl::removeModifyListener( aListener );
|
|
}
|
|
|
|
// XStringResourceResolver
|
|
::rtl::OUString StringResourcePersistenceImpl::resolveString( const ::rtl::OUString& ResourceID )
|
|
throw (::com::sun::star::resource::MissingResourceException, RuntimeException)
|
|
{
|
|
return StringResourceImpl::resolveString( ResourceID ) ;
|
|
}
|
|
::rtl::OUString StringResourcePersistenceImpl::resolveStringForLocale( const ::rtl::OUString& ResourceID, const Locale& locale )
|
|
throw ( ::com::sun::star::resource::MissingResourceException, RuntimeException)
|
|
{
|
|
return StringResourceImpl::resolveStringForLocale( ResourceID, locale );
|
|
}
|
|
sal_Bool StringResourcePersistenceImpl::hasEntryForId( const ::rtl::OUString& ResourceID )
|
|
throw (RuntimeException)
|
|
{
|
|
return StringResourceImpl::hasEntryForId( ResourceID ) ;
|
|
}
|
|
sal_Bool StringResourcePersistenceImpl::hasEntryForIdAndLocale( const ::rtl::OUString& ResourceID,
|
|
const Locale& locale )
|
|
throw (RuntimeException)
|
|
{
|
|
return StringResourceImpl::hasEntryForIdAndLocale( ResourceID, locale );
|
|
}
|
|
Locale StringResourcePersistenceImpl::getCurrentLocale()
|
|
throw (RuntimeException)
|
|
{
|
|
return StringResourceImpl::getCurrentLocale();
|
|
}
|
|
Locale StringResourcePersistenceImpl::getDefaultLocale( )
|
|
throw (RuntimeException)
|
|
{
|
|
return StringResourceImpl::getDefaultLocale();
|
|
}
|
|
Sequence< Locale > StringResourcePersistenceImpl::getLocales( )
|
|
throw (RuntimeException)
|
|
{
|
|
return StringResourceImpl::getLocales();
|
|
}
|
|
|
|
// XStringResourceManager
|
|
sal_Bool StringResourcePersistenceImpl::isReadOnly()
|
|
throw (RuntimeException)
|
|
{
|
|
return StringResourceImpl::isReadOnly();
|
|
}
|
|
void StringResourcePersistenceImpl::setCurrentLocale( const Locale& locale, sal_Bool FindClosestMatch )
|
|
throw (IllegalArgumentException, RuntimeException)
|
|
{
|
|
StringResourceImpl::setCurrentLocale( locale, FindClosestMatch );
|
|
}
|
|
void StringResourcePersistenceImpl::setDefaultLocale( const Locale& locale )
|
|
throw (IllegalArgumentException, RuntimeException,NoSupportException)
|
|
{
|
|
StringResourceImpl::setDefaultLocale( locale );
|
|
}
|
|
Sequence< ::rtl::OUString > StringResourcePersistenceImpl::getResourceIDs( )
|
|
throw (RuntimeException)
|
|
{
|
|
return StringResourceImpl::getResourceIDs();
|
|
}
|
|
void StringResourcePersistenceImpl::setString( const ::rtl::OUString& ResourceID, const ::rtl::OUString& Str )
|
|
throw (NoSupportException, RuntimeException)
|
|
{
|
|
StringResourceImpl::setString( ResourceID, Str );
|
|
}
|
|
void StringResourcePersistenceImpl::setStringForLocale
|
|
( const ::rtl::OUString& ResourceID, const ::rtl::OUString& Str, const Locale& locale )
|
|
throw (NoSupportException, RuntimeException)
|
|
{
|
|
StringResourceImpl::setStringForLocale( ResourceID, Str, locale );
|
|
}
|
|
Sequence< ::rtl::OUString > StringResourcePersistenceImpl::getResourceIDsForLocale
|
|
( const Locale& locale ) throw (::com::sun::star::uno::RuntimeException)
|
|
{
|
|
return StringResourceImpl::getResourceIDsForLocale( locale );
|
|
}
|
|
void StringResourcePersistenceImpl::removeId( const ::rtl::OUString& ResourceID )
|
|
throw (::com::sun::star::resource::MissingResourceException, RuntimeException, NoSupportException)
|
|
{
|
|
StringResourceImpl::removeId( ResourceID );
|
|
}
|
|
void StringResourcePersistenceImpl::removeIdForLocale( const ::rtl::OUString& ResourceID, const Locale& locale )
|
|
throw (::com::sun::star::resource::MissingResourceException, RuntimeException, NoSupportException)
|
|
{
|
|
StringResourceImpl::removeIdForLocale( ResourceID, locale );
|
|
}
|
|
void StringResourcePersistenceImpl::newLocale( const Locale& locale )
|
|
throw (ElementExistException, IllegalArgumentException, RuntimeException, NoSupportException)
|
|
{
|
|
StringResourceImpl::newLocale( locale );
|
|
}
|
|
void StringResourcePersistenceImpl::removeLocale( const Locale& locale )
|
|
throw (IllegalArgumentException, RuntimeException, NoSupportException)
|
|
{
|
|
StringResourceImpl::removeLocale( locale );
|
|
}
|
|
sal_Int32 StringResourcePersistenceImpl::getUniqueNumericId( )
|
|
throw (RuntimeException, NoSupportException)
|
|
{
|
|
return StringResourceImpl::getUniqueNumericId();
|
|
}
|
|
|
|
// -----------------------------------------------------------------------------
|
|
// XStringResourcePersistence
|
|
|
|
void StringResourcePersistenceImpl::store()
|
|
throw (NoSupportException, Exception, RuntimeException)
|
|
{
|
|
}
|
|
|
|
sal_Bool StringResourcePersistenceImpl::isModified( )
|
|
throw (RuntimeException)
|
|
{
|
|
::osl::MutexGuard aGuard( getMutex() );
|
|
|
|
return m_bModified;
|
|
}
|
|
|
|
void StringResourcePersistenceImpl::setComment( const ::rtl::OUString& Comment )
|
|
throw (::com::sun::star::uno::RuntimeException)
|
|
{
|
|
m_aComment = Comment;
|
|
}
|
|
|
|
void StringResourcePersistenceImpl::storeToStorage( const Reference< XStorage >& Storage,
|
|
const ::rtl::OUString& NameBase, const ::rtl::OUString& Comment )
|
|
throw (Exception, RuntimeException)
|
|
{
|
|
::osl::MutexGuard aGuard( getMutex() );
|
|
|
|
bool bUsedForStore = false;
|
|
bool bStoreAll = true;
|
|
implStoreAtStorage( NameBase, Comment, Storage, bUsedForStore, bStoreAll );
|
|
}
|
|
|
|
void StringResourcePersistenceImpl::implStoreAtStorage
|
|
(
|
|
const ::rtl::OUString& aNameBase,
|
|
const ::rtl::OUString& aComment,
|
|
const Reference< ::com::sun::star::embed::XStorage >& Storage,
|
|
bool bUsedForStore,
|
|
bool bStoreAll
|
|
)
|
|
throw (Exception, RuntimeException)
|
|
{
|
|
// Delete files for deleted locales
|
|
if( bUsedForStore )
|
|
{
|
|
while( m_aDeletedLocaleItemVector.size() > 0 )
|
|
{
|
|
LocaleItemVectorIt it = m_aDeletedLocaleItemVector.begin();
|
|
LocaleItem* pLocaleItem = *it;
|
|
if( pLocaleItem != NULL )
|
|
{
|
|
::rtl::OUString aStreamName = implGetFileNameForLocaleItem( pLocaleItem, m_aNameBase );
|
|
aStreamName += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(".properties"));
|
|
|
|
try
|
|
{
|
|
Storage->removeElement( aStreamName );
|
|
}
|
|
catch( Exception& )
|
|
{}
|
|
|
|
m_aDeletedLocaleItemVector.erase( it );
|
|
delete pLocaleItem;
|
|
}
|
|
}
|
|
}
|
|
|
|
for( LocaleItemVectorConstIt it = m_aLocaleItemVector.begin(); it != m_aLocaleItemVector.end(); it++ )
|
|
{
|
|
LocaleItem* pLocaleItem = *it;
|
|
if( pLocaleItem != NULL && (bStoreAll || pLocaleItem->m_bModified) &&
|
|
loadLocale( pLocaleItem ) )
|
|
{
|
|
::rtl::OUString aStreamName = implGetFileNameForLocaleItem( pLocaleItem, aNameBase );
|
|
aStreamName += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(".properties"));
|
|
|
|
Reference< io::XStream > xElementStream =
|
|
Storage->openStreamElement( aStreamName, ElementModes::READWRITE );
|
|
|
|
::rtl::OUString aPropName(RTL_CONSTASCII_USTRINGPARAM("MediaType"));
|
|
::rtl::OUString aMime(RTL_CONSTASCII_USTRINGPARAM("text/plain"));
|
|
|
|
uno::Reference< beans::XPropertySet > xProps( xElementStream, uno::UNO_QUERY );
|
|
OSL_ENSURE( xProps.is(), "The StorageStream must implement XPropertySet interface!\n" );
|
|
if ( xProps.is() )
|
|
{
|
|
xProps->setPropertyValue( aPropName, uno::makeAny( aMime ) );
|
|
|
|
aPropName = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("UseCommonStoragePasswordEncryption"));
|
|
xProps->setPropertyValue( aPropName, uno::makeAny( sal_True ) );
|
|
}
|
|
|
|
Reference< io::XOutputStream > xOutputStream = xElementStream->getOutputStream();
|
|
if( xOutputStream.is() )
|
|
implWritePropertiesFile( pLocaleItem, xOutputStream, aComment );
|
|
xOutputStream->closeOutput();
|
|
|
|
if( bUsedForStore )
|
|
pLocaleItem->m_bModified = false;
|
|
}
|
|
}
|
|
|
|
// Delete files for changed defaults
|
|
if( bUsedForStore )
|
|
{
|
|
for( LocaleItemVectorIt it = m_aChangedDefaultLocaleVector.begin();
|
|
it != m_aChangedDefaultLocaleVector.end(); it++ )
|
|
{
|
|
LocaleItem* pLocaleItem = *it;
|
|
if( pLocaleItem != NULL )
|
|
{
|
|
::rtl::OUString aStreamName = implGetFileNameForLocaleItem( pLocaleItem, m_aNameBase );
|
|
aStreamName += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(".default"));
|
|
|
|
try
|
|
{
|
|
Storage->removeElement( aStreamName );
|
|
}
|
|
catch( Exception& )
|
|
{}
|
|
|
|
delete pLocaleItem;
|
|
}
|
|
}
|
|
m_aChangedDefaultLocaleVector.clear();
|
|
}
|
|
|
|
// Default locale
|
|
if( m_pDefaultLocaleItem != NULL && (bStoreAll || m_bDefaultModified) )
|
|
{
|
|
::rtl::OUString aStreamName = implGetFileNameForLocaleItem( m_pDefaultLocaleItem, aNameBase );
|
|
aStreamName += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(".default"));
|
|
|
|
Reference< io::XStream > xElementStream =
|
|
Storage->openStreamElement( aStreamName, ElementModes::READWRITE );
|
|
|
|
::rtl::OUString aPropName(RTL_CONSTASCII_USTRINGPARAM("MediaType"));
|
|
::rtl::OUString aMime(RTL_CONSTASCII_USTRINGPARAM("text/plain"));
|
|
|
|
// Only create stream without content
|
|
Reference< io::XOutputStream > xOutputStream = xElementStream->getOutputStream();
|
|
xOutputStream->closeOutput();
|
|
|
|
if( bUsedForStore )
|
|
m_bDefaultModified = false;
|
|
}
|
|
}
|
|
|
|
void StringResourcePersistenceImpl::storeToURL( const ::rtl::OUString& URL,
|
|
const ::rtl::OUString& NameBase, const ::rtl::OUString& Comment,
|
|
const Reference< ::com::sun::star::task::XInteractionHandler >& Handler )
|
|
throw (Exception, RuntimeException)
|
|
{
|
|
::osl::MutexGuard aGuard( getMutex() );
|
|
|
|
bool bUsedForStore = false;
|
|
bool bStoreAll = true;
|
|
|
|
Reference< XMultiComponentFactory > xMCF = getMultiComponentFactory();
|
|
Reference< ucb::XSimpleFileAccess > xFileAccess;
|
|
xFileAccess = Reference< ucb::XSimpleFileAccess >( xMCF->createInstanceWithContext
|
|
( ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.ucb.SimpleFileAccess")),
|
|
m_xContext ), UNO_QUERY );
|
|
if( xFileAccess.is() && Handler.is() )
|
|
xFileAccess->setInteractionHandler( Handler );
|
|
|
|
implStoreAtLocation( URL, NameBase, Comment, xFileAccess, bUsedForStore, bStoreAll );
|
|
}
|
|
|
|
void StringResourcePersistenceImpl::implKillRemovedLocaleFiles
|
|
(
|
|
const ::rtl::OUString& Location,
|
|
const ::rtl::OUString& aNameBase,
|
|
const ::com::sun::star::uno::Reference< ::com::sun::star::ucb::XSimpleFileAccess >& xFileAccess
|
|
)
|
|
throw (Exception, RuntimeException)
|
|
{
|
|
// Delete files for deleted locales
|
|
while( m_aDeletedLocaleItemVector.size() > 0 )
|
|
{
|
|
LocaleItemVectorIt it = m_aDeletedLocaleItemVector.begin();
|
|
LocaleItem* pLocaleItem = *it;
|
|
if( pLocaleItem != NULL )
|
|
{
|
|
::rtl::OUString aCompleteFileName =
|
|
implGetPathForLocaleItem( pLocaleItem, aNameBase, Location );
|
|
if( xFileAccess->exists( aCompleteFileName ) )
|
|
xFileAccess->kill( aCompleteFileName );
|
|
|
|
m_aDeletedLocaleItemVector.erase( it );
|
|
delete pLocaleItem;
|
|
}
|
|
}
|
|
}
|
|
|
|
void StringResourcePersistenceImpl::implKillChangedDefaultFiles
|
|
(
|
|
const ::rtl::OUString& Location,
|
|
const ::rtl::OUString& aNameBase,
|
|
const ::com::sun::star::uno::Reference< ::com::sun::star::ucb::XSimpleFileAccess >& xFileAccess
|
|
)
|
|
throw (Exception, RuntimeException)
|
|
{
|
|
// Delete files for changed defaults
|
|
for( LocaleItemVectorIt it = m_aChangedDefaultLocaleVector.begin();
|
|
it != m_aChangedDefaultLocaleVector.end(); it++ )
|
|
{
|
|
LocaleItem* pLocaleItem = *it;
|
|
if( pLocaleItem != NULL )
|
|
{
|
|
::rtl::OUString aCompleteFileName =
|
|
implGetPathForLocaleItem( pLocaleItem, aNameBase, Location, true );
|
|
if( xFileAccess->exists( aCompleteFileName ) )
|
|
xFileAccess->kill( aCompleteFileName );
|
|
|
|
delete pLocaleItem;
|
|
}
|
|
}
|
|
m_aChangedDefaultLocaleVector.clear();
|
|
}
|
|
|
|
void StringResourcePersistenceImpl::implStoreAtLocation
|
|
(
|
|
const ::rtl::OUString& Location,
|
|
const ::rtl::OUString& aNameBase,
|
|
const ::rtl::OUString& aComment,
|
|
const Reference< ucb::XSimpleFileAccess >& xFileAccess,
|
|
bool bUsedForStore,
|
|
bool bStoreAll,
|
|
bool bKillAll
|
|
)
|
|
throw (Exception, RuntimeException)
|
|
{
|
|
// Delete files for deleted locales
|
|
if( bUsedForStore || bKillAll )
|
|
implKillRemovedLocaleFiles( Location, aNameBase, xFileAccess );
|
|
|
|
for( LocaleItemVectorConstIt it = m_aLocaleItemVector.begin(); it != m_aLocaleItemVector.end(); it++ )
|
|
{
|
|
LocaleItem* pLocaleItem = *it;
|
|
if( pLocaleItem != NULL && (bStoreAll || bKillAll || pLocaleItem->m_bModified) &&
|
|
loadLocale( pLocaleItem ) )
|
|
{
|
|
::rtl::OUString aCompleteFileName =
|
|
implGetPathForLocaleItem( pLocaleItem, aNameBase, Location );
|
|
if( xFileAccess->exists( aCompleteFileName ) )
|
|
xFileAccess->kill( aCompleteFileName );
|
|
|
|
if( !bKillAll )
|
|
{
|
|
// Create Output stream
|
|
Reference< io::XOutputStream > xOutputStream = xFileAccess->openFileWrite( aCompleteFileName );
|
|
if( xOutputStream.is() )
|
|
{
|
|
implWritePropertiesFile( pLocaleItem, xOutputStream, aComment );
|
|
xOutputStream->closeOutput();
|
|
}
|
|
if( bUsedForStore )
|
|
pLocaleItem->m_bModified = false;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Delete files for changed defaults
|
|
if( bUsedForStore || bKillAll )
|
|
implKillChangedDefaultFiles( Location, aNameBase, xFileAccess );
|
|
|
|
// Default locale
|
|
if( m_pDefaultLocaleItem != NULL && (bStoreAll || bKillAll || m_bDefaultModified) )
|
|
{
|
|
::rtl::OUString aCompleteFileName =
|
|
implGetPathForLocaleItem( m_pDefaultLocaleItem, aNameBase, Location, true );
|
|
if( xFileAccess->exists( aCompleteFileName ) )
|
|
xFileAccess->kill( aCompleteFileName );
|
|
|
|
if( !bKillAll )
|
|
{
|
|
// Create Output stream
|
|
Reference< io::XOutputStream > xOutputStream = xFileAccess->openFileWrite( aCompleteFileName );
|
|
if( xOutputStream.is() )
|
|
xOutputStream->closeOutput();
|
|
|
|
if( bUsedForStore )
|
|
m_bDefaultModified = false;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
// -----------------------------------------------------------------------------
|
|
// BinaryOutput, helper class for exportBinary
|
|
|
|
class BinaryOutput
|
|
{
|
|
Reference< XMultiComponentFactory > m_xMCF;
|
|
Reference< XComponentContext > m_xContext;
|
|
Reference< XInterface > m_xTempFile;
|
|
Reference< io::XOutputStream > m_xOutputStream;
|
|
|
|
public:
|
|
BinaryOutput( Reference< XMultiComponentFactory > xMCF,
|
|
Reference< XComponentContext > xContext );
|
|
|
|
Reference< io::XOutputStream > getOutputStream() const
|
|
{ return m_xOutputStream; }
|
|
|
|
Sequence< ::sal_Int8 > closeAndGetData();
|
|
|
|
// Template to be used with sal_Int16 and sal_Unicode
|
|
template< class T >
|
|
void write16BitInt( T n );
|
|
void writeInt16( sal_Int16 n )
|
|
{ write16BitInt( n ); }
|
|
void writeUnicodeChar( sal_Unicode n )
|
|
{ write16BitInt( n ); }
|
|
void writeInt32( sal_Int32 n );
|
|
void writeString( const ::rtl::OUString& aStr );
|
|
};
|
|
|
|
BinaryOutput::BinaryOutput( Reference< XMultiComponentFactory > xMCF,
|
|
Reference< XComponentContext > xContext )
|
|
: m_xMCF( xMCF )
|
|
, m_xContext( xContext )
|
|
{
|
|
m_xTempFile = m_xMCF->createInstanceWithContext
|
|
( ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.io.TempFile")), m_xContext );
|
|
if( m_xTempFile.is() )
|
|
m_xOutputStream = Reference< io::XOutputStream >( m_xTempFile, UNO_QUERY );
|
|
}
|
|
|
|
template< class T >
|
|
void BinaryOutput::write16BitInt( T n )
|
|
{
|
|
if( !m_xOutputStream.is() )
|
|
return;
|
|
|
|
Sequence< sal_Int8 > aSeq( 2 );
|
|
sal_Int8* p = aSeq.getArray();
|
|
|
|
sal_Int8 nLow = sal_Int8( n & 0xff );
|
|
sal_Int8 nHigh = sal_Int8( n >> 8 );
|
|
|
|
p[0] = nLow;
|
|
p[1] = nHigh;
|
|
m_xOutputStream->writeBytes( aSeq );
|
|
}
|
|
|
|
void BinaryOutput::writeInt32( sal_Int32 n )
|
|
{
|
|
if( !m_xOutputStream.is() )
|
|
return;
|
|
|
|
Sequence< sal_Int8 > aSeq( 4 );
|
|
sal_Int8* p = aSeq.getArray();
|
|
|
|
for( sal_Int16 i = 0 ; i < 4 ; i++ )
|
|
{
|
|
p[i] = sal_Int8( n & 0xff );
|
|
n >>= 8;
|
|
}
|
|
m_xOutputStream->writeBytes( aSeq );
|
|
}
|
|
|
|
void BinaryOutput::writeString( const ::rtl::OUString& aStr )
|
|
{
|
|
sal_Int32 nLen = aStr.getLength();
|
|
const sal_Unicode* pStr = aStr.getStr();
|
|
|
|
for( sal_Int32 i = 0 ; i < nLen ; i++ )
|
|
writeUnicodeChar( pStr[i] );
|
|
|
|
writeUnicodeChar( 0 );
|
|
}
|
|
|
|
Sequence< ::sal_Int8 > BinaryOutput::closeAndGetData()
|
|
{
|
|
Sequence< ::sal_Int8 > aRetSeq;
|
|
if( !m_xOutputStream.is() )
|
|
return aRetSeq;
|
|
|
|
m_xOutputStream->closeOutput();
|
|
|
|
Reference< io::XSeekable> xSeekable( m_xTempFile, UNO_QUERY );
|
|
if( !xSeekable.is() )
|
|
return aRetSeq;
|
|
|
|
sal_Int32 nSize = (sal_Int32)xSeekable->getPosition();
|
|
|
|
Reference< io::XInputStream> xInputStream( m_xTempFile, UNO_QUERY );
|
|
if( !xInputStream.is() )
|
|
return aRetSeq;
|
|
|
|
xSeekable->seek( 0 );
|
|
sal_Int32 nRead = xInputStream->readBytes( aRetSeq, nSize );
|
|
(void)nRead;
|
|
OSL_ENSURE( nRead == nSize, "BinaryOutput::closeAndGetData: nRead != nSize" );
|
|
|
|
return aRetSeq;
|
|
}
|
|
|
|
|
|
// Binary format:
|
|
|
|
// Header
|
|
// Byte Content
|
|
// 0 + 1 sal_Int16: Version, currently 0, low byte first
|
|
// 2 + 3 sal_Int16: Locale count = n, low byte first
|
|
// 4 + 5 sal_Int16: Default Locale position in Locale list, == n if none
|
|
// 6 - 7 sal_Int32: Start index locale block 0, lowest byte first
|
|
// (n-1) * sal_Int32: Start index locale block 1 to n, lowest byte first
|
|
// 6 + 4*n sal_Int32: "Start index" non existing locale block n+1,
|
|
// marks the first invalid index, kind of EOF
|
|
|
|
// Locale block
|
|
// All strings are stored as 2-Byte-0 terminated sequence
|
|
// of 16 bit Unicode characters, each with low byte first
|
|
// Empty strings only contain the 2-Byte-0
|
|
|
|
// Members of com.sun.star.lang.Locale
|
|
// with l1 = Locale.Language.getLength()
|
|
// with l2 = Locale.Country.getLength()
|
|
// with l3 = Locale.Variant.getLength()
|
|
// pos0 = 0 Locale.Language
|
|
// pos1 = 2 * (l1 + 1) Locale.Country
|
|
// pos2 = pos1 + 2 * (l2 + 1) Locale.Variant
|
|
// pos3 = pos2 + 2 * (l3 + 1)
|
|
// pos3 Properties file written by implWritePropertiesFile
|
|
|
|
Sequence< sal_Int8 > StringResourcePersistenceImpl::exportBinary( )
|
|
throw (RuntimeException)
|
|
{
|
|
Reference< XMultiComponentFactory > xMCF = getMultiComponentFactory();
|
|
BinaryOutput aOut( xMCF, m_xContext );
|
|
|
|
sal_Int32 nLocaleCount = m_aLocaleItemVector.size();
|
|
Sequence< sal_Int8 >* pLocaleDataSeq = new Sequence< sal_Int8 >[ nLocaleCount ];
|
|
|
|
sal_Int32 iLocale = 0;
|
|
sal_Int32 iDefault = 0;
|
|
for( LocaleItemVectorConstIt it = m_aLocaleItemVector.begin();
|
|
it != m_aLocaleItemVector.end(); it++,iLocale++ )
|
|
{
|
|
LocaleItem* pLocaleItem = *it;
|
|
if( pLocaleItem != NULL && loadLocale( pLocaleItem ) )
|
|
{
|
|
if( m_pDefaultLocaleItem == pLocaleItem )
|
|
iDefault = iLocale;
|
|
|
|
BinaryOutput aLocaleOut( m_xMCF, m_xContext );
|
|
implWriteLocaleBinary( pLocaleItem, aLocaleOut );
|
|
|
|
pLocaleDataSeq[iLocale] = aLocaleOut.closeAndGetData();
|
|
}
|
|
}
|
|
|
|
// Write header
|
|
sal_Int16 nVersion = 0;
|
|
sal_Int16 nLocaleCount16 = (sal_Int16)nLocaleCount;
|
|
sal_Int16 iDefault16 = (sal_Int16)iDefault;
|
|
aOut.writeInt16( nVersion );
|
|
aOut.writeInt16( nLocaleCount16 );
|
|
aOut.writeInt16( iDefault16 );
|
|
|
|
// Write data positions
|
|
sal_Int32 nDataPos = 6 + 4 * (nLocaleCount + 1);
|
|
for( iLocale = 0; iLocale < nLocaleCount; iLocale++ )
|
|
{
|
|
aOut.writeInt32( nDataPos );
|
|
|
|
Sequence< sal_Int8 >& rSeq = pLocaleDataSeq[iLocale];
|
|
sal_Int32 nSeqLen = rSeq.getLength();
|
|
nDataPos += nSeqLen;
|
|
}
|
|
// Write final position
|
|
aOut.writeInt32( nDataPos );
|
|
|
|
// Write data
|
|
Reference< io::XOutputStream > xOutputStream = aOut.getOutputStream();
|
|
if( xOutputStream.is() )
|
|
{
|
|
for( iLocale = 0; iLocale < nLocaleCount; iLocale++ )
|
|
{
|
|
Sequence< sal_Int8 >& rSeq = pLocaleDataSeq[iLocale];
|
|
xOutputStream->writeBytes( rSeq );
|
|
}
|
|
}
|
|
|
|
delete[] pLocaleDataSeq;
|
|
|
|
Sequence< sal_Int8 > aRetSeq = aOut.closeAndGetData();
|
|
return aRetSeq;
|
|
}
|
|
|
|
void StringResourcePersistenceImpl::implWriteLocaleBinary
|
|
( LocaleItem* pLocaleItem, BinaryOutput& rOut )
|
|
{
|
|
Reference< io::XOutputStream > xOutputStream = rOut.getOutputStream();
|
|
if( !xOutputStream.is() )
|
|
return;
|
|
|
|
Locale& rLocale = pLocaleItem->m_locale;
|
|
rOut.writeString( rLocale.Language );
|
|
rOut.writeString( rLocale.Country );
|
|
rOut.writeString( rLocale.Variant );
|
|
implWritePropertiesFile( pLocaleItem, xOutputStream, m_aComment );
|
|
}
|
|
|
|
// -----------------------------------------------------------------------------
|
|
// BinaryOutput, helper class for exportBinary
|
|
|
|
class BinaryInput
|
|
{
|
|
Sequence< sal_Int8 > m_aData;
|
|
Reference< XMultiComponentFactory > m_xMCF;
|
|
Reference< XComponentContext > m_xContext;
|
|
|
|
const sal_Int8* m_pData;
|
|
sal_Int32 m_nCurPos;
|
|
sal_Int32 m_nSize;
|
|
|
|
public:
|
|
BinaryInput( Sequence< ::sal_Int8 > aData, Reference< XMultiComponentFactory > xMCF,
|
|
Reference< XComponentContext > xContext );
|
|
|
|
Reference< io::XInputStream > getInputStreamForSection( sal_Int32 nSize );
|
|
|
|
void seek( sal_Int32 nPos );
|
|
sal_Int32 getPosition( void ) const
|
|
{ return m_nCurPos; }
|
|
|
|
sal_Int16 readInt16( void );
|
|
sal_Int32 readInt32( void );
|
|
sal_Unicode readUnicodeChar( void );
|
|
::rtl::OUString readString( void );
|
|
};
|
|
|
|
BinaryInput::BinaryInput( Sequence< ::sal_Int8 > aData, Reference< XMultiComponentFactory > xMCF,
|
|
Reference< XComponentContext > xContext )
|
|
: m_aData( aData )
|
|
, m_xMCF( xMCF )
|
|
, m_xContext( xContext )
|
|
{
|
|
m_pData = m_aData.getConstArray();
|
|
m_nCurPos = 0;
|
|
m_nSize = m_aData.getLength();
|
|
}
|
|
|
|
Reference< io::XInputStream > BinaryInput::getInputStreamForSection( sal_Int32 nSize )
|
|
{
|
|
Reference< io::XInputStream > xIn;
|
|
if( m_nCurPos + nSize <= m_nSize )
|
|
{
|
|
Reference< io::XOutputStream > xTempOut( m_xMCF->createInstanceWithContext
|
|
( ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.io.TempFile")), m_xContext ), UNO_QUERY );
|
|
if( xTempOut.is() )
|
|
{
|
|
Sequence< sal_Int8 > aSection( m_pData + m_nCurPos, nSize );
|
|
xTempOut->writeBytes( aSection );
|
|
|
|
Reference< io::XSeekable> xSeekable( xTempOut, UNO_QUERY );
|
|
if( xSeekable.is() )
|
|
xSeekable->seek( 0 );
|
|
|
|
xIn = Reference< io::XInputStream>( xTempOut, UNO_QUERY );
|
|
}
|
|
}
|
|
else
|
|
OSL_ENSURE( false, "BinaryInput::getInputStreamForSection(): Read past end" );
|
|
|
|
return xIn;
|
|
}
|
|
|
|
void BinaryInput::seek( sal_Int32 nPos )
|
|
{
|
|
if( nPos <= m_nSize )
|
|
m_nCurPos = nPos;
|
|
else
|
|
OSL_ENSURE( false, "BinaryInput::seek(): Position past end" );
|
|
}
|
|
|
|
|
|
sal_Int16 BinaryInput::readInt16( void )
|
|
{
|
|
sal_Int16 nRet = 0;
|
|
if( m_nCurPos + 2 <= m_nSize )
|
|
{
|
|
nRet = nRet + sal_Int16( sal_uInt8( m_pData[m_nCurPos++] ) );
|
|
nRet += 256 * sal_Int16( sal_uInt8( m_pData[m_nCurPos++] ) );
|
|
}
|
|
else
|
|
OSL_ENSURE( false, "BinaryInput::readInt16(): Read past end" );
|
|
|
|
return nRet;
|
|
}
|
|
|
|
sal_Int32 BinaryInput::readInt32( void )
|
|
{
|
|
sal_Int32 nRet = 0;
|
|
if( m_nCurPos + 4 <= m_nSize )
|
|
{
|
|
sal_Int32 nFactor = 1;
|
|
for( sal_Int16 i = 0; i < 4; i++ )
|
|
{
|
|
nRet += sal_uInt8( m_pData[m_nCurPos++] ) * nFactor;
|
|
nFactor *= 256;
|
|
}
|
|
}
|
|
else
|
|
OSL_ENSURE( false, "BinaryInput::readInt32(): Read past end" );
|
|
|
|
return nRet;
|
|
}
|
|
|
|
sal_Unicode BinaryInput::readUnicodeChar( void )
|
|
{
|
|
sal_uInt16 nRet = 0;
|
|
if( m_nCurPos + 2 <= m_nSize )
|
|
{
|
|
nRet = nRet + sal_uInt8( m_pData[m_nCurPos++] );
|
|
nRet += 256 * sal_uInt8( m_pData[m_nCurPos++] );
|
|
}
|
|
else
|
|
OSL_ENSURE( false, "BinaryInput::readUnicodeChar(): Read past end" );
|
|
|
|
sal_Unicode cRet = nRet;
|
|
return cRet;
|
|
}
|
|
|
|
::rtl::OUString BinaryInput::readString( void )
|
|
{
|
|
::rtl::OUStringBuffer aBuf;
|
|
sal_Unicode c;
|
|
do
|
|
{
|
|
c = readUnicodeChar();
|
|
if( c != 0 )
|
|
aBuf.append( c );
|
|
}
|
|
while( c != 0 );
|
|
|
|
::rtl::OUString aRetStr = aBuf.makeStringAndClear();
|
|
return aRetStr;
|
|
}
|
|
|
|
void StringResourcePersistenceImpl::importBinary( const Sequence< ::sal_Int8 >& Data )
|
|
throw (IllegalArgumentException, RuntimeException)
|
|
{
|
|
// Init: Remove all locales
|
|
sal_Int32 nOldLocaleCount = 0;
|
|
do
|
|
{
|
|
Sequence< Locale > aLocaleSeq = getLocales();
|
|
nOldLocaleCount = aLocaleSeq.getLength();
|
|
if( nOldLocaleCount > 0 )
|
|
{
|
|
Locale aLocale = aLocaleSeq[0];
|
|
removeLocale( aLocale );
|
|
}
|
|
}
|
|
while( nOldLocaleCount > 0 );
|
|
|
|
// Import data
|
|
Reference< XMultiComponentFactory > xMCF = getMultiComponentFactory();
|
|
BinaryInput aIn( Data, xMCF, m_xContext );
|
|
|
|
sal_Int32 nVersion = aIn.readInt16();
|
|
(void)nVersion;
|
|
sal_Int32 nLocaleCount = aIn.readInt16();
|
|
sal_Int32 iDefault = aIn.readInt16();
|
|
(void)iDefault;
|
|
|
|
sal_Int32* pPositions = new sal_Int32[nLocaleCount + 1];
|
|
for( sal_Int32 i = 0; i < nLocaleCount + 1; i++ )
|
|
pPositions[i] = aIn.readInt32();
|
|
|
|
// Import locales
|
|
LocaleItem* pUseAsDefaultItem = NULL;
|
|
for( sal_Int32 i = 0; i < nLocaleCount; i++ )
|
|
{
|
|
sal_Int32 nPos = pPositions[i];
|
|
aIn.seek( nPos );
|
|
|
|
Locale aLocale;
|
|
aLocale.Language = aIn.readString();
|
|
aLocale.Country = aIn.readString();
|
|
aLocale.Variant = aIn.readString();
|
|
|
|
sal_Int32 nAfterStringPos = aIn.getPosition();
|
|
sal_Int32 nSize = pPositions[i+1] - nAfterStringPos;
|
|
Reference< io::XInputStream > xInput = aIn.getInputStreamForSection( nSize );
|
|
if( xInput.is() )
|
|
{
|
|
LocaleItem* pLocaleItem = new LocaleItem( aLocale );
|
|
if( iDefault == i )
|
|
pUseAsDefaultItem = pLocaleItem;
|
|
m_aLocaleItemVector.push_back( pLocaleItem );
|
|
implReadPropertiesFile( pLocaleItem, xInput );
|
|
}
|
|
}
|
|
|
|
if( pUseAsDefaultItem != NULL )
|
|
setDefaultLocale( pUseAsDefaultItem->m_locale );
|
|
|
|
delete[] pPositions;
|
|
}
|
|
|
|
|
|
// =============================================================================
|
|
// Private helper methods
|
|
|
|
bool checkNamingSceme( const ::rtl::OUString& aName, const ::rtl::OUString& aNameBase,
|
|
Locale& aLocale )
|
|
{
|
|
bool bSuccess = false;
|
|
|
|
sal_Int32 nNameLen = aName.getLength();
|
|
sal_Int32 nNameBaseLen = aNameBase.getLength();
|
|
|
|
// Name has to start with NameBase followed
|
|
// by a '_' and at least one more character
|
|
if( aName.indexOf( aNameBase ) == 0 && nNameBaseLen < nNameLen-1 &&
|
|
aName.getStr()[nNameBaseLen] == '_' )
|
|
{
|
|
bSuccess = true;
|
|
|
|
sal_Int32 iStart = nNameBaseLen + 1;
|
|
sal_Int32 iNext_ = aName.indexOf( '_', iStart );
|
|
if( iNext_ != -1 && iNext_ < nNameLen-1 )
|
|
{
|
|
aLocale.Language = aName.copy( iStart, iNext_ - iStart );
|
|
|
|
iStart = iNext_ + 1;
|
|
iNext_ = aName.indexOf( '_', iStart );
|
|
if( iNext_ != -1 && iNext_ < nNameLen-1 )
|
|
{
|
|
aLocale.Country = aName.copy( iStart, iNext_ - iStart );
|
|
aLocale.Variant = aName.copy( iNext_ + 1 );
|
|
}
|
|
else
|
|
aLocale.Country = aName.copy( iStart );
|
|
}
|
|
else
|
|
aLocale.Language = aName.copy( iStart );
|
|
}
|
|
return bSuccess;
|
|
}
|
|
|
|
void StringResourcePersistenceImpl::implLoadAllLocales( void )
|
|
{
|
|
for( LocaleItemVectorIt it = m_aLocaleItemVector.begin(); it != m_aLocaleItemVector.end(); it++ )
|
|
{
|
|
LocaleItem* pLocaleItem = *it;
|
|
if( pLocaleItem != NULL )
|
|
loadLocale( pLocaleItem );
|
|
}
|
|
}
|
|
|
|
// Scan locale properties files helper
|
|
void StringResourcePersistenceImpl::implScanLocaleNames( const Sequence< ::rtl::OUString >& aContentSeq )
|
|
{
|
|
Locale aDefaultLocale;
|
|
bool bDefaultFound = false;
|
|
|
|
sal_Int32 nCount = aContentSeq.getLength();
|
|
const ::rtl::OUString* pFiles = aContentSeq.getConstArray();
|
|
for( int i = 0 ; i < nCount ; i++ )
|
|
{
|
|
::rtl::OUString aCompleteName = pFiles[i];
|
|
rtl::OUString aPureName;
|
|
rtl::OUString aExtension;
|
|
sal_Int32 iDot = aCompleteName.lastIndexOf( '.' );
|
|
sal_Int32 iSlash = aCompleteName.lastIndexOf( '/' );
|
|
if( iDot != -1 )
|
|
{
|
|
sal_Int32 iCopyFrom = (iSlash != -1) ? iSlash + 1 : 0;
|
|
aPureName = aCompleteName.copy( iCopyFrom, iDot-iCopyFrom );
|
|
aExtension = aCompleteName.copy( iDot + 1 );
|
|
}
|
|
|
|
if( aExtension.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "properties" ) ) )
|
|
{
|
|
//rtl::OUString aName = aInetObj.getBase();
|
|
Locale aLocale;
|
|
|
|
if( checkNamingSceme( aPureName, m_aNameBase, aLocale ) )
|
|
{
|
|
LocaleItem* pLocaleItem = new LocaleItem( aLocale, false );
|
|
m_aLocaleItemVector.push_back( pLocaleItem );
|
|
|
|
if( m_pCurrentLocaleItem == NULL )
|
|
m_pCurrentLocaleItem = pLocaleItem;
|
|
|
|
if( m_pDefaultLocaleItem == NULL )
|
|
{
|
|
m_pDefaultLocaleItem = pLocaleItem;
|
|
m_bDefaultModified = true;
|
|
}
|
|
}
|
|
}
|
|
else if( !bDefaultFound && aExtension.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "default" ) ) )
|
|
{
|
|
//rtl::OUString aName = aInetObj.getBase();
|
|
Locale aLocale;
|
|
|
|
if( checkNamingSceme( aPureName, m_aNameBase, aDefaultLocale ) )
|
|
bDefaultFound = true;
|
|
}
|
|
}
|
|
if( bDefaultFound )
|
|
{
|
|
LocaleItem* pLocaleItem = getItemForLocale( aDefaultLocale, false );
|
|
if( pLocaleItem )
|
|
{
|
|
m_pDefaultLocaleItem = pLocaleItem;
|
|
m_bDefaultModified = false;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Scan locale properties files
|
|
void StringResourcePersistenceImpl::implScanLocales( void )
|
|
{
|
|
// Dummy implementation, method not called for this
|
|
// base class, but pure virtual not possible-
|
|
}
|
|
|
|
bool StringResourcePersistenceImpl::loadLocale( LocaleItem* pLocaleItem )
|
|
{
|
|
bool bSuccess = false;
|
|
|
|
OSL_ENSURE( pLocaleItem, "StringResourcePersistenceImpl::loadLocale(): pLocaleItem == NULL" );
|
|
if( pLocaleItem )
|
|
{
|
|
if( pLocaleItem->m_bLoaded )
|
|
{
|
|
bSuccess = true;
|
|
}
|
|
else
|
|
{
|
|
bSuccess = implLoadLocale( pLocaleItem );
|
|
pLocaleItem->m_bLoaded = true; // = bSuccess??? -> leads to more tries
|
|
}
|
|
}
|
|
return bSuccess;
|
|
}
|
|
|
|
bool StringResourcePersistenceImpl::implLoadLocale( LocaleItem* )
|
|
{
|
|
// Dummy implementation, method not called for this
|
|
// base class, but pure virtual not possible-
|
|
return false;
|
|
}
|
|
|
|
::rtl::OUString implGetNameScemeForLocaleItem( const LocaleItem* pLocaleItem )
|
|
{
|
|
static ::rtl::OUString aUnder(RTL_CONSTASCII_USTRINGPARAM("_"));
|
|
|
|
OSL_ENSURE( pLocaleItem,
|
|
"StringResourcePersistenceImpl::implGetNameScemeForLocaleItem(): pLocaleItem == NULL" );
|
|
Locale aLocale = pLocaleItem->m_locale;
|
|
|
|
::rtl::OUString aRetStr = aUnder;
|
|
aRetStr += aLocale.Language;
|
|
|
|
::rtl::OUString aCountry = aLocale.Country;
|
|
if( aCountry.getLength() )
|
|
{
|
|
aRetStr += aUnder;
|
|
aRetStr += aCountry;
|
|
}
|
|
|
|
::rtl::OUString aVariant = aLocale.Variant;
|
|
if( aVariant.getLength() )
|
|
{
|
|
aRetStr += aUnder;
|
|
aRetStr += aVariant;
|
|
}
|
|
return aRetStr;
|
|
}
|
|
|
|
::rtl::OUString StringResourcePersistenceImpl::implGetFileNameForLocaleItem
|
|
( LocaleItem* pLocaleItem, const ::rtl::OUString& aNameBase )
|
|
{
|
|
::rtl::OUString aFileName = aNameBase;
|
|
if( aFileName.getLength() == 0 )
|
|
aFileName = aNameBaseDefaultStr;
|
|
|
|
aFileName += implGetNameScemeForLocaleItem( pLocaleItem );
|
|
return aFileName;
|
|
}
|
|
|
|
::rtl::OUString StringResourcePersistenceImpl::implGetPathForLocaleItem
|
|
( LocaleItem* pLocaleItem, const ::rtl::OUString& aNameBase,
|
|
const ::rtl::OUString& aLocation, bool bDefaultFile )
|
|
{
|
|
::rtl::OUString aFileName = implGetFileNameForLocaleItem( pLocaleItem, aNameBase );
|
|
INetURLObject aInetObj( aLocation );
|
|
aInetObj.insertName( aFileName, sal_True, INetURLObject::LAST_SEGMENT, sal_True, INetURLObject::ENCODE_ALL );
|
|
if( bDefaultFile )
|
|
aInetObj.setExtension( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("default") ) );
|
|
else
|
|
aInetObj.setExtension( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("properties") ) );
|
|
::rtl::OUString aCompleteFileName = aInetObj.GetMainURL( INetURLObject::NO_DECODE );
|
|
return aCompleteFileName;
|
|
}
|
|
|
|
// White space according to Java property files specification in
|
|
// http://java.sun.com/j2se/1.4.2/docs/api/java/util/Properties.html#load(java.io.InputStream)
|
|
inline bool isWhiteSpace( sal_Unicode c )
|
|
{
|
|
bool bWhite = ( c == 0x0020 || // space
|
|
c == 0x0009 || // tab
|
|
c == 0x000a || // line feed, not always handled by TextInputStream
|
|
c == 0x000d || // carriage return, not always handled by TextInputStream
|
|
c == 0x000C ); // form feed
|
|
return bWhite;
|
|
}
|
|
|
|
inline void skipWhites( const sal_Unicode* pBuf, sal_Int32 nLen, sal_Int32& ri )
|
|
{
|
|
while( ri < nLen )
|
|
{
|
|
if( !isWhiteSpace( pBuf[ri] ) )
|
|
break;
|
|
ri++;
|
|
}
|
|
}
|
|
|
|
inline bool isHexDigit( sal_Unicode c, sal_uInt16& nDigitVal )
|
|
{
|
|
bool bRet = true;
|
|
if( c >= '0' && c <= '9' )
|
|
nDigitVal = c - '0';
|
|
else if( c >= 'a' && c <= 'f' )
|
|
nDigitVal = c - 'a' + 10;
|
|
else if( c >= 'A' && c <= 'F' )
|
|
nDigitVal = c - 'A' + 10;
|
|
else
|
|
bRet = false;
|
|
return bRet;
|
|
}
|
|
|
|
sal_Unicode getEscapeChar( const sal_Unicode* pBuf, sal_Int32 nLen, sal_Int32& ri )
|
|
{
|
|
sal_Int32 i = ri;
|
|
|
|
sal_Unicode cRet = 0;
|
|
sal_Unicode c = pBuf[i];
|
|
switch( c )
|
|
{
|
|
case 't':
|
|
cRet = 0x0009;
|
|
break;
|
|
case 'n':
|
|
cRet = 0x000a;
|
|
break;
|
|
case 'f':
|
|
cRet = 0x000c;
|
|
break;
|
|
case 'r':
|
|
cRet = 0x000d;
|
|
break;
|
|
case '\\':
|
|
cRet = '\\';
|
|
break;
|
|
case 'u':
|
|
{
|
|
// Skip multiple u
|
|
i++;
|
|
while( i < nLen && pBuf[i] == 'u' )
|
|
i++;
|
|
|
|
// Process hex digits
|
|
sal_Int32 nDigitCount = 0;
|
|
sal_uInt16 nDigitVal;
|
|
while( i < nLen && isHexDigit( pBuf[i], nDigitVal ) )
|
|
{
|
|
cRet = 16 * cRet + nDigitVal;
|
|
|
|
nDigitCount++;
|
|
if( nDigitCount == 4 )
|
|
{
|
|
// Write back position
|
|
ri = i;
|
|
break;
|
|
}
|
|
i++;
|
|
}
|
|
break;
|
|
}
|
|
default:
|
|
cRet = c;
|
|
}
|
|
|
|
return cRet;
|
|
}
|
|
|
|
void CheckContinueInNextLine( Reference< io::XTextInputStream > xTextInputStream,
|
|
::rtl::OUString& aLine, bool& bEscapePending, const sal_Unicode*& pBuf,
|
|
sal_Int32& nLen, sal_Int32& i )
|
|
{
|
|
if( i == nLen && bEscapePending )
|
|
{
|
|
bEscapePending = false;
|
|
|
|
if( !xTextInputStream->isEOF() )
|
|
{
|
|
aLine = xTextInputStream->readLine();
|
|
nLen = aLine.getLength();
|
|
pBuf = aLine.getStr();
|
|
i = 0;
|
|
|
|
skipWhites( pBuf, nLen, i );
|
|
}
|
|
}
|
|
}
|
|
|
|
bool StringResourcePersistenceImpl::implReadPropertiesFile
|
|
( LocaleItem* pLocaleItem, const Reference< io::XInputStream >& xInputStream )
|
|
{
|
|
if( !xInputStream.is() || pLocaleItem == NULL )
|
|
return false;
|
|
|
|
bool bSuccess = false;
|
|
Reference< XMultiComponentFactory > xMCF = getMultiComponentFactory();
|
|
Reference< io::XTextInputStream > xTextInputStream( xMCF->createInstanceWithContext
|
|
( ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.io.TextInputStream")), m_xContext ), UNO_QUERY );
|
|
|
|
if( xTextInputStream.is() )
|
|
{
|
|
Reference< io::XActiveDataSink> xActiveDataSink( xTextInputStream, UNO_QUERY );
|
|
if( xActiveDataSink.is() )
|
|
{
|
|
bSuccess = true;
|
|
|
|
xActiveDataSink->setInputStream( xInputStream );
|
|
|
|
::rtl::OUString aEncodingStr = ::rtl::OUString::createFromAscii
|
|
( rtl_getMimeCharsetFromTextEncoding( RTL_TEXTENCODING_ISO_8859_1 ) );
|
|
xTextInputStream->setEncoding( aEncodingStr );
|
|
|
|
::rtl::OUString aLine;
|
|
while( !xTextInputStream->isEOF() )
|
|
{
|
|
aLine = xTextInputStream->readLine();
|
|
|
|
sal_Int32 nLen = aLine.getLength();
|
|
if( 0 == nLen )
|
|
continue;
|
|
const sal_Unicode* pBuf = aLine.getStr();
|
|
::rtl::OUStringBuffer aBuf;
|
|
sal_Unicode c = 0;
|
|
sal_Int32 i = 0;
|
|
|
|
skipWhites( pBuf, nLen, i );
|
|
if( i == nLen )
|
|
continue; // line contains only white spaces
|
|
|
|
// Comment?
|
|
c = pBuf[i];
|
|
if( c == '#' || c == '!' )
|
|
continue;
|
|
|
|
// Scan key
|
|
::rtl::OUString aResourceID;
|
|
bool bEscapePending = false;
|
|
bool bStrComplete = false;
|
|
while( i < nLen && !bStrComplete )
|
|
{
|
|
c = pBuf[i];
|
|
if( bEscapePending )
|
|
{
|
|
aBuf.append( getEscapeChar( pBuf, nLen, i ) );
|
|
bEscapePending = false;
|
|
}
|
|
else
|
|
{
|
|
if( c == '\\' )
|
|
{
|
|
bEscapePending = true;
|
|
}
|
|
else
|
|
{
|
|
if( c == ':' || c == '=' || isWhiteSpace( c ) )
|
|
bStrComplete = true;
|
|
else
|
|
aBuf.append( c );
|
|
}
|
|
}
|
|
i++;
|
|
|
|
CheckContinueInNextLine( xTextInputStream, aLine, bEscapePending, pBuf, nLen, i );
|
|
if( i == nLen )
|
|
bStrComplete = true;
|
|
|
|
if( bStrComplete )
|
|
aResourceID = aBuf.makeStringAndClear();
|
|
}
|
|
|
|
// Ignore lines with empty keys
|
|
if( 0 == aResourceID.getLength() )
|
|
continue;
|
|
|
|
// Scan value
|
|
skipWhites( pBuf, nLen, i );
|
|
|
|
::rtl::OUString aValueStr;
|
|
bEscapePending = false;
|
|
bStrComplete = false;
|
|
while( i < nLen && !bStrComplete )
|
|
{
|
|
c = pBuf[i];
|
|
if( c == 0x000a || c == 0x000d ) // line feed/carriage return, not always handled by TextInputStream
|
|
{
|
|
i++;
|
|
}
|
|
else
|
|
{
|
|
if( bEscapePending )
|
|
{
|
|
aBuf.append( getEscapeChar( pBuf, nLen, i ) );
|
|
bEscapePending = false;
|
|
}
|
|
else if( c == '\\' )
|
|
bEscapePending = true;
|
|
else
|
|
aBuf.append( c );
|
|
i++;
|
|
|
|
CheckContinueInNextLine( xTextInputStream, aLine, bEscapePending, pBuf, nLen, i );
|
|
}
|
|
if( i == nLen )
|
|
bStrComplete = true;
|
|
|
|
if( bStrComplete )
|
|
aValueStr = aBuf.makeStringAndClear();
|
|
}
|
|
|
|
// Push into table
|
|
pLocaleItem->m_aIdToStringMap[ aResourceID ] = aValueStr;
|
|
implScanIdForNumber( aResourceID );
|
|
IdToIndexMap& rIndexMap = pLocaleItem->m_aIdToIndexMap;
|
|
rIndexMap[ aResourceID ] = pLocaleItem->m_nNextIndex++;
|
|
}
|
|
}
|
|
}
|
|
|
|
return bSuccess;
|
|
}
|
|
|
|
|
|
inline sal_Unicode getHexCharForDigit( sal_uInt16 nDigitVal )
|
|
{
|
|
sal_Unicode cRet = ( nDigitVal < 10 ) ? ('0' + nDigitVal) : ('a' + (nDigitVal-10));
|
|
return cRet;
|
|
}
|
|
|
|
void implWriteCharToBuffer( ::rtl::OUStringBuffer& aBuf, sal_Unicode cu, bool bKey )
|
|
{
|
|
if( cu == '\\' )
|
|
{
|
|
aBuf.append( (sal_Unicode)'\\' );
|
|
aBuf.append( (sal_Unicode)'\\' );
|
|
}
|
|
else if( cu == 0x000a )
|
|
{
|
|
aBuf.append( (sal_Unicode)'\\' );
|
|
aBuf.append( (sal_Unicode)'n' );
|
|
}
|
|
else if( cu == 0x000d )
|
|
{
|
|
aBuf.append( (sal_Unicode)'\\' );
|
|
aBuf.append( (sal_Unicode)'r' );
|
|
}
|
|
else if( bKey && cu == '=' )
|
|
{
|
|
aBuf.append( (sal_Unicode)'\\' );
|
|
aBuf.append( (sal_Unicode)'=' );
|
|
}
|
|
else if( bKey && cu == ':' )
|
|
{
|
|
aBuf.append( (sal_Unicode)'\\' );
|
|
aBuf.append( (sal_Unicode)':' );
|
|
}
|
|
// ISO/IEC 8859-1 range according to:
|
|
// http://en.wikipedia.org/wiki/ISO/IEC_8859-1
|
|
else if( (cu >= 0x20 && cu <= 0x7e) )
|
|
//TODO: Check why (cu >= 0xa0 && cu <= 0xFF)
|
|
//is encoded in sample properties files
|
|
//else if( (cu >= 0x20 && cu <= 0x7e) ||
|
|
// (cu >= 0xa0 && cu <= 0xFF) )
|
|
{
|
|
aBuf.append( cu );
|
|
}
|
|
else
|
|
{
|
|
// Unicode encoding
|
|
aBuf.append( (sal_Unicode)'\\' );
|
|
aBuf.append( (sal_Unicode)'u' );
|
|
|
|
sal_uInt16 nVal = cu;
|
|
for( sal_uInt16 i = 0 ; i < 4 ; i++ )
|
|
{
|
|
sal_uInt16 nDigit = nVal / 0x1000;
|
|
nVal -= nDigit * 0x1000;
|
|
nVal *= 0x10;
|
|
aBuf.append( getHexCharForDigit( nDigit ) );
|
|
}
|
|
}
|
|
}
|
|
|
|
void implWriteStringWithEncoding( const ::rtl::OUString& aStr,
|
|
Reference< io::XTextOutputStream > xTextOutputStream, bool bKey )
|
|
{
|
|
static sal_Unicode cLineFeed = 0xa;
|
|
|
|
(void)aStr;
|
|
(void)xTextOutputStream;
|
|
|
|
::rtl::OUStringBuffer aBuf;
|
|
sal_Int32 nLen = aStr.getLength();
|
|
const sal_Unicode* pSrc = aStr.getStr();
|
|
for( sal_Int32 i = 0 ; i < nLen ; i++ )
|
|
{
|
|
sal_Unicode cu = pSrc[i];
|
|
implWriteCharToBuffer( aBuf, cu, bKey );
|
|
// TODO?: split long lines
|
|
}
|
|
if( !bKey )
|
|
aBuf.append( cLineFeed );
|
|
|
|
::rtl::OUString aWriteStr = aBuf.makeStringAndClear();
|
|
xTextOutputStream->writeString( aWriteStr );
|
|
}
|
|
|
|
bool StringResourcePersistenceImpl::implWritePropertiesFile( LocaleItem* pLocaleItem,
|
|
const Reference< io::XOutputStream >& xOutputStream, const ::rtl::OUString& aComment )
|
|
{
|
|
static ::rtl::OUString aAssignmentStr(RTL_CONSTASCII_USTRINGPARAM("="));
|
|
static ::rtl::OUString aLineFeedStr(RTL_CONSTASCII_USTRINGPARAM("\n"));
|
|
|
|
if( !xOutputStream.is() || pLocaleItem == NULL )
|
|
return false;
|
|
|
|
bool bSuccess = false;
|
|
Reference< XMultiComponentFactory > xMCF = getMultiComponentFactory();
|
|
Reference< io::XTextOutputStream > xTextOutputStream( xMCF->createInstanceWithContext
|
|
( ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.io.TextOutputStream")), m_xContext ), UNO_QUERY );
|
|
|
|
if( xTextOutputStream.is() )
|
|
{
|
|
Reference< io::XActiveDataSource> xActiveDataSource( xTextOutputStream, UNO_QUERY );
|
|
if( xActiveDataSource.is() )
|
|
{
|
|
xActiveDataSource->setOutputStream( xOutputStream );
|
|
|
|
::rtl::OUString aEncodingStr = ::rtl::OUString::createFromAscii
|
|
( rtl_getMimeCharsetFromTextEncoding( RTL_TEXTENCODING_ISO_8859_1 ) );
|
|
xTextOutputStream->setEncoding( aEncodingStr );
|
|
|
|
xTextOutputStream->writeString( aComment );
|
|
xTextOutputStream->writeString( aLineFeedStr );
|
|
|
|
const IdToStringMap& rHashMap = pLocaleItem->m_aIdToStringMap;
|
|
if( rHashMap.size() > 0 )
|
|
{
|
|
// Sort ids according to read order
|
|
const IdToIndexMap& rIndexMap = pLocaleItem->m_aIdToIndexMap;
|
|
IdToIndexMap::const_iterator it_index;
|
|
|
|
// Find max/min index
|
|
sal_Int32 nMinIndex = -1;
|
|
sal_Int32 nMaxIndex = -1;
|
|
for( it_index = rIndexMap.begin(); it_index != rIndexMap.end(); ++it_index )
|
|
{
|
|
sal_Int32 nIndex = (*it_index).second;
|
|
if( nMinIndex > nIndex || nMinIndex == -1 )
|
|
nMinIndex = nIndex;
|
|
if( nMaxIndex < nIndex )
|
|
nMaxIndex = nIndex;
|
|
}
|
|
sal_Int32 nTabSize = nMaxIndex - nMinIndex + 1;
|
|
|
|
// Create sorted array of pointers to the id strings
|
|
const ::rtl::OUString** pIdPtrs = new const ::rtl::OUString*[nTabSize];
|
|
sal_Int32 i;
|
|
for( i = 0 ; i < nTabSize ; i++ )
|
|
pIdPtrs[i] = NULL;
|
|
for( it_index = rIndexMap.begin(); it_index != rIndexMap.end(); ++it_index )
|
|
{
|
|
sal_Int32 nIndex = (*it_index).second;
|
|
pIdPtrs[nIndex - nMinIndex] = &((*it_index).first);
|
|
}
|
|
|
|
// Write lines in correct order
|
|
for( i = 0 ; i < nTabSize ; i++ )
|
|
{
|
|
const ::rtl::OUString* pStr = pIdPtrs[i];
|
|
if( pStr != NULL )
|
|
{
|
|
::rtl::OUString aResourceID = *pStr;
|
|
IdToStringMap::const_iterator it = rHashMap.find( aResourceID );
|
|
if( !( it == rHashMap.end() ) )
|
|
{
|
|
implWriteStringWithEncoding( aResourceID, xTextOutputStream, true );
|
|
xTextOutputStream->writeString( aAssignmentStr );
|
|
::rtl::OUString aValStr = (*it).second;
|
|
implWriteStringWithEncoding( aValStr, xTextOutputStream, false );
|
|
}
|
|
}
|
|
}
|
|
|
|
delete pIdPtrs;
|
|
}
|
|
|
|
bSuccess = true;
|
|
}
|
|
}
|
|
return bSuccess;
|
|
}
|
|
|
|
|
|
// =============================================================================
|
|
// StringResourceWithStorageImpl
|
|
// =============================================================================
|
|
|
|
// component operations
|
|
static Sequence< ::rtl::OUString > getSupportedServiceNames_StringResourceWithStorageImpl()
|
|
{
|
|
Sequence< ::rtl::OUString > names(1);
|
|
names[0] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.resource.StringResourceWithStorage") );
|
|
return names;
|
|
}
|
|
|
|
static ::rtl::OUString getImplementationName_StringResourceWithStorageImpl()
|
|
{
|
|
return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.scripting.StringResourceWithStorage") );
|
|
}
|
|
|
|
static Reference< XInterface > SAL_CALL create_StringResourceWithStorageImpl(
|
|
Reference< XComponentContext > const & xContext )
|
|
SAL_THROW( () )
|
|
{
|
|
return static_cast< ::cppu::OWeakObject * >( new StringResourceWithStorageImpl( xContext ) );
|
|
}
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
StringResourceWithStorageImpl::StringResourceWithStorageImpl( const Reference< XComponentContext >& rxContext )
|
|
: StringResourceWithStorageImpl_BASE( rxContext )
|
|
, m_bStorageChanged( false )
|
|
{
|
|
}
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
StringResourceWithStorageImpl::~StringResourceWithStorageImpl()
|
|
{
|
|
}
|
|
|
|
// -----------------------------------------------------------------------------
|
|
// XServiceInfo
|
|
// -----------------------------------------------------------------------------
|
|
|
|
::rtl::OUString StringResourceWithStorageImpl::getImplementationName( ) throw (RuntimeException)
|
|
{
|
|
return getImplementationName_StringResourceWithStorageImpl();
|
|
}
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
sal_Bool StringResourceWithStorageImpl::supportsService( const ::rtl::OUString& rServiceName ) throw (RuntimeException)
|
|
{
|
|
Sequence< ::rtl::OUString > aNames( getSupportedServiceNames() );
|
|
const ::rtl::OUString* pNames = aNames.getConstArray();
|
|
const ::rtl::OUString* pEnd = pNames + aNames.getLength();
|
|
for ( ; pNames != pEnd && !pNames->equals( rServiceName ); ++pNames )
|
|
;
|
|
|
|
return pNames != pEnd;
|
|
}
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
Sequence< ::rtl::OUString > StringResourceWithStorageImpl::getSupportedServiceNames( ) throw (RuntimeException)
|
|
{
|
|
return getSupportedServiceNames_StringResourceWithStorageImpl();
|
|
}
|
|
|
|
// -----------------------------------------------------------------------------
|
|
// XInitialization
|
|
// -----------------------------------------------------------------------------
|
|
|
|
void StringResourceWithStorageImpl::initialize( const Sequence< Any >& aArguments )
|
|
throw (Exception, RuntimeException)
|
|
{
|
|
::osl::MutexGuard aGuard( getMutex() );
|
|
|
|
if ( aArguments.getLength() != 5 )
|
|
{
|
|
throw RuntimeException(
|
|
::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "StringResourceWithStorageImpl::initialize: invalid number of arguments!" ) ),
|
|
Reference< XInterface >() );
|
|
}
|
|
|
|
bool bOk = (aArguments[0] >>= m_xStorage);
|
|
if( bOk && !m_xStorage.is() )
|
|
bOk = false;
|
|
|
|
if( !bOk )
|
|
{
|
|
::rtl::OUString errorMsg(RTL_CONSTASCII_USTRINGPARAM("StringResourceWithStorageImpl::initialize: invalid storage"));
|
|
throw IllegalArgumentException( errorMsg, Reference< XInterface >(), 0 );
|
|
}
|
|
|
|
implInitializeCommonParameters( aArguments );
|
|
}
|
|
|
|
// -----------------------------------------------------------------------------
|
|
// Forwarding calls to base class
|
|
|
|
// XModifyBroadcaster
|
|
void StringResourceWithStorageImpl::addModifyListener( const Reference< XModifyListener >& aListener )
|
|
throw (RuntimeException)
|
|
{
|
|
StringResourceImpl::addModifyListener( aListener );
|
|
}
|
|
void StringResourceWithStorageImpl::removeModifyListener( const Reference< XModifyListener >& aListener )
|
|
throw (RuntimeException)
|
|
{
|
|
StringResourceImpl::removeModifyListener( aListener );
|
|
}
|
|
|
|
// XStringResourceResolver
|
|
::rtl::OUString StringResourceWithStorageImpl::resolveString( const ::rtl::OUString& ResourceID )
|
|
throw (::com::sun::star::resource::MissingResourceException, RuntimeException)
|
|
{
|
|
return StringResourceImpl::resolveString( ResourceID ) ;
|
|
}
|
|
::rtl::OUString StringResourceWithStorageImpl::resolveStringForLocale( const ::rtl::OUString& ResourceID, const Locale& locale )
|
|
throw ( ::com::sun::star::resource::MissingResourceException, RuntimeException)
|
|
{
|
|
return StringResourceImpl::resolveStringForLocale( ResourceID, locale );
|
|
}
|
|
sal_Bool StringResourceWithStorageImpl::hasEntryForId( const ::rtl::OUString& ResourceID )
|
|
throw (RuntimeException)
|
|
{
|
|
return StringResourceImpl::hasEntryForId( ResourceID ) ;
|
|
}
|
|
sal_Bool StringResourceWithStorageImpl::hasEntryForIdAndLocale( const ::rtl::OUString& ResourceID,
|
|
const Locale& locale )
|
|
throw (RuntimeException)
|
|
{
|
|
return StringResourceImpl::hasEntryForIdAndLocale( ResourceID, locale );
|
|
}
|
|
Sequence< ::rtl::OUString > StringResourceWithStorageImpl::getResourceIDs( )
|
|
throw (RuntimeException)
|
|
{
|
|
return StringResourceImpl::getResourceIDs();
|
|
}
|
|
Sequence< ::rtl::OUString > StringResourceWithStorageImpl::getResourceIDsForLocale
|
|
( const Locale& locale ) throw (::com::sun::star::uno::RuntimeException)
|
|
{
|
|
return StringResourceImpl::getResourceIDsForLocale( locale );
|
|
}
|
|
Locale StringResourceWithStorageImpl::getCurrentLocale()
|
|
throw (RuntimeException)
|
|
{
|
|
return StringResourceImpl::getCurrentLocale();
|
|
}
|
|
Locale StringResourceWithStorageImpl::getDefaultLocale( )
|
|
throw (RuntimeException)
|
|
{
|
|
return StringResourceImpl::getDefaultLocale();
|
|
}
|
|
Sequence< Locale > StringResourceWithStorageImpl::getLocales( )
|
|
throw (RuntimeException)
|
|
{
|
|
return StringResourceImpl::getLocales();
|
|
}
|
|
|
|
// XStringResourceManager
|
|
sal_Bool StringResourceWithStorageImpl::isReadOnly()
|
|
throw (RuntimeException)
|
|
{
|
|
return StringResourceImpl::isReadOnly();
|
|
}
|
|
void StringResourceWithStorageImpl::setCurrentLocale( const Locale& locale, sal_Bool FindClosestMatch )
|
|
throw (IllegalArgumentException, RuntimeException)
|
|
{
|
|
StringResourceImpl::setCurrentLocale( locale, FindClosestMatch );
|
|
}
|
|
void StringResourceWithStorageImpl::setDefaultLocale( const Locale& locale )
|
|
throw (IllegalArgumentException, RuntimeException,NoSupportException)
|
|
{
|
|
StringResourceImpl::setDefaultLocale( locale );
|
|
}
|
|
void StringResourceWithStorageImpl::setString( const ::rtl::OUString& ResourceID, const ::rtl::OUString& Str )
|
|
throw (NoSupportException, RuntimeException)
|
|
{
|
|
StringResourceImpl::setString( ResourceID, Str );
|
|
}
|
|
void StringResourceWithStorageImpl::setStringForLocale
|
|
( const ::rtl::OUString& ResourceID, const ::rtl::OUString& Str, const Locale& locale )
|
|
throw (NoSupportException, RuntimeException)
|
|
{
|
|
StringResourceImpl::setStringForLocale( ResourceID, Str, locale );
|
|
}
|
|
void StringResourceWithStorageImpl::removeId( const ::rtl::OUString& ResourceID )
|
|
throw (::com::sun::star::resource::MissingResourceException, RuntimeException, NoSupportException)
|
|
{
|
|
StringResourceImpl::removeId( ResourceID );
|
|
}
|
|
void StringResourceWithStorageImpl::removeIdForLocale( const ::rtl::OUString& ResourceID, const Locale& locale )
|
|
throw (::com::sun::star::resource::MissingResourceException, RuntimeException, NoSupportException)
|
|
{
|
|
StringResourceImpl::removeIdForLocale( ResourceID, locale );
|
|
}
|
|
void StringResourceWithStorageImpl::newLocale( const Locale& locale )
|
|
throw (ElementExistException, IllegalArgumentException, RuntimeException, NoSupportException)
|
|
{
|
|
StringResourceImpl::newLocale( locale );
|
|
}
|
|
void StringResourceWithStorageImpl::removeLocale( const Locale& locale )
|
|
throw (IllegalArgumentException, RuntimeException, NoSupportException)
|
|
{
|
|
StringResourceImpl::removeLocale( locale );
|
|
}
|
|
sal_Int32 StringResourceWithStorageImpl::getUniqueNumericId( )
|
|
throw (RuntimeException, NoSupportException)
|
|
{
|
|
return StringResourceImpl::getUniqueNumericId();
|
|
}
|
|
|
|
// XStringResourcePersistence
|
|
void StringResourceWithStorageImpl::store()
|
|
throw (NoSupportException, Exception, RuntimeException)
|
|
{
|
|
::osl::MutexGuard aGuard( getMutex() );
|
|
implCheckReadOnly( "StringResourceWithStorageImpl::store(): Read only" );
|
|
|
|
bool bUsedForStore = true;
|
|
bool bStoreAll = m_bStorageChanged;
|
|
m_bStorageChanged = false;
|
|
if( !m_bModified && !bStoreAll )
|
|
return;
|
|
|
|
implStoreAtStorage( m_aNameBase, m_aComment, m_xStorage, bUsedForStore, bStoreAll );
|
|
m_bModified = false;
|
|
}
|
|
|
|
sal_Bool StringResourceWithStorageImpl::isModified( )
|
|
throw (RuntimeException)
|
|
{
|
|
return StringResourcePersistenceImpl::isModified();
|
|
}
|
|
void StringResourceWithStorageImpl::setComment( const ::rtl::OUString& Comment )
|
|
throw (::com::sun::star::uno::RuntimeException)
|
|
{
|
|
StringResourcePersistenceImpl::setComment( Comment );
|
|
}
|
|
void StringResourceWithStorageImpl::storeToStorage( const Reference< XStorage >& Storage,
|
|
const ::rtl::OUString& NameBase, const ::rtl::OUString& Comment )
|
|
throw (Exception, RuntimeException)
|
|
{
|
|
StringResourcePersistenceImpl::storeToStorage( Storage, NameBase, Comment );
|
|
}
|
|
void StringResourceWithStorageImpl::storeToURL( const ::rtl::OUString& URL,
|
|
const ::rtl::OUString& NameBase, const ::rtl::OUString& Comment,
|
|
const Reference< ::com::sun::star::task::XInteractionHandler >& Handler )
|
|
throw (Exception, RuntimeException)
|
|
{
|
|
StringResourcePersistenceImpl::storeToURL( URL, NameBase, Comment, Handler );
|
|
}
|
|
Sequence< ::sal_Int8 > StringResourceWithStorageImpl::exportBinary( )
|
|
throw (RuntimeException)
|
|
{
|
|
return StringResourcePersistenceImpl::exportBinary();
|
|
}
|
|
void StringResourceWithStorageImpl::importBinary( const Sequence< ::sal_Int8 >& Data )
|
|
throw (IllegalArgumentException, RuntimeException)
|
|
{
|
|
StringResourcePersistenceImpl::importBinary( Data );
|
|
}
|
|
|
|
// -----------------------------------------------------------------------------
|
|
// XStringResourceWithStorage
|
|
|
|
void StringResourceWithStorageImpl::storeAsStorage( const Reference< XStorage >& Storage )
|
|
throw (Exception, RuntimeException)
|
|
{
|
|
setStorage( Storage );
|
|
store();
|
|
}
|
|
|
|
void StringResourceWithStorageImpl::setStorage( const Reference< XStorage >& Storage )
|
|
throw (IllegalArgumentException, RuntimeException)
|
|
{
|
|
::osl::MutexGuard aGuard( getMutex() );
|
|
|
|
if( !Storage.is() )
|
|
{
|
|
::rtl::OUString errorMsg(RTL_CONSTASCII_USTRINGPARAM
|
|
( "StringResourceWithStorageImpl::setStorage: invalid storage" ));
|
|
throw IllegalArgumentException( errorMsg, Reference< XInterface >(), 0 );
|
|
}
|
|
|
|
implLoadAllLocales();
|
|
|
|
m_xStorage = Storage;
|
|
m_bStorageChanged = true;
|
|
}
|
|
|
|
|
|
// =============================================================================
|
|
// Private helper methods
|
|
// =============================================================================
|
|
|
|
// Scan locale properties files
|
|
void StringResourceWithStorageImpl::implScanLocales( void )
|
|
{
|
|
Reference< container::XNameAccess > xNameAccess( m_xStorage, UNO_QUERY );
|
|
if( xNameAccess.is() )
|
|
{
|
|
Sequence< ::rtl::OUString > aContentSeq = xNameAccess->getElementNames();
|
|
implScanLocaleNames( aContentSeq );
|
|
}
|
|
|
|
implLoadAllLocales();
|
|
}
|
|
|
|
// Loading
|
|
bool StringResourceWithStorageImpl::implLoadLocale( LocaleItem* pLocaleItem )
|
|
{
|
|
bool bSuccess = false;
|
|
try
|
|
{
|
|
::rtl::OUString aStreamName = implGetFileNameForLocaleItem( pLocaleItem, m_aNameBase );
|
|
aStreamName += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(".properties") );
|
|
|
|
Reference< io::XStream > xElementStream =
|
|
m_xStorage->openStreamElement( aStreamName, ElementModes::READ );
|
|
|
|
if( xElementStream.is() )
|
|
{
|
|
Reference< io::XInputStream > xInputStream = xElementStream->getInputStream();
|
|
if( xInputStream.is() )
|
|
{
|
|
bSuccess = StringResourcePersistenceImpl::implReadPropertiesFile( pLocaleItem, xInputStream );
|
|
xInputStream->closeInput();
|
|
}
|
|
}
|
|
}
|
|
catch( uno::Exception& )
|
|
{}
|
|
|
|
return bSuccess;
|
|
}
|
|
|
|
|
|
// =============================================================================
|
|
// StringResourceWithLocationImpl
|
|
// =============================================================================
|
|
|
|
// component operations
|
|
static Sequence< ::rtl::OUString > getSupportedServiceNames_StringResourceWithLocationImpl()
|
|
{
|
|
Sequence< ::rtl::OUString > names(1);
|
|
names[0] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.resource.StringResourceWithLocation") );
|
|
return names;
|
|
}
|
|
|
|
static ::rtl::OUString getImplementationName_StringResourceWithLocationImpl()
|
|
{
|
|
return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.scripting.StringResourceWithLocation") );
|
|
}
|
|
|
|
static Reference< XInterface > SAL_CALL create_StringResourceWithLocationImpl(
|
|
Reference< XComponentContext > const & xContext )
|
|
SAL_THROW( () )
|
|
{
|
|
return static_cast< ::cppu::OWeakObject * >( new StringResourceWithLocationImpl( xContext ) );
|
|
}
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
StringResourceWithLocationImpl::StringResourceWithLocationImpl( const Reference< XComponentContext >& rxContext )
|
|
: StringResourceWithLocationImpl_BASE( rxContext )
|
|
, m_bLocationChanged( false )
|
|
{
|
|
}
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
StringResourceWithLocationImpl::~StringResourceWithLocationImpl()
|
|
{
|
|
}
|
|
|
|
// -----------------------------------------------------------------------------
|
|
// XServiceInfo
|
|
// -----------------------------------------------------------------------------
|
|
|
|
::rtl::OUString StringResourceWithLocationImpl::getImplementationName( ) throw (RuntimeException)
|
|
{
|
|
return getImplementationName_StringResourceWithLocationImpl();
|
|
}
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
sal_Bool StringResourceWithLocationImpl::supportsService( const ::rtl::OUString& rServiceName ) throw (RuntimeException)
|
|
{
|
|
Sequence< ::rtl::OUString > aNames( getSupportedServiceNames() );
|
|
const ::rtl::OUString* pNames = aNames.getConstArray();
|
|
const ::rtl::OUString* pEnd = pNames + aNames.getLength();
|
|
for ( ; pNames != pEnd && !pNames->equals( rServiceName ); ++pNames )
|
|
;
|
|
|
|
return pNames != pEnd;
|
|
}
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
Sequence< ::rtl::OUString > StringResourceWithLocationImpl::getSupportedServiceNames( ) throw (RuntimeException)
|
|
{
|
|
return getSupportedServiceNames_StringResourceWithLocationImpl();
|
|
}
|
|
|
|
// -----------------------------------------------------------------------------
|
|
// XInitialization
|
|
// -----------------------------------------------------------------------------
|
|
|
|
void StringResourceWithLocationImpl::initialize( const Sequence< Any >& aArguments )
|
|
throw (Exception, RuntimeException)
|
|
{
|
|
::osl::MutexGuard aGuard( getMutex() );
|
|
|
|
if ( aArguments.getLength() != 6 )
|
|
{
|
|
throw RuntimeException(
|
|
::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM
|
|
( "XInitialization::initialize: invalid number of arguments!" ) ),
|
|
Reference< XInterface >() );
|
|
}
|
|
|
|
bool bOk = (aArguments[0] >>= m_aLocation);
|
|
sal_Int32 nLen = m_aLocation.getLength();
|
|
if( bOk && nLen == 0 )
|
|
{
|
|
bOk = false;
|
|
}
|
|
else
|
|
{
|
|
if( m_aLocation.getStr()[nLen - 1] != '/' )
|
|
m_aLocation += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("/"));
|
|
}
|
|
|
|
if( !bOk )
|
|
{
|
|
::rtl::OUString errorMsg(RTL_CONSTASCII_USTRINGPARAM("XInitialization::initialize: invalid URL"));
|
|
throw IllegalArgumentException( errorMsg, Reference< XInterface >(), 0 );
|
|
}
|
|
|
|
|
|
bOk = (aArguments[5] >>= m_xInteractionHandler);
|
|
if( !bOk )
|
|
{
|
|
::rtl::OUString errorMsg(RTL_CONSTASCII_USTRINGPARAM("StringResourceWithStorageImpl::initialize: invalid type"));
|
|
throw IllegalArgumentException( errorMsg, Reference< XInterface >(), 5 );
|
|
}
|
|
|
|
implInitializeCommonParameters( aArguments );
|
|
}
|
|
|
|
// -----------------------------------------------------------------------------
|
|
// Forwarding calls to base class
|
|
|
|
// XModifyBroadcaster
|
|
void StringResourceWithLocationImpl::addModifyListener( const Reference< XModifyListener >& aListener )
|
|
throw (RuntimeException)
|
|
{
|
|
StringResourceImpl::addModifyListener( aListener );
|
|
}
|
|
void StringResourceWithLocationImpl::removeModifyListener( const Reference< XModifyListener >& aListener )
|
|
throw (RuntimeException)
|
|
{
|
|
StringResourceImpl::removeModifyListener( aListener );
|
|
}
|
|
|
|
// XStringResourceResolver
|
|
::rtl::OUString StringResourceWithLocationImpl::resolveString( const ::rtl::OUString& ResourceID )
|
|
throw (::com::sun::star::resource::MissingResourceException, RuntimeException)
|
|
{
|
|
return StringResourceImpl::resolveString( ResourceID ) ;
|
|
}
|
|
::rtl::OUString StringResourceWithLocationImpl::resolveStringForLocale( const ::rtl::OUString& ResourceID, const Locale& locale )
|
|
throw ( ::com::sun::star::resource::MissingResourceException, RuntimeException)
|
|
{
|
|
return StringResourceImpl::resolveStringForLocale( ResourceID, locale );
|
|
}
|
|
sal_Bool StringResourceWithLocationImpl::hasEntryForId( const ::rtl::OUString& ResourceID )
|
|
throw (RuntimeException)
|
|
{
|
|
return StringResourceImpl::hasEntryForId( ResourceID ) ;
|
|
}
|
|
sal_Bool StringResourceWithLocationImpl::hasEntryForIdAndLocale( const ::rtl::OUString& ResourceID,
|
|
const Locale& locale )
|
|
throw (RuntimeException)
|
|
{
|
|
return StringResourceImpl::hasEntryForIdAndLocale( ResourceID, locale );
|
|
}
|
|
Sequence< ::rtl::OUString > StringResourceWithLocationImpl::getResourceIDs( )
|
|
throw (RuntimeException)
|
|
{
|
|
return StringResourceImpl::getResourceIDs();
|
|
}
|
|
Sequence< ::rtl::OUString > StringResourceWithLocationImpl::getResourceIDsForLocale
|
|
( const Locale& locale ) throw (::com::sun::star::uno::RuntimeException)
|
|
{
|
|
return StringResourceImpl::getResourceIDsForLocale( locale );
|
|
}
|
|
Locale StringResourceWithLocationImpl::getCurrentLocale()
|
|
throw (RuntimeException)
|
|
{
|
|
return StringResourceImpl::getCurrentLocale();
|
|
}
|
|
Locale StringResourceWithLocationImpl::getDefaultLocale( )
|
|
throw (RuntimeException)
|
|
{
|
|
return StringResourceImpl::getDefaultLocale();
|
|
}
|
|
Sequence< Locale > StringResourceWithLocationImpl::getLocales( )
|
|
throw (RuntimeException)
|
|
{
|
|
return StringResourceImpl::getLocales();
|
|
}
|
|
|
|
// XStringResourceManager
|
|
sal_Bool StringResourceWithLocationImpl::isReadOnly()
|
|
throw (RuntimeException)
|
|
{
|
|
return StringResourceImpl::isReadOnly();
|
|
}
|
|
void StringResourceWithLocationImpl::setCurrentLocale( const Locale& locale, sal_Bool FindClosestMatch )
|
|
throw (IllegalArgumentException, RuntimeException)
|
|
{
|
|
StringResourceImpl::setCurrentLocale( locale, FindClosestMatch );
|
|
}
|
|
void StringResourceWithLocationImpl::setDefaultLocale( const Locale& locale )
|
|
throw (IllegalArgumentException, RuntimeException,NoSupportException)
|
|
{
|
|
StringResourceImpl::setDefaultLocale( locale );
|
|
}
|
|
void StringResourceWithLocationImpl::setString( const ::rtl::OUString& ResourceID, const ::rtl::OUString& Str )
|
|
throw (NoSupportException, RuntimeException)
|
|
{
|
|
StringResourceImpl::setString( ResourceID, Str );
|
|
}
|
|
void StringResourceWithLocationImpl::setStringForLocale
|
|
( const ::rtl::OUString& ResourceID, const ::rtl::OUString& Str, const Locale& locale )
|
|
throw (NoSupportException, RuntimeException)
|
|
{
|
|
StringResourceImpl::setStringForLocale( ResourceID, Str, locale );
|
|
}
|
|
void StringResourceWithLocationImpl::removeId( const ::rtl::OUString& ResourceID )
|
|
throw (::com::sun::star::resource::MissingResourceException, RuntimeException, NoSupportException)
|
|
{
|
|
StringResourceImpl::removeId( ResourceID );
|
|
}
|
|
void StringResourceWithLocationImpl::removeIdForLocale( const ::rtl::OUString& ResourceID, const Locale& locale )
|
|
throw (::com::sun::star::resource::MissingResourceException, RuntimeException, NoSupportException)
|
|
{
|
|
StringResourceImpl::removeIdForLocale( ResourceID, locale );
|
|
}
|
|
void StringResourceWithLocationImpl::newLocale( const Locale& locale )
|
|
throw (ElementExistException, IllegalArgumentException, RuntimeException, NoSupportException)
|
|
{
|
|
StringResourceImpl::newLocale( locale );
|
|
}
|
|
void StringResourceWithLocationImpl::removeLocale( const Locale& locale )
|
|
throw (IllegalArgumentException, RuntimeException, NoSupportException)
|
|
{
|
|
StringResourceImpl::removeLocale( locale );
|
|
}
|
|
sal_Int32 StringResourceWithLocationImpl::getUniqueNumericId( )
|
|
throw (RuntimeException, NoSupportException)
|
|
{
|
|
return StringResourceImpl::getUniqueNumericId();
|
|
}
|
|
|
|
// XStringResourcePersistence
|
|
void StringResourceWithLocationImpl::store()
|
|
throw (NoSupportException, Exception, RuntimeException)
|
|
{
|
|
::osl::MutexGuard aGuard( getMutex() );
|
|
implCheckReadOnly( "StringResourceWithLocationImpl::store(): Read only" );
|
|
|
|
bool bUsedForStore = true;
|
|
bool bStoreAll = m_bLocationChanged;
|
|
m_bLocationChanged = false;
|
|
if( !m_bModified && !bStoreAll )
|
|
return;
|
|
|
|
Reference< ucb::XSimpleFileAccess > xFileAccess = getFileAccess();
|
|
implStoreAtLocation( m_aLocation, m_aNameBase, m_aComment,
|
|
xFileAccess, bUsedForStore, bStoreAll );
|
|
m_bModified = false;
|
|
}
|
|
|
|
sal_Bool StringResourceWithLocationImpl::isModified( )
|
|
throw (RuntimeException)
|
|
{
|
|
return StringResourcePersistenceImpl::isModified();
|
|
}
|
|
void StringResourceWithLocationImpl::setComment( const ::rtl::OUString& Comment )
|
|
throw (::com::sun::star::uno::RuntimeException)
|
|
{
|
|
StringResourcePersistenceImpl::setComment( Comment );
|
|
}
|
|
void StringResourceWithLocationImpl::storeToStorage( const Reference< XStorage >& Storage,
|
|
const ::rtl::OUString& NameBase, const ::rtl::OUString& Comment )
|
|
throw (Exception, RuntimeException)
|
|
{
|
|
StringResourcePersistenceImpl::storeToStorage( Storage, NameBase, Comment );
|
|
}
|
|
void StringResourceWithLocationImpl::storeToURL( const ::rtl::OUString& URL,
|
|
const ::rtl::OUString& NameBase, const ::rtl::OUString& Comment,
|
|
const Reference< ::com::sun::star::task::XInteractionHandler >& Handler )
|
|
throw (Exception, RuntimeException)
|
|
{
|
|
StringResourcePersistenceImpl::storeToURL( URL, NameBase, Comment, Handler );
|
|
}
|
|
Sequence< ::sal_Int8 > StringResourceWithLocationImpl::exportBinary( )
|
|
throw (RuntimeException)
|
|
{
|
|
return StringResourcePersistenceImpl::exportBinary();
|
|
}
|
|
void StringResourceWithLocationImpl::importBinary( const Sequence< ::sal_Int8 >& Data )
|
|
throw (IllegalArgumentException, RuntimeException)
|
|
{
|
|
StringResourcePersistenceImpl::importBinary( Data );
|
|
}
|
|
|
|
// -----------------------------------------------------------------------------
|
|
// XStringResourceWithLocation
|
|
|
|
// XStringResourceWithLocation
|
|
void StringResourceWithLocationImpl::storeAsURL( const ::rtl::OUString& URL )
|
|
throw (::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException)
|
|
{
|
|
setURL( URL );
|
|
store();
|
|
}
|
|
|
|
void StringResourceWithLocationImpl::setURL( const ::rtl::OUString& URL )
|
|
throw (::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException)
|
|
{
|
|
::osl::MutexGuard aGuard( getMutex() );
|
|
implCheckReadOnly( "StringResourceWithLocationImpl::setURL(): Read only" );
|
|
|
|
sal_Int32 nLen = URL.getLength();
|
|
if( nLen == 0 )
|
|
{
|
|
::rtl::OUString errorMsg(RTL_CONSTASCII_USTRINGPARAM
|
|
( "StringResourceWithLocationImpl::setURL: invalid URL" ));
|
|
throw IllegalArgumentException( errorMsg, Reference< XInterface >(), 0 );
|
|
}
|
|
|
|
implLoadAllLocales();
|
|
|
|
// Delete files at old location
|
|
bool bUsedForStore = false;
|
|
bool bStoreAll = false;
|
|
bool bKillAll = true;
|
|
implStoreAtLocation( m_aLocation, m_aNameBase, m_aComment,
|
|
getFileAccess(), bUsedForStore, bStoreAll, bKillAll );
|
|
|
|
m_aLocation = URL;
|
|
m_bLocationChanged = true;
|
|
}
|
|
|
|
|
|
// =============================================================================
|
|
// Private helper methods
|
|
// =============================================================================
|
|
|
|
// Scan locale properties files
|
|
void StringResourceWithLocationImpl::implScanLocales( void )
|
|
{
|
|
const Reference< ucb::XSimpleFileAccess > xFileAccess = getFileAccess();
|
|
if( xFileAccess.is() && xFileAccess->isFolder( m_aLocation ) )
|
|
{
|
|
Sequence< ::rtl::OUString > aContentSeq = xFileAccess->getFolderContents( m_aLocation, false );
|
|
implScanLocaleNames( aContentSeq );
|
|
}
|
|
}
|
|
|
|
// Loading
|
|
bool StringResourceWithLocationImpl::implLoadLocale( LocaleItem* pLocaleItem )
|
|
{
|
|
bool bSuccess = false;
|
|
|
|
const Reference< ucb::XSimpleFileAccess > xFileAccess = getFileAccess();
|
|
if( xFileAccess.is() )
|
|
{
|
|
::rtl::OUString aCompleteFileName =
|
|
implGetPathForLocaleItem( pLocaleItem, m_aNameBase, m_aLocation );
|
|
|
|
Reference< io::XInputStream > xInputStream;
|
|
try
|
|
{
|
|
xInputStream = xFileAccess->openFileRead( aCompleteFileName );
|
|
}
|
|
catch( Exception& )
|
|
{}
|
|
if( xInputStream.is() )
|
|
{
|
|
bSuccess = StringResourcePersistenceImpl::implReadPropertiesFile( pLocaleItem, xInputStream );
|
|
xInputStream->closeInput();
|
|
}
|
|
}
|
|
|
|
return bSuccess;
|
|
}
|
|
|
|
const Reference< ucb::XSimpleFileAccess > StringResourceWithLocationImpl::getFileAccess( void )
|
|
{
|
|
::osl::MutexGuard aGuard( getMutex() );
|
|
|
|
if( !m_xSFI.is() )
|
|
{
|
|
Reference< XMultiComponentFactory > xMCF = getMultiComponentFactory();
|
|
m_xSFI = Reference< ucb::XSimpleFileAccess >( xMCF->createInstanceWithContext
|
|
( ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.ucb.SimpleFileAccess")), m_xContext ), UNO_QUERY );
|
|
|
|
if( m_xSFI.is() && m_xInteractionHandler.is() )
|
|
m_xSFI->setInteractionHandler( m_xInteractionHandler );
|
|
}
|
|
return m_xSFI;
|
|
}
|
|
|
|
|
|
// =============================================================================
|
|
// component export operations
|
|
// =============================================================================
|
|
|
|
static struct ::cppu::ImplementationEntry s_component_entries [] =
|
|
{
|
|
{
|
|
create_StringResourceImpl, getImplementationName_StringResourceImpl,
|
|
getSupportedServiceNames_StringResourceImpl,
|
|
::cppu::createSingleComponentFactory,
|
|
0, 0
|
|
},
|
|
{
|
|
create_StringResourceWithLocationImpl, getImplementationName_StringResourceWithLocationImpl,
|
|
getSupportedServiceNames_StringResourceWithLocationImpl,
|
|
::cppu::createSingleComponentFactory,
|
|
0, 0
|
|
},
|
|
{
|
|
create_StringResourceWithStorageImpl, getImplementationName_StringResourceWithStorageImpl,
|
|
getSupportedServiceNames_StringResourceWithStorageImpl,
|
|
::cppu::createSingleComponentFactory,
|
|
0, 0
|
|
},
|
|
{ 0, 0, 0, 0, 0, 0 }
|
|
};
|
|
|
|
|
|
//.........................................................................
|
|
} // namespace dlgprov
|
|
//.........................................................................
|
|
|
|
|
|
// =============================================================================
|
|
// component exports
|
|
// =============================================================================
|
|
|
|
extern "C"
|
|
{
|
|
void SAL_CALL component_getImplementationEnvironment(
|
|
const sal_Char ** ppEnvTypeName, uno_Environment ** ppEnv )
|
|
{
|
|
(void)ppEnv;
|
|
|
|
*ppEnvTypeName = CPPU_CURRENT_LANGUAGE_BINDING_NAME;
|
|
}
|
|
|
|
void * SAL_CALL component_getFactory(
|
|
const sal_Char * pImplName, lang::XMultiServiceFactory * pServiceManager,
|
|
registry::XRegistryKey * pRegistryKey )
|
|
{
|
|
return ::cppu::component_getFactoryHelper(
|
|
pImplName, pServiceManager, pRegistryKey, ::stringresource::s_component_entries );
|
|
}
|
|
}
|
|
|
|
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|