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 2808b1f7..df1eb768 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ **The use of this software subjects you to our [Terms Of Use][4] and [Data Protection Policy][5].** -# version [1.3.1][6] +# version [1.4.0][6] ## Introduction: @@ -43,6 +43,7 @@ Being free software I encourage you: - To duplicate its [source code][12]. - To make changes, corrections, improvements. - To open [issue][13] if needed. +- To [participate in the costs][14] of [CASA certification][15]. In short, to participate in the development of this extension. Because it is together that we can make Free Software smarter. @@ -52,10 +53,10 @@ ___ ## Requirement: The mContactOOo extension uses the OAuth2OOo extension to work. -It must therefore meet the [requirement of the OAuth2OOo extension][14]. +It must therefore meet the [requirement of the OAuth2OOo extension][16]. The mContactOOo extension uses the jdbcDriverOOo extension to work. -It must therefore meet the [requirement of the jdbcDriverOOo extension][15]. +It must therefore meet the [requirement of the jdbcDriverOOo extension][17]. Additionally, mContactOOo requires the jdbcDriverOOo extension to be configured to provide `com.sun.star.sdb` as the API level, which is the default configuration. ___ @@ -65,15 +66,15 @@ ___ It seems important that the file was not renamed when it was downloaded. If necessary, rename it before installing it. -- [![OAuth2OOo logo][17]][18] Install **[OAuth2OOo.oxt][19]** extension [![Version][20]][19] +- [![OAuth2OOo logo][18]][19] Install **[OAuth2OOo.oxt][20]** extension [![Version][21]][20] You must install this extension, if it is not already installed. -- [![jdbcDriverOOo logo][21]][22] Install **[jdbcDriverOOo.oxt][23]** extension [![Version][24]][23] +- [![jdbcDriverOOo logo][22]][23] Install **[jdbcDriverOOo.oxt][24]** extension [![Version][25]][24] You must install this extension, if it is not already installed. -- ![mContactOOo logo][25] Install **[mContactOOo.oxt][26]** extension version [![Version][27]][26] +- ![mContactOOo logo][26] Install **[mContactOOo.oxt][27]** extension version [![Version][28]][27] Restart LibreOffice after installation. **Be careful, restarting LibreOffice may not be enough.** @@ -91,7 +92,7 @@ ___ In LibreOffice / OpenOffice go to: **File -> Wizards -> Address Data Source...** -![mContactOOo screenshot 1][28] +![mContactOOo screenshot 1][29] The **Address Book Datasource Wizard** open. @@ -99,12 +100,12 @@ In step: **1.Address Book Type**: - Select: **Other external data source**. - Click button: **Next**. -![mContactOOo screenshot 2][29] +![mContactOOo screenshot 2][30] In step: **2.Connection Settings**: - Click button: **Settings**. -![mContactOOo screenshot 3][30] +![mContactOOo screenshot 3][31] A new wizard opens. **Data source properties**. @@ -113,22 +114,22 @@ In Database type list: - Select: **Microsoft Contacts**. - Click button: **Next**. -![mContactOOo screenshot 4][31] +![mContactOOo screenshot 4][32] In step: **2.Connection Settings**. In General: Enter the DBMS/driver-specific connection string here. - Put your Microsoft account (ie: your_account@outlook.com) - Click button: **Test connection**. -![mContactOOo screenshot 5][32] +![mContactOOo screenshot 5][33] -After authorizing the [OAuth2OOo][18] application to access your Contacts, normally you should see: Connection Test: The connection was established successfully. +After authorizing the [OAuth2OOo][19] application to access your Contacts, normally you should see: Connection Test: The connection was established successfully. -![mContactOOo screenshot 6][33] +![mContactOOo screenshot 6][34] If the connection has been established, you can complete this wizard with the **Finish** button. -![mContactOOo screenshot 7][34] +![mContactOOo screenshot 7][35] In step: **3.Table Selection**. If your data source has multiple tables, you will be asked to select the primary table. @@ -138,7 +139,7 @@ In step: **4.Field Assignment**. If necessary it is possible to rename the names of the columns of the data source using the button: **Field Assignment**. Please continue this wizard with the button: **Next**. -![mContactOOo screenshot 8][35] +![mContactOOo screenshot 8][36] In step: **5.Data Source Title**. @@ -150,7 +151,7 @@ This odb file must also be made accessible. To do this you must: - **Check the box**: Make this address book available to all modules in LibreOffice - Named the address book in the field: **Address book name**. -![mContactOOo screenshot 9][36] +![mContactOOo screenshot 9][37] Have fun... @@ -158,12 +159,12 @@ ___ ## How to build the extension: -Normally, the extension is created with Eclipse for Java and [LOEclipse][37]. To work around Eclipse, I modified LOEclipse to allow the extension to be created with Apache Ant. +Normally, the extension is created with Eclipse for Java and [LOEclipse][38]. To work around Eclipse, I modified LOEclipse to allow the extension to be created with Apache Ant. To create the mContactOOo extension with the help of Apache Ant, you need to: -- Install the [Java SDK][38] version 8 or higher. -- Install [Apache Ant][39] version 1.10.0 or higher. -- Install [LibreOffice and its SDK][40] version 7.x or higher. -- Clone the [mContactOOo][41] repository on GitHub into a folder. +- Install the [Java SDK][39] version 8 or higher. +- Install [Apache Ant][40] version 1.10.0 or higher. +- Install [LibreOffice and its SDK][41] version 7.x or higher. +- Clone the [mContactOOo][42] repository on GitHub into a folder. - From this folder, move to the directory: `source/mContactOOo/` - In this directory, edit the file: `build.properties` so that the `office.install.dir` and `sdk.dir` properties point to the folders where LibreOffice and its SDK were installed, respectively. - Start the archive creation process using the command: `ant` @@ -181,7 +182,7 @@ ___ * LibreOffice 24.8.0.3 (x86_64) - Windows 10(x64) - Python version 3.9.19 (under Lubuntu 22.04 / VirtualBox 6.1.38) -* **Does not work with OpenOffice on Windows** see [bug 128569][42]. Having no solution, I encourage you to install **LibreOffice**. +* **Does not work with OpenOffice on Windows** see [bug 128569][43]. Having no solution, I encourage you to install **LibreOffice**. I encourage you in case of problem :confused: to create an [issue][13] @@ -195,7 +196,7 @@ ___ This extension was written in order to make usable in free software (LibreOffice or OpenOffice) your personal data stored in your Microsoft Outlook address book. -With the [eMailerOOo][43] extension, it can be the data source for [mail merge][44] by email, to your correspondents contained in your Microsoft Outlook address book. +With the [eMailerOOo][44] extension, it can be the data source for [mail merge][45] by email, to your correspondents contained in your Microsoft Outlook address book. It will give you access to an information system that only larges companies are able, today, to implement. @@ -215,10 +216,10 @@ It will give you access to an information system that only larges companies are ### What has been done for version 1.1.0: -- All Python packages necessary for the extension are now recorded in a [requirements.txt][45] file following [PEP 508][46]. +- All Python packages necessary for the extension are now recorded in a [requirements.txt][46] file following [PEP 508][47]. - Now if you are not on Windows then the Python packages necessary for the extension can be easily installed with the command: `pip install requirements.txt` -- Modification of the [Requirement][47] section. +- Modification of the [Requirement][48] section. ### What has been done for version 1.1.1: @@ -227,27 +228,27 @@ It will give you access to an information system that only larges companies are ### What has been done for version 1.1.2: -- Integration of a fix to workaround the [issue #159988][48]. +- Integration of a fix to workaround the [issue #159988][49]. ### What has been done for version 1.1.3: -- The creation of the database, during the first connection, uses the UNO API offered by the jdbcDriverOOo extension since version 1.3.2. This makes it possible to record all the information necessary for creating the database in 9 text tables which are in fact [9 csv files][49]. +- The creation of the database, during the first connection, uses the UNO API offered by the jdbcDriverOOo extension since version 1.3.2. This makes it possible to record all the information necessary for creating the database in 9 text tables which are in fact [9 csv files][50]. - The extension will ask you to install the OAuth2OOo and jdbcDriverOOo extensions in versions 1.3.4 and 1.3.2 respectively minimum. - Many fixes. ### What has been done for version 1.1.4: -- Updated the [Python python-dateutil][50] package to version 2.9.0.post0. -- Updated the [Python decorator][51] package to version 5.1.1. -- Updated the [Python ijson][52] package to version 3.3.0. -- Updated the [Python packaging][53] package to version 24.1. -- Updated the [Python setuptools][54] package to version 72.1.0 in order to respond to the [Dependabot security alert][55]. -- Updated the [Python validators][56] package to version 0.33.0. +- Updated the [Python python-dateutil][51] package to version 2.9.0.post0. +- Updated the [Python decorator][52] package to version 5.1.1. +- Updated the [Python ijson][53] package to version 3.3.0. +- Updated the [Python packaging][54] package to version 24.1. +- Updated the [Python setuptools][55] package to version 72.1.0 in order to respond to the [Dependabot security alert][56]. +- Updated the [Python validators][57] package to version 0.33.0. - The extension will ask you to install the OAuth2OOo and jdbcDriverOOo extensions in versions 1.3.6 and 1.4.2 respectively minimum. ### What has been done for version 1.1.5: -- Updated the [Python setuptools][54] package to version 73.0.1. +- Updated the [Python setuptools][55] package to version 73.0.1. - The extension will ask you to install the OAuth2OOo and jdbcDriverOOo extensions in versions 1.3.7 and 1.4.5 respectively minimum. - Changes to extension options that require a restart of LibreOffice will result in a message being displayed. - Support for LibreOffice version 24.8.x. @@ -260,26 +261,26 @@ It will give you access to an information system that only larges companies are ### What has been done for version 1.2.0: - The extension will ask you to install the OAuth2OOo and jdbcDriverOOo extensions in versions 1.4.0 and 1.4.6 respectively minimum. -- It is possible to build the extension archive (ie: the oxt file) with the [Apache Ant][39] utility and the [build.xml][57] script file. +- It is possible to build the extension archive (ie: the oxt file) with the [Apache Ant][40] utility and the [build.xml][58] script file. - The extension will refuse to install under OpenOffice regardless of version or LibreOffice other than 7.x or higher. - Added binaries needed for Python libraries to work on Linux and LibreOffice 24.8 (ie: Python 3.9). ### What has been done for version 1.2.1: -- Updated the [Python packaging][53] package to version 24.2. -- Updated the [Python setuptools][54] package to version 75.8.0. -- Updated the [Python six][58] package to version 1.17.0. -- Updated the [Python validators][56] package to version 0.34.0. +- Updated the [Python packaging][54] package to version 24.2. +- Updated the [Python setuptools][55] package to version 75.8.0. +- Updated the [Python six][59] package to version 1.17.0. +- Updated the [Python validators][57] package to version 0.34.0. - Support for Python version 3.13. ### What has been done for version 1.3.0: -- Updated the [Python packaging][53] package to version 25.0. +- Updated the [Python packaging][54] package to version 25.0. - Downgrade the [Python setuptools][55] package to version 75.3.2. to ensure support for Python 3.8. -- Passive registration deployment that allows for much faster installation of extensions and differentiation of registered UNO services from those provided by a Java or Python implementation. This passive registration is provided by the [LOEclipse][37] extension via [PR#152][59] and [PR#157][60]. -- Modified [LOEclipse][37] to support the new `rdb` file format produced by the `unoidl-write` compilation utility. `idl` files have been updated to support both available compilation tools: idlc and unoidl-write. -- It is now possible to build the oxt file of the mContactOOo extension only with the help of Apache Ant and a copy of the GitHub repository. The [How to build the extension][61] section has been added to the documentation. -- Implemented [PEP 570][62] in [logging][63] to support unique multiple arguments. +- Passive registration deployment that allows for much faster installation of extensions and differentiation of registered UNO services from those provided by a Java or Python implementation. This passive registration is provided by the [LOEclipse][39] extension via [PR#152][60] and [PR#157][61]. +- Modified [LOEclipse][39] to support the new `rdb` file format produced by the `unoidl-write` compilation utility. `idl` files have been updated to support both available compilation tools: idlc and unoidl-write. +- It is now possible to build the oxt file of the mContactOOo extension only with the help of Apache Ant and a copy of the GitHub repository. The [How to build the extension][62] section has been added to the documentation. +- Implemented [PEP 570][63] in [logging][64] to support unique multiple arguments. - Any errors occurring while loading the driver will be logged in the extension's log if logging has been previously enabled. This makes it easier to identify installation problems on Windows. - To ensure the correct creation of the mContactOOo database, it will be checked that the jdbcDriverOOo extension has `com.sun.star.sdb` as API level. - Requires the **jdbcDriverOOo extension at least version 1.5.0**. @@ -291,7 +292,15 @@ It will give you access to an information system that only larges companies are - Requires the **jdbcDriverOOo extension at least version 1.5.4**. - Requires the **OAuth2OOo extension at least version 1.5.2**. -### What remains to be done for version 1.3.1: +### What has been done for version 1.4.0: + +- If the jdbcDriverOOo extension works without Java instrumentation, a warning message will be displayed in the extension options. +- All modal windows now open correctly in modal mode. +- Requires the **jdbcDriverOOo extension at least version 1.6.1**. +- Requires the **OAuth2OOo extension at least version 1.6.1**. +- Has been tested under LibreOfficeDev 26.2. + +### What remains to be done for version 1.4.0: - Add new languages for internationalization... @@ -302,7 +311,7 @@ It will give you access to an information system that only larges companies are [3]: [4]: [5]: -[6]: +[6]: [7]: [8]: [9]: @@ -310,53 +319,54 @@ It will give you access to an information system that only larges companies are [11]: [12]: [13]: -[14]: -[15]: -[16]: -[17]: -[18]: -[19]: -[20]: -[21]: -[22]: -[23]: -[24]: -[25]: -[26]: -[27]: -[28]: -[29]: -[30]: -[31]: -[32]: -[33]: -[34]: -[35]: -[36]: -[37]: -[38]: -[39]: -[40]: -[41]: -[42]: -[43]: -[44]: -[45]: -[46]: -[47]: -[48]: -[49]: -[50]: -[51]: -[52]: -[53]: -[54]: -[55]: -[56]: -[57]: -[58]: -[59]: -[60]: -[61]: -[62]: -[63]: +[14]: +[15]: +[16]: +[17]: +[18]: +[19]: +[20]: +[21]: +[22]: +[23]: +[24]: +[25]: +[26]: +[27]: +[28]: +[29]: +[30]: +[31]: +[32]: +[33]: +[34]: +[35]: +[36]: +[37]: +[38]: +[39]: +[40]: +[41]: +[42]: +[43]: +[44]: +[45]: +[46]: +[47]: +[48]: +[49]: +[50]: +[51]: +[52]: +[53]: +[54]: +[55]: +[56]: +[57]: +[58]: +[59]: +[60]: +[61]: +[62]: +[63]: +[64]: diff --git a/README_fr.md b/README_fr.md index da0e9d1c..dad05f20 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] et à notre [Politique de protection des données][5].** -# version [1.3.1][6] +# version [1.4.0][6] ## Introduction: @@ -43,6 +43,7 @@ Etant un logiciel libre je vous encourage: - A dupliquer son [code source][12]. - A apporter des modifications, des corrections, des améliorations. - D'ouvrir un [dysfonctionnement][13] si nécessaire. +- De [participer au frais][14] de la [certification CASA][15]. Bref, à participer au developpement de cette extension. Car c'est ensemble que nous pouvons rendre le Logiciel Libre plus intelligent. @@ -52,10 +53,10 @@ ___ ## Prérequis: L'extension mContactOOo utilise l'extension OAuth2OOo pour fonctionner. -Elle doit donc répondre aux [prérequis de l'extension OAuth2OOo][14]. +Elle doit donc répondre aux [prérequis de l'extension OAuth2OOo][16]. L'extension mContactOOo utilise l'extension jdbcDriverOOo pour fonctionner. -Elle doit donc répondre aux [prérequis de l'extension jdbcDriverOOo][15]. +Elle doit donc répondre aux [prérequis de l'extension jdbcDriverOOo][17]. De plus, mContactOOo nécessite que l'extension jdbcDriverOOo soit configurée pour fournir `com.sun.star.sdb` comme niveau d'API, qui est la configuration par défaut. ___ @@ -65,15 +66,15 @@ ___ Il semble important que le fichier n'ait pas été renommé lors de son téléchargement. Si nécessaire, renommez-le avant de l'installer. -- [![OAuth2OOo logo][17]][18] Installer l'extension **[OAuth2OOo.oxt][19]** [![Version][20]][19] +- [![OAuth2OOo logo][18]][19] Installer l'extension **[OAuth2OOo.oxt][20]** [![Version][21]][20] Vous devez installer cette extension, si elle n'est pas déjà installée. -- [![jdbcDriverOOo logo][21]][22] Installer l'extension **[jdbcDriverOOo.oxt][23]** [![Version][24]][23] +- [![jdbcDriverOOo logo][22]][23] Installer l'extension **[jdbcDriverOOo.oxt][24]** [![Version][25]][24] Vous devez installer cette extension, si elle n'est pas déjà installée. -- ![mContactOOo logo][25] Installer l'extension **[mContactOOo.oxt][26]** [![Version][27]][26] +- ![mContactOOo logo][26] Installer l'extension **[mContactOOo.oxt][27]** [![Version][28]][27] Redémarrez LibreOffice après l'installation. **Attention, redémarrer LibreOffice peut ne pas suffire.** @@ -91,7 +92,7 @@ ___ Dans LibreOffice / OpenOffice aller à: **Fichier -> Assistants -> Source de données des adresses...** -![mContactOOo screenshot 1][28] +![mContactOOo screenshot 1][29] L'**Assistant source de données du carnet d'adresses** s'ouvre. @@ -99,12 +100,12 @@ L'**Assistant source de données du carnet d'adresses** s'ouvre. - Sélectionner: **Autre source de données externes**. - Cliquez sur le bouton: **Suivant**. -![mContactOOo screenshot 2][29] +![mContactOOo screenshot 2][30] À l'étape: **2.Paramètres de Connexion**: - Cliquez sur le bouton: **Paramètres**. -![mContactOOo screenshot 3][30] +![mContactOOo screenshot 3][31] Un nouvel assistant s'ouvre. **Propriétés de la source de données**. @@ -113,22 +114,22 @@ Dans Type de base de données: - Sélectionner: **Contacts Microsoft**. - Cliquez sur le bouton: **Suivant**. -![mContactOOo screenshot 4][31] +![mContactOOo screenshot 4][32] A l'étape: **2.Paramètres de connexion**. Dans Général: Entrer ici la chaîne de connexion spécifique au SGDB / pilote. - Mettre votre compte Microsoft (ie: votre_compte@outlook.fr) - Cliquez sur le bouton: **Tester la connexion**. -![mContactOOo screenshot 5][32] +![mContactOOo screenshot 5][33] -Après avoir autorisé l'application [OAuth2OOo][18] à accéder à vos contacts, normalement vous devez voir s'afficher: Test de connexion: Connexion établie. +Après avoir autorisé l'application [OAuth2OOo][19] à accéder à vos contacts, normalement vous devez voir s'afficher: Test de connexion: Connexion établie. -![mContactOOo screenshot 6][33] +![mContactOOo screenshot 6][34] Si la connexion a été etablie, vous pouvez terminer cet assistant avec le bouton **Terminer**. -![mContactOOo screenshot 7][34] +![mContactOOo screenshot 7][35] A l'étape: **3.Sélection de table**. Si votre source de données comporte plusieurs tables, il vous sera demandé de sélectionner la table principale. @@ -138,7 +139,7 @@ A l'étape: **4.Assignation de champ**. Si nécessaire il est possible de renommer les noms des colonnes de la source de données à l'aide du bouton: **Assignation de champ**. Veuillez poursuivre cet assistant par le bouton: **Suivant**. -![mContactOOo screenshot 8][35] +![mContactOOo screenshot 8][36] A l'étape: **5.Titre de la source de données**. @@ -150,7 +151,7 @@ Il faut également rendre accessible ce fichier odb. Pour cela vous devez: - **Cocher la case**: Rendre ce carnet d'adresses accessible à tous les modules de LibreOffice - Nommer le carnet d'adresses dans le champ: **Nom du carnet d'adresses**. -![mContactOOo screenshot 9][36] +![mContactOOo screenshot 9][37] Maintenant à vous d'en profiter... @@ -158,12 +159,12 @@ ___ ## Comment créer l'extension: -Normalement, l'extension est créée avec Eclipse pour Java et [LOEclipse][37]. Pour contourner Eclipse, j'ai modifié LOEclipse afin de permettre la création de l'extension avec Apache Ant. +Normalement, l'extension est créée avec Eclipse pour Java et [LOEclipse][38]. Pour contourner Eclipse, j'ai modifié LOEclipse afin de permettre la création de l'extension avec Apache Ant. Pour créer l'extension mContactOOo avec l'aide d'Apache Ant, vous devez: -- Installer le [SDK Java][38] version 8 ou supérieure. -- Installer [Apache Ant][39] version 1.10.0 ou supérieure. -- Installer [LibreOffice et son SDK][40] version 7.x ou supérieure. -- Cloner le dépôt [mContactOOo][41] sur GitHub dans un dossier. +- Installer le [SDK Java][39] version 8 ou supérieure. +- Installer [Apache Ant][40] version 1.10.0 ou supérieure. +- Installer [LibreOffice et son SDK][41] version 7.x ou supérieure. +- Cloner le dépôt [mContactOOo][42] sur GitHub dans un dossier. - Depuis ce dossier, accédez au répertoire: `source/mContactOOo/` - Dans ce répertoire, modifiez le fichier `build.properties` afin que les propriétés `office.install.dir` et `sdk.dir` pointent vers les dossiers d'installation de LibreOffice et de son SDK, respectivement. - Lancez la création de l'archive avec la commande: `ant` @@ -181,7 +182,7 @@ ___ * LibreOffice 24.8.0.3 (X86_64) - Windows 10(x64) - Python version 3.9.19 (sous Lubuntu 22.04 / VirtualBox 6.1.38) -* **Ne fonctionne pas avec OpenOffice sous Windows** voir [dysfonctionnement 128569][42]. N'ayant aucune solution, je vous encourrage d'installer **LibreOffice**. +* **Ne fonctionne pas avec OpenOffice sous Windows** voir [dysfonctionnement 128569][43]. N'ayant aucune solution, je vous encourrage d'installer **LibreOffice**. Je vous encourage en cas de problème :confused: de créer un [dysfonctionnement][13] @@ -195,7 +196,7 @@ ___ Cette extension a été écrite afin de rendre utilisables dans un logiciel libre (LibreOffice ou OpenOffice) vos données personnelles stockées dans votre carnet d'adresses Microsoft Outlook. -Avec l'extension [eMailerOOo][43], elle peut être la source de données pour des [publipostages][44] par courriel (email), à vos correspondants contenus dans votre carnet d'adresses Microsoft Outlook. +Avec l'extension [eMailerOOo][44], elle peut être la source de données pour des [publipostages][45] par courriel (email), à vos correspondants contenus dans votre carnet d'adresses Microsoft Outlook. Elle vous donnera accès à un système d'information que seules les grandes entreprises sont capables, aujourd'hui, de mettre en œuvre. @@ -215,10 +216,10 @@ Elle vous donnera accès à un système d'information que seules les grandes ent ### Ce qui a été fait pour la version 1.1.0: -- Tous les paquets Python nécessaires à l'extension sont désormais enregistrés dans un fichier [requirements.txt][45] suivant la [PEP 508][46]. +- Tous les paquets Python nécessaires à l'extension sont désormais enregistrés dans un fichier [requirements.txt][46] suivant la [PEP 508][47]. - Désormais si vous n'êtes pas sous Windows alors les paquets Python nécessaires à l'extension peuvent être facilement installés avec la commande: `pip install requirements.txt` -- Modification de la section [Prérequis][47]. +- Modification de la section [Prérequis][48]. ### Ce qui a été fait pour la version 1.1.1: @@ -227,27 +228,27 @@ Elle vous donnera accès à un système d'information que seules les grandes ent ### Ce qui a été fait pour la version 1.1.2: -- Intégration d'un correctif pour contourner le [dysfonctionnement #159988][48]. +- Intégration d'un correctif pour contourner le [dysfonctionnement #159988][49]. ### Ce qui a été fait pour la version 1.1.3: -- La création de la base de données, lors de la première connexion, utilise l'API UNO proposée par l'extension jdbcDriverOOo depuis la version 1.3.2. Cela permet d'enregistrer toutes les informations nécessaires à la création de la base de données dans 9 tables texte qui sont en fait [9 fichiers csv][49]. +- La création de la base de données, lors de la première connexion, utilise l'API UNO proposée par l'extension jdbcDriverOOo depuis la version 1.3.2. Cela permet d'enregistrer toutes les informations nécessaires à la création de la base de données dans 9 tables texte qui sont en fait [9 fichiers csv][50]. - L'extension vous demandera d'installer les extensions OAuth2OOo et jdbcDriverOOo en version respectivement 1.3.4 et 1.3.2 minimum. - De nombreuses corrections. ### Ce qui a été fait pour la version 1.1.4: -- Mise à jour du paquet [Python python-dateutil][50] vers la version 2.9.0.post0. -- Mise à jour du paquet [Python decorator][51] vers la version 5.1.1. -- Mise à jour du paquet [Python ijson][52] vers la version 3.3.0. -- Mise à jour du paquet [Python packaging][53] vers la version 24.1. -- Mise à jour du paquet [Python setuptools][54] vers la version 72.1.0 afin de répondre à l'[alerte de sécurité Dependabot][55]. -- Mise à jour du paquet [Python validators][56] vers la version 0.33.0. +- Mise à jour du paquet [Python python-dateutil][51] vers la version 2.9.0.post0. +- Mise à jour du paquet [Python decorator][52] vers la version 5.1.1. +- Mise à jour du paquet [Python ijson][53] vers la version 3.3.0. +- Mise à jour du paquet [Python packaging][54] vers la version 24.1. +- Mise à jour du paquet [Python setuptools][55] vers la version 72.1.0 afin de répondre à l'[alerte de sécurité Dependabot][56]. +- Mise à jour du paquet [Python validators][57] vers la version 0.33.0. - L'extension vous demandera d'installer les extensions OAuth2OOo et jdbcDriverOOo en version respectivement 1.3.6 et 1.4.2 minimum. ### Ce qui a été fait pour la version 1.1.5: -- Mise à jour du paquet [Python setuptools][54] vers la version 73.0.1. +- Mise à jour du paquet [Python setuptools][55] vers la version 73.0.1. - L'extension vous demandera d'installer les extensions OAuth2OOo et jdbcDriverOOo en version respectivement 1.3.7 et 1.4.5 minimum. - Les modifications apportées aux options de l'extension, qui nécessitent un redémarrage de LibreOffice, entraîneront l'affichage d'un message. - Support de LibreOffice version 24.8.x. @@ -260,26 +261,26 @@ Elle vous donnera accès à un système d'information que seules les grandes ent ### Ce qui a été fait pour la version 1.2.0: - L'extension vous demandera d'installer les extensions OAuth2OOo et jdbcDriverOOo en version respectivement 1.4.0 et 1.4.6 minimum. -- Il est possible de construire l'archive de l'extension (ie: le fichier oxt) avec l'utilitaire [Apache Ant][39] et le fichier script [build.xml][57]. +- Il est possible de construire l'archive de l'extension (ie: le fichier oxt) avec l'utilitaire [Apache Ant][40] et le fichier script [build.xml][58]. - L'extension refusera de s'installer sous OpenOffice quelle que soit la version ou LibreOffice autre que 7.x ou supérieur. - Ajout des fichiers binaires nécessaires aux bibliothèques Python pour fonctionner sous Linux et LibreOffice 24.8 (ie: Python 3.9). ### Ce qui a été fait pour la version 1.2.1: -- Mise à jour du paquet [Python packaging][53] vers la version 24.2. -- Mise à jour du paquet [Python setuptools][54] vers la version 75.8.0. -- Mise à jour du paquet [Python six][58] vers la version 1.17.0. -- Mise à jour du paquet [Python validators][56] vers la version 0.34.0. +- Mise à jour du paquet [Python packaging][54] vers la version 24.2. +- Mise à jour du paquet [Python setuptools][55] vers la version 75.8.0. +- Mise à jour du paquet [Python six][59] vers la version 1.17.0. +- Mise à jour du paquet [Python validators][57] vers la version 0.34.0. - Support de Python version 3.13. ### Ce qui a été fait pour la version 1.3.0: -- Mise à jour du paquet [Python packaging][53] vers la version 25.0. -- Rétrogradage du paquet [Python setuptools][54] vers la version 75.3.2, afin d'assurer la prise en charge de Python 3.8. -- Déploiement de l'enregistrement passif permettant une installation beaucoup plus rapide des extensions et de différencier les services UNO enregistrés de ceux fournis par une implémentation Java ou Python. Cet enregistrement passif est assuré par l'extension [LOEclipse][37] via les [PR#152][59] et [PR#157][60]. -- Modification de [LOEclipse][37] pour prendre en charge le nouveau format de fichier `rdb` produit par l'utilitaire de compilation `unoidl-write`. Les fichiers `idl` ont été mis à jour pour prendre en charge les deux outils de compilation disponibles: idlc et unoidl-write. -- Il est désormais possible de créer le fichier oxt de l'extension mContactOOo uniquement avec Apache Ant et une copie du dépôt GitHub. La section [Comment créer l'extension][61] a été ajoutée à la documentation. -- Implémentation de [PEP 570][62] dans la [journalisation][63] pour prendre en charge les arguments multiples uniques. +- Mise à jour du paquet [Python packaging][54] vers la version 25.0. +- Rétrogradage du paquet [Python setuptools][55] vers la version 75.3.2, afin d'assurer la prise en charge de Python 3.8. +- Déploiement de l'enregistrement passif permettant une installation beaucoup plus rapide des extensions et de différencier les services UNO enregistrés de ceux fournis par une implémentation Java ou Python. Cet enregistrement passif est assuré par l'extension [LOEclipse][38] via les [PR#152][60] et [PR#157][61]. +- Modification de [LOEclipse][38] pour prendre en charge le nouveau format de fichier `rdb` produit par l'utilitaire de compilation `unoidl-write`. Les fichiers `idl` ont été mis à jour pour prendre en charge les deux outils de compilation disponibles: idlc et unoidl-write. +- Il est désormais possible de créer le fichier oxt de l'extension mContactOOo uniquement avec Apache Ant et une copie du dépôt GitHub. La section [Comment créer l'extension][62] a été ajoutée à la documentation. +- Implémentation de [PEP 570][63] dans la [journalisation][64] pour prendre en charge les arguments multiples uniques. - Toute erreur survenant lors du chargement du pilote sera consignée dans le journal de l'extension si la journalisation a été préalablement activé. Cela facilite l'identification des problèmes d'installation sous Windows. - Pour garantir la création correcte de la base de données gContactOOo, il sera vérifié que l'extension jdbcDriverOOo a `com.sun.star.sdb` comme niveau d'API. - Nécessite l'extension **jdbcDriverOOo en version 1.5.0 minimum**. @@ -291,7 +292,15 @@ Elle vous donnera accès à un système d'information que seules les grandes ent - Nécessite l'extension **jdbcDriverOOo en version 1.5.4 minimum**. - Nécessite l'extension **OAuth2OOo en version 1.5.2 minimum**. -### Que reste-t-il à faire pour la version 1.3.1: +### Ce qui a été fait pour la version 1.4.0: + +- Si l'extension jdbcDriverOOo fonctionne sans l'instrumentation Java, un message d'avertissement s'affichera dans les options de l'extension. +- Toutes les fenêtres modales s'ouvrent désormais correctement en mode modal. +- Nécessite l'extension **jdbcDriverOOo en version 1.6.1 minimum**. +- Nécessite l'extension **OAuth2OOo en version 1.6.1 minimum**. +- A été testé sous LibreOfficeDev 26.2. + +### Que reste-t-il à faire pour la version 1.4.0: - Ajouter de nouvelles langues pour l’internationalisation... @@ -302,7 +311,7 @@ Elle vous donnera accès à un système d'information que seules les grandes ent [3]: [4]: [5]: -[6]: +[6]: [7]: [8]: [9]: @@ -310,53 +319,54 @@ Elle vous donnera accès à un système d'information que seules les grandes ent [11]: [12]: [13]: -[14]: -[15]: -[16]: -[17]: -[18]: -[19]: -[20]: -[21]: -[22]: -[23]: -[24]: -[25]: -[26]: -[27]: -[28]: -[29]: -[30]: -[31]: -[32]: -[33]: -[34]: -[35]: -[36]: -[37]: -[38]: -[39]: -[40]: -[41]: -[42]: -[43]: -[44]: -[45]: -[46]: -[47]: -[48]: -[49]: -[50]: -[51]: -[52]: -[53]: -[54]: -[55]: -[56]: -[57]: -[58]: -[59]: -[60]: -[61]: -[62]: -[63]: +[14]: +[15]: +[16]: +[17]: +[18]: +[19]: +[20]: +[21]: +[22]: +[23]: +[24]: +[25]: +[26]: +[27]: +[28]: +[29]: +[30]: +[31]: +[32]: +[33]: +[34]: +[35]: +[36]: +[37]: +[38]: +[39]: +[40]: +[41]: +[42]: +[43]: +[44]: +[45]: +[46]: +[47]: +[48]: +[49]: +[50]: +[51]: +[52]: +[53]: +[54]: +[55]: +[56]: +[57]: +[58]: +[59]: +[60]: +[61]: +[62]: +[63]: +[64]: diff --git a/source/mContactOOo/Drivers.xcu b/source/mContactOOo/Drivers.xcu index 59a1eab7..8007e5ba 100644 --- a/source/mContactOOo/Drivers.xcu +++ b/source/mContactOOo/Drivers.xcu @@ -24,11 +24,13 @@ ║ ║ ╚════════════════════════════════════════════════════════════════════════════════════╝ --> - + + xmlns:xs="http://www.w3.org/2001/XMLSchema" + oor:package="org.openoffice.Office.DataAccess" + oor:name="Drivers" > @@ -90,3 +92,4 @@ + diff --git a/source/mContactOOo/Options.xcs b/source/mContactOOo/Options.xcs index f899832d..7550f044 100644 --- a/source/mContactOOo/Options.xcs +++ b/source/mContactOOo/Options.xcs @@ -24,13 +24,16 @@ ║ ║ ╚════════════════════════════════════════════════════════════════════════════════════╝ --> - + + oor:package="io.github.prrvchr" + oor:name="mContactOOo" + xml:lang="en-US"> + diff --git a/source/mContactOOo/Options.xcu b/source/mContactOOo/Options.xcu index 85544eba..7ce86906 100644 --- a/source/mContactOOo/Options.xcu +++ b/source/mContactOOo/Options.xcu @@ -24,11 +24,13 @@ ║ ║ ╚════════════════════════════════════════════════════════════════════════════════════╝ --> - + + xmlns:xs="http://www.w3.org/2001/XMLSchema" + oor:package="io.github.prrvchr" + oor:name="mContactOOo"> All my contacts Tous mes contacts @@ -37,3 +39,4 @@ 600 + diff --git a/source/mContactOOo/OptionsDialog.xcu b/source/mContactOOo/OptionsDialog.xcu index 544ad533..2a0f1d17 100644 --- a/source/mContactOOo/OptionsDialog.xcu +++ b/source/mContactOOo/OptionsDialog.xcu @@ -24,11 +24,13 @@ ║ ║ ╚════════════════════════════════════════════════════════════════════════════════════╝ --> - + + xmlns:xs="http://www.w3.org/2001/XMLSchema" + oor:package="org.openoffice.Office" + oor:name="OptionsDialog"> @@ -58,3 +60,4 @@ + diff --git a/source/mContactOOo/component-schema.dtd b/source/mContactOOo/component-schema.dtd new file mode 120000 index 00000000..8bd8f795 --- /dev/null +++ b/source/mContactOOo/component-schema.dtd @@ -0,0 +1 @@ +../../uno/lib/uno/component-schema.dtd \ No newline at end of file diff --git a/source/mContactOOo/component-update.dtd b/source/mContactOOo/component-update.dtd new file mode 120000 index 00000000..90c5befb --- /dev/null +++ b/source/mContactOOo/component-update.dtd @@ -0,0 +1 @@ +../../uno/lib/uno/component-update.dtd \ No newline at end of file diff --git a/source/mContactOOo/description.xml b/source/mContactOOo/description.xml index c26c4e14..b1bb43e0 100644 --- a/source/mContactOOo/description.xml +++ b/source/mContactOOo/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/mContactOOo/dialogs/OptionDialog.xdl b/source/mContactOOo/dialogs/OptionDialog.xdl new file mode 120000 index 00000000..b159b219 --- /dev/null +++ b/source/mContactOOo/dialogs/OptionDialog.xdl @@ -0,0 +1 @@ +../../../uno/dialog/card/OptionDialog.xdl \ No newline at end of file diff --git a/uno/dialog/ucb/DialogStrings_en_US.default b/source/mContactOOo/dialogs/OptionDialog_en_US.default similarity index 100% rename from uno/dialog/ucb/DialogStrings_en_US.default rename to source/mContactOOo/dialogs/OptionDialog_en_US.default diff --git a/source/mContactOOo/dialogs/OptionDialog_en_US.properties b/source/mContactOOo/dialogs/OptionDialog_en_US.properties new file mode 100644 index 00000000..e2c1b3a9 --- /dev/null +++ b/source/mContactOOo/dialogs/OptionDialog_en_US.properties @@ -0,0 +1,16 @@ +OptionDialog.HelpText= +OptionDialog.Title= +OptionDialog.FixedLine1.HelpText= +OptionDialog.FixedLine1.Label=mContactOOo settings +OptionDialog.Label1.HelpText= +OptionDialog.Label1.Label=Replication interval: +OptionDialog.NumericField1.HelpText=Replication interval in minutes +OptionDialog.Label2.HelpText= +OptionDialog.Label2.Label=View datasource: +OptionDialog.CommandButton1.HelpText= +OptionDialog.CommandButton1.Label=View DataBase +OptionDialog.Label3.HelpText= +OptionDialog.Label3.Label=Main table name: +OptionDialog.TextField1.HelpText=The name of the main table in your address book +OptionDialog.TextField1.Text= + diff --git a/source/mContactOOo/dialogs/OptionDialog_fr_FR.properties b/source/mContactOOo/dialogs/OptionDialog_fr_FR.properties new file mode 100644 index 00000000..17264bbb --- /dev/null +++ b/source/mContactOOo/dialogs/OptionDialog_fr_FR.properties @@ -0,0 +1,16 @@ +OptionDialog.HelpText= +OptionDialog.Title= +OptionDialog.FixedLine1.HelpText= +OptionDialog.FixedLine1.Label=Options mContactOOo +OptionDialog.Label1.HelpText= +OptionDialog.Label1.Label=Intervalle de r\u00e9plication: +OptionDialog.NumericField1.HelpText=Intervalle de r\u00e9plication en minutes +OptionDialog.Label2.HelpText= +OptionDialog.Label2.Label=Voir la source de donn\u00e9es: +OptionDialog.CommandButton1.HelpText= +OptionDialog.CommandButton1.Label=Voir la base de donn\u00e9es +OptionDialog.Label3.HelpText= +OptionDialog.Label3.Label=Nom de la table principale: +OptionDialog.TextField1.HelpText=Le nom de la table principale dans votre carnet d'adresses +OptionDialog.TextField1.Text= + diff --git a/source/mContactOOo/dialogs/OptionsDialog_en_US.default b/source/mContactOOo/dialogs/OptionsDialog_en_US.default deleted file mode 100644 index e69de29b..00000000 diff --git a/source/mContactOOo/dialogs/OptionsDialog_en_US.default b/source/mContactOOo/dialogs/OptionsDialog_en_US.default new file mode 120000 index 00000000..c39a800a --- /dev/null +++ b/source/mContactOOo/dialogs/OptionsDialog_en_US.default @@ -0,0 +1 @@ +../../../uno/dialog/card/OptionsDialog_en_US.default \ No newline at end of file diff --git a/source/mContactOOo/dialogs/OptionsDialog_en_US.properties b/source/mContactOOo/dialogs/OptionsDialog_en_US.properties deleted file mode 100644 index 10500fc3..00000000 --- a/source/mContactOOo/dialogs/OptionsDialog_en_US.properties +++ /dev/null @@ -1,17 +0,0 @@ -OptionsDialog.HelpText= -OptionsDialog.Title= -OptionsDialog.FixedLine1.HelpText= -OptionsDialog.FixedLine1.Label=mContactOOo 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 -OptionsDialog.Label3.HelpText= -OptionsDialog.Label3.Label=Main table name: -OptionsDialog.TextField1.HelpText=The name of the main table in your address book -OptionsDialog.TextField1.Label= -OptionsDialog.Label4.HelpText= -OptionsDialog.Label4.Label=The changes will take effect after restarting LibreOffice... diff --git a/source/mContactOOo/dialogs/OptionsDialog_en_US.properties b/source/mContactOOo/dialogs/OptionsDialog_en_US.properties new file mode 120000 index 00000000..815cf463 --- /dev/null +++ b/source/mContactOOo/dialogs/OptionsDialog_en_US.properties @@ -0,0 +1 @@ +../../../uno/dialog/card/OptionsDialog_en_US.properties \ No newline at end of file diff --git a/source/mContactOOo/dialogs/OptionsDialog_fr_FR.properties b/source/mContactOOo/dialogs/OptionsDialog_fr_FR.properties deleted file mode 100644 index 806f0e06..00000000 --- a/source/mContactOOo/dialogs/OptionsDialog_fr_FR.properties +++ /dev/null @@ -1,17 +0,0 @@ -OptionsDialog.HelpText= -OptionsDialog.Title= -OptionsDialog.FixedLine1.HelpText= -OptionsDialog.FixedLine1.Label=Options mContactOOo -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 -OptionsDialog.Label3.HelpText= -OptionsDialog.Label3.Label=Nom de la table principale: -OptionsDialog.TextField1.HelpText=Le nom de la table principale dans votre carnet d'adresses -OptionsDialog.TextField1.Label= -OptionsDialog.Label4.HelpText= -OptionsDialog.Label4.Label=Les modifications prendront effet apr\u00e8s le red\u00e9marrage de LibreOffice... diff --git a/source/mContactOOo/dialogs/OptionsDialog_fr_FR.properties b/source/mContactOOo/dialogs/OptionsDialog_fr_FR.properties new file mode 120000 index 00000000..1b5c1b2f --- /dev/null +++ b/source/mContactOOo/dialogs/OptionsDialog_fr_FR.properties @@ -0,0 +1 @@ +../../../uno/dialog/card/OptionsDialog_fr_FR.properties \ No newline at end of file diff --git a/source/mContactOOo/dialogs/dialog.dtd b/source/mContactOOo/dialogs/dialog.dtd new file mode 120000 index 00000000..aee03339 --- /dev/null +++ b/source/mContactOOo/dialogs/dialog.dtd @@ -0,0 +1 @@ +../../../uno/dialog/dialog.dtd \ No newline at end of file diff --git a/source/mContactOOo/idl/com/sun/star/task/XTaskEvent.idl b/source/mContactOOo/idl/com/sun/star/task/XTaskEvent.idl new file mode 120000 index 00000000..04f9701c --- /dev/null +++ b/source/mContactOOo/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/mContactOOo/package.properties b/source/mContactOOo/package.properties index e4dd5c41..7c2540b5 100644 --- a/source/mContactOOo/package.properties +++ b/source/mContactOOo/package.properties @@ -1,3 +1,3 @@ #Written by the OOEclipseIntegration -#Wed Jul 30 19:55:59 CEST 2025 -contents=description.xml, description/description_en.txt, description/description_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/OptionsDialog.xdl, dialogs/OptionsDialog_en_US.default, dialogs/OptionsDialog_en_US.properties, dialogs/OptionsDialog_fr_FR.properties, Drivers.xcu, hsqldb/Columns.csv, hsqldb/ForeignKeys.csv, hsqldb/Indexes.csv, hsqldb/Properties.csv, hsqldb/PropertyType.csv, hsqldb/Resources.csv, hsqldb/TableColumn.csv, hsqldb/Tables.csv, hsqldb/Types.csv, img/mContactOOo.svg, META-INF/manifest.xml, Options.xcs, Options.xcu, OptionsDialog.xcu, package.components, registration/PrivacyPolicy_en.md, registration/PrivacyPolicy_fr.md, registration/TermsOfUse_en.md, registration/TermsOfUse_fr.md, requirements.txt, resource/dbqueries_en_US.default, resource/dbqueries_en_US.properties, resource/dbqueries_fr_FR.properties, resource/dbtool_en_US.default, resource/dbtool_en_US.properties, resource/dbtool_fr_FR.properties, 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, resource/Replicator_en_US.default, resource/Replicator_en_US.properties, resource/Replicator_fr_FR.properties, service/Driver.py, service/mContactOOo.py, service/OptionsHandler.py, service/pythonpath/_distutils_hack/__init__.py, service/pythonpath/_distutils_hack/override.py, service/pythonpath/dateutil/__init__.py, service/pythonpath/dateutil/_common.py, service/pythonpath/dateutil/_version.py, service/pythonpath/dateutil/easter.py, service/pythonpath/dateutil/parser/__init__.py, service/pythonpath/dateutil/parser/_parser.py, service/pythonpath/dateutil/parser/isoparser.py, service/pythonpath/dateutil/relativedelta.py, service/pythonpath/dateutil/rrule.py, service/pythonpath/dateutil/tz/__init__.py, service/pythonpath/dateutil/tz/_common.py, service/pythonpath/dateutil/tz/_factories.py, service/pythonpath/dateutil/tz/tz.py, service/pythonpath/dateutil/tz/win.py, service/pythonpath/dateutil/tzwin.py, service/pythonpath/dateutil/utils.py, service/pythonpath/dateutil/zoneinfo/__init__.py, service/pythonpath/dateutil/zoneinfo/dateutil-zoneinfo.tar.gz, service/pythonpath/dateutil/zoneinfo/rebuild.py, service/pythonpath/decorator-5.1.1.dist-info/LICENSE.txt, service/pythonpath/decorator-5.1.1.dist-info/METADATA, service/pythonpath/decorator-5.1.1.dist-info/pbr.json, service/pythonpath/decorator-5.1.1.dist-info/RECORD, service/pythonpath/decorator-5.1.1.dist-info/top_level.txt, service/pythonpath/decorator-5.1.1.dist-info/WHEEL, service/pythonpath/decorator.py, service/pythonpath/distutils-precedence.pth, service/pythonpath/ijson-3.3.0.dist-info/LICENSE.txt, service/pythonpath/ijson-3.3.0.dist-info/METADATA, service/pythonpath/ijson-3.3.0.dist-info/RECORD, service/pythonpath/ijson-3.3.0.dist-info/top_level.txt, service/pythonpath/ijson-3.3.0.dist-info/WHEEL, service/pythonpath/ijson/__init__.py, service/pythonpath/ijson/backends/__init__.py, service/pythonpath/ijson/backends/_yajl2.cp310-win_amd64.pyd, service/pythonpath/ijson/backends/_yajl2.cp311-win_amd64.pyd, service/pythonpath/ijson/backends/_yajl2.cp38-win32.pyd, service/pythonpath/ijson/backends/_yajl2.cp38-win_amd64.pyd, service/pythonpath/ijson/backends/_yajl2.cp39-win32.pyd, service/pythonpath/ijson/backends/_yajl2.cp39-win_amd64.pyd, service/pythonpath/ijson/backends/_yajl2.cpython-3.8.so, service/pythonpath/ijson/backends/_yajl2.cpython-3.9.so, service/pythonpath/ijson/backends/_yajl2.cpython-310-x86_64-linux-gnu.so, service/pythonpath/ijson/backends/_yajl2.cpython-311-x86_64-linux-gnu.so, service/pythonpath/ijson/backends/_yajl2.cpython-312-x86_64-linux-gnu.so, service/pythonpath/ijson/backends/_yajl2.cpython-313-x86_64-linux-gnu.so, service/pythonpath/ijson/backends/_yajl2.cpython-38-x86_64-linux-gnu.so, service/pythonpath/ijson/backends/_yajl2.cpython-39-x86_64-linux-gnu.so, service/pythonpath/ijson/backends/_yajl2_ctypes_common.py, service/pythonpath/ijson/backends/python.py, service/pythonpath/ijson/backends/yajl.py, service/pythonpath/ijson/backends/yajl2.py, service/pythonpath/ijson/backends/yajl2_c.py, service/pythonpath/ijson/backends/yajl2_cffi.py, service/pythonpath/ijson/benchmark.py, service/pythonpath/ijson/common.py, service/pythonpath/ijson/compat.py, service/pythonpath/ijson/dump.py, service/pythonpath/ijson/utils.py, service/pythonpath/ijson/utils35.py, service/pythonpath/ijson/version.py, service/pythonpath/mcontact/__init__.py, service/pythonpath/mcontact/card/__init__.py, service/pythonpath/mcontact/card/book.py, service/pythonpath/mcontact/card/database.py, service/pythonpath/mcontact/card/group.py, service/pythonpath/mcontact/card/listener.py, service/pythonpath/mcontact/card/provider.py, service/pythonpath/mcontact/card/replicator.py, service/pythonpath/mcontact/card/user.py, service/pythonpath/mcontact/configuration.py, service/pythonpath/mcontact/database.py, service/pythonpath/mcontact/datasource.py, service/pythonpath/mcontact/dbconfig.py, service/pythonpath/mcontact/dbinit.py, service/pythonpath/mcontact/dbqueries.py, service/pythonpath/mcontact/dbtool/__init__.py, service/pythonpath/mcontact/dbtool/array.py, service/pythonpath/mcontact/dbtool/dbinit.py, service/pythonpath/mcontact/dbtool/dbtool.py, service/pythonpath/mcontact/dbtool/object.py, service/pythonpath/mcontact/driver.py, service/pythonpath/mcontact/helper.py, service/pythonpath/mcontact/jdbcdriver/__init__.py, service/pythonpath/mcontact/jdbcdriver/configuration.py, service/pythonpath/mcontact/logger/__init__.py, service/pythonpath/mcontact/logger/dialog/__init__.py, service/pythonpath/mcontact/logger/dialog/loghandler.py, service/pythonpath/mcontact/logger/dialog/logmanager.py, service/pythonpath/mcontact/logger/dialog/logmodel.py, service/pythonpath/mcontact/logger/dialog/logview.py, service/pythonpath/mcontact/logger/logconfig.py, service/pythonpath/mcontact/logger/logcontroller.py, service/pythonpath/mcontact/logger/logger.py, service/pythonpath/mcontact/logger/loggerpool.py, service/pythonpath/mcontact/logger/loghandler.py, service/pythonpath/mcontact/logger/loghelper.py, service/pythonpath/mcontact/logger/logwrapper.py, service/pythonpath/mcontact/oauth20/__init__.py, service/pythonpath/mcontact/oauth20/configuration.py, service/pythonpath/mcontact/oauth20/oauth2core.py, service/pythonpath/mcontact/oauth20/oauth2lib.py, service/pythonpath/mcontact/oauth20/oauth2tool.py, service/pythonpath/mcontact/options/__init__.py, service/pythonpath/mcontact/options/optionsmanager.py, service/pythonpath/mcontact/options/optionsmodel.py, service/pythonpath/mcontact/options/optionsview.py, service/pythonpath/mcontact/provider.py, service/pythonpath/mcontact/unotool/__init__.py, service/pythonpath/mcontact/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/python_dateutil-2.9.0.post0.dist-info/LICENSE, service/pythonpath/python_dateutil-2.9.0.post0.dist-info/METADATA, service/pythonpath/python_dateutil-2.9.0.post0.dist-info/RECORD, service/pythonpath/python_dateutil-2.9.0.post0.dist-info/top_level.txt, service/pythonpath/python_dateutil-2.9.0.post0.dist-info/WHEEL, service/pythonpath/python_dateutil-2.9.0.post0.dist-info/zip-safe, 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, service/pythonpath/validators-0.34.0.dist-info/LICENSE.txt, service/pythonpath/validators-0.34.0.dist-info/METADATA, service/pythonpath/validators-0.34.0.dist-info/RECORD, service/pythonpath/validators-0.34.0.dist-info/top_level.txt, service/pythonpath/validators-0.34.0.dist-info/WHEEL, service/pythonpath/validators/__init__.py, service/pythonpath/validators/_extremes.py, service/pythonpath/validators/_tld.txt, service/pythonpath/validators/between.py, service/pythonpath/validators/card.py, service/pythonpath/validators/country.py, service/pythonpath/validators/cron.py, service/pythonpath/validators/crypto_addresses/__init__.py, service/pythonpath/validators/crypto_addresses/bsc_address.py, service/pythonpath/validators/crypto_addresses/btc_address.py, service/pythonpath/validators/crypto_addresses/eth_address.py, service/pythonpath/validators/crypto_addresses/trx_address.py, service/pythonpath/validators/domain.py, service/pythonpath/validators/email.py, service/pythonpath/validators/encoding.py, service/pythonpath/validators/finance.py, service/pythonpath/validators/hashes.py, service/pythonpath/validators/hostname.py, service/pythonpath/validators/i18n/__init__.py, service/pythonpath/validators/i18n/es.py, service/pythonpath/validators/i18n/fi.py, service/pythonpath/validators/i18n/fr.py, service/pythonpath/validators/i18n/ind.py, service/pythonpath/validators/iban.py, service/pythonpath/validators/ip_address.py, service/pythonpath/validators/length.py, service/pythonpath/validators/mac_address.py, service/pythonpath/validators/py.typed, service/pythonpath/validators/slug.py, service/pythonpath/validators/uri.py, service/pythonpath/validators/url.py, service/pythonpath/validators/utils.py, service/pythonpath/validators/uuid.py +#Tue Oct 14 12:36:04 CEST 2025 +contents=component-schema.dtd, component-update.dtd, description.xml, description/description_en.txt, description/description_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, hsqldb/Columns.csv, hsqldb/ForeignKeys.csv, hsqldb/Indexes.csv, hsqldb/Properties.csv, hsqldb/PropertyType.csv, hsqldb/Resources.csv, hsqldb/TableColumn.csv, hsqldb/Tables.csv, hsqldb/Types.csv, img/mContactOOo.svg, META-INF/manifest.xml, Options.xcs, Options.xcu, OptionsDialog.xcu, package.components, registration/PrivacyPolicy_en.md, registration/PrivacyPolicy_fr.md, registration/TermsOfUse_en.md, registration/TermsOfUse_fr.md, requirements.txt, resource/dbqueries_en_US.default, resource/dbqueries_en_US.properties, resource/dbqueries_fr_FR.properties, resource/dbtool_en_US.default, resource/dbtool_en_US.properties, resource/dbtool_fr_FR.properties, 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, resource/Replicator_en_US.default, resource/Replicator_en_US.properties, resource/Replicator_fr_FR.properties, service/Driver.py, service/mContactOOo.py, service/OptionsHandler.py, service/pythonpath/_distutils_hack/__init__.py, service/pythonpath/_distutils_hack/override.py, service/pythonpath/dateutil/__init__.py, service/pythonpath/dateutil/_common.py, service/pythonpath/dateutil/_version.py, service/pythonpath/dateutil/easter.py, service/pythonpath/dateutil/parser/__init__.py, service/pythonpath/dateutil/parser/_parser.py, service/pythonpath/dateutil/parser/isoparser.py, service/pythonpath/dateutil/relativedelta.py, service/pythonpath/dateutil/rrule.py, service/pythonpath/dateutil/tz/__init__.py, service/pythonpath/dateutil/tz/_common.py, service/pythonpath/dateutil/tz/_factories.py, service/pythonpath/dateutil/tz/tz.py, service/pythonpath/dateutil/tz/win.py, service/pythonpath/dateutil/tzwin.py, service/pythonpath/dateutil/utils.py, service/pythonpath/dateutil/zoneinfo/__init__.py, service/pythonpath/dateutil/zoneinfo/dateutil-zoneinfo.tar.gz, service/pythonpath/dateutil/zoneinfo/rebuild.py, service/pythonpath/decorator-5.1.1.dist-info/LICENSE.txt, service/pythonpath/decorator-5.1.1.dist-info/METADATA, service/pythonpath/decorator-5.1.1.dist-info/pbr.json, service/pythonpath/decorator-5.1.1.dist-info/RECORD, service/pythonpath/decorator-5.1.1.dist-info/top_level.txt, service/pythonpath/decorator-5.1.1.dist-info/WHEEL, service/pythonpath/decorator.py, service/pythonpath/distutils-precedence.pth, service/pythonpath/ijson-3.3.0.dist-info/LICENSE.txt, service/pythonpath/ijson-3.3.0.dist-info/METADATA, service/pythonpath/ijson-3.3.0.dist-info/RECORD, service/pythonpath/ijson-3.3.0.dist-info/top_level.txt, service/pythonpath/ijson-3.3.0.dist-info/WHEEL, service/pythonpath/ijson/__init__.py, service/pythonpath/ijson/backends/__init__.py, service/pythonpath/ijson/backends/_yajl2.cp310-win_amd64.pyd, service/pythonpath/ijson/backends/_yajl2.cp311-win_amd64.pyd, service/pythonpath/ijson/backends/_yajl2.cp38-win32.pyd, service/pythonpath/ijson/backends/_yajl2.cp38-win_amd64.pyd, service/pythonpath/ijson/backends/_yajl2.cp39-win32.pyd, service/pythonpath/ijson/backends/_yajl2.cp39-win_amd64.pyd, service/pythonpath/ijson/backends/_yajl2.cpython-3.8.so, service/pythonpath/ijson/backends/_yajl2.cpython-3.9.so, service/pythonpath/ijson/backends/_yajl2.cpython-310-x86_64-linux-gnu.so, service/pythonpath/ijson/backends/_yajl2.cpython-311-x86_64-linux-gnu.so, service/pythonpath/ijson/backends/_yajl2.cpython-312-x86_64-linux-gnu.so, service/pythonpath/ijson/backends/_yajl2.cpython-313-x86_64-linux-gnu.so, service/pythonpath/ijson/backends/_yajl2.cpython-38-x86_64-linux-gnu.so, service/pythonpath/ijson/backends/_yajl2.cpython-39-x86_64-linux-gnu.so, service/pythonpath/ijson/backends/_yajl2_ctypes_common.py, service/pythonpath/ijson/backends/python.py, service/pythonpath/ijson/backends/yajl.py, service/pythonpath/ijson/backends/yajl2.py, service/pythonpath/ijson/backends/yajl2_c.py, service/pythonpath/ijson/backends/yajl2_cffi.py, service/pythonpath/ijson/benchmark.py, service/pythonpath/ijson/common.py, service/pythonpath/ijson/compat.py, service/pythonpath/ijson/dump.py, service/pythonpath/ijson/utils.py, service/pythonpath/ijson/utils35.py, service/pythonpath/ijson/version.py, service/pythonpath/mcontact/__init__.py, service/pythonpath/mcontact/card/__init__.py, service/pythonpath/mcontact/card/book.py, service/pythonpath/mcontact/card/database.py, service/pythonpath/mcontact/card/group.py, service/pythonpath/mcontact/card/listener.py, service/pythonpath/mcontact/card/provider.py, service/pythonpath/mcontact/card/replicator.py, service/pythonpath/mcontact/card/user.py, service/pythonpath/mcontact/configuration.py, service/pythonpath/mcontact/database.py, service/pythonpath/mcontact/datasource.py, service/pythonpath/mcontact/dbconfig.py, service/pythonpath/mcontact/dbinit.py, service/pythonpath/mcontact/dbqueries.py, service/pythonpath/mcontact/dbtool/__init__.py, service/pythonpath/mcontact/dbtool/array.py, service/pythonpath/mcontact/dbtool/dbinit.py, service/pythonpath/mcontact/dbtool/dbtool.py, service/pythonpath/mcontact/dbtool/object.py, service/pythonpath/mcontact/driver.py, service/pythonpath/mcontact/helper.py, service/pythonpath/mcontact/jdbcdriver/__init__.py, service/pythonpath/mcontact/jdbcdriver/configuration.py, service/pythonpath/mcontact/jdbcdriver/jdbctool.py, service/pythonpath/mcontact/logger/__init__.py, service/pythonpath/mcontact/logger/dialog/__init__.py, service/pythonpath/mcontact/logger/dialog/loghandler.py, service/pythonpath/mcontact/logger/dialog/logmanager.py, service/pythonpath/mcontact/logger/dialog/logmodel.py, service/pythonpath/mcontact/logger/dialog/logview.py, service/pythonpath/mcontact/logger/logconfig.py, service/pythonpath/mcontact/logger/logcontroller.py, service/pythonpath/mcontact/logger/logger.py, service/pythonpath/mcontact/logger/loggerpool.py, service/pythonpath/mcontact/logger/loghandler.py, service/pythonpath/mcontact/logger/loghelper.py, service/pythonpath/mcontact/logger/logwrapper.py, service/pythonpath/mcontact/oauth20/__init__.py, service/pythonpath/mcontact/oauth20/configuration.py, service/pythonpath/mcontact/oauth20/oauth2core.py, service/pythonpath/mcontact/oauth20/oauth2lib.py, service/pythonpath/mcontact/oauth20/oauth2tool.py, service/pythonpath/mcontact/options/__init__.py, service/pythonpath/mcontact/options/options/__init__.py, service/pythonpath/mcontact/options/options/optionshandler.py, service/pythonpath/mcontact/options/options/optionsmanager.py, service/pythonpath/mcontact/options/options/optionsmodel.py, service/pythonpath/mcontact/options/options/optionsview.py, service/pythonpath/mcontact/options/optionsmanager.py, service/pythonpath/mcontact/options/optionsmodel.py, service/pythonpath/mcontact/options/optionsview.py, service/pythonpath/mcontact/provider.py, service/pythonpath/mcontact/unotool/__init__.py, service/pythonpath/mcontact/unotool/statusindicator.py, service/pythonpath/mcontact/unotool/taskevent.py, service/pythonpath/mcontact/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/python_dateutil-2.9.0.post0.dist-info/LICENSE, service/pythonpath/python_dateutil-2.9.0.post0.dist-info/METADATA, service/pythonpath/python_dateutil-2.9.0.post0.dist-info/RECORD, service/pythonpath/python_dateutil-2.9.0.post0.dist-info/top_level.txt, service/pythonpath/python_dateutil-2.9.0.post0.dist-info/WHEEL, service/pythonpath/python_dateutil-2.9.0.post0.dist-info/zip-safe, 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, service/pythonpath/validators-0.34.0.dist-info/LICENSE.txt, service/pythonpath/validators-0.34.0.dist-info/METADATA, service/pythonpath/validators-0.34.0.dist-info/RECORD, service/pythonpath/validators-0.34.0.dist-info/top_level.txt, service/pythonpath/validators-0.34.0.dist-info/WHEEL, service/pythonpath/validators/__init__.py, service/pythonpath/validators/_extremes.py, service/pythonpath/validators/_tld.txt, service/pythonpath/validators/between.py, service/pythonpath/validators/card.py, service/pythonpath/validators/country.py, service/pythonpath/validators/cron.py, service/pythonpath/validators/crypto_addresses/__init__.py, service/pythonpath/validators/crypto_addresses/bsc_address.py, service/pythonpath/validators/crypto_addresses/btc_address.py, service/pythonpath/validators/crypto_addresses/eth_address.py, service/pythonpath/validators/crypto_addresses/trx_address.py, service/pythonpath/validators/domain.py, service/pythonpath/validators/email.py, service/pythonpath/validators/encoding.py, service/pythonpath/validators/finance.py, service/pythonpath/validators/hashes.py, service/pythonpath/validators/hostname.py, service/pythonpath/validators/i18n/__init__.py, service/pythonpath/validators/i18n/es.py, service/pythonpath/validators/i18n/fi.py, service/pythonpath/validators/i18n/fr.py, service/pythonpath/validators/i18n/ind.py, service/pythonpath/validators/iban.py, service/pythonpath/validators/ip_address.py, service/pythonpath/validators/length.py, service/pythonpath/validators/mac_address.py, service/pythonpath/validators/py.typed, service/pythonpath/validators/slug.py, service/pythonpath/validators/uri.py, service/pythonpath/validators/url.py, service/pythonpath/validators/utils.py, service/pythonpath/validators/uuid.py diff --git a/source/mContactOOo/service/OptionsHandler.py b/source/mContactOOo/service/OptionsHandler.py index 306af6d3..824c1098 100644 --- a/source/mContactOOo/service/OptionsHandler.py +++ b/source/mContactOOo/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()', 201, e, traceback.format_exc()) def getSupportedMethodNames(self): diff --git a/source/mContactOOo/service/pythonpath/mcontact/options b/source/mContactOOo/service/pythonpath/mcontact/options deleted file mode 120000 index 43dfb140..00000000 --- a/source/mContactOOo/service/pythonpath/mcontact/options +++ /dev/null @@ -1 +0,0 @@ -../../../../../uno/lib/uno/options/addressbook \ No newline at end of file diff --git a/source/mContactOOo/service/pythonpath/mcontact/options/__init__.py b/source/mContactOOo/service/pythonpath/mcontact/options/__init__.py new file mode 100644 index 00000000..f6f7a27b --- /dev/null +++ b/source/mContactOOo/service/pythonpath/mcontact/options/__init__.py @@ -0,0 +1,31 @@ +#! +# -*- 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 .optionsmanager import OptionsManager + diff --git a/source/mContactOOo/service/pythonpath/mcontact/options/options b/source/mContactOOo/service/pythonpath/mcontact/options/options new file mode 120000 index 00000000..77102fc4 --- /dev/null +++ b/source/mContactOOo/service/pythonpath/mcontact/options/options @@ -0,0 +1 @@ +../../../../../../uno/lib/uno/options/addressbook \ No newline at end of file diff --git a/source/mContactOOo/service/pythonpath/mcontact/options/optionsmanager.py b/source/mContactOOo/service/pythonpath/mcontact/options/optionsmanager.py new file mode 100644 index 00000000..432abdb6 --- /dev/null +++ b/source/mContactOOo/service/pythonpath/mcontact/options/optionsmanager.py @@ -0,0 +1,61 @@ +#! +# -*- 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 com.sun.star.logging.LogLevel import SEVERE + +from .optionsmodel import OptionsModel + +from .optionsview import OptionsView + +from .options import OptionsManager as Manager + +from ..unotool import executeDispatch + +from ..configuration import g_extension + +import traceback + + +class OptionsManager(): + def __init__(self, ctx, logger, window): + self._model = OptionsModel(ctx) + self._view = OptionsView(window, OptionsManager._restart, *self._model.getViewData()) + self._manager = Manager(ctx, logger, window) + self._logger = logger + + _restart = False + + def saveSetting(self): + if self._manager.saveSetting(): + OptionsManager._restart = True + self._view.setWarning(True, self._model.isInstrumented()) + + def loadSetting(self): + self._manager.loadSetting() + diff --git a/source/mContactOOo/service/pythonpath/mcontact/options/optionsmodel.py b/source/mContactOOo/service/pythonpath/mcontact/options/optionsmodel.py new file mode 100644 index 00000000..acbdf2b0 --- /dev/null +++ b/source/mContactOOo/service/pythonpath/mcontact/options/optionsmodel.py @@ -0,0 +1,52 @@ +#! +# -*- 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 ..jdbcdriver import isInstrumented + +from ..unotool import getStringResource + +from ..configuration import g_identifier + + +import traceback + + +class OptionsModel(): + def __init__(self, ctx): + self._instrumented = isInstrumented(ctx, 'xdbc:jdbc') + resolver = getStringResource(ctx, g_identifier, 'dialogs', 'OptionsDialog') + self._url = resolver.resolveString('OptionsDialog.Hyperlink1.Url') + +# OptionsModel getter methods + def isInstrumented(self): + return self._instrumented + + def getViewData(self): + return self._url, self._instrumented + diff --git a/source/mContactOOo/service/pythonpath/mcontact/options/optionsview.py b/source/mContactOOo/service/pythonpath/mcontact/options/optionsview.py new file mode 100644 index 00000000..5fbcd589 --- /dev/null +++ b/source/mContactOOo/service/pythonpath/mcontact/options/optionsview.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 traceback + + +class OptionsView(): + def __init__(self, window, restart, url, instrumented): + self._window = window + control = self._getWarning() + control.URL = url + self._setWarning(control, restart, instrumented) + + def setWarning(self, restart, instrumented): + self._setWarning(self._getWarning(), restart, instrumented) + +# 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) + +# OptionsView private control methods + def _getRestart(self): + return self._window.getControl('Label1') + + def _getWarning(self): + return self._window.getControl('Hyperlink1') + diff --git a/source/mContactOOo/types.rdb b/source/mContactOOo/types.rdb index 83bd1b17..b402cd4b 100644 Binary files a/source/mContactOOo/types.rdb and b/source/mContactOOo/types.rdb differ diff --git a/uno/.gitrepo b/uno/.gitrepo index b0ad36f0..591582ff 100644 --- a/uno/.gitrepo +++ b/uno/.gitrepo @@ -6,7 +6,7 @@ [subrepo] remote = https://github.com/prrvchr/uno.git branch = main - commit = 66e9aea6994add573be9c1556b90c87449543a11 - parent = 6eb3a75f67d0582ac4de866237290bc793e4a4a8 + commit = c1a100b6f093ceef9aef387d4e88660e70568d3f + parent = 284d4ab80f3f3341a542210d2f664d5bbd99bcbc 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/card/OptionsDialog_en_US.default b/uno/dialog/card/OptionsDialog_en_US.default new file mode 100644 index 00000000..e69de29b 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