diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 00000000..bcd5e647 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,3 @@ +# These are supported funding model platforms + +github: prrvchr diff --git a/README.md b/README.md index a5261bd8..00b76466 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ **The use of this software subjects you to our [Terms Of Use][4].** -# version [1.2.2][5] +# version [1.3.0][5] ## Introduction: @@ -51,6 +51,7 @@ Being free software I encourage you: - To duplicate its [source code][15]. - To make changes, corrections, improvements. - To open [issue][16] if needed. +- To [participate in the costs][17] of [CASA certification][18]. In short, to participate in the development of this extension. Because it is together that we can make Free Software smarter. @@ -322,7 +323,17 @@ ___ - Requires the **jdbcDriverOOo extension at least version 1.5.4**. -### What remains to be done for version 1.2.2: +### What has been done for version 1.2.3: + +- Requires the **jdbcDriverOOo extension at least version 1.5.7**. + +### What has been done for version 1.3.0: + +- If the jdbcDriverOOo extension works without Java instrumentation, a warning message will be displayed in the extension options. +- Requires the **jdbcDriverOOo extension at least version 1.6.1**. +- Has been tested under LibreOfficeDev 26.2. + +### What remains to be done for version 1.3.0: - Add new language for internationalization... @@ -332,7 +343,7 @@ ___ [2]: [3]: [4]: -[5]: +[5]: [6]: [7]: [8]: @@ -344,13 +355,15 @@ ___ [14]: [15]: [16]: +[17]: +[18]: [20]: [21]: [22]: [23]: [24]: [25]: -[26]: +[26]: [27]: [28]: [29]: diff --git a/README_fr.md b/README_fr.md index 541122e4..dfc01ecd 100644 --- a/README_fr.md +++ b/README_fr.md @@ -29,7 +29,7 @@ **L'utilisation de ce logiciel vous soumet à nos [Conditions d'utilisation][4].** -# version [1.2.2][5] +# version [1.3.0][5] ## Introduction: @@ -51,6 +51,7 @@ Etant un logiciel libre je vous encourage: - A dupliquer son [code source][15]. - A apporter des modifications, des corrections, des améliorations. - D'ouvrir un [dysfonctionnement][16] si nécessaire. +- De [participer au frais][17] de la [certification CASA][18]. Bref, à participer au developpement de cette extension. Car c'est ensemble que nous pouvons rendre le Logiciel Libre plus intelligent. @@ -322,7 +323,17 @@ ___ - Nécessite l'extension **jdbcDriverOOo en version 1.5.4 minimum**. -### Que reste-t-il à faire pour la version 1.2.2: +### Ce qui a été fait pour la version 1.2.3: + +- Nécessite l'extension **jdbcDriverOOo en version 1.5.7 minimum**. + +### Ce qui a été fait pour la version 1.3.0: + +- Si l'extension jdbcDriverOOo fonctionne sans l'instrumentation Java, un message d'avertissement s'affichera dans les options de l'extension. +- Nécessite l'extension **jdbcDriverOOo en version 1.6.1 minimum**. +- A été testé sous LibreOfficeDev 26.2. + +### Que reste-t-il à faire pour la version 1.3.0: - Ajouter de nouvelles langue pour l'internationalisation... @@ -332,7 +343,7 @@ ___ [2]: [3]: [4]: -[5]: +[5]: [6]: [7]: [8]: @@ -344,13 +355,15 @@ ___ [14]: [15]: [16]: +[17]: +[18]: [20]: [21]: [22]: [23]: [24]: [25]: -[26]: +[26]: [27]: [28]: [29]: diff --git a/source/HyperSQLOOo/Drivers.xcu b/source/HyperSQLOOo/Drivers.xcu index 06398391..6164a396 100644 --- a/source/HyperSQLOOo/Drivers.xcu +++ b/source/HyperSQLOOo/Drivers.xcu @@ -24,7 +24,9 @@ ║ ║ ╚════════════════════════════════════════════════════════════════════════════════════╝ --> + false - + SELECT|1|INSERT|2|UPDATE|4|DELETE|8|REFERENCES|128 diff --git a/source/HyperSQLOOo/Options.xcs b/source/HyperSQLOOo/Options.xcs index 1b683d76..9d9f2ceb 100644 --- a/source/HyperSQLOOo/Options.xcs +++ b/source/HyperSQLOOo/Options.xcs @@ -24,13 +24,13 @@ ║ ║ ╚════════════════════════════════════════════════════════════════════════════════════╝ --> + + oor:name="HyperSQLOOo" + xml:lang="en-US"> diff --git a/source/HyperSQLOOo/Options.xcu b/source/HyperSQLOOo/Options.xcu index 7e1f6234..4570e117 100644 --- a/source/HyperSQLOOo/Options.xcu +++ b/source/HyperSQLOOo/Options.xcu @@ -24,11 +24,11 @@ ║ ║ ╚════════════════════════════════════════════════════════════════════════════════════╝ --> + diff --git a/source/HyperSQLOOo/OptionsDialog.xcu b/source/HyperSQLOOo/OptionsDialog.xcu index d08bbc71..6d21c080 100644 --- a/source/HyperSQLOOo/OptionsDialog.xcu +++ b/source/HyperSQLOOo/OptionsDialog.xcu @@ -24,10 +24,11 @@ ║ ║ ╚════════════════════════════════════════════════════════════════════════════════════╝ --> + diff --git a/source/HyperSQLOOo/component-schema.dtd b/source/HyperSQLOOo/component-schema.dtd new file mode 120000 index 00000000..8bd8f795 --- /dev/null +++ b/source/HyperSQLOOo/component-schema.dtd @@ -0,0 +1 @@ +../../uno/lib/uno/component-schema.dtd \ No newline at end of file diff --git a/source/HyperSQLOOo/component-update.dtd b/source/HyperSQLOOo/component-update.dtd new file mode 120000 index 00000000..90c5befb --- /dev/null +++ b/source/HyperSQLOOo/component-update.dtd @@ -0,0 +1 @@ +../../uno/lib/uno/component-update.dtd \ No newline at end of file diff --git a/source/HyperSQLOOo/description.xml b/source/HyperSQLOOo/description.xml index a8384975..b73bdd88 100644 --- a/source/HyperSQLOOo/description.xml +++ b/source/HyperSQLOOo/description.xml @@ -28,7 +28,7 @@ xmlns:d="http://openoffice.org/extensions/description/2006" xmlns:l="http://libreoffice.org/extensions/description/2011" xmlns:xlink="http://www.w3.org/1999/xlink"> - + diff --git a/source/HyperSQLOOo/dialogs/dialog.dtd b/source/HyperSQLOOo/dialogs/dialog.dtd new file mode 120000 index 00000000..aee03339 --- /dev/null +++ b/source/HyperSQLOOo/dialogs/dialog.dtd @@ -0,0 +1 @@ +../../../uno/dialog/dialog.dtd \ No newline at end of file diff --git a/source/HyperSQLOOo/idl/com/sun/star/task/XTaskEvent.idl b/source/HyperSQLOOo/idl/com/sun/star/task/XTaskEvent.idl new file mode 120000 index 00000000..04f9701c --- /dev/null +++ b/source/HyperSQLOOo/idl/com/sun/star/task/XTaskEvent.idl @@ -0,0 +1 @@ +../../../../../../../uno/rdb/idl/com/sun/star/task/XTaskEvent.idl \ No newline at end of file diff --git a/source/HyperSQLOOo/package.properties b/source/HyperSQLOOo/package.properties index 1f7ca66e..7d53402b 100644 --- a/source/HyperSQLOOo/package.properties +++ b/source/HyperSQLOOo/package.properties @@ -1,3 +1,3 @@ #Written by the OOEclipseIntegration -#Thu May 01 22:01:42 CEST 2025 -contents=description.xml, description/desc_en.txt, description/desc_fr.txt, dialogs/LogDialog.xdl, dialogs/LogDialog_en_US.default, dialogs/LogDialog_en_US.properties, dialogs/LogDialog_fr_FR.properties, dialogs/LogWindow.xdl, dialogs/LogWindow_en_US.default, dialogs/LogWindow_en_US.properties, dialogs/LogWindow_fr_FR.properties, dialogs/OptionDialog.xdl, dialogs/OptionDialog_en_US.default, dialogs/OptionDialog_en_US.properties, dialogs/OptionDialog_fr_FR.properties, dialogs/OptionsDialog.xdl, dialogs/OptionsDialog_en_US.default, dialogs/OptionsDialog_en_US.properties, dialogs/OptionsDialog_fr_FR.properties, Drivers.xcu, img/HyperSQLOOo.svg, META-INF/manifest.xml, Options.xcs, Options.xcu, OptionsDialog.xcu, package.components, registration/TermsOfUse_en.md, registration/TermsOfUse_fr.md, requirements.txt, resource/Driver_en_US.default, resource/Driver_en_US.properties, resource/Driver_fr_FR.properties, resource/Logger_en_US.default, resource/Logger_en_US.properties, resource/Logger_fr_FR.properties, service/Driver.py, service/HyperSQLOOo.py, service/OptionsHandler.py, service/pythonpath/_distutils_hack/__init__.py, service/pythonpath/_distutils_hack/override.py, service/pythonpath/distutils-precedence.pth, service/pythonpath/hypersql/__init__.py, service/pythonpath/hypersql/configuration.py, service/pythonpath/hypersql/documenthandler.py, service/pythonpath/hypersql/driver.py, service/pythonpath/hypersql/helper.py, service/pythonpath/hypersql/jdbcdriver/__init__.py, service/pythonpath/hypersql/jdbcdriver/configuration.py, service/pythonpath/hypersql/logger/__init__.py, service/pythonpath/hypersql/logger/dialog/__init__.py, service/pythonpath/hypersql/logger/dialog/loghandler.py, service/pythonpath/hypersql/logger/dialog/logmanager.py, service/pythonpath/hypersql/logger/dialog/logmodel.py, service/pythonpath/hypersql/logger/dialog/logview.py, service/pythonpath/hypersql/logger/logconfig.py, service/pythonpath/hypersql/logger/logcontroller.py, service/pythonpath/hypersql/logger/logger.py, service/pythonpath/hypersql/logger/loggerpool.py, service/pythonpath/hypersql/logger/loghandler.py, service/pythonpath/hypersql/logger/loghelper.py, service/pythonpath/hypersql/logger/logwrapper.py, service/pythonpath/hypersql/option/__init__.py, service/pythonpath/hypersql/option/optionhandler.py, service/pythonpath/hypersql/option/optionmanager.py, service/pythonpath/hypersql/option/optionmodel.py, service/pythonpath/hypersql/option/optionview.py, service/pythonpath/hypersql/options/__init__.py, service/pythonpath/hypersql/options/optionshandler.py, service/pythonpath/hypersql/options/optionsmanager.py, service/pythonpath/hypersql/options/optionsmodel.py, service/pythonpath/hypersql/options/optionsview.py, service/pythonpath/hypersql/sdbc/__init__.py, service/pythonpath/hypersql/sdbc/driver.py, service/pythonpath/hypersql/sdbcx/__init__.py, service/pythonpath/hypersql/sdbcx/driver.py, service/pythonpath/hypersql/unotool/__init__.py, service/pythonpath/hypersql/unotool/unotool.py, service/pythonpath/packaging-25.0.dist-info/licenses/LICENSE, service/pythonpath/packaging-25.0.dist-info/licenses/LICENSE.APACHE, service/pythonpath/packaging-25.0.dist-info/licenses/LICENSE.BSD, service/pythonpath/packaging-25.0.dist-info/METADATA, service/pythonpath/packaging-25.0.dist-info/RECORD, service/pythonpath/packaging-25.0.dist-info/WHEEL, service/pythonpath/packaging/__init__.py, service/pythonpath/packaging/_elffile.py, service/pythonpath/packaging/_manylinux.py, service/pythonpath/packaging/_musllinux.py, service/pythonpath/packaging/_parser.py, service/pythonpath/packaging/_structures.py, service/pythonpath/packaging/_tokenizer.py, service/pythonpath/packaging/licenses/__init__.py, service/pythonpath/packaging/licenses/_spdx.py, service/pythonpath/packaging/markers.py, service/pythonpath/packaging/metadata.py, service/pythonpath/packaging/py.typed, service/pythonpath/packaging/requirements.py, service/pythonpath/packaging/specifiers.py, service/pythonpath/packaging/tags.py, service/pythonpath/packaging/utils.py, service/pythonpath/packaging/version.py, service/pythonpath/pkg_resources/__init__.py, service/pythonpath/pkg_resources/api_tests.txt, service/pythonpath/pkg_resources/py.typed, service/pythonpath/pkg_resources/tests/__init__.py, service/pythonpath/pkg_resources/tests/data/my-test-package-source/setup.cfg, service/pythonpath/pkg_resources/tests/data/my-test-package-source/setup.py, service/pythonpath/pkg_resources/tests/data/my-test-package-zip/my-test-package.zip, service/pythonpath/pkg_resources/tests/data/my-test-package_unpacked-egg/my_test_package-1.0-py3.7.egg/EGG-INFO/dependency_links.txt, service/pythonpath/pkg_resources/tests/data/my-test-package_unpacked-egg/my_test_package-1.0-py3.7.egg/EGG-INFO/PKG-INFO, service/pythonpath/pkg_resources/tests/data/my-test-package_unpacked-egg/my_test_package-1.0-py3.7.egg/EGG-INFO/SOURCES.txt, service/pythonpath/pkg_resources/tests/data/my-test-package_unpacked-egg/my_test_package-1.0-py3.7.egg/EGG-INFO/top_level.txt, service/pythonpath/pkg_resources/tests/data/my-test-package_unpacked-egg/my_test_package-1.0-py3.7.egg/EGG-INFO/zip-safe, service/pythonpath/pkg_resources/tests/data/my-test-package_zipped-egg/my_test_package-1.0-py3.7.egg, service/pythonpath/pkg_resources/tests/test_find_distributions.py, service/pythonpath/pkg_resources/tests/test_integration_zope_interface.py, service/pythonpath/pkg_resources/tests/test_markers.py, service/pythonpath/pkg_resources/tests/test_pkg_resources.py, service/pythonpath/pkg_resources/tests/test_resources.py, service/pythonpath/pkg_resources/tests/test_working_set.py, service/pythonpath/setuptools-75.3.2.dist-info/entry_points.txt, service/pythonpath/setuptools-75.3.2.dist-info/LICENSE, service/pythonpath/setuptools-75.3.2.dist-info/METADATA, service/pythonpath/setuptools-75.3.2.dist-info/RECORD, service/pythonpath/setuptools-75.3.2.dist-info/top_level.txt, service/pythonpath/setuptools-75.3.2.dist-info/WHEEL, service/pythonpath/setuptools/__init__.py, service/pythonpath/setuptools/_core_metadata.py, service/pythonpath/setuptools/_distutils/__init__.py, service/pythonpath/setuptools/_distutils/_log.py, service/pythonpath/setuptools/_distutils/_macos_compat.py, service/pythonpath/setuptools/_distutils/_modified.py, service/pythonpath/setuptools/_distutils/_msvccompiler.py, service/pythonpath/setuptools/_distutils/archive_util.py, service/pythonpath/setuptools/_distutils/ccompiler.py, service/pythonpath/setuptools/_distutils/cmd.py, service/pythonpath/setuptools/_distutils/command/__init__.py, service/pythonpath/setuptools/_distutils/command/_framework_compat.py, service/pythonpath/setuptools/_distutils/command/bdist.py, service/pythonpath/setuptools/_distutils/command/bdist_dumb.py, service/pythonpath/setuptools/_distutils/command/bdist_rpm.py, service/pythonpath/setuptools/_distutils/command/build.py, service/pythonpath/setuptools/_distutils/command/build_clib.py, service/pythonpath/setuptools/_distutils/command/build_ext.py, service/pythonpath/setuptools/_distutils/command/build_py.py, service/pythonpath/setuptools/_distutils/command/build_scripts.py, service/pythonpath/setuptools/_distutils/command/check.py, service/pythonpath/setuptools/_distutils/command/clean.py, service/pythonpath/setuptools/_distutils/command/config.py, service/pythonpath/setuptools/_distutils/command/install.py, service/pythonpath/setuptools/_distutils/command/install_data.py, service/pythonpath/setuptools/_distutils/command/install_egg_info.py, service/pythonpath/setuptools/_distutils/command/install_headers.py, service/pythonpath/setuptools/_distutils/command/install_lib.py, service/pythonpath/setuptools/_distutils/command/install_scripts.py, service/pythonpath/setuptools/_distutils/command/sdist.py, service/pythonpath/setuptools/_distutils/compat/__init__.py, service/pythonpath/setuptools/_distutils/compat/py38.py, service/pythonpath/setuptools/_distutils/compat/py39.py, service/pythonpath/setuptools/_distutils/core.py, service/pythonpath/setuptools/_distutils/cygwinccompiler.py, service/pythonpath/setuptools/_distutils/debug.py, service/pythonpath/setuptools/_distutils/dep_util.py, service/pythonpath/setuptools/_distutils/dir_util.py, service/pythonpath/setuptools/_distutils/dist.py, service/pythonpath/setuptools/_distutils/errors.py, service/pythonpath/setuptools/_distutils/extension.py, service/pythonpath/setuptools/_distutils/fancy_getopt.py, service/pythonpath/setuptools/_distutils/file_util.py, service/pythonpath/setuptools/_distutils/filelist.py, service/pythonpath/setuptools/_distutils/log.py, service/pythonpath/setuptools/_distutils/spawn.py, service/pythonpath/setuptools/_distutils/sysconfig.py, service/pythonpath/setuptools/_distutils/tests/__init__.py, service/pythonpath/setuptools/_distutils/tests/compat/__init__.py, service/pythonpath/setuptools/_distutils/tests/compat/py38.py, service/pythonpath/setuptools/_distutils/tests/support.py, service/pythonpath/setuptools/_distutils/tests/test_archive_util.py, service/pythonpath/setuptools/_distutils/tests/test_bdist.py, service/pythonpath/setuptools/_distutils/tests/test_bdist_dumb.py, service/pythonpath/setuptools/_distutils/tests/test_bdist_rpm.py, service/pythonpath/setuptools/_distutils/tests/test_build.py, service/pythonpath/setuptools/_distutils/tests/test_build_clib.py, service/pythonpath/setuptools/_distutils/tests/test_build_ext.py, service/pythonpath/setuptools/_distutils/tests/test_build_py.py, service/pythonpath/setuptools/_distutils/tests/test_build_scripts.py, service/pythonpath/setuptools/_distutils/tests/test_ccompiler.py, service/pythonpath/setuptools/_distutils/tests/test_check.py, service/pythonpath/setuptools/_distutils/tests/test_clean.py, service/pythonpath/setuptools/_distutils/tests/test_cmd.py, service/pythonpath/setuptools/_distutils/tests/test_config_cmd.py, service/pythonpath/setuptools/_distutils/tests/test_core.py, service/pythonpath/setuptools/_distutils/tests/test_cygwinccompiler.py, service/pythonpath/setuptools/_distutils/tests/test_dir_util.py, service/pythonpath/setuptools/_distutils/tests/test_dist.py, service/pythonpath/setuptools/_distutils/tests/test_extension.py, service/pythonpath/setuptools/_distutils/tests/test_file_util.py, service/pythonpath/setuptools/_distutils/tests/test_filelist.py, service/pythonpath/setuptools/_distutils/tests/test_install.py, service/pythonpath/setuptools/_distutils/tests/test_install_data.py, service/pythonpath/setuptools/_distutils/tests/test_install_headers.py, service/pythonpath/setuptools/_distutils/tests/test_install_lib.py, service/pythonpath/setuptools/_distutils/tests/test_install_scripts.py, service/pythonpath/setuptools/_distutils/tests/test_log.py, service/pythonpath/setuptools/_distutils/tests/test_mingwccompiler.py, service/pythonpath/setuptools/_distutils/tests/test_modified.py, service/pythonpath/setuptools/_distutils/tests/test_msvccompiler.py, service/pythonpath/setuptools/_distutils/tests/test_sdist.py, service/pythonpath/setuptools/_distutils/tests/test_spawn.py, service/pythonpath/setuptools/_distutils/tests/test_sysconfig.py, service/pythonpath/setuptools/_distutils/tests/test_text_file.py, service/pythonpath/setuptools/_distutils/tests/test_unixccompiler.py, service/pythonpath/setuptools/_distutils/tests/test_util.py, service/pythonpath/setuptools/_distutils/tests/test_version.py, service/pythonpath/setuptools/_distutils/tests/test_versionpredicate.py, service/pythonpath/setuptools/_distutils/tests/unix_compat.py, service/pythonpath/setuptools/_distutils/text_file.py, service/pythonpath/setuptools/_distutils/unixccompiler.py, service/pythonpath/setuptools/_distutils/util.py, service/pythonpath/setuptools/_distutils/version.py, service/pythonpath/setuptools/_distutils/versionpredicate.py, service/pythonpath/setuptools/_distutils/zosccompiler.py, service/pythonpath/setuptools/_entry_points.py, service/pythonpath/setuptools/_imp.py, service/pythonpath/setuptools/_importlib.py, service/pythonpath/setuptools/_itertools.py, service/pythonpath/setuptools/_normalization.py, service/pythonpath/setuptools/_path.py, service/pythonpath/setuptools/_reqs.py, service/pythonpath/setuptools/_vendor/autocommand-2.2.2.dist-info/INSTALLER, service/pythonpath/setuptools/_vendor/autocommand-2.2.2.dist-info/LICENSE, service/pythonpath/setuptools/_vendor/autocommand-2.2.2.dist-info/METADATA, service/pythonpath/setuptools/_vendor/autocommand-2.2.2.dist-info/RECORD, service/pythonpath/setuptools/_vendor/autocommand-2.2.2.dist-info/top_level.txt, service/pythonpath/setuptools/_vendor/autocommand-2.2.2.dist-info/WHEEL, service/pythonpath/setuptools/_vendor/autocommand/__init__.py, service/pythonpath/setuptools/_vendor/autocommand/autoasync.py, service/pythonpath/setuptools/_vendor/autocommand/autocommand.py, service/pythonpath/setuptools/_vendor/autocommand/automain.py, service/pythonpath/setuptools/_vendor/autocommand/autoparse.py, service/pythonpath/setuptools/_vendor/autocommand/errors.py, service/pythonpath/setuptools/_vendor/backports.tarfile-1.2.0.dist-info/INSTALLER, service/pythonpath/setuptools/_vendor/backports.tarfile-1.2.0.dist-info/LICENSE, service/pythonpath/setuptools/_vendor/backports.tarfile-1.2.0.dist-info/METADATA, service/pythonpath/setuptools/_vendor/backports.tarfile-1.2.0.dist-info/RECORD, service/pythonpath/setuptools/_vendor/backports.tarfile-1.2.0.dist-info/REQUESTED, service/pythonpath/setuptools/_vendor/backports.tarfile-1.2.0.dist-info/top_level.txt, service/pythonpath/setuptools/_vendor/backports.tarfile-1.2.0.dist-info/WHEEL, service/pythonpath/setuptools/_vendor/backports/__init__.py, service/pythonpath/setuptools/_vendor/backports/tarfile/__init__.py, service/pythonpath/setuptools/_vendor/backports/tarfile/__main__.py, service/pythonpath/setuptools/_vendor/backports/tarfile/compat/__init__.py, service/pythonpath/setuptools/_vendor/backports/tarfile/compat/py38.py, service/pythonpath/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/INSTALLER, service/pythonpath/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/LICENSE, service/pythonpath/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/METADATA, service/pythonpath/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/RECORD, service/pythonpath/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/REQUESTED, service/pythonpath/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/top_level.txt, service/pythonpath/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/WHEEL, service/pythonpath/setuptools/_vendor/importlib_metadata/__init__.py, service/pythonpath/setuptools/_vendor/importlib_metadata/_adapters.py, service/pythonpath/setuptools/_vendor/importlib_metadata/_collections.py, service/pythonpath/setuptools/_vendor/importlib_metadata/_compat.py, service/pythonpath/setuptools/_vendor/importlib_metadata/_functools.py, service/pythonpath/setuptools/_vendor/importlib_metadata/_itertools.py, service/pythonpath/setuptools/_vendor/importlib_metadata/_meta.py, service/pythonpath/setuptools/_vendor/importlib_metadata/_text.py, service/pythonpath/setuptools/_vendor/importlib_metadata/compat/__init__.py, service/pythonpath/setuptools/_vendor/importlib_metadata/compat/py311.py, service/pythonpath/setuptools/_vendor/importlib_metadata/compat/py39.py, service/pythonpath/setuptools/_vendor/importlib_metadata/diagnose.py, service/pythonpath/setuptools/_vendor/importlib_metadata/py.typed, service/pythonpath/setuptools/_vendor/importlib_resources-6.4.0.dist-info/INSTALLER, service/pythonpath/setuptools/_vendor/importlib_resources-6.4.0.dist-info/LICENSE, service/pythonpath/setuptools/_vendor/importlib_resources-6.4.0.dist-info/METADATA, service/pythonpath/setuptools/_vendor/importlib_resources-6.4.0.dist-info/RECORD, service/pythonpath/setuptools/_vendor/importlib_resources-6.4.0.dist-info/REQUESTED, service/pythonpath/setuptools/_vendor/importlib_resources-6.4.0.dist-info/top_level.txt, service/pythonpath/setuptools/_vendor/importlib_resources-6.4.0.dist-info/WHEEL, service/pythonpath/setuptools/_vendor/importlib_resources/__init__.py, service/pythonpath/setuptools/_vendor/importlib_resources/_adapters.py, service/pythonpath/setuptools/_vendor/importlib_resources/_common.py, service/pythonpath/setuptools/_vendor/importlib_resources/_itertools.py, service/pythonpath/setuptools/_vendor/importlib_resources/abc.py, service/pythonpath/setuptools/_vendor/importlib_resources/compat/__init__.py, service/pythonpath/setuptools/_vendor/importlib_resources/compat/py38.py, service/pythonpath/setuptools/_vendor/importlib_resources/compat/py39.py, service/pythonpath/setuptools/_vendor/importlib_resources/functional.py, service/pythonpath/setuptools/_vendor/importlib_resources/future/__init__.py, service/pythonpath/setuptools/_vendor/importlib_resources/future/adapters.py, service/pythonpath/setuptools/_vendor/importlib_resources/py.typed, service/pythonpath/setuptools/_vendor/importlib_resources/readers.py, service/pythonpath/setuptools/_vendor/importlib_resources/simple.py, service/pythonpath/setuptools/_vendor/importlib_resources/tests/__init__.py, service/pythonpath/setuptools/_vendor/importlib_resources/tests/_path.py, service/pythonpath/setuptools/_vendor/importlib_resources/tests/compat/__init__.py, service/pythonpath/setuptools/_vendor/importlib_resources/tests/compat/py312.py, service/pythonpath/setuptools/_vendor/importlib_resources/tests/compat/py39.py, service/pythonpath/setuptools/_vendor/importlib_resources/tests/data01/__init__.py, service/pythonpath/setuptools/_vendor/importlib_resources/tests/data01/binary.file, service/pythonpath/setuptools/_vendor/importlib_resources/tests/data01/subdirectory/__init__.py, service/pythonpath/setuptools/_vendor/importlib_resources/tests/data01/subdirectory/binary.file, service/pythonpath/setuptools/_vendor/importlib_resources/tests/data01/utf-16.file, service/pythonpath/setuptools/_vendor/importlib_resources/tests/data01/utf-8.file, service/pythonpath/setuptools/_vendor/importlib_resources/tests/data02/__init__.py, service/pythonpath/setuptools/_vendor/importlib_resources/tests/data02/one/__init__.py, service/pythonpath/setuptools/_vendor/importlib_resources/tests/data02/one/resource1.txt, service/pythonpath/setuptools/_vendor/importlib_resources/tests/data02/subdirectory/subsubdir/resource.txt, service/pythonpath/setuptools/_vendor/importlib_resources/tests/data02/two/__init__.py, service/pythonpath/setuptools/_vendor/importlib_resources/tests/data02/two/resource2.txt, service/pythonpath/setuptools/_vendor/importlib_resources/tests/namespacedata01/binary.file, service/pythonpath/setuptools/_vendor/importlib_resources/tests/namespacedata01/subdirectory/binary.file, service/pythonpath/setuptools/_vendor/importlib_resources/tests/namespacedata01/utf-16.file, service/pythonpath/setuptools/_vendor/importlib_resources/tests/namespacedata01/utf-8.file, service/pythonpath/setuptools/_vendor/importlib_resources/tests/test_compatibilty_files.py, service/pythonpath/setuptools/_vendor/importlib_resources/tests/test_contents.py, service/pythonpath/setuptools/_vendor/importlib_resources/tests/test_custom.py, service/pythonpath/setuptools/_vendor/importlib_resources/tests/test_files.py, service/pythonpath/setuptools/_vendor/importlib_resources/tests/test_functional.py, service/pythonpath/setuptools/_vendor/importlib_resources/tests/test_open.py, service/pythonpath/setuptools/_vendor/importlib_resources/tests/test_path.py, service/pythonpath/setuptools/_vendor/importlib_resources/tests/test_read.py, service/pythonpath/setuptools/_vendor/importlib_resources/tests/test_reader.py, service/pythonpath/setuptools/_vendor/importlib_resources/tests/test_resource.py, service/pythonpath/setuptools/_vendor/importlib_resources/tests/util.py, service/pythonpath/setuptools/_vendor/importlib_resources/tests/zip.py, service/pythonpath/setuptools/_vendor/inflect-7.3.1.dist-info/INSTALLER, service/pythonpath/setuptools/_vendor/inflect-7.3.1.dist-info/LICENSE, service/pythonpath/setuptools/_vendor/inflect-7.3.1.dist-info/METADATA, service/pythonpath/setuptools/_vendor/inflect-7.3.1.dist-info/RECORD, service/pythonpath/setuptools/_vendor/inflect-7.3.1.dist-info/top_level.txt, service/pythonpath/setuptools/_vendor/inflect-7.3.1.dist-info/WHEEL, service/pythonpath/setuptools/_vendor/inflect/__init__.py, service/pythonpath/setuptools/_vendor/inflect/compat/__init__.py, service/pythonpath/setuptools/_vendor/inflect/compat/py38.py, service/pythonpath/setuptools/_vendor/inflect/py.typed, service/pythonpath/setuptools/_vendor/jaraco.collections-5.1.0.dist-info/INSTALLER, service/pythonpath/setuptools/_vendor/jaraco.collections-5.1.0.dist-info/LICENSE, service/pythonpath/setuptools/_vendor/jaraco.collections-5.1.0.dist-info/METADATA, service/pythonpath/setuptools/_vendor/jaraco.collections-5.1.0.dist-info/RECORD, service/pythonpath/setuptools/_vendor/jaraco.collections-5.1.0.dist-info/REQUESTED, service/pythonpath/setuptools/_vendor/jaraco.collections-5.1.0.dist-info/top_level.txt, service/pythonpath/setuptools/_vendor/jaraco.collections-5.1.0.dist-info/WHEEL, service/pythonpath/setuptools/_vendor/jaraco.context-5.3.0.dist-info/INSTALLER, service/pythonpath/setuptools/_vendor/jaraco.context-5.3.0.dist-info/LICENSE, service/pythonpath/setuptools/_vendor/jaraco.context-5.3.0.dist-info/METADATA, service/pythonpath/setuptools/_vendor/jaraco.context-5.3.0.dist-info/RECORD, service/pythonpath/setuptools/_vendor/jaraco.context-5.3.0.dist-info/top_level.txt, service/pythonpath/setuptools/_vendor/jaraco.context-5.3.0.dist-info/WHEEL, service/pythonpath/setuptools/_vendor/jaraco.functools-4.0.1.dist-info/INSTALLER, service/pythonpath/setuptools/_vendor/jaraco.functools-4.0.1.dist-info/LICENSE, service/pythonpath/setuptools/_vendor/jaraco.functools-4.0.1.dist-info/METADATA, service/pythonpath/setuptools/_vendor/jaraco.functools-4.0.1.dist-info/RECORD, service/pythonpath/setuptools/_vendor/jaraco.functools-4.0.1.dist-info/top_level.txt, service/pythonpath/setuptools/_vendor/jaraco.functools-4.0.1.dist-info/WHEEL, service/pythonpath/setuptools/_vendor/jaraco.text-3.12.1.dist-info/INSTALLER, service/pythonpath/setuptools/_vendor/jaraco.text-3.12.1.dist-info/LICENSE, service/pythonpath/setuptools/_vendor/jaraco.text-3.12.1.dist-info/METADATA, service/pythonpath/setuptools/_vendor/jaraco.text-3.12.1.dist-info/RECORD, service/pythonpath/setuptools/_vendor/jaraco.text-3.12.1.dist-info/REQUESTED, service/pythonpath/setuptools/_vendor/jaraco.text-3.12.1.dist-info/top_level.txt, service/pythonpath/setuptools/_vendor/jaraco.text-3.12.1.dist-info/WHEEL, service/pythonpath/setuptools/_vendor/jaraco/collections/__init__.py, service/pythonpath/setuptools/_vendor/jaraco/collections/py.typed, service/pythonpath/setuptools/_vendor/jaraco/context.py, service/pythonpath/setuptools/_vendor/jaraco/functools/__init__.py, service/pythonpath/setuptools/_vendor/jaraco/functools/__init__.pyi, service/pythonpath/setuptools/_vendor/jaraco/functools/py.typed, service/pythonpath/setuptools/_vendor/jaraco/text/__init__.py, service/pythonpath/setuptools/_vendor/jaraco/text/layouts.py, service/pythonpath/setuptools/_vendor/jaraco/text/Lorem ipsum.txt, service/pythonpath/setuptools/_vendor/jaraco/text/show-newlines.py, service/pythonpath/setuptools/_vendor/jaraco/text/strip-prefix.py, service/pythonpath/setuptools/_vendor/jaraco/text/to-dvorak.py, service/pythonpath/setuptools/_vendor/jaraco/text/to-qwerty.py, service/pythonpath/setuptools/_vendor/more_itertools-10.3.0.dist-info/INSTALLER, service/pythonpath/setuptools/_vendor/more_itertools-10.3.0.dist-info/LICENSE, service/pythonpath/setuptools/_vendor/more_itertools-10.3.0.dist-info/METADATA, service/pythonpath/setuptools/_vendor/more_itertools-10.3.0.dist-info/RECORD, service/pythonpath/setuptools/_vendor/more_itertools-10.3.0.dist-info/REQUESTED, service/pythonpath/setuptools/_vendor/more_itertools-10.3.0.dist-info/WHEEL, service/pythonpath/setuptools/_vendor/more_itertools/__init__.py, service/pythonpath/setuptools/_vendor/more_itertools/__init__.pyi, service/pythonpath/setuptools/_vendor/more_itertools/more.py, service/pythonpath/setuptools/_vendor/more_itertools/more.pyi, service/pythonpath/setuptools/_vendor/more_itertools/py.typed, service/pythonpath/setuptools/_vendor/more_itertools/recipes.py, service/pythonpath/setuptools/_vendor/more_itertools/recipes.pyi, service/pythonpath/setuptools/_vendor/packaging-24.1.dist-info/INSTALLER, service/pythonpath/setuptools/_vendor/packaging-24.1.dist-info/LICENSE, service/pythonpath/setuptools/_vendor/packaging-24.1.dist-info/LICENSE.APACHE, service/pythonpath/setuptools/_vendor/packaging-24.1.dist-info/LICENSE.BSD, service/pythonpath/setuptools/_vendor/packaging-24.1.dist-info/METADATA, service/pythonpath/setuptools/_vendor/packaging-24.1.dist-info/RECORD, service/pythonpath/setuptools/_vendor/packaging-24.1.dist-info/REQUESTED, service/pythonpath/setuptools/_vendor/packaging-24.1.dist-info/WHEEL, service/pythonpath/setuptools/_vendor/packaging/__init__.py, service/pythonpath/setuptools/_vendor/packaging/_elffile.py, service/pythonpath/setuptools/_vendor/packaging/_manylinux.py, service/pythonpath/setuptools/_vendor/packaging/_musllinux.py, service/pythonpath/setuptools/_vendor/packaging/_parser.py, service/pythonpath/setuptools/_vendor/packaging/_structures.py, service/pythonpath/setuptools/_vendor/packaging/_tokenizer.py, service/pythonpath/setuptools/_vendor/packaging/markers.py, service/pythonpath/setuptools/_vendor/packaging/metadata.py, service/pythonpath/setuptools/_vendor/packaging/py.typed, service/pythonpath/setuptools/_vendor/packaging/requirements.py, service/pythonpath/setuptools/_vendor/packaging/specifiers.py, service/pythonpath/setuptools/_vendor/packaging/tags.py, service/pythonpath/setuptools/_vendor/packaging/utils.py, service/pythonpath/setuptools/_vendor/packaging/version.py, service/pythonpath/setuptools/_vendor/platformdirs-4.2.2.dist-info/INSTALLER, service/pythonpath/setuptools/_vendor/platformdirs-4.2.2.dist-info/licenses/LICENSE, service/pythonpath/setuptools/_vendor/platformdirs-4.2.2.dist-info/METADATA, service/pythonpath/setuptools/_vendor/platformdirs-4.2.2.dist-info/RECORD, service/pythonpath/setuptools/_vendor/platformdirs-4.2.2.dist-info/REQUESTED, service/pythonpath/setuptools/_vendor/platformdirs-4.2.2.dist-info/WHEEL, service/pythonpath/setuptools/_vendor/platformdirs/__init__.py, service/pythonpath/setuptools/_vendor/platformdirs/__main__.py, service/pythonpath/setuptools/_vendor/platformdirs/android.py, service/pythonpath/setuptools/_vendor/platformdirs/api.py, service/pythonpath/setuptools/_vendor/platformdirs/macos.py, service/pythonpath/setuptools/_vendor/platformdirs/py.typed, service/pythonpath/setuptools/_vendor/platformdirs/unix.py, service/pythonpath/setuptools/_vendor/platformdirs/version.py, service/pythonpath/setuptools/_vendor/platformdirs/windows.py, service/pythonpath/setuptools/_vendor/ruff.toml, service/pythonpath/setuptools/_vendor/tomli-2.0.1.dist-info/INSTALLER, service/pythonpath/setuptools/_vendor/tomli-2.0.1.dist-info/LICENSE, service/pythonpath/setuptools/_vendor/tomli-2.0.1.dist-info/METADATA, service/pythonpath/setuptools/_vendor/tomli-2.0.1.dist-info/RECORD, service/pythonpath/setuptools/_vendor/tomli-2.0.1.dist-info/REQUESTED, service/pythonpath/setuptools/_vendor/tomli-2.0.1.dist-info/WHEEL, service/pythonpath/setuptools/_vendor/tomli/__init__.py, service/pythonpath/setuptools/_vendor/tomli/_parser.py, service/pythonpath/setuptools/_vendor/tomli/_re.py, service/pythonpath/setuptools/_vendor/tomli/_types.py, service/pythonpath/setuptools/_vendor/tomli/py.typed, service/pythonpath/setuptools/_vendor/typeguard-4.3.0.dist-info/entry_points.txt, service/pythonpath/setuptools/_vendor/typeguard-4.3.0.dist-info/INSTALLER, service/pythonpath/setuptools/_vendor/typeguard-4.3.0.dist-info/LICENSE, service/pythonpath/setuptools/_vendor/typeguard-4.3.0.dist-info/METADATA, service/pythonpath/setuptools/_vendor/typeguard-4.3.0.dist-info/RECORD, service/pythonpath/setuptools/_vendor/typeguard-4.3.0.dist-info/top_level.txt, service/pythonpath/setuptools/_vendor/typeguard-4.3.0.dist-info/WHEEL, service/pythonpath/setuptools/_vendor/typeguard/__init__.py, service/pythonpath/setuptools/_vendor/typeguard/_checkers.py, service/pythonpath/setuptools/_vendor/typeguard/_config.py, service/pythonpath/setuptools/_vendor/typeguard/_decorators.py, service/pythonpath/setuptools/_vendor/typeguard/_exceptions.py, service/pythonpath/setuptools/_vendor/typeguard/_functions.py, service/pythonpath/setuptools/_vendor/typeguard/_importhook.py, service/pythonpath/setuptools/_vendor/typeguard/_memo.py, service/pythonpath/setuptools/_vendor/typeguard/_pytest_plugin.py, service/pythonpath/setuptools/_vendor/typeguard/_suppression.py, service/pythonpath/setuptools/_vendor/typeguard/_transformer.py, service/pythonpath/setuptools/_vendor/typeguard/_union_transformer.py, service/pythonpath/setuptools/_vendor/typeguard/_utils.py, service/pythonpath/setuptools/_vendor/typeguard/py.typed, service/pythonpath/setuptools/_vendor/typing_extensions-4.12.2.dist-info/INSTALLER, service/pythonpath/setuptools/_vendor/typing_extensions-4.12.2.dist-info/LICENSE, service/pythonpath/setuptools/_vendor/typing_extensions-4.12.2.dist-info/METADATA, service/pythonpath/setuptools/_vendor/typing_extensions-4.12.2.dist-info/RECORD, service/pythonpath/setuptools/_vendor/typing_extensions-4.12.2.dist-info/WHEEL, service/pythonpath/setuptools/_vendor/typing_extensions.py, service/pythonpath/setuptools/_vendor/wheel-0.43.0.dist-info/entry_points.txt, service/pythonpath/setuptools/_vendor/wheel-0.43.0.dist-info/INSTALLER, service/pythonpath/setuptools/_vendor/wheel-0.43.0.dist-info/LICENSE.txt, service/pythonpath/setuptools/_vendor/wheel-0.43.0.dist-info/METADATA, service/pythonpath/setuptools/_vendor/wheel-0.43.0.dist-info/RECORD, service/pythonpath/setuptools/_vendor/wheel-0.43.0.dist-info/REQUESTED, service/pythonpath/setuptools/_vendor/wheel-0.43.0.dist-info/WHEEL, service/pythonpath/setuptools/_vendor/wheel/__init__.py, service/pythonpath/setuptools/_vendor/wheel/__main__.py, service/pythonpath/setuptools/_vendor/wheel/_setuptools_logging.py, service/pythonpath/setuptools/_vendor/wheel/bdist_wheel.py, service/pythonpath/setuptools/_vendor/wheel/cli/__init__.py, service/pythonpath/setuptools/_vendor/wheel/cli/convert.py, service/pythonpath/setuptools/_vendor/wheel/cli/pack.py, service/pythonpath/setuptools/_vendor/wheel/cli/tags.py, service/pythonpath/setuptools/_vendor/wheel/cli/unpack.py, service/pythonpath/setuptools/_vendor/wheel/macosx_libfile.py, service/pythonpath/setuptools/_vendor/wheel/metadata.py, service/pythonpath/setuptools/_vendor/wheel/util.py, service/pythonpath/setuptools/_vendor/wheel/vendored/__init__.py, service/pythonpath/setuptools/_vendor/wheel/vendored/packaging/__init__.py, service/pythonpath/setuptools/_vendor/wheel/vendored/packaging/_elffile.py, service/pythonpath/setuptools/_vendor/wheel/vendored/packaging/_manylinux.py, service/pythonpath/setuptools/_vendor/wheel/vendored/packaging/_musllinux.py, service/pythonpath/setuptools/_vendor/wheel/vendored/packaging/_parser.py, service/pythonpath/setuptools/_vendor/wheel/vendored/packaging/_structures.py, service/pythonpath/setuptools/_vendor/wheel/vendored/packaging/_tokenizer.py, service/pythonpath/setuptools/_vendor/wheel/vendored/packaging/markers.py, service/pythonpath/setuptools/_vendor/wheel/vendored/packaging/requirements.py, service/pythonpath/setuptools/_vendor/wheel/vendored/packaging/specifiers.py, service/pythonpath/setuptools/_vendor/wheel/vendored/packaging/tags.py, service/pythonpath/setuptools/_vendor/wheel/vendored/packaging/utils.py, service/pythonpath/setuptools/_vendor/wheel/vendored/packaging/version.py, service/pythonpath/setuptools/_vendor/wheel/vendored/vendor.txt, service/pythonpath/setuptools/_vendor/wheel/wheelfile.py, service/pythonpath/setuptools/_vendor/zipp-3.19.2.dist-info/INSTALLER, service/pythonpath/setuptools/_vendor/zipp-3.19.2.dist-info/LICENSE, service/pythonpath/setuptools/_vendor/zipp-3.19.2.dist-info/METADATA, service/pythonpath/setuptools/_vendor/zipp-3.19.2.dist-info/RECORD, service/pythonpath/setuptools/_vendor/zipp-3.19.2.dist-info/REQUESTED, service/pythonpath/setuptools/_vendor/zipp-3.19.2.dist-info/top_level.txt, service/pythonpath/setuptools/_vendor/zipp-3.19.2.dist-info/WHEEL, service/pythonpath/setuptools/_vendor/zipp/__init__.py, service/pythonpath/setuptools/_vendor/zipp/compat/__init__.py, service/pythonpath/setuptools/_vendor/zipp/compat/py310.py, service/pythonpath/setuptools/_vendor/zipp/glob.py, service/pythonpath/setuptools/archive_util.py, service/pythonpath/setuptools/build_meta.py, service/pythonpath/setuptools/cli-32.exe, service/pythonpath/setuptools/cli-64.exe, service/pythonpath/setuptools/cli-arm64.exe, service/pythonpath/setuptools/cli.exe, service/pythonpath/setuptools/command/__init__.py, service/pythonpath/setuptools/command/_requirestxt.py, service/pythonpath/setuptools/command/alias.py, service/pythonpath/setuptools/command/bdist_egg.py, service/pythonpath/setuptools/command/bdist_rpm.py, service/pythonpath/setuptools/command/bdist_wheel.py, service/pythonpath/setuptools/command/build.py, service/pythonpath/setuptools/command/build_clib.py, service/pythonpath/setuptools/command/build_ext.py, service/pythonpath/setuptools/command/build_py.py, service/pythonpath/setuptools/command/develop.py, service/pythonpath/setuptools/command/dist_info.py, service/pythonpath/setuptools/command/easy_install.py, service/pythonpath/setuptools/command/editable_wheel.py, service/pythonpath/setuptools/command/egg_info.py, service/pythonpath/setuptools/command/install.py, service/pythonpath/setuptools/command/install_egg_info.py, service/pythonpath/setuptools/command/install_lib.py, service/pythonpath/setuptools/command/install_scripts.py, service/pythonpath/setuptools/command/launcher manifest.xml, service/pythonpath/setuptools/command/rotate.py, service/pythonpath/setuptools/command/saveopts.py, service/pythonpath/setuptools/command/sdist.py, service/pythonpath/setuptools/command/setopt.py, service/pythonpath/setuptools/command/test.py, service/pythonpath/setuptools/compat/__init__.py, service/pythonpath/setuptools/compat/py310.py, service/pythonpath/setuptools/compat/py311.py, service/pythonpath/setuptools/compat/py312.py, service/pythonpath/setuptools/compat/py39.py, service/pythonpath/setuptools/config/__init__.py, service/pythonpath/setuptools/config/_apply_pyprojecttoml.py, service/pythonpath/setuptools/config/_validate_pyproject/__init__.py, service/pythonpath/setuptools/config/_validate_pyproject/error_reporting.py, service/pythonpath/setuptools/config/_validate_pyproject/extra_validations.py, service/pythonpath/setuptools/config/_validate_pyproject/fastjsonschema_exceptions.py, service/pythonpath/setuptools/config/_validate_pyproject/fastjsonschema_validations.py, service/pythonpath/setuptools/config/_validate_pyproject/formats.py, service/pythonpath/setuptools/config/_validate_pyproject/NOTICE, service/pythonpath/setuptools/config/distutils.schema.json, service/pythonpath/setuptools/config/expand.py, service/pythonpath/setuptools/config/NOTICE, service/pythonpath/setuptools/config/pyprojecttoml.py, service/pythonpath/setuptools/config/setupcfg.py, service/pythonpath/setuptools/config/setuptools.schema.json, service/pythonpath/setuptools/depends.py, service/pythonpath/setuptools/discovery.py, service/pythonpath/setuptools/dist.py, service/pythonpath/setuptools/errors.py, service/pythonpath/setuptools/extension.py, service/pythonpath/setuptools/glob.py, service/pythonpath/setuptools/gui-32.exe, service/pythonpath/setuptools/gui-64.exe, service/pythonpath/setuptools/gui-arm64.exe, service/pythonpath/setuptools/gui.exe, service/pythonpath/setuptools/installer.py, service/pythonpath/setuptools/launch.py, service/pythonpath/setuptools/logging.py, service/pythonpath/setuptools/modified.py, service/pythonpath/setuptools/monkey.py, service/pythonpath/setuptools/msvc.py, service/pythonpath/setuptools/namespaces.py, service/pythonpath/setuptools/package_index.py, service/pythonpath/setuptools/sandbox.py, service/pythonpath/setuptools/script (dev).tmpl, service/pythonpath/setuptools/script.tmpl, service/pythonpath/setuptools/tests/__init__.py, service/pythonpath/setuptools/tests/compat/__init__.py, service/pythonpath/setuptools/tests/compat/py39.py, service/pythonpath/setuptools/tests/config/__init__.py, service/pythonpath/setuptools/tests/config/downloads/__init__.py, service/pythonpath/setuptools/tests/config/downloads/preload.py, service/pythonpath/setuptools/tests/config/setupcfg_examples.txt, service/pythonpath/setuptools/tests/config/test_apply_pyprojecttoml.py, service/pythonpath/setuptools/tests/config/test_expand.py, service/pythonpath/setuptools/tests/config/test_pyprojecttoml.py, service/pythonpath/setuptools/tests/config/test_pyprojecttoml_dynamic_deps.py, service/pythonpath/setuptools/tests/config/test_setupcfg.py, service/pythonpath/setuptools/tests/contexts.py, service/pythonpath/setuptools/tests/environment.py, service/pythonpath/setuptools/tests/fixtures.py, service/pythonpath/setuptools/tests/indexes/test_links_priority/external.html, service/pythonpath/setuptools/tests/indexes/test_links_priority/simple/foobar/index.html, service/pythonpath/setuptools/tests/integration/__init__.py, service/pythonpath/setuptools/tests/integration/helpers.py, service/pythonpath/setuptools/tests/integration/test_pip_install_sdist.py, service/pythonpath/setuptools/tests/mod_with_constant.py, service/pythonpath/setuptools/tests/namespaces.py, service/pythonpath/setuptools/tests/script-with-bom.py, service/pythonpath/setuptools/tests/server.py, service/pythonpath/setuptools/tests/test_archive_util.py, service/pythonpath/setuptools/tests/test_bdist_deprecations.py, service/pythonpath/setuptools/tests/test_bdist_egg.py, service/pythonpath/setuptools/tests/test_bdist_wheel.py, service/pythonpath/setuptools/tests/test_build.py, service/pythonpath/setuptools/tests/test_build_clib.py, service/pythonpath/setuptools/tests/test_build_ext.py, service/pythonpath/setuptools/tests/test_build_meta.py, service/pythonpath/setuptools/tests/test_build_py.py, service/pythonpath/setuptools/tests/test_config_discovery.py, service/pythonpath/setuptools/tests/test_core_metadata.py, service/pythonpath/setuptools/tests/test_depends.py, service/pythonpath/setuptools/tests/test_develop.py, service/pythonpath/setuptools/tests/test_dist.py, service/pythonpath/setuptools/tests/test_dist_info.py, service/pythonpath/setuptools/tests/test_distutils_adoption.py, service/pythonpath/setuptools/tests/test_easy_install.py, service/pythonpath/setuptools/tests/test_editable_install.py, service/pythonpath/setuptools/tests/test_egg_info.py, service/pythonpath/setuptools/tests/test_extern.py, service/pythonpath/setuptools/tests/test_find_packages.py, service/pythonpath/setuptools/tests/test_find_py_modules.py, service/pythonpath/setuptools/tests/test_glob.py, service/pythonpath/setuptools/tests/test_install_scripts.py, service/pythonpath/setuptools/tests/test_logging.py, service/pythonpath/setuptools/tests/test_manifest.py, service/pythonpath/setuptools/tests/test_namespaces.py, service/pythonpath/setuptools/tests/test_packageindex.py, service/pythonpath/setuptools/tests/test_sandbox.py, service/pythonpath/setuptools/tests/test_sdist.py, service/pythonpath/setuptools/tests/test_setopt.py, service/pythonpath/setuptools/tests/test_setuptools.py, service/pythonpath/setuptools/tests/test_unicode_utils.py, service/pythonpath/setuptools/tests/test_virtualenv.py, service/pythonpath/setuptools/tests/test_warnings.py, service/pythonpath/setuptools/tests/test_wheel.py, service/pythonpath/setuptools/tests/test_windows_wrappers.py, service/pythonpath/setuptools/tests/text.py, service/pythonpath/setuptools/tests/textwrap.py, service/pythonpath/setuptools/unicode_utils.py, service/pythonpath/setuptools/version.py, service/pythonpath/setuptools/warnings.py, service/pythonpath/setuptools/wheel.py, service/pythonpath/setuptools/windows_support.py, service/pythonpath/six-1.17.0.dist-info/LICENSE, service/pythonpath/six-1.17.0.dist-info/METADATA, service/pythonpath/six-1.17.0.dist-info/RECORD, service/pythonpath/six-1.17.0.dist-info/top_level.txt, service/pythonpath/six-1.17.0.dist-info/WHEEL, service/pythonpath/six.py +#Tue Oct 14 15:14:45 CEST 2025 +contents=component-schema.dtd, component-update.dtd, description.xml, description/desc_en.txt, description/desc_fr.txt, dialogs/dialog.dtd, dialogs/LogDialog.xdl, dialogs/LogDialog_en_US.default, dialogs/LogDialog_en_US.properties, dialogs/LogDialog_fr_FR.properties, dialogs/LogWindow.xdl, dialogs/LogWindow_en_US.default, dialogs/LogWindow_en_US.properties, dialogs/LogWindow_fr_FR.properties, dialogs/OptionDialog.xdl, dialogs/OptionDialog_en_US.default, dialogs/OptionDialog_en_US.properties, dialogs/OptionDialog_fr_FR.properties, dialogs/OptionsDialog.xdl, dialogs/OptionsDialog_en_US.default, dialogs/OptionsDialog_en_US.properties, dialogs/OptionsDialog_fr_FR.properties, Drivers.xcu, img/HyperSQLOOo.svg, META-INF/manifest.xml, Options.xcs, Options.xcu, OptionsDialog.xcu, package.components, registration/TermsOfUse_en.md, registration/TermsOfUse_fr.md, requirements.txt, resource/Driver_en_US.default, resource/Driver_en_US.properties, resource/Driver_fr_FR.properties, resource/Logger_en_US.default, resource/Logger_en_US.properties, resource/Logger_fr_FR.properties, service/Driver.py, service/HyperSQLOOo.py, service/OptionsHandler.py, service/pythonpath/_distutils_hack/__init__.py, service/pythonpath/_distutils_hack/override.py, service/pythonpath/distutils-precedence.pth, service/pythonpath/hypersql/__init__.py, service/pythonpath/hypersql/configuration.py, service/pythonpath/hypersql/documenthandler.py, service/pythonpath/hypersql/driver.py, service/pythonpath/hypersql/helper.py, service/pythonpath/hypersql/jdbcdriver/__init__.py, service/pythonpath/hypersql/jdbcdriver/configuration.py, service/pythonpath/hypersql/jdbcdriver/jdbctool.py, service/pythonpath/hypersql/logger/__init__.py, service/pythonpath/hypersql/logger/dialog/__init__.py, service/pythonpath/hypersql/logger/dialog/loghandler.py, service/pythonpath/hypersql/logger/dialog/logmanager.py, service/pythonpath/hypersql/logger/dialog/logmodel.py, service/pythonpath/hypersql/logger/dialog/logview.py, service/pythonpath/hypersql/logger/logconfig.py, service/pythonpath/hypersql/logger/logcontroller.py, service/pythonpath/hypersql/logger/logger.py, service/pythonpath/hypersql/logger/loggerpool.py, service/pythonpath/hypersql/logger/loghandler.py, service/pythonpath/hypersql/logger/loghelper.py, service/pythonpath/hypersql/logger/logwrapper.py, service/pythonpath/hypersql/options/__init__.py, service/pythonpath/hypersql/options/options/__init__.py, service/pythonpath/hypersql/options/options/optionshandler.py, service/pythonpath/hypersql/options/options/optionsmanager.py, service/pythonpath/hypersql/options/options/optionsmodel.py, service/pythonpath/hypersql/options/options/optionsview.py, service/pythonpath/hypersql/options/optionshandler.py, service/pythonpath/hypersql/options/optionsmanager.py, service/pythonpath/hypersql/options/optionsmodel.py, service/pythonpath/hypersql/options/optionsview.py, service/pythonpath/hypersql/sdbc/__init__.py, service/pythonpath/hypersql/sdbc/driver.py, service/pythonpath/hypersql/sdbcx/__init__.py, service/pythonpath/hypersql/sdbcx/driver.py, service/pythonpath/hypersql/unotool/__init__.py, service/pythonpath/hypersql/unotool/statusindicator.py, service/pythonpath/hypersql/unotool/taskevent.py, service/pythonpath/hypersql/unotool/unotool.py, service/pythonpath/packaging-25.0.dist-info/licenses/LICENSE, service/pythonpath/packaging-25.0.dist-info/licenses/LICENSE.APACHE, service/pythonpath/packaging-25.0.dist-info/licenses/LICENSE.BSD, service/pythonpath/packaging-25.0.dist-info/METADATA, service/pythonpath/packaging-25.0.dist-info/RECORD, service/pythonpath/packaging-25.0.dist-info/WHEEL, service/pythonpath/packaging/__init__.py, service/pythonpath/packaging/_elffile.py, service/pythonpath/packaging/_manylinux.py, service/pythonpath/packaging/_musllinux.py, service/pythonpath/packaging/_parser.py, service/pythonpath/packaging/_structures.py, service/pythonpath/packaging/_tokenizer.py, service/pythonpath/packaging/licenses/__init__.py, service/pythonpath/packaging/licenses/_spdx.py, service/pythonpath/packaging/markers.py, service/pythonpath/packaging/metadata.py, service/pythonpath/packaging/py.typed, service/pythonpath/packaging/requirements.py, service/pythonpath/packaging/specifiers.py, service/pythonpath/packaging/tags.py, service/pythonpath/packaging/utils.py, service/pythonpath/packaging/version.py, service/pythonpath/pkg_resources/__init__.py, service/pythonpath/pkg_resources/api_tests.txt, service/pythonpath/pkg_resources/py.typed, service/pythonpath/pkg_resources/tests/__init__.py, service/pythonpath/pkg_resources/tests/data/my-test-package-source/setup.cfg, service/pythonpath/pkg_resources/tests/data/my-test-package-source/setup.py, service/pythonpath/pkg_resources/tests/data/my-test-package-zip/my-test-package.zip, service/pythonpath/pkg_resources/tests/data/my-test-package_unpacked-egg/my_test_package-1.0-py3.7.egg/EGG-INFO/dependency_links.txt, service/pythonpath/pkg_resources/tests/data/my-test-package_unpacked-egg/my_test_package-1.0-py3.7.egg/EGG-INFO/PKG-INFO, service/pythonpath/pkg_resources/tests/data/my-test-package_unpacked-egg/my_test_package-1.0-py3.7.egg/EGG-INFO/SOURCES.txt, service/pythonpath/pkg_resources/tests/data/my-test-package_unpacked-egg/my_test_package-1.0-py3.7.egg/EGG-INFO/top_level.txt, service/pythonpath/pkg_resources/tests/data/my-test-package_unpacked-egg/my_test_package-1.0-py3.7.egg/EGG-INFO/zip-safe, service/pythonpath/pkg_resources/tests/data/my-test-package_zipped-egg/my_test_package-1.0-py3.7.egg, service/pythonpath/pkg_resources/tests/test_find_distributions.py, service/pythonpath/pkg_resources/tests/test_integration_zope_interface.py, service/pythonpath/pkg_resources/tests/test_markers.py, service/pythonpath/pkg_resources/tests/test_pkg_resources.py, service/pythonpath/pkg_resources/tests/test_resources.py, service/pythonpath/pkg_resources/tests/test_working_set.py, service/pythonpath/setuptools-75.3.2.dist-info/entry_points.txt, service/pythonpath/setuptools-75.3.2.dist-info/LICENSE, service/pythonpath/setuptools-75.3.2.dist-info/METADATA, service/pythonpath/setuptools-75.3.2.dist-info/RECORD, service/pythonpath/setuptools-75.3.2.dist-info/top_level.txt, service/pythonpath/setuptools-75.3.2.dist-info/WHEEL, service/pythonpath/setuptools/__init__.py, service/pythonpath/setuptools/_core_metadata.py, service/pythonpath/setuptools/_distutils/__init__.py, service/pythonpath/setuptools/_distutils/_log.py, service/pythonpath/setuptools/_distutils/_macos_compat.py, service/pythonpath/setuptools/_distutils/_modified.py, service/pythonpath/setuptools/_distutils/_msvccompiler.py, service/pythonpath/setuptools/_distutils/archive_util.py, service/pythonpath/setuptools/_distutils/ccompiler.py, service/pythonpath/setuptools/_distutils/cmd.py, service/pythonpath/setuptools/_distutils/command/__init__.py, service/pythonpath/setuptools/_distutils/command/_framework_compat.py, service/pythonpath/setuptools/_distutils/command/bdist.py, service/pythonpath/setuptools/_distutils/command/bdist_dumb.py, service/pythonpath/setuptools/_distutils/command/bdist_rpm.py, service/pythonpath/setuptools/_distutils/command/build.py, service/pythonpath/setuptools/_distutils/command/build_clib.py, service/pythonpath/setuptools/_distutils/command/build_ext.py, service/pythonpath/setuptools/_distutils/command/build_py.py, service/pythonpath/setuptools/_distutils/command/build_scripts.py, service/pythonpath/setuptools/_distutils/command/check.py, service/pythonpath/setuptools/_distutils/command/clean.py, service/pythonpath/setuptools/_distutils/command/config.py, service/pythonpath/setuptools/_distutils/command/install.py, service/pythonpath/setuptools/_distutils/command/install_data.py, service/pythonpath/setuptools/_distutils/command/install_egg_info.py, service/pythonpath/setuptools/_distutils/command/install_headers.py, service/pythonpath/setuptools/_distutils/command/install_lib.py, service/pythonpath/setuptools/_distutils/command/install_scripts.py, service/pythonpath/setuptools/_distutils/command/sdist.py, service/pythonpath/setuptools/_distutils/compat/__init__.py, service/pythonpath/setuptools/_distutils/compat/py38.py, service/pythonpath/setuptools/_distutils/compat/py39.py, service/pythonpath/setuptools/_distutils/core.py, service/pythonpath/setuptools/_distutils/cygwinccompiler.py, service/pythonpath/setuptools/_distutils/debug.py, service/pythonpath/setuptools/_distutils/dep_util.py, service/pythonpath/setuptools/_distutils/dir_util.py, service/pythonpath/setuptools/_distutils/dist.py, service/pythonpath/setuptools/_distutils/errors.py, service/pythonpath/setuptools/_distutils/extension.py, service/pythonpath/setuptools/_distutils/fancy_getopt.py, service/pythonpath/setuptools/_distutils/file_util.py, service/pythonpath/setuptools/_distutils/filelist.py, service/pythonpath/setuptools/_distutils/log.py, service/pythonpath/setuptools/_distutils/spawn.py, service/pythonpath/setuptools/_distutils/sysconfig.py, service/pythonpath/setuptools/_distutils/tests/__init__.py, service/pythonpath/setuptools/_distutils/tests/compat/__init__.py, service/pythonpath/setuptools/_distutils/tests/compat/py38.py, service/pythonpath/setuptools/_distutils/tests/support.py, service/pythonpath/setuptools/_distutils/tests/test_archive_util.py, service/pythonpath/setuptools/_distutils/tests/test_bdist.py, service/pythonpath/setuptools/_distutils/tests/test_bdist_dumb.py, service/pythonpath/setuptools/_distutils/tests/test_bdist_rpm.py, service/pythonpath/setuptools/_distutils/tests/test_build.py, service/pythonpath/setuptools/_distutils/tests/test_build_clib.py, service/pythonpath/setuptools/_distutils/tests/test_build_ext.py, service/pythonpath/setuptools/_distutils/tests/test_build_py.py, service/pythonpath/setuptools/_distutils/tests/test_build_scripts.py, service/pythonpath/setuptools/_distutils/tests/test_ccompiler.py, service/pythonpath/setuptools/_distutils/tests/test_check.py, service/pythonpath/setuptools/_distutils/tests/test_clean.py, service/pythonpath/setuptools/_distutils/tests/test_cmd.py, service/pythonpath/setuptools/_distutils/tests/test_config_cmd.py, service/pythonpath/setuptools/_distutils/tests/test_core.py, service/pythonpath/setuptools/_distutils/tests/test_cygwinccompiler.py, service/pythonpath/setuptools/_distutils/tests/test_dir_util.py, service/pythonpath/setuptools/_distutils/tests/test_dist.py, service/pythonpath/setuptools/_distutils/tests/test_extension.py, service/pythonpath/setuptools/_distutils/tests/test_file_util.py, service/pythonpath/setuptools/_distutils/tests/test_filelist.py, service/pythonpath/setuptools/_distutils/tests/test_install.py, service/pythonpath/setuptools/_distutils/tests/test_install_data.py, service/pythonpath/setuptools/_distutils/tests/test_install_headers.py, service/pythonpath/setuptools/_distutils/tests/test_install_lib.py, service/pythonpath/setuptools/_distutils/tests/test_install_scripts.py, service/pythonpath/setuptools/_distutils/tests/test_log.py, service/pythonpath/setuptools/_distutils/tests/test_mingwccompiler.py, service/pythonpath/setuptools/_distutils/tests/test_modified.py, service/pythonpath/setuptools/_distutils/tests/test_msvccompiler.py, service/pythonpath/setuptools/_distutils/tests/test_sdist.py, service/pythonpath/setuptools/_distutils/tests/test_spawn.py, service/pythonpath/setuptools/_distutils/tests/test_sysconfig.py, service/pythonpath/setuptools/_distutils/tests/test_text_file.py, service/pythonpath/setuptools/_distutils/tests/test_unixccompiler.py, service/pythonpath/setuptools/_distutils/tests/test_util.py, service/pythonpath/setuptools/_distutils/tests/test_version.py, service/pythonpath/setuptools/_distutils/tests/test_versionpredicate.py, service/pythonpath/setuptools/_distutils/tests/unix_compat.py, service/pythonpath/setuptools/_distutils/text_file.py, service/pythonpath/setuptools/_distutils/unixccompiler.py, service/pythonpath/setuptools/_distutils/util.py, service/pythonpath/setuptools/_distutils/version.py, service/pythonpath/setuptools/_distutils/versionpredicate.py, service/pythonpath/setuptools/_distutils/zosccompiler.py, service/pythonpath/setuptools/_entry_points.py, service/pythonpath/setuptools/_imp.py, service/pythonpath/setuptools/_importlib.py, service/pythonpath/setuptools/_itertools.py, service/pythonpath/setuptools/_normalization.py, service/pythonpath/setuptools/_path.py, service/pythonpath/setuptools/_reqs.py, service/pythonpath/setuptools/_vendor/autocommand-2.2.2.dist-info/INSTALLER, service/pythonpath/setuptools/_vendor/autocommand-2.2.2.dist-info/LICENSE, service/pythonpath/setuptools/_vendor/autocommand-2.2.2.dist-info/METADATA, service/pythonpath/setuptools/_vendor/autocommand-2.2.2.dist-info/RECORD, service/pythonpath/setuptools/_vendor/autocommand-2.2.2.dist-info/top_level.txt, service/pythonpath/setuptools/_vendor/autocommand-2.2.2.dist-info/WHEEL, service/pythonpath/setuptools/_vendor/autocommand/__init__.py, service/pythonpath/setuptools/_vendor/autocommand/autoasync.py, service/pythonpath/setuptools/_vendor/autocommand/autocommand.py, service/pythonpath/setuptools/_vendor/autocommand/automain.py, service/pythonpath/setuptools/_vendor/autocommand/autoparse.py, service/pythonpath/setuptools/_vendor/autocommand/errors.py, service/pythonpath/setuptools/_vendor/backports.tarfile-1.2.0.dist-info/INSTALLER, service/pythonpath/setuptools/_vendor/backports.tarfile-1.2.0.dist-info/LICENSE, service/pythonpath/setuptools/_vendor/backports.tarfile-1.2.0.dist-info/METADATA, service/pythonpath/setuptools/_vendor/backports.tarfile-1.2.0.dist-info/RECORD, service/pythonpath/setuptools/_vendor/backports.tarfile-1.2.0.dist-info/REQUESTED, service/pythonpath/setuptools/_vendor/backports.tarfile-1.2.0.dist-info/top_level.txt, service/pythonpath/setuptools/_vendor/backports.tarfile-1.2.0.dist-info/WHEEL, service/pythonpath/setuptools/_vendor/backports/__init__.py, service/pythonpath/setuptools/_vendor/backports/tarfile/__init__.py, service/pythonpath/setuptools/_vendor/backports/tarfile/__main__.py, service/pythonpath/setuptools/_vendor/backports/tarfile/compat/__init__.py, service/pythonpath/setuptools/_vendor/backports/tarfile/compat/py38.py, service/pythonpath/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/INSTALLER, service/pythonpath/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/LICENSE, service/pythonpath/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/METADATA, service/pythonpath/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/RECORD, service/pythonpath/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/REQUESTED, service/pythonpath/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/top_level.txt, service/pythonpath/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/WHEEL, service/pythonpath/setuptools/_vendor/importlib_metadata/__init__.py, service/pythonpath/setuptools/_vendor/importlib_metadata/_adapters.py, service/pythonpath/setuptools/_vendor/importlib_metadata/_collections.py, service/pythonpath/setuptools/_vendor/importlib_metadata/_compat.py, service/pythonpath/setuptools/_vendor/importlib_metadata/_functools.py, service/pythonpath/setuptools/_vendor/importlib_metadata/_itertools.py, service/pythonpath/setuptools/_vendor/importlib_metadata/_meta.py, service/pythonpath/setuptools/_vendor/importlib_metadata/_text.py, service/pythonpath/setuptools/_vendor/importlib_metadata/compat/__init__.py, service/pythonpath/setuptools/_vendor/importlib_metadata/compat/py311.py, service/pythonpath/setuptools/_vendor/importlib_metadata/compat/py39.py, service/pythonpath/setuptools/_vendor/importlib_metadata/diagnose.py, service/pythonpath/setuptools/_vendor/importlib_metadata/py.typed, service/pythonpath/setuptools/_vendor/importlib_resources-6.4.0.dist-info/INSTALLER, service/pythonpath/setuptools/_vendor/importlib_resources-6.4.0.dist-info/LICENSE, service/pythonpath/setuptools/_vendor/importlib_resources-6.4.0.dist-info/METADATA, service/pythonpath/setuptools/_vendor/importlib_resources-6.4.0.dist-info/RECORD, service/pythonpath/setuptools/_vendor/importlib_resources-6.4.0.dist-info/REQUESTED, service/pythonpath/setuptools/_vendor/importlib_resources-6.4.0.dist-info/top_level.txt, service/pythonpath/setuptools/_vendor/importlib_resources-6.4.0.dist-info/WHEEL, service/pythonpath/setuptools/_vendor/importlib_resources/__init__.py, service/pythonpath/setuptools/_vendor/importlib_resources/_adapters.py, service/pythonpath/setuptools/_vendor/importlib_resources/_common.py, service/pythonpath/setuptools/_vendor/importlib_resources/_itertools.py, service/pythonpath/setuptools/_vendor/importlib_resources/abc.py, service/pythonpath/setuptools/_vendor/importlib_resources/compat/__init__.py, service/pythonpath/setuptools/_vendor/importlib_resources/compat/py38.py, service/pythonpath/setuptools/_vendor/importlib_resources/compat/py39.py, service/pythonpath/setuptools/_vendor/importlib_resources/functional.py, service/pythonpath/setuptools/_vendor/importlib_resources/future/__init__.py, service/pythonpath/setuptools/_vendor/importlib_resources/future/adapters.py, service/pythonpath/setuptools/_vendor/importlib_resources/py.typed, service/pythonpath/setuptools/_vendor/importlib_resources/readers.py, service/pythonpath/setuptools/_vendor/importlib_resources/simple.py, service/pythonpath/setuptools/_vendor/importlib_resources/tests/__init__.py, service/pythonpath/setuptools/_vendor/importlib_resources/tests/_path.py, service/pythonpath/setuptools/_vendor/importlib_resources/tests/compat/__init__.py, service/pythonpath/setuptools/_vendor/importlib_resources/tests/compat/py312.py, service/pythonpath/setuptools/_vendor/importlib_resources/tests/compat/py39.py, service/pythonpath/setuptools/_vendor/importlib_resources/tests/data01/__init__.py, service/pythonpath/setuptools/_vendor/importlib_resources/tests/data01/binary.file, service/pythonpath/setuptools/_vendor/importlib_resources/tests/data01/subdirectory/__init__.py, service/pythonpath/setuptools/_vendor/importlib_resources/tests/data01/subdirectory/binary.file, service/pythonpath/setuptools/_vendor/importlib_resources/tests/data01/utf-16.file, service/pythonpath/setuptools/_vendor/importlib_resources/tests/data01/utf-8.file, service/pythonpath/setuptools/_vendor/importlib_resources/tests/data02/__init__.py, service/pythonpath/setuptools/_vendor/importlib_resources/tests/data02/one/__init__.py, service/pythonpath/setuptools/_vendor/importlib_resources/tests/data02/one/resource1.txt, service/pythonpath/setuptools/_vendor/importlib_resources/tests/data02/subdirectory/subsubdir/resource.txt, service/pythonpath/setuptools/_vendor/importlib_resources/tests/data02/two/__init__.py, service/pythonpath/setuptools/_vendor/importlib_resources/tests/data02/two/resource2.txt, service/pythonpath/setuptools/_vendor/importlib_resources/tests/namespacedata01/binary.file, service/pythonpath/setuptools/_vendor/importlib_resources/tests/namespacedata01/subdirectory/binary.file, service/pythonpath/setuptools/_vendor/importlib_resources/tests/namespacedata01/utf-16.file, service/pythonpath/setuptools/_vendor/importlib_resources/tests/namespacedata01/utf-8.file, service/pythonpath/setuptools/_vendor/importlib_resources/tests/test_compatibilty_files.py, service/pythonpath/setuptools/_vendor/importlib_resources/tests/test_contents.py, service/pythonpath/setuptools/_vendor/importlib_resources/tests/test_custom.py, service/pythonpath/setuptools/_vendor/importlib_resources/tests/test_files.py, service/pythonpath/setuptools/_vendor/importlib_resources/tests/test_functional.py, service/pythonpath/setuptools/_vendor/importlib_resources/tests/test_open.py, service/pythonpath/setuptools/_vendor/importlib_resources/tests/test_path.py, service/pythonpath/setuptools/_vendor/importlib_resources/tests/test_read.py, service/pythonpath/setuptools/_vendor/importlib_resources/tests/test_reader.py, service/pythonpath/setuptools/_vendor/importlib_resources/tests/test_resource.py, service/pythonpath/setuptools/_vendor/importlib_resources/tests/util.py, service/pythonpath/setuptools/_vendor/importlib_resources/tests/zip.py, service/pythonpath/setuptools/_vendor/inflect-7.3.1.dist-info/INSTALLER, service/pythonpath/setuptools/_vendor/inflect-7.3.1.dist-info/LICENSE, service/pythonpath/setuptools/_vendor/inflect-7.3.1.dist-info/METADATA, service/pythonpath/setuptools/_vendor/inflect-7.3.1.dist-info/RECORD, service/pythonpath/setuptools/_vendor/inflect-7.3.1.dist-info/top_level.txt, service/pythonpath/setuptools/_vendor/inflect-7.3.1.dist-info/WHEEL, service/pythonpath/setuptools/_vendor/inflect/__init__.py, service/pythonpath/setuptools/_vendor/inflect/compat/__init__.py, service/pythonpath/setuptools/_vendor/inflect/compat/py38.py, service/pythonpath/setuptools/_vendor/inflect/py.typed, service/pythonpath/setuptools/_vendor/jaraco.collections-5.1.0.dist-info/INSTALLER, service/pythonpath/setuptools/_vendor/jaraco.collections-5.1.0.dist-info/LICENSE, service/pythonpath/setuptools/_vendor/jaraco.collections-5.1.0.dist-info/METADATA, service/pythonpath/setuptools/_vendor/jaraco.collections-5.1.0.dist-info/RECORD, service/pythonpath/setuptools/_vendor/jaraco.collections-5.1.0.dist-info/REQUESTED, service/pythonpath/setuptools/_vendor/jaraco.collections-5.1.0.dist-info/top_level.txt, service/pythonpath/setuptools/_vendor/jaraco.collections-5.1.0.dist-info/WHEEL, service/pythonpath/setuptools/_vendor/jaraco.context-5.3.0.dist-info/INSTALLER, service/pythonpath/setuptools/_vendor/jaraco.context-5.3.0.dist-info/LICENSE, service/pythonpath/setuptools/_vendor/jaraco.context-5.3.0.dist-info/METADATA, service/pythonpath/setuptools/_vendor/jaraco.context-5.3.0.dist-info/RECORD, service/pythonpath/setuptools/_vendor/jaraco.context-5.3.0.dist-info/top_level.txt, service/pythonpath/setuptools/_vendor/jaraco.context-5.3.0.dist-info/WHEEL, service/pythonpath/setuptools/_vendor/jaraco.functools-4.0.1.dist-info/INSTALLER, service/pythonpath/setuptools/_vendor/jaraco.functools-4.0.1.dist-info/LICENSE, service/pythonpath/setuptools/_vendor/jaraco.functools-4.0.1.dist-info/METADATA, service/pythonpath/setuptools/_vendor/jaraco.functools-4.0.1.dist-info/RECORD, service/pythonpath/setuptools/_vendor/jaraco.functools-4.0.1.dist-info/top_level.txt, service/pythonpath/setuptools/_vendor/jaraco.functools-4.0.1.dist-info/WHEEL, service/pythonpath/setuptools/_vendor/jaraco.text-3.12.1.dist-info/INSTALLER, service/pythonpath/setuptools/_vendor/jaraco.text-3.12.1.dist-info/LICENSE, service/pythonpath/setuptools/_vendor/jaraco.text-3.12.1.dist-info/METADATA, service/pythonpath/setuptools/_vendor/jaraco.text-3.12.1.dist-info/RECORD, service/pythonpath/setuptools/_vendor/jaraco.text-3.12.1.dist-info/REQUESTED, service/pythonpath/setuptools/_vendor/jaraco.text-3.12.1.dist-info/top_level.txt, service/pythonpath/setuptools/_vendor/jaraco.text-3.12.1.dist-info/WHEEL, service/pythonpath/setuptools/_vendor/jaraco/collections/__init__.py, service/pythonpath/setuptools/_vendor/jaraco/collections/py.typed, service/pythonpath/setuptools/_vendor/jaraco/context.py, service/pythonpath/setuptools/_vendor/jaraco/functools/__init__.py, service/pythonpath/setuptools/_vendor/jaraco/functools/__init__.pyi, service/pythonpath/setuptools/_vendor/jaraco/functools/py.typed, service/pythonpath/setuptools/_vendor/jaraco/text/__init__.py, service/pythonpath/setuptools/_vendor/jaraco/text/layouts.py, service/pythonpath/setuptools/_vendor/jaraco/text/Lorem ipsum.txt, service/pythonpath/setuptools/_vendor/jaraco/text/show-newlines.py, service/pythonpath/setuptools/_vendor/jaraco/text/strip-prefix.py, service/pythonpath/setuptools/_vendor/jaraco/text/to-dvorak.py, service/pythonpath/setuptools/_vendor/jaraco/text/to-qwerty.py, service/pythonpath/setuptools/_vendor/more_itertools-10.3.0.dist-info/INSTALLER, service/pythonpath/setuptools/_vendor/more_itertools-10.3.0.dist-info/LICENSE, service/pythonpath/setuptools/_vendor/more_itertools-10.3.0.dist-info/METADATA, service/pythonpath/setuptools/_vendor/more_itertools-10.3.0.dist-info/RECORD, service/pythonpath/setuptools/_vendor/more_itertools-10.3.0.dist-info/REQUESTED, service/pythonpath/setuptools/_vendor/more_itertools-10.3.0.dist-info/WHEEL, service/pythonpath/setuptools/_vendor/more_itertools/__init__.py, service/pythonpath/setuptools/_vendor/more_itertools/__init__.pyi, service/pythonpath/setuptools/_vendor/more_itertools/more.py, service/pythonpath/setuptools/_vendor/more_itertools/more.pyi, service/pythonpath/setuptools/_vendor/more_itertools/py.typed, service/pythonpath/setuptools/_vendor/more_itertools/recipes.py, service/pythonpath/setuptools/_vendor/more_itertools/recipes.pyi, service/pythonpath/setuptools/_vendor/packaging-24.1.dist-info/INSTALLER, service/pythonpath/setuptools/_vendor/packaging-24.1.dist-info/LICENSE, service/pythonpath/setuptools/_vendor/packaging-24.1.dist-info/LICENSE.APACHE, service/pythonpath/setuptools/_vendor/packaging-24.1.dist-info/LICENSE.BSD, service/pythonpath/setuptools/_vendor/packaging-24.1.dist-info/METADATA, service/pythonpath/setuptools/_vendor/packaging-24.1.dist-info/RECORD, service/pythonpath/setuptools/_vendor/packaging-24.1.dist-info/REQUESTED, service/pythonpath/setuptools/_vendor/packaging-24.1.dist-info/WHEEL, service/pythonpath/setuptools/_vendor/packaging/__init__.py, service/pythonpath/setuptools/_vendor/packaging/_elffile.py, service/pythonpath/setuptools/_vendor/packaging/_manylinux.py, service/pythonpath/setuptools/_vendor/packaging/_musllinux.py, service/pythonpath/setuptools/_vendor/packaging/_parser.py, service/pythonpath/setuptools/_vendor/packaging/_structures.py, service/pythonpath/setuptools/_vendor/packaging/_tokenizer.py, service/pythonpath/setuptools/_vendor/packaging/markers.py, service/pythonpath/setuptools/_vendor/packaging/metadata.py, service/pythonpath/setuptools/_vendor/packaging/py.typed, service/pythonpath/setuptools/_vendor/packaging/requirements.py, service/pythonpath/setuptools/_vendor/packaging/specifiers.py, service/pythonpath/setuptools/_vendor/packaging/tags.py, service/pythonpath/setuptools/_vendor/packaging/utils.py, service/pythonpath/setuptools/_vendor/packaging/version.py, service/pythonpath/setuptools/_vendor/platformdirs-4.2.2.dist-info/INSTALLER, service/pythonpath/setuptools/_vendor/platformdirs-4.2.2.dist-info/licenses/LICENSE, service/pythonpath/setuptools/_vendor/platformdirs-4.2.2.dist-info/METADATA, service/pythonpath/setuptools/_vendor/platformdirs-4.2.2.dist-info/RECORD, service/pythonpath/setuptools/_vendor/platformdirs-4.2.2.dist-info/REQUESTED, service/pythonpath/setuptools/_vendor/platformdirs-4.2.2.dist-info/WHEEL, service/pythonpath/setuptools/_vendor/platformdirs/__init__.py, service/pythonpath/setuptools/_vendor/platformdirs/__main__.py, service/pythonpath/setuptools/_vendor/platformdirs/android.py, service/pythonpath/setuptools/_vendor/platformdirs/api.py, service/pythonpath/setuptools/_vendor/platformdirs/macos.py, service/pythonpath/setuptools/_vendor/platformdirs/py.typed, service/pythonpath/setuptools/_vendor/platformdirs/unix.py, service/pythonpath/setuptools/_vendor/platformdirs/version.py, service/pythonpath/setuptools/_vendor/platformdirs/windows.py, service/pythonpath/setuptools/_vendor/ruff.toml, service/pythonpath/setuptools/_vendor/tomli-2.0.1.dist-info/INSTALLER, service/pythonpath/setuptools/_vendor/tomli-2.0.1.dist-info/LICENSE, service/pythonpath/setuptools/_vendor/tomli-2.0.1.dist-info/METADATA, service/pythonpath/setuptools/_vendor/tomli-2.0.1.dist-info/RECORD, service/pythonpath/setuptools/_vendor/tomli-2.0.1.dist-info/REQUESTED, service/pythonpath/setuptools/_vendor/tomli-2.0.1.dist-info/WHEEL, service/pythonpath/setuptools/_vendor/tomli/__init__.py, service/pythonpath/setuptools/_vendor/tomli/_parser.py, service/pythonpath/setuptools/_vendor/tomli/_re.py, service/pythonpath/setuptools/_vendor/tomli/_types.py, service/pythonpath/setuptools/_vendor/tomli/py.typed, service/pythonpath/setuptools/_vendor/typeguard-4.3.0.dist-info/entry_points.txt, service/pythonpath/setuptools/_vendor/typeguard-4.3.0.dist-info/INSTALLER, service/pythonpath/setuptools/_vendor/typeguard-4.3.0.dist-info/LICENSE, service/pythonpath/setuptools/_vendor/typeguard-4.3.0.dist-info/METADATA, service/pythonpath/setuptools/_vendor/typeguard-4.3.0.dist-info/RECORD, service/pythonpath/setuptools/_vendor/typeguard-4.3.0.dist-info/top_level.txt, service/pythonpath/setuptools/_vendor/typeguard-4.3.0.dist-info/WHEEL, service/pythonpath/setuptools/_vendor/typeguard/__init__.py, service/pythonpath/setuptools/_vendor/typeguard/_checkers.py, service/pythonpath/setuptools/_vendor/typeguard/_config.py, service/pythonpath/setuptools/_vendor/typeguard/_decorators.py, service/pythonpath/setuptools/_vendor/typeguard/_exceptions.py, service/pythonpath/setuptools/_vendor/typeguard/_functions.py, service/pythonpath/setuptools/_vendor/typeguard/_importhook.py, service/pythonpath/setuptools/_vendor/typeguard/_memo.py, service/pythonpath/setuptools/_vendor/typeguard/_pytest_plugin.py, service/pythonpath/setuptools/_vendor/typeguard/_suppression.py, service/pythonpath/setuptools/_vendor/typeguard/_transformer.py, service/pythonpath/setuptools/_vendor/typeguard/_union_transformer.py, service/pythonpath/setuptools/_vendor/typeguard/_utils.py, service/pythonpath/setuptools/_vendor/typeguard/py.typed, service/pythonpath/setuptools/_vendor/typing_extensions-4.12.2.dist-info/INSTALLER, service/pythonpath/setuptools/_vendor/typing_extensions-4.12.2.dist-info/LICENSE, service/pythonpath/setuptools/_vendor/typing_extensions-4.12.2.dist-info/METADATA, service/pythonpath/setuptools/_vendor/typing_extensions-4.12.2.dist-info/RECORD, service/pythonpath/setuptools/_vendor/typing_extensions-4.12.2.dist-info/WHEEL, service/pythonpath/setuptools/_vendor/typing_extensions.py, service/pythonpath/setuptools/_vendor/wheel-0.43.0.dist-info/entry_points.txt, service/pythonpath/setuptools/_vendor/wheel-0.43.0.dist-info/INSTALLER, service/pythonpath/setuptools/_vendor/wheel-0.43.0.dist-info/LICENSE.txt, service/pythonpath/setuptools/_vendor/wheel-0.43.0.dist-info/METADATA, service/pythonpath/setuptools/_vendor/wheel-0.43.0.dist-info/RECORD, service/pythonpath/setuptools/_vendor/wheel-0.43.0.dist-info/REQUESTED, service/pythonpath/setuptools/_vendor/wheel-0.43.0.dist-info/WHEEL, service/pythonpath/setuptools/_vendor/wheel/__init__.py, service/pythonpath/setuptools/_vendor/wheel/__main__.py, service/pythonpath/setuptools/_vendor/wheel/_setuptools_logging.py, service/pythonpath/setuptools/_vendor/wheel/bdist_wheel.py, service/pythonpath/setuptools/_vendor/wheel/cli/__init__.py, service/pythonpath/setuptools/_vendor/wheel/cli/convert.py, service/pythonpath/setuptools/_vendor/wheel/cli/pack.py, service/pythonpath/setuptools/_vendor/wheel/cli/tags.py, service/pythonpath/setuptools/_vendor/wheel/cli/unpack.py, service/pythonpath/setuptools/_vendor/wheel/macosx_libfile.py, service/pythonpath/setuptools/_vendor/wheel/metadata.py, service/pythonpath/setuptools/_vendor/wheel/util.py, service/pythonpath/setuptools/_vendor/wheel/vendored/__init__.py, service/pythonpath/setuptools/_vendor/wheel/vendored/packaging/__init__.py, service/pythonpath/setuptools/_vendor/wheel/vendored/packaging/_elffile.py, service/pythonpath/setuptools/_vendor/wheel/vendored/packaging/_manylinux.py, service/pythonpath/setuptools/_vendor/wheel/vendored/packaging/_musllinux.py, service/pythonpath/setuptools/_vendor/wheel/vendored/packaging/_parser.py, service/pythonpath/setuptools/_vendor/wheel/vendored/packaging/_structures.py, service/pythonpath/setuptools/_vendor/wheel/vendored/packaging/_tokenizer.py, service/pythonpath/setuptools/_vendor/wheel/vendored/packaging/markers.py, service/pythonpath/setuptools/_vendor/wheel/vendored/packaging/requirements.py, service/pythonpath/setuptools/_vendor/wheel/vendored/packaging/specifiers.py, service/pythonpath/setuptools/_vendor/wheel/vendored/packaging/tags.py, service/pythonpath/setuptools/_vendor/wheel/vendored/packaging/utils.py, service/pythonpath/setuptools/_vendor/wheel/vendored/packaging/version.py, service/pythonpath/setuptools/_vendor/wheel/vendored/vendor.txt, service/pythonpath/setuptools/_vendor/wheel/wheelfile.py, service/pythonpath/setuptools/_vendor/zipp-3.19.2.dist-info/INSTALLER, service/pythonpath/setuptools/_vendor/zipp-3.19.2.dist-info/LICENSE, service/pythonpath/setuptools/_vendor/zipp-3.19.2.dist-info/METADATA, service/pythonpath/setuptools/_vendor/zipp-3.19.2.dist-info/RECORD, service/pythonpath/setuptools/_vendor/zipp-3.19.2.dist-info/REQUESTED, service/pythonpath/setuptools/_vendor/zipp-3.19.2.dist-info/top_level.txt, service/pythonpath/setuptools/_vendor/zipp-3.19.2.dist-info/WHEEL, service/pythonpath/setuptools/_vendor/zipp/__init__.py, service/pythonpath/setuptools/_vendor/zipp/compat/__init__.py, service/pythonpath/setuptools/_vendor/zipp/compat/py310.py, service/pythonpath/setuptools/_vendor/zipp/glob.py, service/pythonpath/setuptools/archive_util.py, service/pythonpath/setuptools/build_meta.py, service/pythonpath/setuptools/cli-32.exe, service/pythonpath/setuptools/cli-64.exe, service/pythonpath/setuptools/cli-arm64.exe, service/pythonpath/setuptools/cli.exe, service/pythonpath/setuptools/command/__init__.py, service/pythonpath/setuptools/command/_requirestxt.py, service/pythonpath/setuptools/command/alias.py, service/pythonpath/setuptools/command/bdist_egg.py, service/pythonpath/setuptools/command/bdist_rpm.py, service/pythonpath/setuptools/command/bdist_wheel.py, service/pythonpath/setuptools/command/build.py, service/pythonpath/setuptools/command/build_clib.py, service/pythonpath/setuptools/command/build_ext.py, service/pythonpath/setuptools/command/build_py.py, service/pythonpath/setuptools/command/develop.py, service/pythonpath/setuptools/command/dist_info.py, service/pythonpath/setuptools/command/easy_install.py, service/pythonpath/setuptools/command/editable_wheel.py, service/pythonpath/setuptools/command/egg_info.py, service/pythonpath/setuptools/command/install.py, service/pythonpath/setuptools/command/install_egg_info.py, service/pythonpath/setuptools/command/install_lib.py, service/pythonpath/setuptools/command/install_scripts.py, service/pythonpath/setuptools/command/launcher manifest.xml, service/pythonpath/setuptools/command/rotate.py, service/pythonpath/setuptools/command/saveopts.py, service/pythonpath/setuptools/command/sdist.py, service/pythonpath/setuptools/command/setopt.py, service/pythonpath/setuptools/command/test.py, service/pythonpath/setuptools/compat/__init__.py, service/pythonpath/setuptools/compat/py310.py, service/pythonpath/setuptools/compat/py311.py, service/pythonpath/setuptools/compat/py312.py, service/pythonpath/setuptools/compat/py39.py, service/pythonpath/setuptools/config/__init__.py, service/pythonpath/setuptools/config/_apply_pyprojecttoml.py, service/pythonpath/setuptools/config/_validate_pyproject/__init__.py, service/pythonpath/setuptools/config/_validate_pyproject/error_reporting.py, service/pythonpath/setuptools/config/_validate_pyproject/extra_validations.py, service/pythonpath/setuptools/config/_validate_pyproject/fastjsonschema_exceptions.py, service/pythonpath/setuptools/config/_validate_pyproject/fastjsonschema_validations.py, service/pythonpath/setuptools/config/_validate_pyproject/formats.py, service/pythonpath/setuptools/config/_validate_pyproject/NOTICE, service/pythonpath/setuptools/config/distutils.schema.json, service/pythonpath/setuptools/config/expand.py, service/pythonpath/setuptools/config/NOTICE, service/pythonpath/setuptools/config/pyprojecttoml.py, service/pythonpath/setuptools/config/setupcfg.py, service/pythonpath/setuptools/config/setuptools.schema.json, service/pythonpath/setuptools/depends.py, service/pythonpath/setuptools/discovery.py, service/pythonpath/setuptools/dist.py, service/pythonpath/setuptools/errors.py, service/pythonpath/setuptools/extension.py, service/pythonpath/setuptools/glob.py, service/pythonpath/setuptools/gui-32.exe, service/pythonpath/setuptools/gui-64.exe, service/pythonpath/setuptools/gui-arm64.exe, service/pythonpath/setuptools/gui.exe, service/pythonpath/setuptools/installer.py, service/pythonpath/setuptools/launch.py, service/pythonpath/setuptools/logging.py, service/pythonpath/setuptools/modified.py, service/pythonpath/setuptools/monkey.py, service/pythonpath/setuptools/msvc.py, service/pythonpath/setuptools/namespaces.py, service/pythonpath/setuptools/package_index.py, service/pythonpath/setuptools/sandbox.py, service/pythonpath/setuptools/script (dev).tmpl, service/pythonpath/setuptools/script.tmpl, service/pythonpath/setuptools/tests/__init__.py, service/pythonpath/setuptools/tests/compat/__init__.py, service/pythonpath/setuptools/tests/compat/py39.py, service/pythonpath/setuptools/tests/config/__init__.py, service/pythonpath/setuptools/tests/config/downloads/__init__.py, service/pythonpath/setuptools/tests/config/downloads/preload.py, service/pythonpath/setuptools/tests/config/setupcfg_examples.txt, service/pythonpath/setuptools/tests/config/test_apply_pyprojecttoml.py, service/pythonpath/setuptools/tests/config/test_expand.py, service/pythonpath/setuptools/tests/config/test_pyprojecttoml.py, service/pythonpath/setuptools/tests/config/test_pyprojecttoml_dynamic_deps.py, service/pythonpath/setuptools/tests/config/test_setupcfg.py, service/pythonpath/setuptools/tests/contexts.py, service/pythonpath/setuptools/tests/environment.py, service/pythonpath/setuptools/tests/fixtures.py, service/pythonpath/setuptools/tests/indexes/test_links_priority/external.html, service/pythonpath/setuptools/tests/indexes/test_links_priority/simple/foobar/index.html, service/pythonpath/setuptools/tests/integration/__init__.py, service/pythonpath/setuptools/tests/integration/helpers.py, service/pythonpath/setuptools/tests/integration/test_pip_install_sdist.py, service/pythonpath/setuptools/tests/mod_with_constant.py, service/pythonpath/setuptools/tests/namespaces.py, service/pythonpath/setuptools/tests/script-with-bom.py, service/pythonpath/setuptools/tests/server.py, service/pythonpath/setuptools/tests/test_archive_util.py, service/pythonpath/setuptools/tests/test_bdist_deprecations.py, service/pythonpath/setuptools/tests/test_bdist_egg.py, service/pythonpath/setuptools/tests/test_bdist_wheel.py, service/pythonpath/setuptools/tests/test_build.py, service/pythonpath/setuptools/tests/test_build_clib.py, service/pythonpath/setuptools/tests/test_build_ext.py, service/pythonpath/setuptools/tests/test_build_meta.py, service/pythonpath/setuptools/tests/test_build_py.py, service/pythonpath/setuptools/tests/test_config_discovery.py, service/pythonpath/setuptools/tests/test_core_metadata.py, service/pythonpath/setuptools/tests/test_depends.py, service/pythonpath/setuptools/tests/test_develop.py, service/pythonpath/setuptools/tests/test_dist.py, service/pythonpath/setuptools/tests/test_dist_info.py, service/pythonpath/setuptools/tests/test_distutils_adoption.py, service/pythonpath/setuptools/tests/test_easy_install.py, service/pythonpath/setuptools/tests/test_editable_install.py, service/pythonpath/setuptools/tests/test_egg_info.py, service/pythonpath/setuptools/tests/test_extern.py, service/pythonpath/setuptools/tests/test_find_packages.py, service/pythonpath/setuptools/tests/test_find_py_modules.py, service/pythonpath/setuptools/tests/test_glob.py, service/pythonpath/setuptools/tests/test_install_scripts.py, service/pythonpath/setuptools/tests/test_logging.py, service/pythonpath/setuptools/tests/test_manifest.py, service/pythonpath/setuptools/tests/test_namespaces.py, service/pythonpath/setuptools/tests/test_packageindex.py, service/pythonpath/setuptools/tests/test_sandbox.py, service/pythonpath/setuptools/tests/test_sdist.py, service/pythonpath/setuptools/tests/test_setopt.py, service/pythonpath/setuptools/tests/test_setuptools.py, service/pythonpath/setuptools/tests/test_unicode_utils.py, service/pythonpath/setuptools/tests/test_virtualenv.py, service/pythonpath/setuptools/tests/test_warnings.py, service/pythonpath/setuptools/tests/test_wheel.py, service/pythonpath/setuptools/tests/test_windows_wrappers.py, service/pythonpath/setuptools/tests/text.py, service/pythonpath/setuptools/tests/textwrap.py, service/pythonpath/setuptools/unicode_utils.py, service/pythonpath/setuptools/version.py, service/pythonpath/setuptools/warnings.py, service/pythonpath/setuptools/wheel.py, service/pythonpath/setuptools/windows_support.py, service/pythonpath/six-1.17.0.dist-info/LICENSE, service/pythonpath/six-1.17.0.dist-info/METADATA, service/pythonpath/six-1.17.0.dist-info/RECORD, service/pythonpath/six-1.17.0.dist-info/top_level.txt, service/pythonpath/six-1.17.0.dist-info/WHEEL, service/pythonpath/six.py diff --git a/source/HyperSQLOOo/service/OptionsHandler.py b/source/HyperSQLOOo/service/OptionsHandler.py index 1196383d..4c413c49 100644 --- a/source/HyperSQLOOo/service/OptionsHandler.py +++ b/source/HyperSQLOOo/service/OptionsHandler.py @@ -77,6 +77,7 @@ def callHandlerMethod(self, window, event, method): handled = True return handled except Exception as e: + print("OptionsHandler.callHandlerMethod() ERROR: %s" % traceback.format_exc()) self._logger.logprb(SEVERE, 'OptionsHandler', 'callHandlerMethod', 301, e, traceback.format_exc()) def getSupportedMethodNames(self): diff --git a/source/HyperSQLOOo/service/pythonpath/hypersql/option b/source/HyperSQLOOo/service/pythonpath/hypersql/option deleted file mode 120000 index 322f3aa0..00000000 --- a/source/HyperSQLOOo/service/pythonpath/hypersql/option +++ /dev/null @@ -1 +0,0 @@ -../../../../../uno/lib/uno/options/jdbc \ No newline at end of file diff --git a/source/HyperSQLOOo/types.rdb b/source/HyperSQLOOo/types.rdb index 1ac3de27..cbaf2415 100644 Binary files a/source/HyperSQLOOo/types.rdb and b/source/HyperSQLOOo/types.rdb differ diff --git a/uno/.gitrepo b/uno/.gitrepo index d3fa444b..6dfd17e9 100644 --- a/uno/.gitrepo +++ b/uno/.gitrepo @@ -6,7 +6,7 @@ [subrepo] remote = https://github.com/prrvchr/uno.git branch = main - commit = 66e9aea6994add573be9c1556b90c87449543a11 - parent = 1597a53409658078944bc6348a59826b01fad6d8 + commit = c1a100b6f093ceef9aef387d4e88660e70568d3f + parent = 6ab23df5dd63d796e2894312422010362da34326 method = merge cmdver = 0.4.9 diff --git a/uno/dialog/card/OptionDialog.xdl b/uno/dialog/card/OptionDialog.xdl new file mode 100644 index 00000000..71b21e9d --- /dev/null +++ b/uno/dialog/card/OptionDialog.xdl @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/uno/dialog/card/OptionsDialog.xdl b/uno/dialog/card/OptionsDialog.xdl index 5da50845..573f84f8 100644 --- a/uno/dialog/card/OptionsDialog.xdl +++ b/uno/dialog/card/OptionsDialog.xdl @@ -24,20 +24,14 @@ ║ ║ ╚════════════════════════════════════════════════════════════════════════════════════╝ --> + - - - - - - - - - - + + + diff --git a/uno/dialog/ucb/DialogStrings_en_US.default b/uno/dialog/card/OptionsDialog_en_US.default similarity index 100% rename from uno/dialog/ucb/DialogStrings_en_US.default rename to uno/dialog/card/OptionsDialog_en_US.default diff --git a/uno/dialog/card/OptionsDialog_en_US.properties b/uno/dialog/card/OptionsDialog_en_US.properties new file mode 100644 index 00000000..f656e782 --- /dev/null +++ b/uno/dialog/card/OptionsDialog_en_US.properties @@ -0,0 +1,8 @@ +OptionsDialog.HelpText= +OptionsDialog.Title= +OptionsDialog.Label1.HelpText= +OptionsDialog.Label1.Label=The changes will take effect after restarting LibreOffice... +OptionsDialog.Hyperlink1.HelpText= +OptionsDialog.Hyperlink1.Label=You must install the Java Instrumentation Agent to use jdbcDriverOOO... +OptionsDialog.Hyperlink1.Url=https://prrvchr.github.io/jdbcDriverOOo/#how-to-install-java-instrumentation + diff --git a/uno/dialog/card/OptionsDialog_fr_FR.properties b/uno/dialog/card/OptionsDialog_fr_FR.properties new file mode 100644 index 00000000..9fcdca9f --- /dev/null +++ b/uno/dialog/card/OptionsDialog_fr_FR.properties @@ -0,0 +1,8 @@ +OptionsDialog.HelpText= +OptionsDialog.Title= +OptionsDialog.Label1.HelpText= +OptionsDialog.Label1.Label=Les modifications prendront effet apr\u00e8s le red\u00e9marrage de LibreOffice... +OptionsDialog.Hyperlink1.HelpText= +OptionsDialog.Hyperlink1.Label=Veuillez installer l'instrumentation Java pour utiliser jdbcDriverOOO... +OptionsDialog.Hyperlink1.Url=https://prrvchr.github.io/jdbcDriverOOo/README_fr#comment-installer-linstrumentation-java + diff --git a/uno/dialog/dialog.dtd b/uno/dialog/dialog.dtd new file mode 100644 index 00000000..7290b8d2 --- /dev/null +++ b/uno/dialog/dialog.dtd @@ -0,0 +1,426 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/uno/dialog/embedded/OptionsDialog.xdl b/uno/dialog/embedded/OptionsDialog.xdl index 3800155d..0f861bb4 100644 --- a/uno/dialog/embedded/OptionsDialog.xdl +++ b/uno/dialog/embedded/OptionsDialog.xdl @@ -1,4 +1,29 @@ + @@ -7,5 +32,8 @@ + + + diff --git a/uno/dialog/embedded/OptionsDialog_en_US.properties b/uno/dialog/embedded/OptionsDialog_en_US.properties index c078b893..18ef2e71 100644 --- a/uno/dialog/embedded/OptionsDialog_en_US.properties +++ b/uno/dialog/embedded/OptionsDialog_en_US.properties @@ -4,3 +4,9 @@ OptionsDialog.Label1.HelpText= OptionsDialog.Label1.Label=Driver version: OptionsDialog.Label2.HelpText= OptionsDialog.Label2.Label= +OptionsDialog.Label3.HelpText=You have made changes. Restart LibreOffice for the changes to take effect +OptionsDialog.Label3.Label=Changes will take effect after restarting LibreOffice... +OptionsDialog.Hyperlink1.HelpText= +OptionsDialog.Hyperlink1.Label=You must install the Java Instrumentation Agent to use jdbcDriverOOO... +OptionsDialog.Hyperlink1.Url=https://prrvchr.github.io/jdbcDriverOOo/#how-to-install-java-instrumentation + diff --git a/uno/dialog/embedded/OptionsDialog_fr_FR.properties b/uno/dialog/embedded/OptionsDialog_fr_FR.properties index 1b4de163..cc8866fc 100644 --- a/uno/dialog/embedded/OptionsDialog_fr_FR.properties +++ b/uno/dialog/embedded/OptionsDialog_fr_FR.properties @@ -4,3 +4,9 @@ OptionsDialog.Label1.HelpText= OptionsDialog.Label1.Label=Version du pilote: OptionsDialog.Label2.HelpText= OptionsDialog.Label2.Label= +OptionsDialog.Label3.HelpText=Vous avez effectu des modifications. Redmarrez LibreOffice pour que les modifications soient prises en compte +OptionsDialog.Label3.Label=Les modifications prendront effet aprs le redmarrage de LibreOffice... +OptionsDialog.Hyperlink1.HelpText= +OptionsDialog.Hyperlink1.Label=Veuillez installer l'instrumentation Java pour utiliser jdbcDriverOOO... +OptionsDialog.Hyperlink1.Url=https://prrvchr.github.io/jdbcDriverOOo/README_fr#comment-installer-linstrumentation-java + diff --git a/uno/dialog/grid/GridWindow.xdl b/uno/dialog/grid/GridWindow.xdl index c1bb2d88..f0a2bba6 100644 --- a/uno/dialog/grid/GridWindow.xdl +++ b/uno/dialog/grid/GridWindow.xdl @@ -31,8 +31,9 @@ - + + diff --git a/uno/dialog/grid/GridWindow_en_US.properties b/uno/dialog/grid/GridWindow_en_US.properties index 9c3c60b4..68ffd080 100644 --- a/uno/dialog/grid/GridWindow_en_US.properties +++ b/uno/dialog/grid/GridWindow_en_US.properties @@ -5,4 +5,4 @@ GridWindow.CommandButton1.Label=+ GridWindow.Label1.HelpText=Columns to display GridWindow.Label1.Label=Show columns: GridWindow.ListBox1.HelpText=Define the name of the columns to display -GridWindow.ListBox1.Text= + diff --git a/uno/dialog/grid/GridWindow_fr_FR.properties b/uno/dialog/grid/GridWindow_fr_FR.properties index 5c5089cc..a676b2d2 100644 --- a/uno/dialog/grid/GridWindow_fr_FR.properties +++ b/uno/dialog/grid/GridWindow_fr_FR.properties @@ -5,4 +5,4 @@ GridWindow.CommandButton1.Label=+ GridWindow.Label1.HelpText=Colonnes \u00e0 afficher GridWindow.Label1.Label=Afficher les colonnes: GridWindow.ListBox1.HelpText=D\u00e9finir le nom des colonnes \u00e0 afficher -GridWindow.ListBox1.Text= + diff --git a/uno/dialog/jdbc/OptionDialog.xdl b/uno/dialog/jdbc/OptionDialog.xdl index 14f97dc9..ee070c9f 100644 --- a/uno/dialog/jdbc/OptionDialog.xdl +++ b/uno/dialog/jdbc/OptionDialog.xdl @@ -25,7 +25,7 @@ ╚════════════════════════════════════════════════════════════════════════════════════╝ --> - + @@ -58,6 +58,6 @@ - + diff --git a/uno/dialog/jdbc/OptionDialog_en_US.properties b/uno/dialog/jdbc/OptionDialog_en_US.properties index 9071f3ee..b30760d0 100644 --- a/uno/dialog/jdbc/OptionDialog_en_US.properties +++ b/uno/dialog/jdbc/OptionDialog_en_US.properties @@ -10,7 +10,7 @@ OptionDialog.OptionButton2.HelpText=The delivered SDBC API level will be: com.su OptionDialog.OptionButton2.Label=css.sdbcx OptionDialog.OptionButton3.HelpText=The delivered SDBC API level will be: com.sun.star.sdb.* OptionDialog.OptionButton3.Label=css.sdb -OptionDialog.Label2.HelpText=Use javax.sql.rowset.CachedRowSet to provide ResultSet +OptionDialog.Label2.HelpText=Use javax.sql.rowset.CachedRowSet to provide ResultSet. Using Bookmark is a prerequisite. OptionDialog.Label2.Label=Use CachedRowSet: OptionDialog.OptionButton4.HelpText=Never use CachedRowSet (not recommended) OptionDialog.OptionButton4.Label=Never @@ -20,5 +20,4 @@ OptionDialog.OptionButton6.HelpText=Always use CachedRowSet OptionDialog.OptionButton6.Label=Always OptionDialog.CheckBox1.HelpText=Show system tables in the Base browser OptionDialog.CheckBox1.Label=View system tables -OptionDialog.Label3.HelpText=You have made changes. Restart LibreOffice for the changes to take effect -OptionDialog.Label3.Label=Changes will take effect after restarting LibreOffice... + diff --git a/uno/dialog/jdbc/OptionDialog_fr_FR.properties b/uno/dialog/jdbc/OptionDialog_fr_FR.properties index 1c9de951..7a6b34e7 100644 --- a/uno/dialog/jdbc/OptionDialog_fr_FR.properties +++ b/uno/dialog/jdbc/OptionDialog_fr_FR.properties @@ -10,7 +10,7 @@ OptionDialog.OptionButton2.HelpText=Le niveau de l'API SDBC d OptionDialog.OptionButton2.Label=css.sdbcx OptionDialog.OptionButton3.HelpText=Le niveau de l'API SDBC dlivr sera: com.sun.star.sdb.* OptionDialog.OptionButton3.Label=css.sdb -OptionDialog.Label2.HelpText=Utilise javax.sql.rowset.CachedRowSet pour fournir les ResutSets +OptionDialog.Label2.HelpText=Utilise javax.sql.rowset.CachedRowSet pour fournir les ResutSets. L'utilisation de signets (ie: Bookmark) est une condition pralable. OptionDialog.Label2.Label=Utiliser CachedRowSet: OptionDialog.OptionButton4.HelpText=Ne jamais utiliser les CachedRowSet (non conseill) OptionDialog.OptionButton4.Label=Jamais @@ -20,5 +20,4 @@ OptionDialog.OptionButton6.HelpText=Toujours utiliser les CachedRowSet OptionDialog.OptionButton6.Label=Toujours OptionDialog.CheckBox1.HelpText=Afficher les tables systmes dans le navigateur de Base OptionDialog.CheckBox1.Label=Voir les tables systme -OptionDialog.Label3.HelpText=Vous avez effectu des modifications. Redmarrez LibreOffice pour que les modifications soient prises en compte -OptionDialog.Label3.Label=Les modifications prendront effet aprs le redmarrage de LibreOffice... + diff --git a/uno/dialog/logger/LogDialog.xdl b/uno/dialog/logger/LogDialog.xdl index 1d7040b1..978fd93e 100644 --- a/uno/dialog/logger/LogDialog.xdl +++ b/uno/dialog/logger/LogDialog.xdl @@ -24,12 +24,14 @@ ║ ║ ╚════════════════════════════════════════════════════════════════════════════════════╝ --> + - + + diff --git a/uno/dialog/logger/LogDialog_en_US.properties b/uno/dialog/logger/LogDialog_en_US.properties index 03fb7f46..cfd2480d 100644 --- a/uno/dialog/logger/LogDialog_en_US.properties +++ b/uno/dialog/logger/LogDialog_en_US.properties @@ -6,3 +6,4 @@ LogDialog.CommandButton1.HelpText= LogDialog.CommandButton1.Label=System info LogDialog.CommandButton2.HelpText= LogDialog.CommandButton2.Label=Close + diff --git a/uno/dialog/logger/LogDialog_fr_FR.properties b/uno/dialog/logger/LogDialog_fr_FR.properties index 793e16bb..f4e09a06 100644 --- a/uno/dialog/logger/LogDialog_fr_FR.properties +++ b/uno/dialog/logger/LogDialog_fr_FR.properties @@ -6,3 +6,4 @@ LogDialog.CommandButton1.HelpText= LogDialog.CommandButton1.Label=Info systme LogDialog.CommandButton2.HelpText= LogDialog.CommandButton2.Label=Fermer + diff --git a/uno/dialog/logger/LogWindow.xdl b/uno/dialog/logger/LogWindow.xdl index 2508a6d6..b5d450f0 100644 --- a/uno/dialog/logger/LogWindow.xdl +++ b/uno/dialog/logger/LogWindow.xdl @@ -24,6 +24,7 @@ ║ ║ ╚════════════════════════════════════════════════════════════════════════════════════╝ --> + @@ -31,7 +32,7 @@ - + @@ -51,7 +52,6 @@ - @@ -62,6 +62,8 @@ + + diff --git a/uno/dialog/logger/LogWindow_en_US.properties b/uno/dialog/logger/LogWindow_en_US.properties index 68ff1f72..e24f69e6 100644 --- a/uno/dialog/logger/LogWindow_en_US.properties +++ b/uno/dialog/logger/LogWindow_en_US.properties @@ -5,7 +5,6 @@ LogWindow.FixedLine1.Label=Logging options LogWindow.Label1.HelpText= LogWindow.Label1.Label=Available logs: LogWindow.ListBox1.HelpText= -LogWindow.ListBox1.Text= LogWindow.CheckBox1.HelpText= LogWindow.CheckBox1.Label=Enable log LogWindow.Label2.HelpText= @@ -19,7 +18,6 @@ LogWindow.CommandButton1.Label=View log LogWindow.Label3.HelpText= LogWindow.Label3.Label=Level: LogWindow.ListBox2.HelpText= -LogWindow.ListBox2.Text= LogWindow.ListBox2.StringItemList.0=Sever LogWindow.ListBox2.StringItemList.1=Warning LogWindow.ListBox2.StringItemList.2=Info diff --git a/uno/dialog/logger/LogWindow_fr_FR.properties b/uno/dialog/logger/LogWindow_fr_FR.properties index 68ca2564..3cb145f0 100644 --- a/uno/dialog/logger/LogWindow_fr_FR.properties +++ b/uno/dialog/logger/LogWindow_fr_FR.properties @@ -5,7 +5,6 @@ LogWindow.FixedLine1.Label=Options de journalisation LogWindow.Label1.HelpText= LogWindow.Label1.Label=Journaux disponibles: LogWindow.ListBox1.HelpText= -LogWindow.ListBox1.Text= LogWindow.CheckBox1.HelpText= LogWindow.CheckBox1.Label=Activer le journal LogWindow.Label2.HelpText= @@ -19,7 +18,6 @@ LogWindow.CommandButton1.Label=Voir journal LogWindow.Label3.HelpText= LogWindow.Label3.Label=Seuil: LogWindow.ListBox2.HelpText= -LogWindow.ListBox2.Text= LogWindow.ListBox2.StringItemList.0=Grave LogWindow.ListBox2.StringItemList.1=Alerte LogWindow.ListBox2.StringItemList.2=Info diff --git a/uno/dialog/ucb/DialogStrings_en_US.properties b/uno/dialog/ucb/DialogStrings_en_US.properties deleted file mode 100644 index 744963c8..00000000 --- a/uno/dialog/ucb/DialogStrings_en_US.properties +++ /dev/null @@ -1,53 +0,0 @@ -OptionsDialog.HelpText= -OptionsDialog.Title= -OptionsDialog.FixedLine1.HelpText= -OptionsDialog.FixedLine1.Label=gDriveOOo settings -OptionsDialog.Label1.HelpText= -OptionsDialog.Label1.Label=Replication interval: -OptionsDialog.NumericField1.HelpText=Replication interval in minutes -OptionsDialog.Label2.HelpText= -OptionsDialog.Label2.Label=View datasource: -OptionsDialog.CommandButton1.HelpText= -OptionsDialog.CommandButton1.Label=View DataBase - -LogWindow.HelpText= -LogWindow.Title= -LogWindow.FixedLine1.HelpText= -LogWindow.FixedLine1.Label=Logger settings -LogWindow.Label1.HelpText= -LogWindow.Label1.Label=Available loggers: -LogWindow.ListBox1.HelpText= -LogWindow.ListBox1.Text= -LogWindow.CheckBox1.HelpText= -LogWindow.CheckBox1.Label=Enable logger -LogWindow.Label2.HelpText= -LogWindow.Label2.Label=Output: -LogWindow.OptionButton1.HelpText= -LogWindow.OptionButton1.Label=Console -LogWindow.OptionButton2.HelpText= -LogWindow.OptionButton2.Label=File -LogWindow.CommandButton1.HelpText= -LogWindow.CommandButton1.Label=View log -LogWindow.Label3.HelpText= -LogWindow.Label3.Label=Level: -LogWindow.ListBox2.HelpText= -LogWindow.ListBox2.Text= -LogWindow.ListBox2.StringItemList.0=Sever -LogWindow.ListBox2.StringItemList.1=Warning -LogWindow.ListBox2.StringItemList.2=Info -LogWindow.ListBox2.StringItemList.3=Config -LogWindow.ListBox2.StringItemList.4=Fine -LogWindow.ListBox2.StringItemList.5=Finer -LogWindow.ListBox2.StringItemList.6=Finest -LogWindow.ListBox2.StringItemList.7=All - -LogDialog.HelpText= -LogDialog.Title=Log file - %s -LogDialog.TextField1.HelpText= -LogDialog.TextField1.Text= -LogDialog.CommandButton1.HelpText= -LogDialog.CommandButton1.Label=System Info -LogDialog.CommandButton2.HelpText= -LogDialog.CommandButton2.Label=Clear -LogDialog.CommandButton3.HelpText= -LogDialog.CommandButton3.Label=Close diff --git a/uno/dialog/ucb/DialogStrings_fr_FR.properties b/uno/dialog/ucb/DialogStrings_fr_FR.properties deleted file mode 100644 index a91d7b93..00000000 --- a/uno/dialog/ucb/DialogStrings_fr_FR.properties +++ /dev/null @@ -1,53 +0,0 @@ -OptionsDialog.HelpText= -OptionsDialog.Title= -OptionsDialog.FixedLine1.HelpText= -OptionsDialog.FixedLine1.Label=Options gDriveOOo -OptionsDialog.Label1.HelpText= -OptionsDialog.Label1.Label=Intervalle de r\u00e9plication: -OptionsDialog.NumericField1.HelpText=Intervalle de r\u00e9plication en minutes -OptionsDialog.Label2.HelpText= -OptionsDialog.Label2.Label=Voir la source de donn\u00e9es: -OptionsDialog.CommandButton1.HelpText= -OptionsDialog.CommandButton1.Label=Voir la base de donn\u00e9es - -LogWindow.HelpText= -LogWindow.Title= -LogWindow.FixedLine1.HelpText= -LogWindow.FixedLine1.Label=Options de journalisation -LogWindow.Label1.HelpText= -LogWindow.Label1.Label=Journaux disponibles: -LogWindow.ListBox1.HelpText= -LogWindow.ListBox1.Text= -LogWindow.CheckBox1.HelpText= -LogWindow.CheckBox1.Label=Activer le journal -LogWindow.Label2.HelpText= -LogWindow.Label2.Label=Sortie: -LogWindow.OptionButton1.HelpText= -LogWindow.OptionButton1.Label=Console -LogWindow.OptionButton2.HelpText= -LogWindow.OptionButton2.Label=Fichier -LogWindow.CommandButton1.HelpText= -LogWindow.CommandButton1.Label=Voir journal -LogWindow.Label3.HelpText= -LogWindow.Label3.Label=Seuil: -LogWindow.ListBox2.HelpText= -LogWindow.ListBox2.Text= -LogWindow.ListBox2.StringItemList.0=Grave -LogWindow.ListBox2.StringItemList.1=Alerte -LogWindow.ListBox2.StringItemList.2=Info -LogWindow.ListBox2.StringItemList.3=Config -LogWindow.ListBox2.StringItemList.4=Basique -LogWindow.ListBox2.StringItemList.5=Fin -LogWindow.ListBox2.StringItemList.6=Tr\u00e9s fin -LogWindow.ListBox2.StringItemList.7=Tout - -LogDialog.HelpText= -LogDialog.Title=Fichier journal - %s -LogDialog.TextField1.HelpText= -LogDialog.TextField1.Text= -LogDialog.CommandButton1.HelpText= -LogDialog.CommandButton1.Label=Info syst\u00e8me -LogDialog.CommandButton2.HelpText= -LogDialog.CommandButton2.Label=Effacer -LogDialog.CommandButton3.HelpText= -LogDialog.CommandButton3.Label=Fermer diff --git a/uno/dialog/ucb/OptionsDialog.xdl b/uno/dialog/ucb/OptionsDialog.xdl index d9a13b34..3c8b6e4a 100644 --- a/uno/dialog/ucb/OptionsDialog.xdl +++ b/uno/dialog/ucb/OptionsDialog.xdl @@ -24,6 +24,7 @@ ║ ║ ╚════════════════════════════════════════════════════════════════════════════════════╝ --> + @@ -54,7 +55,7 @@ - + @@ -65,8 +66,8 @@ - - + + @@ -80,22 +81,24 @@ - - + + - - + + - + - + + - \ No newline at end of file + + diff --git a/uno/dialog/wizard/Wizard.xdl b/uno/dialog/wizard/Wizard.xdl index d7487129..73131871 100644 --- a/uno/dialog/wizard/Wizard.xdl +++ b/uno/dialog/wizard/Wizard.xdl @@ -24,26 +24,24 @@ ║ ║ ╚════════════════════════════════════════════════════════════════════════════════════╝ --> - - - - + + - - + - + - + - + - + + diff --git a/uno/dialog/wizard/WizardTop.xdl b/uno/dialog/wizard/WizardTop.xdl new file mode 100644 index 00000000..4754d9fe --- /dev/null +++ b/uno/dialog/wizard/WizardTop.xdl @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/uno/dialog/wizard/WizardTop_en_US.default b/uno/dialog/wizard/WizardTop_en_US.default new file mode 120000 index 00000000..3a9c45d0 --- /dev/null +++ b/uno/dialog/wizard/WizardTop_en_US.default @@ -0,0 +1 @@ +./Wizard_en_US.default \ No newline at end of file diff --git a/uno/dialog/wizard/WizardTop_en_US.properties b/uno/dialog/wizard/WizardTop_en_US.properties new file mode 120000 index 00000000..a1fe6e0e --- /dev/null +++ b/uno/dialog/wizard/WizardTop_en_US.properties @@ -0,0 +1 @@ +./Wizard_en_US.properties \ No newline at end of file diff --git a/uno/dialog/wizard/WizardTop_fr_FR.properties b/uno/dialog/wizard/WizardTop_fr_FR.properties new file mode 120000 index 00000000..887d01c3 --- /dev/null +++ b/uno/dialog/wizard/WizardTop_fr_FR.properties @@ -0,0 +1 @@ +./Wizard_fr_FR.properties \ No newline at end of file diff --git a/uno/dialog/wizard/Wizard_en_US.properties b/uno/dialog/wizard/Wizard_en_US.properties index a08f1aea..5c620869 100644 --- a/uno/dialog/wizard/Wizard_en_US.properties +++ b/uno/dialog/wizard/Wizard_en_US.properties @@ -1,8 +1,6 @@ Wizard.HelpText= Wizard.Title= Wizard.Roadmap.Text=Steps -Wizard.FixedLine1.HelpText= -Wizard.FixedLine1.Label= Wizard.CommandButton5.HelpText= Wizard.CommandButton5.Label=Help Wizard.CommandButton4.HelpText= @@ -13,3 +11,4 @@ Wizard.CommandButton2.HelpText= Wizard.CommandButton2.Label=Finish Wizard.CommandButton1.HelpText= Wizard.CommandButton1.Label=Cancel + diff --git a/uno/dialog/wizard/Wizard_fr_FR.properties b/uno/dialog/wizard/Wizard_fr_FR.properties index 4a12f9db..fc2e4bd0 100644 --- a/uno/dialog/wizard/Wizard_fr_FR.properties +++ b/uno/dialog/wizard/Wizard_fr_FR.properties @@ -1,8 +1,6 @@ Wizard.HelpText= Wizard.Title= Wizard.Roadmap.Text=\u00c9tapes -Wizard.FixedLine1.HelpText= -Wizard.FixedLine1.Label= Wizard.CommandButton5.HelpText= Wizard.CommandButton5.Label=Aide Wizard.CommandButton4.HelpText= @@ -13,3 +11,4 @@ Wizard.CommandButton2.HelpText= Wizard.CommandButton2.Label=Terminer Wizard.CommandButton1.HelpText= Wizard.CommandButton1.Label=Annuler + diff --git a/uno/lib/java/UnoHelper/UnoHelper.jar b/uno/lib/java/UnoHelper/UnoHelper.jar index 977a88f5..b5fda019 100644 Binary files a/uno/lib/java/UnoHelper/UnoHelper.jar and b/uno/lib/java/UnoHelper/UnoHelper.jar differ diff --git a/uno/lib/python/pyRdfa/extras/httpheader.py b/uno/lib/python/pyRdfa/extras/httpheader.py index 7a81a263..e43b1207 100644 --- a/uno/lib/python/pyRdfa/extras/httpheader.py +++ b/uno/lib/python/pyRdfa/extras/httpheader.py @@ -344,7 +344,7 @@ def parse_quoted_string(s, start=0): """Parses a quoted string. Returns a tuple (string, chars_consumed). The quote marks will - have been removed and all \-escapes will have been replaced with + have been removed and all \\-escapes will have been replaced with the characters they represent. """ @@ -356,7 +356,7 @@ def parse_token_or_quoted_string(s, start=0, allow_quoted=True, allow_token=True 's' is the string to parse, while start is the position within the string where parsing should begin. It will returns a tuple - (token, chars_consumed), with all \-escapes and quotation already + (token, chars_consumed), with all \\-escapes and quotation already processed. Syntax is according to BNF rules in RFC 2161 section 2.2, @@ -522,7 +522,7 @@ def parse_comment(s, start=0): nested comments will still have their parentheses and whitespace left intact. - All \-escaped quoted pairs will have been replaced with the actual + All \\-escaped quoted pairs will have been replaced with the actual characters they represent, even within the inner nested comments. You should note that only a few HTTP headers, such as User-Agent diff --git a/uno/lib/python/pyRdfa3-3.6.4.dist-info/LICENSE b/uno/lib/python/pyRdfa3-3.6.5.dist-info/LICENSE similarity index 100% rename from uno/lib/python/pyRdfa3-3.6.4.dist-info/LICENSE rename to uno/lib/python/pyRdfa3-3.6.5.dist-info/LICENSE diff --git a/uno/lib/python/pyRdfa3-3.6.4.dist-info/METADATA b/uno/lib/python/pyRdfa3-3.6.5.dist-info/METADATA similarity index 94% rename from uno/lib/python/pyRdfa3-3.6.4.dist-info/METADATA rename to uno/lib/python/pyRdfa3-3.6.5.dist-info/METADATA index c86833e1..ff2ca97b 100644 --- a/uno/lib/python/pyRdfa3-3.6.4.dist-info/METADATA +++ b/uno/lib/python/pyRdfa3-3.6.5.dist-info/METADATA @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: pyRdfa3 -Version: 3.6.4 +Version: 3.6.5 Summary: pyRdfa distiller/parser library Author-email: Ivan Herman & prrvchr Project-URL: Homepage, https://prrvchr.github.io/pyrdfa3/ @@ -11,9 +11,9 @@ Classifier: Operating System :: OS Independent Requires-Python: >=3.8 Description-Content-Type: text/markdown License-File: LICENSE -Requires-Dist: requests >=2.32.3 -Requires-Dist: rdflib >=7.0.0 -Requires-Dist: html5lib >=1.1 +Requires-Dist: requests (>=2.32.3) +Requires-Dist: rdflib (>=7.0.0) +Requires-Dist: html5lib (>=1.1) [![DOI](https://zenodo.org/badge/doi/10.5281/zenodo.14547.svg)](http://dx.doi.org/10.5281/zenodo.14547) @@ -21,7 +21,7 @@ Requires-Dist: html5lib >=1.1 > **Note:** since I retired a few months ago I do not really maintain this package any more. I would be more than happy if an interested party was interested to take over. In the meantime, I have "archived" the repository to clearly signal that there is no maintenance. I would be happy to unarchive it and transfer ownership if someone is interested. > [@iherman](https://github.com/iherman) -> **This new version 3.6.4 is now built and maintained on [prrvchr.github.io/pyrdfa3][1]** +> **This new version 3.6.5 is now built and maintained on [prrvchr.github.io/pyrdfa3][1]** The package can be installed from [PyPI][2] with command: diff --git a/uno/lib/python/pyRdfa3-3.6.4.dist-info/RECORD b/uno/lib/python/pyRdfa3-3.6.5.dist-info/RECORD similarity index 81% rename from uno/lib/python/pyRdfa3-3.6.4.dist-info/RECORD rename to uno/lib/python/pyRdfa3-3.6.5.dist-info/RECORD index 6a5cbf20..a41c40d4 100644 --- a/uno/lib/python/pyRdfa3-3.6.4.dist-info/RECORD +++ b/uno/lib/python/pyRdfa3-3.6.5.dist-info/RECORD @@ -9,7 +9,7 @@ pyRdfa/state.py,sha256=gbD41iGy-zJ7edkLmYFAPCAwC0VeUez38eXGF-RIQoM,24502 pyRdfa/termorcurie.py,sha256=M0ocu76xb1fTG6xGR5GAlfmK5aulVzBViBIIUUUzCBc,23387 pyRdfa/utils.py,sha256=apkz3UBF9zyObsnIadl2i6sm6ORzZA7xnuBSCCQBcPc,10229 pyRdfa/extras/__init__.py,sha256=ewApVDdXUYUQJiq-fpZBZ0ZO6OCIifz4kThymF8sCKs,105 -pyRdfa/extras/httpheader.py,sha256=D8DzCGmv6wEufJs1yg1d7ubDY2NY7rxF4XIeaUN8_g8,70183 +pyRdfa/extras/httpheader.py,sha256=fdn_P1zdAGLPR43VZ9rxeVxC1UVz2qDHBmlQ-jN1bsk,70186 pyRdfa/host/__init__.py,sha256=M0YxNcG3LGmj6aUf8QyCbbFi61UddyitcqYV9BmwvZY,10493 pyRdfa/host/atom.py,sha256=eO3kHFL3sIELeMp1EGZGbhhY9D45R9WfoFlyEQvBg0w,1141 pyRdfa/host/html5.py,sha256=aso2SDUvcOaCEM1wK1n-TRZB0YvwKx5jscbYKv1a94A,8241 @@ -22,8 +22,8 @@ pyRdfa/transform/__init__.py,sha256=rdLhZQSfv5K8zt4km8p1x7WIrjfcgJ6dqyGgIabgVRc, pyRdfa/transform/lite.py,sha256=0dI11FWNOJo7gYFwEDNuegXg9UZexuA5IoRCmXw2K1s,3478 pyRdfa/transform/metaname.py,sha256=3zB5M3jSyyQx1D3n_AUdVsFyjYShy938PzKVOFR3rIM,1153 pyRdfa/transform/prototype.py,sha256=eH8Bub1iIZ1SUu9FsskHmKtGKDJy0wWq3B9WhxqIevY,1328 -pyRdfa3-3.6.4.dist-info/LICENSE,sha256=GOjCqSTUS9_c4wVdtwvU3n-tfx1g3ylFh1WmS8sEdm8,1901 -pyRdfa3-3.6.4.dist-info/METADATA,sha256=dSqs6Fbnl9oggoWS5UVWCgxpGwEWe2UTh2K4FMt7IXk,3369 -pyRdfa3-3.6.4.dist-info/WHEEL,sha256=Wyh-_nZ0DJYolHNn1_hMa4lM7uDedD_RGVwbmTjyItk,91 -pyRdfa3-3.6.4.dist-info/top_level.txt,sha256=NhGN9_N-teibyYvfbpX1aDUW7al6WiIPLTdEjpWUII4,7 -pyRdfa3-3.6.4.dist-info/RECORD,, +pyRdfa3-3.6.5.dist-info/LICENSE,sha256=GOjCqSTUS9_c4wVdtwvU3n-tfx1g3ylFh1WmS8sEdm8,1901 +pyRdfa3-3.6.5.dist-info/METADATA,sha256=P2PhrqeYHeGPp26cr-RG8tof1UWoSjReXiBOQgjL80s,3375 +pyRdfa3-3.6.5.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91 +pyRdfa3-3.6.5.dist-info/top_level.txt,sha256=NhGN9_N-teibyYvfbpX1aDUW7al6WiIPLTdEjpWUII4,7 +pyRdfa3-3.6.5.dist-info/RECORD,, diff --git a/uno/lib/python/pyRdfa3-3.6.4.dist-info/WHEEL b/uno/lib/python/pyRdfa3-3.6.5.dist-info/WHEEL similarity index 65% rename from uno/lib/python/pyRdfa3-3.6.4.dist-info/WHEEL rename to uno/lib/python/pyRdfa3-3.6.5.dist-info/WHEEL index ecaf39f3..9b78c445 100644 --- a/uno/lib/python/pyRdfa3-3.6.4.dist-info/WHEEL +++ b/uno/lib/python/pyRdfa3-3.6.5.dist-info/WHEEL @@ -1,5 +1,5 @@ Wheel-Version: 1.0 -Generator: setuptools (71.1.0) +Generator: setuptools (75.3.0) Root-Is-Purelib: true Tag: py3-none-any diff --git a/uno/lib/python/pyRdfa3-3.6.4.dist-info/top_level.txt b/uno/lib/python/pyRdfa3-3.6.5.dist-info/top_level.txt similarity index 100% rename from uno/lib/python/pyRdfa3-3.6.4.dist-info/top_level.txt rename to uno/lib/python/pyRdfa3-3.6.5.dist-info/top_level.txt diff --git a/uno/lib/uno/card/datasource.py b/uno/lib/uno/card/datasource.py index 72bdfc99..789edbfc 100644 --- a/uno/lib/uno/card/datasource.py +++ b/uno/lib/uno/card/datasource.py @@ -30,6 +30,8 @@ from com.sun.star.logging.LogLevel import INFO from com.sun.star.logging.LogLevel import SEVERE +from com.sun.star.uno import Exception as UnoException + from .database import DataBase from .provider import Provider @@ -45,6 +47,7 @@ from .helper import getSqlException +from .configuration import g_extension from threading import Event @@ -87,22 +90,29 @@ def closeConnection(self, connection): # Procedures called by Driver def getConnection(self, source, logger, url, scheme, server, account, password=''): + mtd = 'getConnection' uri = self._provider.getUserUri(server, account) if uri in self._maps: name = self._maps.get(uri) user = self._users.get(name) if not user.Request.isAuthorized(): - cls, mtd = 'DataSource', 'getConnection()' - raise getSqlException(self._ctx, source, 1002, 1401, cls, mtd, name) + raise getSqlException(self._ctx, source, 1002, 1401, self._cls, mtd, name, g_extension) else: user = User(self._ctx, source, logger, self._database, self._provider, url, scheme, server, account, password) name = user.getName() - self._users[name] = user - self._maps[uri] = name if user.isOnLine(): - self._provider.initAddressbooks(self._database, user) + try: + self._provider.initAddressbooks(self._database, user) + except UnoException as ex: + e = getSqlException(self._ctx, source, 1001, 1402, self._cls, mtd, name, g_extension) + e.NextException = ex + raise e connection = self._database.getConnection(name, user.getPassword()) + # XXX: New users are cached only if the connection is successful. + if not uri in self._maps: + self._users[name] = user + self._maps[uri] = name user.addSession(self._database.getSessionId(connection)) # User and/or AddressBooks has been initialized and the connection to the database is done... # We can start the database replication in a background task. diff --git a/uno/lib/uno/card/resource/Driver_en_US.properties b/uno/lib/uno/card/resource/Driver_en_US.properties index 06c3f67e..87b2ab9e 100644 --- a/uno/lib/uno/card/resource/Driver_en_US.properties +++ b/uno/lib/uno/card/resource/Driver_en_US.properties @@ -47,6 +47,7 @@ 1400=DataSource.getConnection() 1401=The user {} has abandoned the OAuth2 authorization wizard, the {} extension cannot continue without this authorization!!! +1402=The user {} cannot connect, the {} extension cannot continue without connection!!! 1500=User.__init__() diff --git a/uno/lib/uno/card/resource/Driver_fr_FR.properties b/uno/lib/uno/card/resource/Driver_fr_FR.properties index 3a578563..a40d95bd 100644 --- a/uno/lib/uno/card/resource/Driver_fr_FR.properties +++ b/uno/lib/uno/card/resource/Driver_fr_FR.properties @@ -47,6 +47,7 @@ 1400=DataSource.getConnection() 1401=L'utilisateur {} a abandonn l'assistant d'autorisation OAuth2, l'extension {} ne peut pas continuer sans cette autorisation!!! +1402=L'utilisateur {} ne peut pas se connecter, l'extension {} ne peut pas continuer sans connexion!!! 1500=User.__init__() diff --git a/uno/lib/uno/component-schema.dtd b/uno/lib/uno/component-schema.dtd new file mode 100644 index 00000000..70bd51bf --- /dev/null +++ b/uno/lib/uno/component-schema.dtd @@ -0,0 +1,142 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/uno/lib/uno/component-update.dtd b/uno/lib/uno/component-update.dtd new file mode 100644 index 00000000..0659e412 --- /dev/null +++ b/uno/lib/uno/component-update.dtd @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/uno/lib/uno/dbtool/__init__.py b/uno/lib/uno/dbtool/__init__.py index 41dbed8b..a5ca8616 100644 --- a/uno/lib/uno/dbtool/__init__.py +++ b/uno/lib/uno/dbtool/__init__.py @@ -61,6 +61,7 @@ from .dbtool import getDateTimeFromString from .dbtool import getDateTimeToString from .dbtool import getDictFromResult +from .dbtool import getDictSequenceFromResult from .dbtool import getDriverInfos from .dbtool import getDriverPropertyInfo from .dbtool import getDriverPropertyInfos diff --git a/uno/lib/uno/dbtool/dbtool.py b/uno/lib/uno/dbtool/dbtool.py index 62b3043c..6f75a0b1 100644 --- a/uno/lib/uno/dbtool/dbtool.py +++ b/uno/lib/uno/dbtool/dbtool.py @@ -303,6 +303,14 @@ def getRowDict(result, default=None, count=None): row[name] = value return row +def getDictSequenceFromResult(result, default=None): + sequence = [] + count = result.MetaData.ColumnCount +1 + while result.next(): + data = getRowDict(result, default, count) + sequence.append(data) + return tuple(sequence) + def getObjectFromResult(result, default=None, count=None): obj = Object() if count is None: diff --git a/uno/lib/uno/grid/__init__.py b/uno/lib/uno/grid/__init__.py index 261096be..8a211532 100644 --- a/uno/lib/uno/grid/__init__.py +++ b/uno/lib/uno/grid/__init__.py @@ -31,5 +31,6 @@ from .gridmodel import GridModel -from .gridhandler import GridListener +from .gridhandler import GridDataListener +from .gridhandler import GridSelectionListener diff --git a/uno/lib/uno/grid/gridhandler.py b/uno/lib/uno/grid/gridhandler.py index 509e7491..d1426cdf 100644 --- a/uno/lib/uno/grid/gridhandler.py +++ b/uno/lib/uno/grid/gridhandler.py @@ -30,6 +30,7 @@ import unohelper from com.sun.star.awt import XContainerWindowEventHandler +from com.sun.star.awt.grid import XGridDataListener from com.sun.star.awt.grid import XGridSelectionListener import traceback @@ -51,17 +52,44 @@ def callHandlerMethod(self, window, event, method): self._manager.setColumn(event.Source.getSelectedItemPos()) handled = True return handled - except Exception as e: - msg = "Error: %s" % traceback.format_exc() - print(msg) + except: + print("WindowHandler.callHandlerMethod() ERROR: %s" % traceback.format_exc()) def getSupportedMethodNames(self): return ('ShowColumns', 'SetColumn') -class GridListener(unohelper.Base, - XGridSelectionListener): +class GridDataListener(unohelper.Base, + XGridDataListener): + def __init__(self, manager): + self._manager = manager + + # XGridDataListener + def rowsInserted(self, event): + try: + self._manager.dataGridChanged() + except: + print("GridDataListener.rowsInserted() ERROR: %s" % traceback.format_exc()) + + def rowsRemoved(self, event): + try: + self._manager.dataGridChanged() + except: + print("GridDataListener.rowsRemoved() ERROR: %s" % traceback.format_exc()) + + def dataChanged(self, event): + pass + + def rowHeadingChanged(self, event): + pass + + def disposing(self, event): + pass + + +class GridSelectionListener(unohelper.Base, + XGridSelectionListener): def __init__(self, manager, grid=1): self._manager = manager self._grid = grid @@ -72,9 +100,8 @@ def selectionChanged(self, event): control = event.Source index = control.getSelectedRows()[-1] if control.hasSelectedRows() else -1 self._manager.changeGridSelection(index, self._grid) - except Exception as e: - msg = "Error: %s" % traceback.format_exc() - print(msg) + except: + print("GridSelectionListener.selectionChanged() ERROR: %s" % traceback.format_exc()) def disposing(self, event): pass diff --git a/uno/lib/uno/grid/gridmanager.py b/uno/lib/uno/grid/gridmanager.py index 2c48bf7d..a972aacf 100644 --- a/uno/lib/uno/grid/gridmanager.py +++ b/uno/lib/uno/grid/gridmanager.py @@ -37,11 +37,11 @@ from .gridhandler import WindowHandler -from ..unotool import createService -from ..unotool import getConfiguration -from ..unotool import getPropertyValue +from ...unotool import createService +from ...unotool import getConfiguration +from ...unotool import getPropertyValue -from ..configuration import g_identifier +from ...configuration import g_identifier import json from collections import OrderedDict @@ -49,8 +49,7 @@ class GridManager(): - def __init__(self, ctx, url, model, window, quote, setting, selection, resources=None, maxi=None, multi=False, factor=5): - self._quote = quote + def __init__(self, ctx, url, model, window, setting, selection, resources=None, maxi=None, multi=False, factor=5): self._factor = factor self._datasource = None self._table = None @@ -101,10 +100,9 @@ def getSelectedRows(self): def getSelectedColumn(self, column): value = None - if self._view.hasSelectedRows() and column in self._headers: - index = tuple(self._headers.keys()).index(column) - row = self.getUnsortedIndex(self._view.getSelectedRow()) - value = self._model.getCellData(index, row) + if self._view.hasSelectedRows(): + row = self._view.getSelectedRow() + value = self._getColumnValue(row, column) return value def getSelectedIdentifier(self, identifier): @@ -113,11 +111,24 @@ def getSelectedIdentifier(self, identifier): value = self._getRowValue(identifier, self.getUnsortedIndex(self._view.getSelectedRow())) return value - def getGridFilters(self): - filters = [] + def getSelectedIdentifiers(self, identifier): + values = [] + if self._view.hasSelectedRows(): + for row in self._view.getSelectedRows(): + values.append(self._getRowValue(identifier, self.getUnsortedIndex(row))) + return tuple(values) + + def getGridData(self, columns, quote, default=None): + values = {} for row in (range(self._model.RowCount)): - filters.append(self._getRowFilter(row)) - return tuple(filters) + filter = self._getRowFilter(row, quote) + for column in columns: + if column in self._headers: + value = self._getColumnValue(row, column, default) + if value: + values[filter] = value + break + return values def getSelectedStructuredFilters(self): filters = [] @@ -125,10 +136,22 @@ def getSelectedStructuredFilters(self): filters.append(self._getRowStructuredFilter(row)) return tuple(filters) - def _getRowFilter(self, row): + def getRowPredicates(self, row): + predicates = [] + for identifier in self._indexes: + predicates.append(self._getRowValue(identifier, row)) + return tuple(predicates) + + def _getColumnValue(self, row, column, value=None): + if column in self._headers: + keys = tuple(self._headers.keys()) + value = self._model.getCellData(keys.index(column), self.getUnsortedIndex(row)) + return value + + def _getRowFilter(self, row, quote): filters = [] for identifier in self._indexes: - column = self._getQuotedIdentifier(identifier) + column = self._getQuotedIdentifier(identifier, quote) value = self._getQuotedValue(identifier, row) filter = '%s = %s' % (column, value) filters.append(filter) @@ -151,15 +174,14 @@ def _getQuotedValue(self, identifier, row): value = "%s" % value return value - def _getQuotedIdentifier(self, identifier): - return "%s%s%s" % (self._quote, identifier, self._quote) + def _getQuotedIdentifier(self, identifier, quote): + return quote + identifier + quote def _getRowValue(self, identifier, row): return self._model.getCellData(self._indexes[identifier], row) # GridManager setter methods def dispose(self): - self.saveColumnSettings() self.Column.dispose() self.Model.dispose() @@ -172,6 +194,12 @@ def addSelectionListener(self, listener): def removeSelectionListener(self, listener): self._view.getGrid().removeSelectionListener(listener) + def addGridDataListener(self, listener): + self._model.addGridDataListener(listener) + + def removeGridDataListener(self, listener): + self._model.removeGridDataListener(listener) + def showColumns(self, state): self._view.showColumns(state) diff --git a/uno/lib/uno/grid/gridmodel.py b/uno/lib/uno/grid/gridmodel.py index 2b3e05f8..94c863d2 100644 --- a/uno/lib/uno/grid/gridmodel.py +++ b/uno/lib/uno/grid/gridmodel.py @@ -32,7 +32,7 @@ from com.sun.star.awt.grid import XMutableGridDataModel -from ..unotool import hasInterface +from ...unotool import hasInterface import traceback diff --git a/uno/lib/uno/grid/gridview.py b/uno/lib/uno/grid/gridview.py index ebe2e52f..c6750298 100644 --- a/uno/lib/uno/grid/gridview.py +++ b/uno/lib/uno/grid/gridview.py @@ -31,9 +31,9 @@ from com.sun.star.view.SelectionType import MULTI -from ..unotool import getContainerWindow +from ...unotool import getContainerWindow -from ..configuration import g_identifier +from ...configuration import g_identifier class GridView(unohelper.Base): diff --git a/uno/lib/uno/jdbcdriver/__init__.py b/uno/lib/uno/jdbcdriver/__init__.py index 30efb5d2..badde637 100644 --- a/uno/lib/uno/jdbcdriver/__init__.py +++ b/uno/lib/uno/jdbcdriver/__init__.py @@ -27,8 +27,11 @@ ╚════════════════════════════════════════════════════════════════════════════════════╝ """ +from .jdbctool import isInstrumented + from .configuration import g_extension from .configuration import g_identifier from .configuration import g_service from .configuration import g_services from .configuration import g_version + diff --git a/uno/lib/uno/jdbcdriver/configuration.py b/uno/lib/uno/jdbcdriver/configuration.py index 7650d1ea..149e3931 100644 --- a/uno/lib/uno/jdbcdriver/configuration.py +++ b/uno/lib/uno/jdbcdriver/configuration.py @@ -34,4 +34,12 @@ g_services = ('io.github.prrvchr.jdbcdriver.sdbc.Driver', 'io.github.prrvchr.jdbcdriver.sdbcx.Driver', 'io.github.prrvchr.jdbcdriver.sdb.Driver') -g_version = '1.5.4' +g_version = '1.6.1' +g_instrumented = 'SupportsInstrumentationAgent' + +# jdbcDriverOOo special configuration +g_resource = 'resource' +g_basename = 'Driver' +g_defaultlog = 'Driver' +g_errorlog = 'jdbcDriverError' + diff --git a/uno/lib/uno/jdbcdriver/jdbctool.py b/uno/lib/uno/jdbcdriver/jdbctool.py new file mode 100644 index 00000000..99b0cb17 --- /dev/null +++ b/uno/lib/uno/jdbcdriver/jdbctool.py @@ -0,0 +1,47 @@ +#! +# -*- coding: utf-8 -*- + +""" +╔════════════════════════════════════════════════════════════════════════════════════╗ +║ ║ +║ Copyright (c) 2020-25 https://prrvchr.github.io ║ +║ ║ +║ Permission is hereby granted, free of charge, to any person obtaining ║ +║ a copy of this software and associated documentation files (the "Software"), ║ +║ to deal in the Software without restriction, including without limitation ║ +║ the rights to use, copy, modify, merge, publish, distribute, sublicense, ║ +║ and/or sell copies of the Software, and to permit persons to whom the Software ║ +║ is furnished to do so, subject to the following conditions: ║ +║ ║ +║ The above copyright notice and this permission notice shall be included in ║ +║ all copies or substantial portions of the Software. ║ +║ ║ +║ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, ║ +║ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES ║ +║ OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ║ +║ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY ║ +║ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, ║ +║ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE ║ +║ OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ║ +║ ║ +╚════════════════════════════════════════════════════════════════════════════════════╝ +""" + +from ..unotool import createService +from ..unotool import getPropertyValueSet + +from .configuration import g_instrumented +from .configuration import g_service + + +def isInstrumented(ctx, url): + support = False + driver = createService(ctx, g_service) + if driver: + properties = getPropertyValueSet({g_instrumented: True}) + for info in driver.getPropertyInfo(url, properties): + if info.Name == g_instrumented: + support = info.Value != 'false' + break + return support + diff --git a/uno/lib/uno/library.dtd b/uno/lib/uno/library.dtd new file mode 100644 index 00000000..c0341ed5 --- /dev/null +++ b/uno/lib/uno/library.dtd @@ -0,0 +1,33 @@ + + + + + + + + + diff --git a/uno/lib/uno/logger/dialog/loghandler.py b/uno/lib/uno/logger/dialog/loghandler.py index 343510f1..63073747 100644 --- a/uno/lib/uno/logger/dialog/loghandler.py +++ b/uno/lib/uno/logger/dialog/loghandler.py @@ -65,8 +65,8 @@ def callHandlerMethod(self, dialog, event, method): self._manager.setLevel(event.Source.getSelectedItemPos()) handled = True return handled - except Exception as e: - print("ERROR: %s - %s" % (e, traceback.format_exc())) + except: + print("WindowHandler.callHandlerMethod() ERROR: %s" % traceback.format_exc()) def getSupportedMethodNames(self): return ('SetLogger', @@ -90,9 +90,8 @@ def callHandlerMethod(self, dialog, event, method): self._manager.logInfos() handled = True return handled - except Exception as e: - msg = f"Error: {traceback.format_exc()}" - print(msg) + except: + print("DialogHandler.callHandlerMethod() ERROR: %s" % traceback.format_exc()) def getSupportedMethodNames(self): return ('LogInfo', ) @@ -107,9 +106,8 @@ def __init__(self, manager): def modified(self, event): try: self._manager.updateLogger() - except Exception as e: - msg = f"Error: {traceback.format_exc()}" - print(msg) + except: + print("LoggerListener.modified() ERROR: %s" % traceback.format_exc()) def disposing(self, event): pass @@ -123,11 +121,9 @@ def __init__(self, manager): # XModifyListener def modified(self, event): try: - print("PoolListener.modified()") self._manager.updateLoggers() - except Exception as e: - msg = f"Error: {traceback.format_exc()}" - print(msg) + except: + print("PoolListener.modified() ERROR: %s" % traceback.format_exc()) def disposing(self, event): pass diff --git a/uno/lib/uno/logger/dialog/logmodel.py b/uno/lib/uno/logger/dialog/logmodel.py index 4cfd975b..44303128 100644 --- a/uno/lib/uno/logger/dialog/logmodel.py +++ b/uno/lib/uno/logger/dialog/logmodel.py @@ -56,7 +56,7 @@ from packaging.requirements import Requirement from importlib import metadata -import distutils.sysconfig as ds +import sysconfig import pkg_resources as pkgr import os, sys import traceback @@ -140,7 +140,7 @@ def logInfos(self, level, clazz, method, requirements): else: msg = self._resolver.resolveString(123).format(sys.executable) self._logger.logp(level, clazz, method, msg) - msg = self._resolver.resolveString(124).format(ds.get_config_var('EXT_SUFFIX')) + msg = self._resolver.resolveString(124).format(sysconfig.get_config_var('EXT_SUFFIX')) self._logger.logp(level, clazz, method, msg) msg = self._resolver.resolveString(125).format(os.pathsep.join(sys.path)) self._logger.logp(level, clazz, method, msg) diff --git a/uno/lib/uno/logger/logcontroller.py b/uno/lib/uno/logger/logcontroller.py index 50a896f6..5b910124 100644 --- a/uno/lib/uno/logger/logcontroller.py +++ b/uno/lib/uno/logger/logcontroller.py @@ -27,6 +27,8 @@ ╚════════════════════════════════════════════════════════════════════════════════════╝ """ +import uno + from com.sun.star.logging.LogLevel import SEVERE from .logwrapper import LogWrapper @@ -50,7 +52,8 @@ def __init__(self, ctx, name, basename=g_basename, listener=None): self._listener = listener self._setting = None self._config = LogConfig(ctx) - if listener is not None: + self._handler = None + if listener: self._logger.addModifyListener(listener) # Public getter method @@ -62,17 +65,26 @@ def dispose(self): if self._listener is not None: self._logger.removeModifyListener(self._listener) + def addRollerHandler(self, handler=None): + if handler is None: + handler = RollerHandler(self._ctx, self.Name) + super().addRollerHandler(handler) + self._handler = handler + if self._listener: + event = uno.createUnoStruct('com.sun.star.lang.EventObject', self._logger) + self._listener.modified(event) + + def removeRollerHandler(self, handler=None): + if handler is None: + handler = self._handler + super().removeRollerHandler(handler) + def clearLogger(self): - url = getRollerHandlerUrl(self._ctx, self.Name) - sf = getSimpleFile(self._ctx) - if sf.exists(url): - sf.kill(url) + if self._handler: + self._handler.clearLogger() resolver = getStringResourceWithLocation(self._ctx, self._url, 'Logger') msg = resolver.resolveString(111) - handler = RollerHandler(self._ctx, self.Name) - self.addRollerHandler(handler) self._logger.logp(SEVERE, 'Logger', 'clearLogger', msg) - self.removeRollerHandler(handler) def addModifyListener(self, listener): self._logger.addModifyListener(listener) diff --git a/uno/lib/uno/logger/loghandler.py b/uno/lib/uno/logger/loghandler.py index f537bfa3..c426f421 100644 --- a/uno/lib/uno/logger/loghandler.py +++ b/uno/lib/uno/logger/loghandler.py @@ -108,6 +108,10 @@ def removeEventListener(self, listener): if listener in self._listeners: self._listeners.remove(listener) + def clearLogger(self): + if self._sf.exists(self._url): + self._sf.kill(self._url) + def _publishRecord(self, record): if not self._sf.exists(self._url): msg = self._formatter.getHead() diff --git a/uno/lib/uno/module.dtd b/uno/lib/uno/module.dtd new file mode 100644 index 00000000..b77d62f4 --- /dev/null +++ b/uno/lib/uno/module.dtd @@ -0,0 +1,24 @@ + + + + diff --git a/uno/lib/uno/oauth20/__init__.py b/uno/lib/uno/oauth20/__init__.py index 87c7eb48..721859f2 100644 --- a/uno/lib/uno/oauth20/__init__.py +++ b/uno/lib/uno/oauth20/__init__.py @@ -32,7 +32,6 @@ from .oauth2lib import NoOAuth2 from .oauth2lib import OAuth2OOo -from .oauth2tool import getOAuth2 from .oauth2tool import getOAuth2Version from .oauth2tool import getParserItems from .oauth2tool import getRequest diff --git a/uno/lib/uno/oauth20/configuration.py b/uno/lib/uno/oauth20/configuration.py index 1574f4ea..6c9ecd8e 100644 --- a/uno/lib/uno/oauth20/configuration.py +++ b/uno/lib/uno/oauth20/configuration.py @@ -33,7 +33,7 @@ g_service = '%s.OAuth2Service' % g_identifier g_resource = 'resource' -g_version = '1.5.2' +g_version = '1.6.1' g_chunk = g_chunk = 320 * 1024 g_token = 'Bearer ${AccessToken}' diff --git a/uno/lib/uno/oauth20/oauth2core.py b/uno/lib/uno/oauth20/oauth2core.py index 19e8762b..463c03d5 100644 --- a/uno/lib/uno/oauth20/oauth2core.py +++ b/uno/lib/uno/oauth20/oauth2core.py @@ -27,23 +27,28 @@ ╚════════════════════════════════════════════════════════════════════════════════════╝ """ +from ..unotool import getPropertyValueSet from ..unotool import getInteractionHandler from .oauth2lib import InteractionRequest -def getOAuth2UserName(ctx, source, url, message=''): +def getOAuth2UserName(ctx, source, url, message='', parent=None, context=''): username = '' handler = getInteractionHandler(ctx) + if parent: + handler.initialize(getPropertyValueSet({'Parent': parent, 'Context': context})) interaction = InteractionRequest(source, url, '', '', message) if handler.handleInteractionRequest(interaction): continuation = interaction.getContinuations()[-1] username = continuation.getUserName() return username -def getOAuth2Token(ctx, source, url, user, format=''): +def getOAuth2Token(ctx, source, url, user, format='', parent=None, context=''): token = '' handler = getInteractionHandler(ctx) + if parent: + handler.initialize(getPropertyValueSet({'Parent': parent, 'Context': context})) interaction = InteractionRequest(source, url, user, format, '') if handler.handleInteractionRequest(interaction): continuation = interaction.getContinuations()[-1] diff --git a/uno/lib/uno/oauth20/oauth2tool.py b/uno/lib/uno/oauth20/oauth2tool.py index 65c15a59..9d594b87 100644 --- a/uno/lib/uno/oauth20/oauth2tool.py +++ b/uno/lib/uno/oauth20/oauth2tool.py @@ -51,13 +51,6 @@ def getRequest(ctx, url=None, name=None): request = createService(ctx, g_service) return request -def getOAuth2(ctx, url='', name=''): - if url and name: - oauth2 = createService(ctx, g_service, url, name) - else: - oauth2 = createService(ctx, g_service) - return oauth2 - def getOAuth2Version(ctx): version = getExtensionVersion(ctx, g_identifier) return version diff --git a/uno/lib/uno/options/addressbook/__init__.py b/uno/lib/uno/options/addressbook/__init__.py index c2eddf4f..f6f7a27b 100644 --- a/uno/lib/uno/options/addressbook/__init__.py +++ b/uno/lib/uno/options/addressbook/__init__.py @@ -28,3 +28,4 @@ """ from .optionsmanager import OptionsManager + diff --git a/uno/lib/uno/options/addressbook/optionshandler.py b/uno/lib/uno/options/addressbook/optionshandler.py new file mode 100644 index 00000000..e8e38c75 --- /dev/null +++ b/uno/lib/uno/options/addressbook/optionshandler.py @@ -0,0 +1,55 @@ +#! +# -*- coding: utf-8 -*- + +""" +╔════════════════════════════════════════════════════════════════════════════════════╗ +║ ║ +║ Copyright (c) 2020-25 https://prrvchr.github.io ║ +║ ║ +║ Permission is hereby granted, free of charge, to any person obtaining ║ +║ a copy of this software and associated documentation files (the "Software"), ║ +║ to deal in the Software without restriction, including without limitation ║ +║ the rights to use, copy, modify, merge, publish, distribute, sublicense, ║ +║ and/or sell copies of the Software, and to permit persons to whom the Software ║ +║ is furnished to do so, subject to the following conditions: ║ +║ ║ +║ The above copyright notice and this permission notice shall be included in ║ +║ all copies or substantial portions of the Software. ║ +║ ║ +║ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, ║ +║ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES ║ +║ OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ║ +║ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY ║ +║ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, ║ +║ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE ║ +║ OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ║ +║ ║ +╚════════════════════════════════════════════════════════════════════════════════════╝ +""" + +import unohelper + +from com.sun.star.awt import XContainerWindowEventHandler + +import traceback + + +class WindowHandler(unohelper.Base, + XContainerWindowEventHandler): + def __init__(self, manager): + self._manager = manager + + # XContainerWindowEventHandler + def callHandlerMethod(self, window, event, method): + try: + handled = False + if method == 'ViewData': + self._manager.viewData() + handled = True + return handled + except: + print("WindowHandler.callHandlerMethod() ERROR: %s" % traceback.format_exc()) + + def getSupportedMethodNames(self): + return ('ViewData', ) + diff --git a/uno/lib/uno/options/addressbook/optionsmanager.py b/uno/lib/uno/options/addressbook/optionsmanager.py index 7d010716..a04b943f 100644 --- a/uno/lib/uno/options/addressbook/optionsmanager.py +++ b/uno/lib/uno/options/addressbook/optionsmanager.py @@ -31,44 +31,42 @@ from com.sun.star.logging.LogLevel import SEVERE from .optionsmodel import OptionsModel + from .optionsview import OptionsView -from ..unotool import getDesktop +from .optionshandler import WindowHandler + +from ...unotool import getDesktop -from ..logger import LogManager +from ...logger import LogManager -from ..configuration import g_defaultlog -from ..configuration import g_synclog +from ...configuration import g_defaultlog +from ...configuration import g_synclog class OptionsManager(): - def __init__(self, ctx, logger, window, offset=0): + def __init__(self, ctx, logger, window): self._ctx = ctx - self._logger = logger self._model = OptionsModel(ctx) - self._view = OptionsView(window, OptionsManager._restart, offset, *self._model.getViewData()) - self._logmanager = LogManager(self._ctx, window, 'requirements.txt', g_defaultlog, g_synclog) + self._view = OptionsView(ctx, window, WindowHandler(self), *self._model.getViewData()) + self._logmanager = LogManager(ctx, self._view.getWindow(), 'requirements.txt', g_defaultlog, g_synclog) self._logmanager.initView() + self._logger = logger self._logger.logprb(INFO, 'OptionsManager', '__init__()', 301) self._model.loadDriver() - _restart = False - def loadSetting(self): self._view.setTimeout(self._model.getTimeout()) self._view.setViewName(self._model.getViewName()) - self._view.setRestart(OptionsManager._restart) self._logmanager.loadSetting() self._logger.logprb(INFO, 'OptionsManager', 'loadSetting()', 311) def saveSetting(self): timeout, view = self._view.getViewData() option = self._model.setViewData(timeout, view) - log = self._logmanager.saveSetting() - if log: - OptionsManager._restart = True - self._view.setRestart(True) - self._logger.logprb(INFO, 'OptionsManager', 'saveSetting()', 321, option, log) + saved = self._logmanager.saveSetting() + self._logger.logprb(INFO, 'OptionsManager', 'saveSetting()', 321, option, saved) + return saved def viewData(self): url = self._model.getDatasourceUrl() diff --git a/uno/lib/uno/options/addressbook/optionsmodel.py b/uno/lib/uno/options/addressbook/optionsmodel.py index 85b76b3e..30cb662c 100644 --- a/uno/lib/uno/options/addressbook/optionsmodel.py +++ b/uno/lib/uno/options/addressbook/optionsmodel.py @@ -27,14 +27,14 @@ ╚════════════════════════════════════════════════════════════════════════════════════╝ """ -from ..unotool import createService -from ..unotool import getConfiguration -from ..unotool import getSimpleFile +from ...unotool import createService +from ...unotool import getConfiguration +from ...unotool import getSimpleFile -from ..helper import getDataBaseUrl +from ...helper import getDataBaseUrl -from ..configuration import g_identifier -from ..configuration import g_implementation +from ...configuration import g_identifier +from ...configuration import g_implementation class OptionsModel(): @@ -65,7 +65,6 @@ def getViewName(self): def getDatasourceUrl(self): return self._url - # OptionsModel setter methods def loadDriver(self): try: diff --git a/uno/lib/uno/options/addressbook/optionsview.py b/uno/lib/uno/options/addressbook/optionsview.py index 2d335949..2f5da84e 100644 --- a/uno/lib/uno/options/addressbook/optionsview.py +++ b/uno/lib/uno/options/addressbook/optionsview.py @@ -27,21 +27,25 @@ ╚════════════════════════════════════════════════════════════════════════════════════╝ """ -import unohelper +from ...unotool import getContainerWindow + +from ...configuration import g_identifier import traceback class OptionsView(): - def __init__(self, window, restart, offset, timeout, view, enabled): - self._window = window + def __init__(self, ctx, window, handler, timeout, view, enabled): + self._window = getContainerWindow(ctx, window.getPeer(), handler, g_identifier, 'OptionDialog') + self._window.setVisible(True) self._getTimeout().Value = timeout self._getDatasource().Model.Enabled = enabled self._setViewName(view, not enabled) - self.setRestart(restart) - self._getRestart().Model.PositionY += offset # OptionsView getter methods + def getWindow(self): + return self._window + def getViewData(self): return int(self._getTimeout().Value), self._getViewName().Text @@ -52,9 +56,6 @@ def setTimeout(self, timeout): def setViewName(self, view): self._getViewName().Text = view - def setRestart(self, enabled): - self._getRestart().setVisible(enabled) - # OptionsView private setter methods def _setViewName(self, view, disabled): self._getViewLabel().Model.Enabled = disabled @@ -75,6 +76,3 @@ def _getViewLabel(self): def _getViewName(self): return self._window.getControl('TextField1') - def _getRestart(self): - return self._window.getControl('Label4') - diff --git a/uno/lib/uno/options/embedded/options b/uno/lib/uno/options/embedded/options new file mode 120000 index 00000000..9b1eeeec --- /dev/null +++ b/uno/lib/uno/options/embedded/options @@ -0,0 +1 @@ +../jdbc \ No newline at end of file diff --git a/uno/lib/uno/options/embedded/optionsmanager.py b/uno/lib/uno/options/embedded/optionsmanager.py index 669ad65c..141dc395 100644 --- a/uno/lib/uno/options/embedded/optionsmanager.py +++ b/uno/lib/uno/options/embedded/optionsmanager.py @@ -31,7 +31,7 @@ from .optionsview import OptionsView from .optionshandler import OptionsListener -from ..option import OptionManager +from .options import OptionsManager as Manager from ..configuration import g_defaultlog @@ -41,8 +41,9 @@ class OptionsManager(): def __init__(self, ctx, logger, window, options, url=None): self._model = OptionsModel(ctx, logger, url) - self._manager = OptionManager(ctx, window, options, OptionsManager._restart, 20, g_defaultlog) - self._view = OptionsView(window) + link, instrumented = self._model.getDriverInfo() + self._manager = Manager(ctx, window, instrumented, options, g_defaultlog) + self._view = OptionsView(window, OptionsManager._restart, link, instrumented) window.addEventListener(OptionsListener(self)) self._manager.initView() self._initView() @@ -56,13 +57,11 @@ def dispose(self): def saveSetting(self): if self._manager.saveSetting(): OptionsManager._restart = True - self._manager.setRestart(True) - + self._view.setWarning(True, self._model.isInstrumented()) def loadSetting(self): self._manager.loadSetting() - version = self._model.getDriverVersion(self._getConfigApiLevel()) - self._view.setDriverVersion(version) + self._initView() # OptionsManager private getter methods def _getConfigApiLevel(self): diff --git a/uno/lib/uno/options/embedded/optionsmodel.py b/uno/lib/uno/options/embedded/optionsmodel.py index 049914fb..c8f1686a 100644 --- a/uno/lib/uno/options/embedded/optionsmodel.py +++ b/uno/lib/uno/options/embedded/optionsmodel.py @@ -33,9 +33,12 @@ from com.sun.star.uno import Exception as UnoException from ..unotool import createService +from ..unotool import getStringResource from ..jdbcdriver import g_service as jdbc +from ..jdbcdriver import isInstrumented +from ..configuration import g_identifier from ..configuration import g_service as embedded import traceback @@ -45,10 +48,19 @@ class OptionsModel(): def __init__(self, ctx, logger, url=None): self._ctx = ctx self._url = url + self._instrumented = isInstrumented(ctx, 'xdbc:jdbc') + resolver = getStringResource(ctx, g_identifier, 'dialogs', 'OptionsDialog') + self._link = resolver.resolveString('OptionsDialog.Hyperlink1.Url') self._logger = logger self._logger.logprb(INFO, 'OptionsModel', '__init__', 401) # OptionsModel getter methods + def getDriverInfo(self): + return self._link, self._instrumented + + def isInstrumented(self): + return self._instrumented + def getDriverVersion(self, apilevel): driver = None version = 'N/A' diff --git a/uno/lib/uno/options/embedded/optionsview.py b/uno/lib/uno/options/embedded/optionsview.py index 98170ae8..19450086 100644 --- a/uno/lib/uno/options/embedded/optionsview.py +++ b/uno/lib/uno/options/embedded/optionsview.py @@ -31,14 +31,35 @@ class OptionsView(): - def __init__(self, window): + def __init__(self, window, restart, url, instrumented): self._window = window + control = self._getWarning() + control.URL = url + self._setWarning(control, restart, instrumented) # OptionsView setter methods + def setWarning(self, restart, instrumented): + self._setWarning(self._getWarning(), restart, instrumented) + def setDriverVersion(self, version): self._getVersion().Text = version +# OptionsView private methods + def _setWarning(self, control, restart, instrumented): + if restart: + control.setVisible(False) + self._getRestart().setVisible(True) + else: + self._getRestart().setVisible(False) + control.setVisible(not instrumented) + # OptionsView private control methods def _getVersion(self): return self._window.getControl('Label2') + def _getRestart(self): + return self._window.getControl('Label3') + + def _getWarning(self): + return self._window.getControl('Hyperlink1') + diff --git a/uno/lib/uno/options/jdbc/__init__.py b/uno/lib/uno/options/jdbc/__init__.py index eab324b7..f6f7a27b 100644 --- a/uno/lib/uno/options/jdbc/__init__.py +++ b/uno/lib/uno/options/jdbc/__init__.py @@ -27,4 +27,5 @@ ╚════════════════════════════════════════════════════════════════════════════════════╝ """ -from .optionmanager import OptionManager +from .optionsmanager import OptionsManager + diff --git a/uno/lib/uno/options/jdbc/optionhandler.py b/uno/lib/uno/options/jdbc/optionshandler.py similarity index 97% rename from uno/lib/uno/options/jdbc/optionhandler.py rename to uno/lib/uno/options/jdbc/optionshandler.py index d58b7af5..aeaec53e 100644 --- a/uno/lib/uno/options/jdbc/optionhandler.py +++ b/uno/lib/uno/options/jdbc/optionshandler.py @@ -65,8 +65,8 @@ def callHandlerMethod(self, window, event, method): self._manager.setSystemTable(event.Source.State) handled = True return handled - except Exception as e: - print("ERROR: %s - %s" % (e, traceback.format_exc())) + except: + print("WindowHandler.callHandlerMethod() ERROR: %s" % traceback.format_exc()) def getSupportedMethodNames(self): return ('Level0', diff --git a/uno/lib/uno/options/jdbc/optionmanager.py b/uno/lib/uno/options/jdbc/optionsmanager.py similarity index 88% rename from uno/lib/uno/options/jdbc/optionmanager.py rename to uno/lib/uno/options/jdbc/optionsmanager.py index 2f8f4d35..ac7cb0b1 100644 --- a/uno/lib/uno/options/jdbc/optionmanager.py +++ b/uno/lib/uno/options/jdbc/optionsmanager.py @@ -27,20 +27,22 @@ ╚════════════════════════════════════════════════════════════════════════════════════╝ """ -from .optionmodel import OptionModel -from .optionview import OptionWindow -from .optionhandler import WindowHandler +from .optionsmodel import OptionsModel -from ..logger import LogManager +from .optionsview import OptionsWindow + +from .optionshandler import WindowHandler + +from ...logger import LogManager import traceback -class OptionManager(): - def __init__(self, ctx, window, options, restart, offset, logger, *loggers): +class OptionsManager(): + def __init__(self, ctx, window, instrumented, options, logger, *loggers): self._logmanager = LogManager(ctx, window, 'requirements.txt', logger, *loggers) - self._model = OptionModel(ctx) - self._view = OptionWindow(ctx, window, WindowHandler(self), options, restart, offset) + self._model = OptionsModel(ctx, instrumented) + self._view = OptionsWindow(ctx, window, WindowHandler(self), options) # OptionManager setter methods def initView(self): @@ -61,9 +63,6 @@ def saveSetting(self): saved |= self._model.saveSetting() return saved - def setRestart(self, state): - self._view.setRestart(state) - def loadSetting(self): self._logmanager.loadSetting() self._initView() diff --git a/uno/lib/uno/options/jdbc/optionmodel.py b/uno/lib/uno/options/jdbc/optionsmodel.py similarity index 85% rename from uno/lib/uno/options/jdbc/optionmodel.py rename to uno/lib/uno/options/jdbc/optionsmodel.py index 680827cf..65262b7a 100644 --- a/uno/lib/uno/options/jdbc/optionmodel.py +++ b/uno/lib/uno/options/jdbc/optionsmodel.py @@ -27,27 +27,21 @@ ╚════════════════════════════════════════════════════════════════════════════════════╝ """ -from com.sun.star.logging.LogLevel import INFO +from ...unotool import getConfiguration -from ..unotool import getConfiguration - -from ..logger import getLogger - -from ..jdbcdriver import g_services - -from ..configuration import g_identifier -from ..configuration import g_basename +from ...configuration import g_identifier import traceback -class OptionModel(): - def __init__(self, ctx): +class OptionsModel(): + def __init__(self, ctx, instrumented): self._rebootkeys = ('ApiLevel', 'CachedRowSet') configkeys = ('ShowSystemTable', ) self._keys = self._rebootkeys + configkeys self._config = getConfiguration(ctx, g_identifier, True) self._settings = self._getSettings() + self._instrumented = instrumented # OptionModel getter methods def getConfigApiLevel(self): @@ -58,12 +52,12 @@ def getViewData(self): level = self._settings.get('ApiLevel') crs = self._settings.get('CachedRowSet') system = self._settings.get('ShowSystemTable') - return level, crs, system, self._isRowSetEnabled(level) + return self._instrumented, level, crs, system, self._isRowSetEnabled(level) # OptionModel setter methods def setApiLevel(self, level): self._settings['ApiLevel'] = level - return self._isRowSetEnabled(level) + return self._instrumented and self._isRowSetEnabled(level) def setCachedRowSet(self, level): self._settings['CachedRowSet'] = level @@ -74,11 +68,12 @@ def setSystemTable(self, state): def saveSetting(self): reboot = False for key in self._keys: - value = self._settings.get(key) - if value != self._config.getByName(key): - self._config.replaceByName(key, value) - if key in self._rebootkeys: - reboot = True + if key != 'CachedRowSet' or self._instrumented: + value = self._settings.get(key) + if value != self._config.getByName(key): + self._config.replaceByName(key, value) + if key in self._rebootkeys: + reboot = True if self._config.hasPendingChanges(): self._config.commitChanges() return reboot diff --git a/uno/lib/uno/options/jdbc/optionview.py b/uno/lib/uno/options/jdbc/optionsview.py similarity index 80% rename from uno/lib/uno/options/jdbc/optionview.py rename to uno/lib/uno/options/jdbc/optionsview.py index 866dbdb9..c1b8a17f 100644 --- a/uno/lib/uno/options/jdbc/optionview.py +++ b/uno/lib/uno/options/jdbc/optionsview.py @@ -27,38 +27,35 @@ ╚════════════════════════════════════════════════════════════════════════════════════╝ """ -from ..unotool import getContainerWindow +from ...unotool import getContainerWindow -from ..configuration import g_identifier +from ...configuration import g_identifier import traceback -class OptionWindow(): - def __init__(self, ctx, window, handler, options, restart, offset): +class OptionsWindow(): + def __init__(self, ctx, window, handler, options): self._window = getContainerWindow(ctx, window.getPeer(), handler, g_identifier, 'OptionDialog') self._window.setVisible(True) - for crs in options: - self._getCachedRowSet(crs).Model.Enabled = False - self.setRestart(restart) - self._getRestart().Model.PositionY += offset + self.enableCachedRowSet(False, options) # OptionWindow setter methods def dispose(self): self._window.dispose() - def initView(self, level, crs, system, enabled): + def initView(self, instrumented, level, crs, system, enabled): self._getApiLevel(level).State = 1 - self._getCachedRowSet(crs).State = 1 - self.enableCachedRowSet(enabled) + if instrumented: + self._getCachedRowSet(crs).State = 1 + else: + self._getCachedRowSet(0).State = 1 + self.enableCachedRowSet(instrumented and enabled) self._getSytemTable().State = int(system) - def enableCachedRowSet(self, enabled): - for crs in range(3): - self._getCachedRowSet(crs).Model.Enabled = enabled - - def setRestart(self, enabled): - self._getRestart().setVisible(enabled) + def enableCachedRowSet(self, enabled, options=(0, 1, 2)): + for index in options: + self._getCachedRowSet(index).Model.Enabled = enabled # OptionWindow private control methods def _getApiLevel(self, index): @@ -70,6 +67,3 @@ def _getCachedRowSet(self, index): def _getSytemTable(self): return self._window.getControl('CheckBox1') - def _getRestart(self): - return self._window.getControl('Label3') - diff --git a/uno/lib/uno/options/ucb/optionsmanager.py b/uno/lib/uno/options/ucb/optionsmanager.py index ccbc5ba6..3aaa5ef8 100644 --- a/uno/lib/uno/options/ucb/optionsmanager.py +++ b/uno/lib/uno/options/ucb/optionsmanager.py @@ -55,10 +55,10 @@ def __init__(self, ctx, source, logger, window): self._ctx = ctx self._logger = logger self._model = OptionsModel(ctx) - self._view = OptionsView(window, *self._model.getInitData()) + self._view = OptionsView(window, OptionsManager._restart, *self._model.getInitData()) self._logmanager = LogManager(ctx, window, 'requirements.txt', g_defaultlog, g_synclog) self._logmanager.initView() - self._view.setViewData(*self._model.getViewData(OptionsManager._restart)) + self._view.setViewData(OptionsManager._restart, *self._model.getViewData()) self._logger.logprb(INFO, 'OptionsManager', '__init__', 151) try: url = getDataBaseUrl(ctx) @@ -71,7 +71,7 @@ def __init__(self, ctx, source, logger, window): _restart = False def loadSetting(self): - self._view.setViewData(*self._model.getViewData(OptionsManager._restart)) + self._view.setViewData(OptionsManager._restart, *self._model.getViewData()) self._logmanager.loadSetting() self._logger.logprb(INFO, 'OptionsManager', 'loadSetting', 161) @@ -80,14 +80,14 @@ def saveSetting(self): changed = self._logmanager.saveSetting() if changed: OptionsManager._restart = True - self._view.setRestart(True) + self._view.setWarning(True, self._model.isInstrumented()) self._logger.logprb(INFO, 'OptionsManager', 'saveSetting', 171, option, changed) def enableShare(self, enabled): self._view.enableShare(enabled) def enableSync(self, enabled): - self._view.enableSync(enabled, OptionsManager._restart, self._model.hasDataBase()) + self._view.enableSync(OptionsManager._restart, self._model.isInstrumented(), enabled, self._model.hasDataBase()) def setReset(self, enabled): self._view.enableResetFile(enabled) @@ -103,10 +103,10 @@ def viewFile(self): fp.dispose() def download(self): - self._view.setStep(1, OptionsManager._restart) + self._view.setStep(1, OptionsManager._restart, self._model.isInstrumented()) def upload(self): - self._view.setStep(2, OptionsManager._restart) + self._view.setStep(2, OptionsManager._restart, self._model.isInstrumented()) def spinUp(self, index): self._view.setChunk(index, self._view.getChunk(index) * 2) diff --git a/uno/lib/uno/options/ucb/optionsmodel.py b/uno/lib/uno/options/ucb/optionsmodel.py index 4061f310..d912b59f 100644 --- a/uno/lib/uno/options/ucb/optionsmodel.py +++ b/uno/lib/uno/options/ucb/optionsmodel.py @@ -31,6 +31,8 @@ from com.sun.star.ucb.SynchronizePolicy import CLIENT_IS_MASTER from com.sun.star.ucb.SynchronizePolicy import NONE_IS_MASTER +from ..jdbcdriver import isInstrumented + from ..unotool import getConfiguration from ..unotool import getResourceLocation from ..unotool import getSimpleFile @@ -50,6 +52,7 @@ class OptionsModel(): def __init__(self, ctx): self._config = getConfiguration(ctx, g_identifier, True) self._common = getConfiguration(ctx, 'org.openoffice.Office.Common', True) + self._instrumented = isInstrumented(ctx, 'xdbc:hsqldb:') self._url = getResourceLocation(ctx, g_identifier) self._policies = {'SERVER_IS_MASTER': 1, 'CLIENT_IS_MASTER': 2, 'NONE_IS_MASTER': 3} self._factors = {'Timeout': 60, 'Chunk': 1024} @@ -57,8 +60,8 @@ def __init__(self, ctx): self._hasdatabase = sf.exists(self.getDatasourceUrl()) self._hasfile = sf.exists(self.getFileUrl()) self._resolver = getStringResource(ctx, g_identifier, 'dialogs', 'OptionsDialog') - self._resources = {'Link': 'OptionsDialog.Hyperlink1.Link'} - + self._resources = {'Link': 'OptionsDialog.Hyperlink1.Url', + 'Url': 'OptionsDialog.Hyperlink2.Url'} @property def _ResetSync(self): @@ -95,15 +98,18 @@ def _Macro(self): # OptionsModel getter methods def getInitData(self): resumable = self._config.getByName('ResumableUpload') - return self._hasdatabase, self._hasfile, resumable, self._getLink() + return self._getUrl(), self._instrumented, self._hasdatabase, self._hasfile, resumable, self._getLink() + + def isInstrumented(self): + return self._instrumented def hasDataBase(self): return self._hasdatabase - def getViewData(self, restart): - return (self._hasdatabase, self._ResetSync, self._SupportShare, - self._IsShared, self._ShareName, self._Policy, - self._Timeout, self._Download, self._Upload, self._Macro, restart) + def getViewData(self): + return (self._instrumented, self._hasdatabase, self._ResetSync, + self._SupportShare, self._IsShared, self._ShareName, + self._Policy, self._Timeout, self._Download, self._Upload, self._Macro) def getDatasourceUrl(self): folder = g_ucbseparator + g_folder + g_ucbseparator + g_scheme @@ -188,6 +194,10 @@ def _setMacro(self, enabled): if enabled != self._Macro: self._common.replaceByHierarchicalName('Misc/UseSystemFileDialog', enabled) + def _getUrl(self): + resource = self._resources.get('Url') + return self._resolver.resolveString(resource) + def _getLink(self): resource = self._resources.get('Link') return self._resolver.resolveString(resource) diff --git a/uno/lib/uno/options/ucb/optionsview.py b/uno/lib/uno/options/ucb/optionsview.py index 7e058c83..7d6603ec 100644 --- a/uno/lib/uno/options/ucb/optionsview.py +++ b/uno/lib/uno/options/ucb/optionsview.py @@ -31,7 +31,7 @@ class OptionsView(): - def __init__(self, window, exist, hasfile, resumable, link): + def __init__(self, window, restart, url, instrumented, exist, hasfile, resumable, link): self._window = window if exist: self._disableShare() @@ -41,6 +41,9 @@ def __init__(self, window, exist, hasfile, resumable, link): self._getFile().Model.Enabled = hasfile self._getUpload().Model.Enabled = resumable self._getLink().URL = link + control = self._getWarning() + control.URL = url + self._setWarning(control, restart, instrumented) # OptionsView getter methods def getViewData(self): @@ -59,13 +62,16 @@ def getChunk(self, index): return int(self._getChunk(index).Value) # OptionsView setter methods - def setStep(self, step, restart): + def setWarning(self, restart, instrumented): + self._setWarning(self._getWarning(), restart, instrumented) + + def setStep(self, step, restart, instrumented): self._window.Model.Step = step # XXX: If we change the step, we have to restore the visibility of the controls # XXX: because it was lost (ie: after setting the new step everything is visible). - self.setRestart(restart) + self.setWarning(restart, instrumented) - def setViewData(self, exist, reset, support, share, name, index, timeout, download, upload, macro, restart): + def setViewData(self, restart, instrumented, exist, reset, support, share, name, index, timeout, download, upload, macro): self._getResetSync().State = int(reset != 0) self._getResetFile().State = int(reset == 2) self.enableResetFile(reset != 0) @@ -80,22 +86,22 @@ def setViewData(self, exist, reset, support, share, name, index, timeout, downlo self._getShareName().Text = name self.enableShare(False) self._getOption(index).State = 1 - self.enableSync(index != 3, restart, exist) + self.enableSync(restart, instrumented, index != 3, exist) self._getTimeout().Value = timeout self._setSetting(download, 0) self._setSetting(upload, 1) self._getMacro().State = int(macro) self.enableCustomize(macro) - self.setRestart(restart) + self.setWarning(restart, instrumented) def enableShare(self, enabled): self._getShareName().Model.Enabled = enabled - def enableSync(self, enabled, restart, exist): + def enableSync(self, restart, instrumented, enabled, exist): self._getResetSync().Model.Enabled = enabled and exist self._getTimeoutLabel().Model.Enabled = enabled self._getTimeout().Model.Enabled = enabled - self._enableUpload(enabled, restart) + self._enableUpload(restart, instrumented, enabled) def enableResetFile(self, enabled): self._getResetFile().Model.Enabled = enabled @@ -106,9 +112,6 @@ def enableCustomize(self, enabled): self._getLink().Model.Enabled = enabled self._getCustomize().Model.Enabled = enabled - def setRestart(self, enabled): - self._getRestart().setVisible(enabled) - def setChunk(self, index, chunk): control = self._getChunk(index) control.Value = chunk @@ -130,6 +133,14 @@ def _getSetting(self, index): 'Retry': int(self._getRetry(index).Value)} # OptionsView private setter methods + def _setWarning(self, control, restart, instrumented): + if restart: + control.setVisible(False) + self._getRestart().setVisible(True) + else: + self._getRestart().setVisible(False) + control.setVisible(not instrumented) + def _disableShare(self): self._getShare().Model.Enabled = False self._getShareName().Model.Enabled = False @@ -139,11 +150,11 @@ def _setSetting(self, setting, index): self._getDelay(index).Value = setting.get('Delay') self._getRetry(index).Value = setting.get('Retry') - def _enableUpload(self, enabled, restart): + def _enableUpload(self, restart, instrumented, enabled): control = self._getUpload() if not enabled and control.State: self._getDownload().State = 1 - self.setStep(1, restart) + self.setStep(1, restart, instrumented) control.Model.Enabled = enabled # OptionsView private control methods @@ -200,9 +211,6 @@ def _getRetry(self, index): index += 6 return self._window.getControl('NumericField%s' % index) - def _getRestart(self): - return self._window.getControl('Label8') - def _getMacro(self): return self._window.getControl('CheckBox4') @@ -212,3 +220,9 @@ def _getLink(self): def _getCustomize(self): return self._window.getControl('CommandButton7') + def _getRestart(self): + return self._window.getControl('Label8') + + def _getWarning(self): + return self._window.getControl('Hyperlink2') + diff --git a/uno/lib/uno/ucb/__init__.py b/uno/lib/uno/ucb/__init__.py index 45be9115..621a3b35 100644 --- a/uno/lib/uno/ucb/__init__.py +++ b/uno/lib/uno/ucb/__init__.py @@ -33,7 +33,7 @@ from .dispatch import Dispatch -from .unotool import hasInterface +from .unotool import hasFrameInterface from .logger import getLogger diff --git a/uno/lib/uno/ucb/datasource.py b/uno/lib/uno/ucb/datasource.py index d62020d0..606dd974 100644 --- a/uno/lib/uno/ucb/datasource.py +++ b/uno/lib/uno/ucb/datasource.py @@ -124,7 +124,7 @@ def _getUser(self, source, authority, url): name = uri.getAuthority() else: title, msg = self._getExceptionMessage(322, url) - showWarning(self._ctx, msg, title) + showWarning(self._ctx, title, msg) raise IllegalIdentifierException(msg, source) elif self._default: name = self._default @@ -138,7 +138,7 @@ def _getUser(self, source, authority, url): # XXX: The user's OAuth2 configuration has been deleted and # XXX: the OAuth2 configuration wizard has been canceled. title, msg = self._getExceptionMessage(324, name) - showWarning(self._ctx, msg, title) + showWarning(self._ctx, title, msg) raise IllegalIdentifierException(msg, source) else: user = User(self._ctx, source, self._logger, self.DataBase, @@ -153,11 +153,11 @@ def _getUser(self, source, authority, url): def _getUserName(self, source, url): try: name = getOAuth2UserName(self._ctx, source, self._provider.Scheme) - except Exception as e: - print("DataSource._getUserName() ERROR: %s - %s" % (e, traceback.format_exc())) + except: + print("DataSource._getUserName() ERROR: %s" % traceback.format_exc()) if not name: title, msg = self._getExceptionMessage(331, url) - showWarning(self._ctx, msg, title) + showWarning(self._ctx, title, msg) raise IllegalIdentifierException(msg, source) return name diff --git a/uno/lib/uno/ucb/dispatch.py b/uno/lib/uno/ucb/dispatch.py index 68d3cec5..2c76f680 100644 --- a/uno/lib/uno/ucb/dispatch.py +++ b/uno/lib/uno/ucb/dispatch.py @@ -41,10 +41,7 @@ from com.sun.star.frame.DispatchResultState import FAILURE from .unotool import createService -from .unotool import getArgumentSet from .unotool import getDesktop -from .unotool import getMessageBox -from .unotool import getToolKit import traceback @@ -79,8 +76,6 @@ def dispatch(self, url, arguments): elif url.Path == 'SaveAs': document = self._frame.getController().getModel() state = self._saveAs(document) - elif url.Path == 'ShowWarning': - state = self._showWarning(arguments) return state, result def addStatusListener(self, listener, url): @@ -95,6 +90,7 @@ def removeStatusListener(self, listener, url): if listener in self._listeners: self._listeners.remove(listener) +# Private methods def _open(self): state = FAILURE fp = createService(self._ctx, self._service, FILEOPEN_SIMPLE) @@ -126,11 +122,3 @@ def _saveAs(self, document): fp.dispose() return state - def _showWarning(self, arguments): - toolkit = getToolKit(self._ctx) - peer = toolkit.getActiveTopWindow() - args = getArgumentSet(arguments) - msgbox = getMessageBox(toolkit, peer, args['Box'], args['Button'], args['Title'], args['Message']) - msgbox.execute() - msgbox.dispose() - return SUCCESS diff --git a/uno/lib/uno/ucb/helper.py b/uno/lib/uno/ucb/helper.py index aaf119a6..e1c835e9 100644 --- a/uno/lib/uno/ucb/helper.py +++ b/uno/lib/uno/ucb/helper.py @@ -29,11 +29,6 @@ import uno -from com.sun.star.connection import NoConnectException - -from com.sun.star.logging.LogLevel import INFO -from com.sun.star.logging.LogLevel import SEVERE - from com.sun.star.ucb.ContentAction import INSERTED from com.sun.star.ucb.ContentAction import REMOVED from com.sun.star.ucb.ContentAction import DELETED @@ -42,9 +37,6 @@ from com.sun.star.ucb import IllegalIdentifierException from com.sun.star.ucb import InteractiveAugmentedIOException -from com.sun.star.ucb.ConnectionMode import ONLINE -from com.sun.star.ucb.ConnectionMode import OFFLINE - from com.sun.star.sdb import ParametersRequest from .dbtool import getConnectionUrl @@ -53,17 +45,10 @@ from .unotool import checkVersion from .unotool import createMessageBox -from .unotool import createService -from .unotool import executeDispatch from .unotool import hasInterface -from .unotool import getDesktop -from .unotool import getDispatcher from .unotool import getExtensionVersion -from .unotool import getNamedValueSet -from .unotool import getParentWindow from .unotool import getProperty from .unotool import getPropertyValue -from .unotool import getPropertyValueSet from .unotool import getSimpleFile from .unotool import parseUrl @@ -86,6 +71,8 @@ from .ucp import g_ucbseparator +import traceback + def getPresentationUrl(transformer, url): # FIXME: Sometimes the url can end with a dot, it must be removed @@ -218,10 +205,10 @@ def getExceptionMessage(logger, code, extension, *args): message = logger.resolveString(code + 1, *args) return title, message -def showWarning(ctx, message, title): - box = uno.Enum('com.sun.star.awt.MessageBoxType', 'ERRORBOX') - args = {'Box': box, 'Button': 1, 'Title': title, 'Message': message} - executeDispatch(ctx, '%s:ShowWarning' % g_scheme, **args) +def showWarning(ctx, title, message): + msgbox = createMessageBox(ctx, title, message) + msgbox.execute() + msgbox.dispose() # Private method def _checkConfiguration(ctx, source, logger, warn): @@ -230,22 +217,22 @@ def _checkConfiguration(ctx, source, logger, warn): if oauth2 is None: title, msg = getExceptionMessage(logger, 801, g_oauth2ext, g_oauth2ext, g_extension) if warn: - showWarning(ctx, msg, title) + showWarning(ctx, title, msg) raise IllegalIdentifierException(msg, source) if not checkVersion(oauth2, g_oauth2ver): title, msg = getExceptionMessage(logger, 803, g_oauth2ext, oauth2, g_oauth2ext, g_oauth2ver) if warn: - showWarning(ctx, msg, title) + showWarning(ctx, title, msg) raise IllegalIdentifierException(msg, source) if driver is None: title, msg = getExceptionMessage(logger, 801, g_jdbcext, g_jdbcext, g_extension) if warn: - showWarning(ctx, msg, title) + showWarning(ctx, title, msg) raise IllegalIdentifierException(msg, source) if not checkVersion(driver, g_jdbcver): title, msg = getExceptionMessage(logger, 803, g_jdbcext, driver, g_jdbcext, g_jdbcver) if warn: - showWarning(ctx, msg, title) + showWarning(ctx, title, msg) raise IllegalIdentifierException(msg, source) def _getDataSourceConnection(ctx, url, new, infos=None): @@ -259,7 +246,7 @@ def _checkConnection(ctx, source, connection, logger, new, warn): connection.close() title, msg = getExceptionMessage(logger, 811, g_jdbcext, version, g_version) if warn: - showWarning(ctx, msg, title) + showWarning(ctx, title, msg) raise IllegalIdentifierException(msg, source) service = 'com.sun.star.sdb.Connection' interface = 'com.sun.star.sdbcx.XGroupsSupplier' @@ -267,7 +254,7 @@ def _checkConnection(ctx, source, connection, logger, new, warn): connection.close() title, msg = getExceptionMessage(logger, 813, g_jdbcext, service, interface) if warn: - showWarning(ctx, msg, title) + showWarning(ctx, title, msg) raise IllegalIdentifierException(msg, source) def _checkConnectionApi(connection, service, interface): diff --git a/uno/lib/uno/ucb/ucp/user.py b/uno/lib/uno/ucb/ucp/user.py index 4167cb59..f03eea2c 100644 --- a/uno/lib/uno/ucb/ucp/user.py +++ b/uno/lib/uno/ucb/ucp/user.py @@ -91,29 +91,29 @@ def __init__(self, ctx, source, logger, database, provider, sync, name, password # If we have a Null value here then it means that the user has abandoned # the OAuth2 Wizard, there is nothing more to do except throw an exception title, msg = self._getExceptionMessage(501, name) - showWarning(self._ctx, msg, title) + showWarning(self._ctx, title, msg) raise IllegalIdentifierException(msg, source) else: if not self.Provider.isOnLine(): title, msg = self._getExceptionMessage(503, name) - showWarning(self._ctx, msg, title) + showWarning(self._ctx, title, msg) raise IllegalIdentifierException(msg, source) request = getRequest(ctx, self.Provider.Scheme, name) if request is None: # If we have a Null value here then it means that the user has abandoned # the OAuth2 Wizard, there is nothing more to do except throw an exception title, msg = self._getExceptionMessage(501, g_service) - showWarning(self._ctx, msg, title) + showWarning(self._ctx, title, msg) raise IllegalIdentifierException(msg, source) user = self.Provider.getUser(source, request, name) metadata = database.insertUser(user) if metadata is None: title, msg = self._getExceptionMessage(505, name) - showWarning(self._ctx, msg, title) + showWarning(self._ctx, title, msg) raise IllegalIdentifierException(msg, source) if not database.createUser(name, password): title, msg = self._getExceptionMessage(507, name) - showWarning(self._ctx, msg, title) + showWarning(self._ctx, title, msg) raise IllegalIdentifierException(msg, source) self._paths = {} self._contents = {} diff --git a/uno/lib/uno/unotool/__init__.py b/uno/lib/uno/unotool/__init__.py index 4419bb72..02148529 100644 --- a/uno/lib/uno/unotool/__init__.py +++ b/uno/lib/uno/unotool/__init__.py @@ -27,22 +27,30 @@ ╚════════════════════════════════════════════════════════════════════════════════════╝ """ +from .taskevent import TaskEvent + +from .statusindicator import StatusIndicator + from .unotool import checkVersion from .unotool import createMessageBox from .unotool import createService -from .unotool import createWindow +from .unotool import executeDesktopDispatch from .unotool import executeDispatch from .unotool import executeFrameDispatch from .unotool import executeShell +from .unotool import findFrame from .unotool import generateUuid from .unotool import getArgumentSet +from .unotool import getCallBack from .unotool import getConfiguration from .unotool import getConnectionMode +from .unotool import getConnector from .unotool import getContainerWindow from .unotool import getCurrentLocale from .unotool import getDateTime from .unotool import getDefaultPropertyValueSet from .unotool import getDesktop +from .unotool import getDialogPosSize from .unotool import getDispatcher from .unotool import getDialog from .unotool import getDialogUrl @@ -55,13 +63,14 @@ from .unotool import getInteractionHandler from .unotool import getInterfaceNames from .unotool import getInterfaceTypes +from .unotool import getLastNamedParts from .unotool import getLibreOfficeInfo from .unotool import getLibreOfficeVersion -from .unotool import getMessageBox +from .unotool import getMailMerge from .unotool import getMimeTypeFactory +from .unotool import getMri from .unotool import getNamedValue from .unotool import getNamedValueSet -from .unotool import getParentWindow from .unotool import getPathSettings from .unotool import getPathSubstitution from .unotool import getProperty @@ -75,14 +84,19 @@ from .unotool import getStringResourceWithLocation from .unotool import getTempFile from .unotool import getToolKit +from .unotool import getTopWindow +from .unotool import getTopWindowPosition from .unotool import getTypeDetection from .unotool import getUriFactory from .unotool import getUrl from .unotool import getUrlPresentation from .unotool import getUrlTransformer +from .unotool import hasFrameInterface from .unotool import hasInterface from .unotool import hasService from .unotool import parseDateTime from .unotool import parseUrl +from .unotool import saveTopWindowPosition +from .unotool import setProgress from .unotool import unparseDateTime from .unotool import unparseTimeStamp diff --git a/uno/lib/uno/unotool/statusindicator.py b/uno/lib/uno/unotool/statusindicator.py new file mode 100644 index 00000000..335a2636 --- /dev/null +++ b/uno/lib/uno/unotool/statusindicator.py @@ -0,0 +1,90 @@ +#! +# -*- coding: utf-8 -*- + +""" +╔════════════════════════════════════════════════════════════════════════════════════╗ +║ ║ +║ Copyright (c) 2020-25 https://prrvchr.github.io ║ +║ ║ +║ Permission is hereby granted, free of charge, to any person obtaining ║ +║ a copy of this software and associated documentation files (the "Software"), ║ +║ to deal in the Software without restriction, including without limitation ║ +║ the rights to use, copy, modify, merge, publish, distribute, sublicense, ║ +║ and/or sell copies of the Software, and to permit persons to whom the Software ║ +║ is furnished to do so, subject to the following conditions: ║ +║ ║ +║ The above copyright notice and this permission notice shall be included in ║ +║ all copies or substantial portions of the Software. ║ +║ ║ +║ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, ║ +║ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES ║ +║ OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ║ +║ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY ║ +║ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, ║ +║ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE ║ +║ OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ║ +║ ║ +╚════════════════════════════════════════════════════════════════════════════════════╝ +""" + +import uno +import unohelper + +from com.sun.star.awt.PosSize import SIZE + +from com.sun.star.task import XStatusIndicator + +from com.sun.star.util.MeasureUnit import APPFONT + +from threading import Lock +import traceback + + +class StatusIndicator(unohelper.Base, + XStatusIndicator): + def __init__(self, frame, offset=10): + self._window = frame.getContainerWindow() + self._progress = frame.createStatusIndicator() + self._point = uno.createUnoStruct('com.sun.star.awt.Point', 0, offset) + self._lock = Lock() + self._value = 0 + + def start(self, text, value): + self._setValue(0) + self._setWindowHeight() + self._progress.start(text, value) + + def setText(self, text): + self._setText(text) + + def setValue(self, value): + # XXX: In order to be able to progress in the loops it is necessary + # XXX: to be able to add value to the current progression value. + # XXX: This is what is done here thanks to a negative value + self._setValue(value) + + def end(self): + self._progress.end() + self._setWindowHeight(-1) + + def reset(self): + self._setValue(0) + self._progress.reset() + + def _setText(self, text): + with self._lock: + self._progress.setText(text) + + def _setValue(self, value): + with self._lock: + if value < 0: + self._value += abs(value) + else: + self._value = value + self._progress.setValue(self._value) + + def _setWindowHeight(self, factor=1): + size = self._window.getPosSize() + offset = self._window.convertPointToPixel(self._point, APPFONT).Y * factor + self._window.setPosSize(0, 0, size.Width, size.Height + offset, SIZE) + diff --git a/uno/lib/uno/unotool/taskevent.py b/uno/lib/uno/unotool/taskevent.py new file mode 100644 index 00000000..300197d3 --- /dev/null +++ b/uno/lib/uno/unotool/taskevent.py @@ -0,0 +1,58 @@ +#! +# -*- coding: utf-8 -*- + +""" +╔════════════════════════════════════════════════════════════════════════════════════╗ +║ ║ +║ Copyright (c) 2020-25 https://prrvchr.github.io ║ +║ ║ +║ Permission is hereby granted, free of charge, to any person obtaining ║ +║ a copy of this software and associated documentation files (the "Software"), ║ +║ to deal in the Software without restriction, including without limitation ║ +║ the rights to use, copy, modify, merge, publish, distribute, sublicense, ║ +║ and/or sell copies of the Software, and to permit persons to whom the Software ║ +║ is furnished to do so, subject to the following conditions: ║ +║ ║ +║ The above copyright notice and this permission notice shall be included in ║ +║ all copies or substantial portions of the Software. ║ +║ ║ +║ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, ║ +║ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES ║ +║ OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ║ +║ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY ║ +║ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, ║ +║ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE ║ +║ OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ║ +║ ║ +╚════════════════════════════════════════════════════════════════════════════════════╝ +""" + +import unohelper + +from com.sun.star.task import XTaskEvent + +from threading import Event +import traceback + + +class TaskEvent(unohelper.Base, + XTaskEvent): + def __init__(self, set=False): + self._event = Event() + if set: + self._event.set() + + def isSet(self): + return self._event.is_set() + + def set(self): + self._event.set() + + def clear(self): + return self._event.clear() + + def wait(self, timeout): + if timeout <= 0: + timeout = None + return self._event.wait(timeout) + diff --git a/uno/lib/uno/unotool/unotool.py b/uno/lib/uno/unotool/unotool.py index 66f4d5c5..7a186395 100644 --- a/uno/lib/uno/unotool/unotool.py +++ b/uno/lib/uno/unotool/unotool.py @@ -29,7 +29,21 @@ import uno +from com.sun.star.awt import Point from com.sun.star.awt import Rectangle +from com.sun.star.awt import Size + +from com.sun.star.awt.MessageBoxType import ERRORBOX + +from com.sun.star.awt.WindowAttribute import SHOW +from com.sun.star.awt.WindowAttribute import MINSIZE +from com.sun.star.awt.WindowAttribute import BORDER +from com.sun.star.awt.WindowAttribute import MOVEABLE +from com.sun.star.awt.WindowAttribute import CLOSEABLE +from com.sun.star.awt.WindowAttribute import NODECORATION + +from com.sun.star.awt.WindowClass import TOP +from com.sun.star.awt.WindowClass import CONTAINER from com.sun.star.beans.PropertyState import DIRECT_VALUE @@ -37,6 +51,8 @@ from com.sun.star.document.MacroExecMode import ALWAYS_EXECUTE_NO_WARN +from com.sun.star.frame.FrameSearchFlag import GLOBAL + from com.sun.star.lang import WrappedTargetRuntimeException from com.sun.star.ucb.ConnectionMode import ONLINE @@ -44,6 +60,8 @@ from com.sun.star.ui.dialogs.ExecutableDialogResults import OK +from com.sun.star.util.MeasureUnit import APPFONT + import binascii import datetime from packaging import version @@ -51,16 +69,22 @@ def getConnectionMode(ctx, host, port=80): - connector = createService(ctx, 'com.sun.star.connection.Connector') + connector = getConnector(ctx) try: connection = connector.connect('socket,host=%s,port=%s' % (host, port)) except NoConnectException: mode = OFFLINE else: - connection.close() + try: + connection.close() + except: + pass mode = ONLINE return mode +def getConnector(ctx): + return createService(ctx, 'com.sun.star.connection.Connector') + def getDesktop(ctx): return createService(ctx, 'com.sun.star.frame.Desktop') @@ -94,6 +118,15 @@ def getUrlTransformer(ctx): def getInteractionHandler(ctx): return createService(ctx, 'com.sun.star.task.InteractionHandler') +def getMailMerge(ctx): + return createService(ctx, 'com.sun.star.text.MailMerge') + +def getMri(ctx): + return createService(ctx, 'mytools.Mri') + +def getCallBack(ctx): + return createService(ctx, 'com.sun.star.awt.AsyncCallback') + def getSequenceInputStream(ctx, sequence): service = 'com.sun.star.io.SequenceInputStream' return createService(ctx, service, sequence) @@ -119,11 +152,14 @@ def parseUrl(transformer, location, protocol=None): success, url = transformer.parseSmart(url, protocol) return url if success else None -def getDocument(ctx, url): - properties = {'Hidden': True, - 'OpenNewView': True, - 'MacroExecutionMode': ALWAYS_EXECUTE_NO_WARN} - descriptor = getPropertyValueSet(properties) +def getDocument(ctx, url, readonly=True): + # XXX: ReadOnly: documents opened for mailing are opened readonly because they must + # XXX: be opened as a new document and this document could be open already + # XXX: OpenNewView: always open a new document because it must be disposed afterwards. + # XXX: Hidden: mailing is done in a hidden view + # XXX: Silence: load document for mailing without user interaction + arguments = {'ReadOnly': readonly, 'OpenNewView': True, 'Hidden': True, 'Silence': True} + descriptor = getPropertyValueSet(arguments) document = getDesktop(ctx).loadComponentFromURL(url, '_blank', 0, descriptor) return document @@ -182,6 +218,11 @@ def hasInterface(component, interface): return True return False +def hasFrameInterface(component): + frame = 'com.sun.star.frame.XFrame2' + desktop = 'com.sun.star.frame.XDesktop2' + return hasInterface(component, frame) or hasInterface(component, desktop) + def hasService(ctx, name): service = createService(ctx, name) return service is not None @@ -218,6 +259,12 @@ def getExtensionVersion(ctx, extension): return version return None +def getLastNamedParts(name, sep='.'): + part1, sep, part2 = name.rpartition(sep) + if not sep: + part1, part2 = part2, None + return part1, part2 + def getLibreOfficeInfo(ctx): config = getConfiguration(ctx, '/org.openoffice.Setup/Product') name = config.getByName('ooName') @@ -279,23 +326,67 @@ def getStringResourceWithLocation(ctx, url, filename, locale=None): def generateUuid(): return binascii.hexlify(uno.generateUuid().value).decode('utf-8') -def getDialog(ctx, identifier, xdl, handler=None, window=None): +def setProgress(callback, caller, value): + data = {'call': 'progress', 'value': value} + callback.addCallback(caller, getNamedValueSet(data)) + +def getDialog(ctx, identifier, xdl, handler=None, parent=None): dialog = None provider = createService(ctx, 'com.sun.star.awt.DialogProvider2') url = getDialogUrl(identifier, xdl) - if handler is None and window is None: - dialog = provider.createDialog(url) - toolkit = createService(ctx, 'com.sun.star.awt.Toolkit') - dialog.createPeer(toolkit, None) - elif handler is not None and window is None: - dialog = provider.createDialogWithHandler(url, handler) - toolkit = createService(ctx, 'com.sun.star.awt.Toolkit') - dialog.createPeer(toolkit, None) + if handler and parent: + properties = getNamedValueSet({'ParentWindow': parent, 'EventHandler': handler}) + dialog = provider.createDialogWithArguments(url, properties) else: - args = getNamedValueSet({'ParentWindow': window, 'EventHandler': handler}) - dialog = provider.createDialogWithArguments(url, args) + if handler: + dialog = provider.createDialogWithHandler(url, handler) + else: + dialog = provider.createDialog(url) + toolkit = getToolKit(ctx) + dialog.createPeer(toolkit, toolkit.getDesktopWindow()) return dialog +def findFrame(ctx, name, flags=GLOBAL): + return getDesktop(ctx).findFrame(name, flags) + +def getDialogPosSize(ctx, extension, xdl, point=None, unit=APPFONT): + dialog = getDialog(ctx, extension, xdl) + size = dialog.convertSizeToPixel(Size(dialog.Model.Width, dialog.Model.Height), unit) + dialog.dispose() + if point is None: + point = Point(0, 0) + return Rectangle(point.X, point.Y, size.Width, size.Height) + +def getTopWindow(ctx, name, rectangle=None, parent=None, modal=TOP, attrs=BORDER | MOVEABLE | CLOSEABLE | NODECORATION): + descriptor = uno.createUnoStruct('com.sun.star.awt.WindowDescriptor') + descriptor.Type = modal + descriptor.WindowServiceName = 'window' + if parent: + descriptor.Parent = parent + else: + descriptor.ParentIndex = -1 + if rectangle: + attrs |= SHOW + descriptor.Bounds = rectangle + descriptor.WindowAttributes = attrs + # XXX: We use the TaskCreator UNO service instead of Frame + # XXX: in order to be able to assign a title to the window. + service = 'com.sun.star.frame.TaskCreator' + arguments = {'FrameName': name, 'ContainerWindow': getToolKit(ctx).createWindow(descriptor)} + frame = createService(ctx, service).createInstanceWithArguments(getNamedValueSet(arguments)) + getDesktop(ctx).getFrames().append(frame) + return frame + +def getTopWindowPosition(window): + size = window.getPosSize() + return Point(size.X, size.Y) + +def saveTopWindowPosition(config, position, property): + if config.hasByName(property): + any = uno.Any('[]long', (position.X, position.Y)) + uno.invoke(config, 'replaceByName', (property, any)) + config.commitChanges() + def getContainerWindow(ctx, parent, handler, identifier, xdl): service = 'com.sun.star.awt.ContainerWindowProvider' provider = createService(ctx, service) @@ -313,15 +404,10 @@ def getFileUrl(ctx, title, path, filters=(), multi=False): filepicker.setCurrentFilter(name) filepicker.setMultiSelectionMode(multi) if filepicker.execute() == OK: - url = filepicker.getFiles()[0] if multi: - try: - urls = filepicker.getSelectedFiles() - except: - urls = filepicker.getFiles() - if len(urls) > 1: - urls = [url + u for u in urls[1:]] - url = urls + url = filepicker.getSelectedFiles() + else: + url = filepicker.getSelectedFiles()[0] path = filepicker.getDisplayDirectory() filepicker.dispose() return url, path @@ -333,10 +419,22 @@ def executeShell(ctx, url, option=''): shell = createService(ctx, 'com.sun.star.system.SystemShellExecute') shell.execute(url, option, 0) -def executeDispatch(ctx, url, /, **args): - frame = getDesktop(ctx).getCurrentFrame() - arguments = getPropertyValueSet(args) - getDispatcher(ctx).executeDispatch(frame, url, '', 0, arguments) +def executeDispatch(ctx, url, /, **kwargs): + frame = _getCurrentFrame(ctx) + properties = getPropertyValueSet(kwargs) + getDispatcher(ctx).executeDispatch(frame, url, '', 0, properties) + +def executeDesktopDispatch(ctx, url, listener=None, /, **kwargs): + frame = _getCurrentFrame(ctx) + properties = getPropertyValueSet(kwargs) + executeFrameDispatch(ctx, frame, url, listener, *properties) + +def _getCurrentFrame(ctx): + desktop = getDesktop(ctx) + frame = desktop.getCurrentFrame() + if frame is None: + frame = desktop + return frame def executeFrameDispatch(ctx, frame, url, listener=None, /, *properties): url = getUrl(ctx, url) @@ -347,11 +445,11 @@ def executeFrameDispatch(ctx, frame, url, listener=None, /, *properties): else: dispatcher.dispatch(url, properties) -def createMessageBox(peer, box, button, title, message): - return getMessageBox(peer.getToolkit(), peer, box, button, title, message) - -def getMessageBox(toolkit, peer, box, button, title, message): - return toolkit.createMessageBox(peer, box, button, title, message) +def createMessageBox(ctx, title, message, box=ERRORBOX, button=1, parent=None): + toolkit = getToolKit(ctx) + if parent is None: + parent = toolkit.getDesktopWindow() + return toolkit.createMessageBox(parent, box, button, title, message) def createService(ctx, name, *args, **kwargs): if args: @@ -363,10 +461,13 @@ def createService(ctx, name, *args, **kwargs): service = ctx.ServiceManager.createInstanceWithContext(name, ctx) return service -def getArgumentSet(properties): +def getArgumentSet(properties, lower=True): arguments = {} for property in properties: - arguments[property.Name] = property.Value + name = property.Name + if lower: + name = name.lower() + arguments[name] = property.Value return arguments def getDefaultPropertyValueSet(args, default): @@ -408,19 +509,6 @@ def getPropertySetInfoChangeEvent(source, name, reason, handle=-1): event.Handle = handle event.Reason = reason -def createWindow(ctx, extension, xdl, name): - dialog = getDialog(ctx, extension, xdl, None, None) - possize = Rectangle(dialog.Model.PositionX, dialog.Model.PositionY, dialog.Model.Width, dialog.Model.Height) - dialog.dispose() - desktop = getDesktop(ctx) - args = getNamedValueSet({'FrameName': name, 'PosSize': possize}) - frame = createService(ctx, 'com.sun.star.frame.TaskCreator').createInstanceWithArguments(args) - frames = desktop.getFrames() - frame.setTitle(_getUniqueName(frames, name)) - frame.setCreator(desktop) - frames.append(frame) - return frame.getContainerWindow() - def _getUniqueName(frames, name): count = 0 for i in range(frames.getCount()): @@ -430,15 +518,6 @@ def _getUniqueName(frames, name): name = '%s - %s' % (name, (count +1)) return name - -def getParentWindow(ctx): - desktop = getDesktop(ctx) - try: - parent = desktop.getCurrentFrame().getContainerWindow() - except: - parent = None - return parent - def getDateTime(utc=True): if utc: t = datetime.datetime.utcnow() diff --git a/uno/lib/uno/wizard/__init__.py b/uno/lib/uno/wizard/__init__.py index 47432631..0f7a7349 100644 --- a/uno/lib/uno/wizard/__init__.py +++ b/uno/lib/uno/wizard/__init__.py @@ -28,3 +28,4 @@ """ from .wizard import Wizard + diff --git a/uno/lib/uno/wizard/wizard.py b/uno/lib/uno/wizard/wizard.py index bd30d116..a6050a67 100644 --- a/uno/lib/uno/wizard/wizard.py +++ b/uno/lib/uno/wizard/wizard.py @@ -30,16 +30,15 @@ import uno import unohelper -from com.sun.star.logging.LogLevel import SEVERE - -from com.sun.star.ui.dialogs import XWizard +from com.sun.star.container import NoSuchElementException +from com.sun.star.lang import XComponent from com.sun.star.lang import XInitialization from com.sun.star.lang import IllegalArgumentException -from com.sun.star.util import InvalidStateException +from com.sun.star.logging.LogLevel import SEVERE -from com.sun.star.container import NoSuchElementException +from com.sun.star.ui.dialogs import XWizard from com.sun.star.ui.dialogs.ExecutableDialogResults import CANCEL from com.sun.star.ui.dialogs.ExecutableDialogResults import OK @@ -48,24 +47,30 @@ from com.sun.star.ui.dialogs.WizardTravelType import BACKWARD from com.sun.star.ui.dialogs.WizardTravelType import FINISH +from com.sun.star.util import CloseVetoException +from com.sun.star.util import InvalidStateException + from .wizardmodel import WizardModel + from .wizardview import WizardView + +from .wizardhandler import CloseListener from .wizardhandler import DialogHandler from .wizardhandler import ItemListener +from .wizardhandler import WindowHandler -from ..logger import getLogger +from ...logger import getLogger -from ..unotool import hasInterface +from ...unotool import hasInterface -from ..configuration import g_extension +from ...configuration import g_extension import traceback class Wizard(unohelper.Base, - XWizard, - XInitialization): - def __init__(self, ctx, auto=-1, resize=False, parent=None): + XWizard): + def __init__(self, ctx, auto=-1, name=None, point=None, parent=None, resize=True): self._ctx = ctx self._helpUrl = '' self._auto = auto @@ -74,12 +79,26 @@ def __init__(self, ctx, auto=-1, resize=False, parent=None): self._currentPath = -1 self._multiPaths = False self._controller = None + self._closed = False self._model = WizardModel(ctx) title = self._model.getRoadmapTitle() - self._view = WizardView(ctx, DialogHandler(self), ItemListener(self), parent, title) + if name: + handler, self._listener = WindowHandler(self), CloseListener(self) + else: + handler, self._listener = DialogHandler(self), None + self._view = WizardView(ctx, handler, self._listener, ItemListener(self), parent, name, title, resize, point) roadmap = self._view.getRoadmapModel() self._model.setRoadmapModel(roadmap) +# XCloseListener + def queryClosing(self, source, ownership): + self._queryClosing(ownership) + + def notifyClosing(self, source): + if self._listener: + source.removeCloseListener(self._listener) + self._dispose() + # XWizard # XWizard Attributes @property @@ -93,7 +112,7 @@ def HelpURL(self, url): @property def DialogWindow(self): - return self._view.getDialog() + return self._view.getDialogWindow() # XWizard Methods def getCurrentPage(self): @@ -165,7 +184,12 @@ def execute(self): if not self._isCurrentPathSet(): self._initPath(0, False) self._initPage() - return self._view.execute() + if self._view.isModal(): + status = self._view.execute() + self._dispose() + else: + status = OK + return status # XInitialization def initialize(self, arguments): @@ -194,10 +218,16 @@ def doFinish(self): reason = self._getCommitReason() if self._model.doFinish(reason): if self._controller.confirmFinish(): - self._view.endDialog(OK) + if self._view.isModal(): + self._view.endDialog(OK) + else: + self._tryToClose() def doCancel(self): - self._view.endDialog(CANCEL) + if self._view.isModal(): + self._view.endDialog(CANCEL) + else: + self._tryToClose() # Wizard private getter methods def _isComplete(self): @@ -303,7 +333,7 @@ def _isAutoLoad(self, page=None): if page is None: nextindex = self._getFirstPageId() else: - nextindex = self._getCurrentPath().index(page) +1 + nextindex = self._getCurrentPath().index(page) + 1 return nextindex < self._auto def _getPath(self, index, final): @@ -343,6 +373,27 @@ def _initNextPage(self): return init # Wizard private setter methods + def _dispose(self): + interface = 'com.sun.star.lang.XComponent' + if self._controller and hasInterface(self._controller, interface): + self._controller.dispose() + self._model.dispose() + self._view.dispose() + + def _tryToClose(self): + try: + self._queryClosing() + except CloseVetoException as e: + pass + else: + self._view.close() + + def _queryClosing(self, ownership=False): + if not ownership: + interface = 'com.sun.star.util.XCloseable' + if self._controller and hasInterface(self._controller, interface): + self._controller.close(ownership) + def _initPath(self, index, final): complete, paths = self._getPath(index, final) self._model.initRoadmap(self._controller, paths, complete) @@ -384,6 +435,9 @@ def _updateButton(self): self._view.updateButtonFinish(enabled) # Private Exception getter methods + def _getEventObject(self): + return uno.createUnoStruct('com.sun.star.lang.EventObject', self) + def _getIllegalArgumentException(self, position, code, method): e = IllegalArgumentException() e.ArgumentPosition = position diff --git a/uno/lib/uno/wizard/wizardhandler.py b/uno/lib/uno/wizard/wizardhandler.py index c3a85c87..31674704 100644 --- a/uno/lib/uno/wizard/wizardhandler.py +++ b/uno/lib/uno/wizard/wizardhandler.py @@ -29,9 +29,12 @@ import unohelper +from com.sun.star.awt import XContainerWindowEventHandler from com.sun.star.awt import XDialogEventHandler from com.sun.star.awt import XItemListener +from com.sun.star.util import XCloseListener + import traceback @@ -59,9 +62,43 @@ def callHandlerMethod(self, dialog, event, method): self._manager.doCancel() handled = True return handled - except Exception as e: - msg = "Error: %s" % traceback.format_exc() - print(msg) + except: + print("DialogHandler.callHandlerMethod() ERROR: %s" % traceback.format_exc()) + + def getSupportedMethodNames(self): + return ('Help', + 'Previous', + 'Next', + 'Finish', + 'Cancel') + + +class WindowHandler(unohelper.Base, + XContainerWindowEventHandler): + def __init__(self, manager): + self._manager = manager + +# XContainerWindowEventHandler + def callHandlerMethod(self, dialog, event, method): + try: + handled = False + if method == 'Help': + handled = True + elif method == 'Previous': + self._manager.travelPrevious() + handled = True + elif method == 'Next': + self._manager.travelNext() + handled = True + elif method == 'Finish': + self._manager.doFinish() + handled = True + elif method == 'Cancel': + self._manager.doCancel() + handled = True + return handled + except: + print("WindowHandler.callHandlerMethod() ERROR: %s" % traceback.format_exc()) def getSupportedMethodNames(self): return ('Help', @@ -80,9 +117,25 @@ def __init__(self, manager): def itemStateChanged(self, event): try: self._manager.changeRoadmapStep(event.ItemId) - except Exception as e: - msg = "Error: %s" % traceback.format_exc() - print(msg) + except: + print("ItemListener.itemStateChanged() ERROR: %s" % traceback.format_exc()) def disposing(self, event): pass + + +class CloseListener(unohelper.Base, + XCloseListener): + def __init__(self, manager): + self._manager = manager + + # XCloseListener + def queryClosing(self, event, ownership): + self._manager.queryClosing(event.Source, ownership) + + def notifyClosing(self, event): + self._manager.notifyClosing(event.Source) + + def disposing(self, event): + pass + diff --git a/uno/lib/uno/wizard/wizardmodel.py b/uno/lib/uno/wizard/wizardmodel.py index e9344333..265bc04e 100644 --- a/uno/lib/uno/wizard/wizardmodel.py +++ b/uno/lib/uno/wizard/wizardmodel.py @@ -30,9 +30,10 @@ import uno import unohelper -from ..unotool import getStringResource +from ...unotool import getStringResource +from ...unotool import hasInterface -from ..configuration import g_identifier +from ...configuration import g_identifier import traceback @@ -46,6 +47,12 @@ def __init__(self, ctx): self._resolver = getStringResource(ctx, g_identifier, 'dialogs', 'Wizard') self._resources = {'Roadmap': 'Wizard.Roadmap.Text'} + def dispose(self): + interface = 'com.sun.star.lang.XComponent' + for page in self._pages.values(): + if page and hasInterface(page, interface): + page.dispose() + def setRoadmapModel(self, model): self._roadmap = model diff --git a/uno/lib/uno/wizard/wizardview.py b/uno/lib/uno/wizard/wizardview.py index 8d293687..745ede03 100644 --- a/uno/lib/uno/wizard/wizardview.py +++ b/uno/lib/uno/wizard/wizardview.py @@ -30,65 +30,114 @@ import uno import unohelper +from com.sun.star.awt import Size +from com.sun.star.awt.PosSize import POSSIZE +from com.sun.star.awt.PosSize import SIZE + from com.sun.star.ui.dialogs.WizardButton import NEXT from com.sun.star.ui.dialogs.WizardButton import PREVIOUS from com.sun.star.ui.dialogs.WizardButton import FINISH from com.sun.star.ui.dialogs.WizardButton import CANCEL from com.sun.star.ui.dialogs.WizardButton import HELP -from ..unotool import createWindow -from ..unotool import getDialog +from com.sun.star.util.MeasureUnit import APPFONT + +from ...unotool import getContainerWindow +from ...unotool import getDialog +from ...unotool import getTopWindow -from ..configuration import g_identifier +from ...configuration import g_identifier import traceback class WizardView(unohelper.Base): - def __init__(self, ctx, handler, listener, parent, title, modal=True): + def __init__(self, ctx, handler, listener, listener1, parent, name, title, resize, point): self._name = 'Roadmap1' - #if not modal and parent is None: - # parent = createWindow(ctx, g_identifier, 'Wizard', title).getPeer() - self._dialog = getDialog(ctx, g_identifier, 'Wizard', handler, parent) + if name: + # XXX: With a frame name we use a TOP XWindow + self._frame = getTopWindow(ctx, name) + peer = self._frame.getContainerWindow() + self._dialog = getContainerWindow(ctx, peer, handler, g_identifier, 'WizardTop') + # XXX: setComponent is needed if we want a StatusIndicator at the bottom + self._frame.setComponent(self._dialog, None) + self._frame.addCloseListener(listener) + else: + # XXX: Without frame name we use a MODAL XDialog + self._frame = None + self._dialog = getDialog(ctx, g_identifier, 'Wizard', handler, parent) + self._point = point rectangle = uno.createUnoStruct('com.sun.star.awt.Rectangle', 0, 0, 85, 180) roadmap = self._getRoadmap(title, rectangle, 0) - roadmap.addItemListener(listener) + roadmap.addItemListener(listener1) self._button = {CANCEL: 1, FINISH: 2, NEXT: 3, PREVIOUS: 4, HELP: 5} self._spacer = 5 + if self._frame and not resize: + peer.setVisible(True) + self._dialog.setVisible(True) # WizardView getter methods + def isModal(self): + return self._frame is None + def getDialog(self): return self._dialog + def getDialogWindow(self): + if self._frame: + dialog = self._frame.getContainerWindow() + else: + dialog = self._dialog + return dialog + def getRoadmapModel(self): return self._getRoadmapControl().Model # WizardView setter methods def execute(self): - return self._dialog.execute() + if self._frame is None: + return self._dialog.execute() def endDialog(self, result): - self._dialog.endDialog(result) + if self._frame is None: + self._dialog.endDialog(result) - def dispose(self): - self._dialog.dispose() - self._dialog = None + def close(self): + if self._frame: + self._frame.close(True) - def isDisposed(self): - return self._dialog is None + def dispose(self): + if self._frame is None: + self._dialog.dispose() def setDialogTitle(self, title): - self._dialog.setTitle(title) + if self._frame: + self._frame.setTitle(title) + else: + self._dialog.setTitle(title) def setDialogSize(self, page): button = self._getButton(HELP).Model - button.PositionY = page.Height + self._spacer + button.PositionY = page.Height + self._spacer dialog = self._dialog.Model dialog.Height = button.PositionY + button.Height + self._spacer dialog.Width = page.PositionX + page.Width # We assume all buttons are named appropriately - for i in (1,2,3,4): + for i in (1, 2, 3, 4): self._setButtonPosition(i, button.PositionY, dialog.Width) + if self._frame: + window = self._frame.getContainerWindow() + size = self._dialog.convertSizeToPixel(Size(dialog.Width, dialog.Height), APPFONT) + if self._point: + point = self._dialog.convertPointToPixel(self._point, APPFONT) + possize = POSSIZE + else: + point = uno.createUnoStruct('com.sun.star.awt.Point', 0, 0) + possize = SIZE + window.setPosSize(point.X, point.Y, size.Width, size.Height, possize) + # XXX: Visibility should be done after size adjustment + window.setVisible(True) + self._dialog.setVisible(True) def enableHelpButton(self, enabled): self._getButton(HELP).Model.Enabled = enabled diff --git a/uno/rdb/idl/com/sun/star/task/XTaskEvent.idl b/uno/rdb/idl/com/sun/star/task/XTaskEvent.idl new file mode 100644 index 00000000..2223e66a --- /dev/null +++ b/uno/rdb/idl/com/sun/star/task/XTaskEvent.idl @@ -0,0 +1,49 @@ +/* +╔════════════════════════════════════════════════════════════════════════════════════╗ +║ ║ +║ Copyright (c) 2020-25 https://prrvchr.github.io ║ +║ ║ +║ Permission is hereby granted, free of charge, to any person obtaining ║ +║ a copy of this software and associated documentation files (the "Software"), ║ +║ to deal in the Software without restriction, including without limitation ║ +║ the rights to use, copy, modify, merge, publish, distribute, sublicense, ║ +║ and/or sell copies of the Software, and to permit persons to whom the Software ║ +║ is furnished to do so, subject to the following conditions: ║ +║ ║ +║ The above copyright notice and this permission notice shall be included in ║ +║ all copies or substantial portions of the Software. ║ +║ ║ +║ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, ║ +║ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES ║ +║ OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ║ +║ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY ║ +║ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, ║ +║ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE ║ +║ OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ║ +║ ║ +╚════════════════════════════════════════════════════════════════════════════════════╝ + */ + +#ifndef __com_sun_star_task_XTaskEvent_idl__ +#define __com_sun_star_task_XTaskEvent_idl__ + +#include + +module com { module sun { module star { module task { + +interface XTaskEvent : com::sun::star::uno::XInterface +{ + + boolean isSet(); + + void set(); + + void clear(); + + boolean wait([in] float Timeout); + +}; + +}; }; }; }; + +#endif