pax_global_header00006660000000000000000000000064144600756760014531gustar00rootroot0000000000000052 comment=95a633ae20144bf2fda428f89f169d7c29c02cc3 lomiri-url-dispatcher-0.1.3/000077500000000000000000000000001446007567600157515ustar00rootroot00000000000000lomiri-url-dispatcher-0.1.3/.gitignore000066400000000000000000000000571446007567600177430ustar00rootroot00000000000000build .settings .project .cproject __pycache__ lomiri-url-dispatcher-0.1.3/AUTHORS000066400000000000000000000011301446007567600170140ustar00rootroot00000000000000Alfred Neumayer Allan Nordhøy Andreas Pokorny Andres Salomon Brendan Donegan Charles Kerr Dan Dan Chapman Florian Boucault Gallegonovato Gnu-ewm Guido Berhoerster Hatato Heimen Stoffels Hosted Weblate Ivan Semkin Ivo Xavier Jami Kettunen Jesse Pullinen J Lavoie Jozef Mlich Jussi Pakkanen Ken VanDine Larry Price Leo Arias Luca Weiss Łukasz 'sil2100' Zemczak Luna Jernberg Marius Gripsgard Michael Terry Michal Hruby Mike Gabriel Muhammad NPL Phlostically Ratchanan Srirattanamet Rodney Rodney Dawes Rudra Harsh V Singh Sergii Horichenko Sylke Vicious Ted Gould Temuri Doghonadze Timothy G Weblate lomiri-url-dispatcher-0.1.3/CMakeLists.txt000066400000000000000000000076551446007567600205260ustar00rootroot00000000000000cmake_minimum_required(VERSION 3.5) project(lomiri-url-dispatcher VERSION 0.1.3 LANGUAGES C CXX) string(TOLOWER "${CMAKE_BUILD_TYPE}" cmake_build_type_lower) # Build types should always be lowercase but sometimes they are not. if ("${cmake_build_type_lower}" STREQUAL "debug") option (werror "Treat warnings as errors." FALSE) else() option (werror "Treat warnings as errors." TRUE) endif() enable_testing () option (enable_lcov "Generate Coverage Reports" ON) option (enable_mirclient "Enable overlay using mirclient" ON) set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake" "${CMAKE_MODULE_PATH}") set(PACKAGE ${CMAKE_PROJECT_NAME}) set(GETTEXT_PACKAGE ${CMAKE_PROJECT_NAME}) set(DESKTOP_FILE ${PROJECT_NAME}-gui.desktop) find_package(PkgConfig REQUIRED) find_package(GDbus) include(GNUInstallDirs) include(CheckIncludeFile) include(CheckFunctionExists) include(UseGlibGeneration) include(UseConstantBuilder) # Workaround for libexecdir on debian if (EXISTS "/etc/debian_version") set(CMAKE_INSTALL_LIBEXECDIR ${CMAKE_INSTALL_LIBDIR}) set(CMAKE_INSTALL_FULL_LIBEXECDIR "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBEXECDIR}") endif() set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall") # https://bugzilla.gnome.org/show_bug.cgi?id=669355 # Since gdbus-codegen does not produce warning-free code # and we use -Werror, only enable these warnings for debug # builds. Drop this once the issue has been fixed and landed. if ("${cmake_build_type_lower}" STREQUAL debug) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wpedantic")# -Wextra") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wpedantic -Wextra") endif() if (${werror}) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror") set(CMAKE_C_FLAGS "${CMAKE_CXX_FLAGS} -Werror") endif() pkg_check_modules(LOMIRI_APP_LAUNCH REQUIRED lomiri-app-launch-0>=0.1.3) include_directories(${LOMIRI_APP_LAUNCH_INCLUDE_DIRS}) pkg_check_modules(GLIB2 REQUIRED glib-2.0) include_directories(${GLIB2_INCLUDE_DIRS}) pkg_check_modules(GOBJECT2 REQUIRED gobject-2.0) include_directories(${GOBJECT2_INCLUDE_DIRS}) pkg_check_modules(GIO2 REQUIRED gio-2.0) include_directories(${GIO2_INCLUDE_DIRS}) pkg_check_modules(GIO_UNIX2 REQUIRED gio-unix-2.0) include_directories(${GIO_UNIX2_INCLUDE_DIRS}) pkg_check_modules(JSONGLIB REQUIRED json-glib-1.0) include_directories(${JSONGLIB_INCLUDE_DIRS}) pkg_check_modules(DBUSTEST REQUIRED dbustest-1>=14.04.0) include_directories(${DBUSTEST_INCLUDE_DIRS}) pkg_check_modules(SQLITE REQUIRED sqlite3) include_directories(${SQLITE_INCLUDE_DIRS}) pkg_check_modules(APPARMOR REQUIRED libapparmor) include_directories(${APPARMOR_INCLUDE_DIRS}) if(${LOCAL_INSTALL}) set(DBUSSERVICEDIR "${CMAKE_INSTALL_DATADIR}/dbus-1/services/") else() EXEC_PROGRAM(${PKG_CONFIG_EXECUTABLE} ARGS dbus-1 --variable session_bus_services_dir OUTPUT_VARIABLE DBUSSERVICEDIR ) endif() message("Installing DBus services to ${DBUSSERVICEDIR}") if(${LOCAL_INSTALL}) set(DBUSIFACEDIR "${CMAKE_INSTALL_DATADIR}/dbus-1/interfaces/") else() EXEC_PROGRAM(${PKG_CONFIG_EXECUTABLE} ARGS dbus-1 --variable interfaces_dir OUTPUT_VARIABLE DBUSIFACEDIR ) endif() message("Installing DBus interfaces to ${DBUSIFACEDIR}") pkg_check_modules(SYSTEMD REQUIRED systemd) pkg_get_variable(SYSTEMD_USER_UNIT_DIR systemd systemduserunitdir) include_directories(${CMAKE_CURRENT_SOURCE_DIR}) include_directories(${CMAKE_CURRENT_BINARY_DIR}) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c11 -fPIC") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17 -fPIC") add_subdirectory(data) add_subdirectory(service) add_subdirectory(liblomiri-url-dispatcher) add_subdirectory(tools) add_subdirectory(gui) add_subdirectory(po) add_subdirectory(tests) # coverage reporting find_package(CoverageReport) get_property(COVERAGE_TARGETS GLOBAL PROPERTY COVERAGE_TARGETS) get_property(COVERAGE_TESTS GLOBAL PROPERTY COVERAGE_TESTS) ENABLE_COVERAGE_REPORT( TARGETS ${COVERAGE_TARGETS} TESTS ${COVERAGE_TESTS} FILTER /usr/include ${CMAKE_BINARY_DIR}/* ) lomiri-url-dispatcher-0.1.3/COPYING000066400000000000000000000167431446007567600170170ustar00rootroot00000000000000 GNU LESSER GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. This version of the GNU Lesser General Public License incorporates the terms and conditions of version 3 of the GNU General Public License, supplemented by the additional permissions listed below. 0. Additional Definitions. As used herein, "this License" refers to version 3 of the GNU Lesser General Public License, and the "GNU GPL" refers to version 3 of the GNU General Public License. "The Library" refers to a covered work governed by this License, other than an Application or a Combined Work as defined below. An "Application" is any work that makes use of an interface provided by the Library, but which is not otherwise based on the Library. Defining a subclass of a class defined by the Library is deemed a mode of using an interface provided by the Library. A "Combined Work" is a work produced by combining or linking an Application with the Library. The particular version of the Library with which the Combined Work was made is also called the "Linked Version". The "Minimal Corresponding Source" for a Combined Work means the Corresponding Source for the Combined Work, excluding any source code for portions of the Combined Work that, considered in isolation, are based on the Application, and not on the Linked Version. The "Corresponding Application Code" for a Combined Work means the object code and/or source code for the Application, including any data and utility programs needed for reproducing the Combined Work from the Application, but excluding the System Libraries of the Combined Work. 1. Exception to Section 3 of the GNU GPL. You may convey a covered work under sections 3 and 4 of this License without being bound by section 3 of the GNU GPL. 2. Conveying Modified Versions. If you modify a copy of the Library, and, in your modifications, a facility refers to a function or data to be supplied by an Application that uses the facility (other than as an argument passed when the facility is invoked), then you may convey a copy of the modified version: a) under this License, provided that you make a good faith effort to ensure that, in the event an Application does not supply the function or data, the facility still operates, and performs whatever part of its purpose remains meaningful, or b) under the GNU GPL, with none of the additional permissions of this License applicable to that copy. 3. Object Code Incorporating Material from Library Header Files. The object code form of an Application may incorporate material from a header file that is part of the Library. You may convey such object code under terms of your choice, provided that, if the incorporated material is not limited to numerical parameters, data structure layouts and accessors, or small macros, inline functions and templates (ten or fewer lines in length), you do both of the following: a) Give prominent notice with each copy of the object code that the Library is used in it and that the Library and its use are covered by this License. b) Accompany the object code with a copy of the GNU GPL and this license document. 4. Combined Works. You may convey a Combined Work under terms of your choice that, taken together, effectively do not restrict modification of the portions of the Library contained in the Combined Work and reverse engineering for debugging such modifications, if you also do each of the following: a) Give prominent notice with each copy of the Combined Work that the Library is used in it and that the Library and its use are covered by this License. b) Accompany the Combined Work with a copy of the GNU GPL and this license document. c) For a Combined Work that displays copyright notices during execution, include the copyright notice for the Library among these notices, as well as a reference directing the user to the copies of the GNU GPL and this license document. d) Do one of the following: 0) Convey the Minimal Corresponding Source under the terms of this License, and the Corresponding Application Code in a form suitable for, and under terms that permit, the user to recombine or relink the Application with a modified version of the Linked Version to produce a modified Combined Work, in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source. 1) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (a) uses at run time a copy of the Library already present on the user's computer system, and (b) will operate properly with a modified version of the Library that is interface-compatible with the Linked Version. e) Provide Installation Information, but only if you would otherwise be required to provide such information under section 6 of the GNU GPL, and only to the extent that such information is necessary to install and execute a modified version of the Combined Work produced by recombining or relinking the Application with a modified version of the Linked Version. (If you use option 4d0, the Installation Information must accompany the Minimal Corresponding Source and Corresponding Application Code. If you use option 4d1, you must provide the Installation Information in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source.) 5. Combined Libraries. You may place library facilities that are a work based on the Library side by side in a single library together with other library facilities that are not Applications and are not covered by this License, and convey such a combined library under terms of your choice, if you do both of the following: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities, conveyed under the terms of this License. b) Give prominent notice with the combined library that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 6. Revised Versions of the GNU Lesser General Public License. The Free Software Foundation may publish revised and/or new versions of the GNU Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library as you received it specifies that a certain numbered version of the GNU Lesser General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that published version or of any later version published by the Free Software Foundation. If the Library as you received it does not specify a version number of the GNU Lesser General Public License, you may choose any version of the GNU Lesser General Public License ever published by the Free Software Foundation. If the Library as you received it specifies that a proxy can decide whether future versions of the GNU Lesser General Public License shall apply, that proxy's public statement of acceptance of any version is permanent authorization for you to choose that version for the Library. lomiri-url-dispatcher-0.1.3/ChangeLog000066400000000000000000002076721446007567600175410ustar00rootroot000000000000002023-07-26 Marius Gripsgard * Release 0.1.3 (HEAD -> main, tag: 0.1.3) 2023-06-30 Rudra Harsh V.Singh * Translated using Weblate (Sanskrit) (59701fd) 2023-07-07 NPL * Translated using Weblate (Japanese) (afa250f) 2023-06-30 Weblate * Added translation using Weblate (Sanskrit) (9c203c6) 2023-06-27 Rudra Harsh V.Singh * Translated using Weblate (English (Canada)) (0352d8b) 2023-06-26 Rudra Harsh V.Singh * Translated using Weblate (Hindi) (0f67e5e) 2023-06-28 J. Lavoie * Translated using Weblate (German) (a455047) 2023-04-11 Temuri Doghonadze * Translated using Weblate (Georgian) (23c4235) 2023-04-04 gallegonovato * Translated using Weblate (Spanish) (6be0adf) 2023-03-31 Sylke Vicious * Translated using Weblate (Italian) (74766ae) 2023-03-31 Jozef Mlich * Translated using Weblate (Czech) (ceec117) 2023-03-27 Jozef Mlich * Translated using Weblate (Czech) (2b6328c) 2023-03-01 Allan Nordhøy * Translated using Weblate (Norwegian Bokmål) (6164af4) 2023-02-26 Luna Jernberg * Translated using Weblate (Swedish) (1315e28) 2023-02-21 Heimen Stoffels * Translated using Weblate (Dutch) (9291c42) 2023-02-18 Sergii Horichenko * Translated using Weblate (Russian) (befe723) 2023-02-16 phlostically * Translated using Weblate (Esperanto) (9fd65c1) 2023-02-15 Mike Gabriel * Merge branch 'c++17' into 'main' (2b74dfe) 2023-02-12 Luca Weiss * Upgrade C++ standard to C++17 (7f41a2e) 2023-02-07 Ivo Xavier * Translated using Weblate (Portuguese) (23c2172) 2023-02-06 Sergii Horichenko * Translated using Weblate (Ukrainian) (f745bc2) 2023-02-05 gnu-ewm * Translated using Weblate (Polish) (bc62743) 2023-02-05 Mike Gabriel * po/url-dispatcher.pot: Drop file. Obsolete. (8450eb8) * Release 0.1.2 (0f65184) (tag: 0.1.2) 2023-02-04 Allan Nordhøy * Translated using Weblate (Norwegian Bokmål) (26b1194) 2023-02-04 Mike Gabriel * Translated using Weblate (German) (0b3dceb) 2023-02-04 Hosted Weblate * Update translation files (f7ceca3) 2023-02-04 Mike Gabriel * po/lomiri-url-dispatcher.pot -m po/lomiri-url-dispatcher.pot: No-change update of translation template. (c93689e) 2023-01-31 Guido Berhoerster * Merge branch 'personal/sunweaver/modernize-i18n' into 'main' (430964d) 2023-01-31 Mike Gabriel * README.md: Add references to hosted Weblate about contributing i18n. (3c5429d) * README -> README.md (convert to markdown). (ab70131) 2023-01-30 Mike Gabriel * lomiri-url-dispatcher: Modernize i18n. (7cfc392) * CMake: Bump mininum version requirement to 3.5 (a2e47af) * .gitignore: Don't ignore files in po/. (f7bca69) 2023-01-24 gnu-ewm * Translated using Weblate (Polish) (0b7789e) 2023-01-16 Ivo Xavier * Translated using Weblate (Portuguese) (086da1c) 2023-01-14 Dan * Translated using Weblate (Ukrainian) (93cb64c) 2023-01-14 Sergii Horichenko * Translated using Weblate (Ukrainian) (1b62418) 2023-01-13 Timothy G * Translated using Weblate (French) (1e66c1c) 2023-01-13 Ivo Xavier * Translated using Weblate (Portuguese) (0f27110) 2023-01-12 Sergii Horichenko * Translated using Weblate (Russian) (34b54bc) 2023-01-09 Mike Gabriel * Merge branch 'personal/mariogrip/lalver' into 'main' (5c5af3f) 2023-01-09 Marius Gripsgard * Require lal version 0.1.3 (456b798) 2023-01-09 Mike Gabriel * Merge branch 'personal/mariogrip/lal' into 'main' (ab6b3ac) 2023-01-03 Marius Gripsgard * Support lal no mirclient build (cb2be28) 2023-01-05 Muhammad * Translated using Weblate (Urdu) (5187481) 2023-01-05 Mike Gabriel * Translated using Weblate (German) (d46ffb8) 2023-01-06 Guido Berhoerster * Merge branch 'personal/sunweaver/ftbfs-fix-add-common-pkg' into 'main' (e2afef7) 2023-01-05 Mike Gabriel * debian/: Introduce common:pkg containing locale files. (5014b75) * po/: Rename Chinese translation files to _.po pattern. (cd9087c) * Revert "Deleted translation using Weblate (Chinese (Traditional, Hong Kong))" (d94042e) * Revert "Added translation using Weblate (Chinese (Traditional, Hong Kong))" (9d15298) 2023-01-05 Allan Nordhøy * Translated using Weblate (Norwegian Bokmål) (d7441ea) 2023-01-05 Mike Gabriel * Merge branch 'kingu-main-patch-12571' into 'main' (e146103) 2023-01-05 Allan Nordhøy * Spelling: Cannot open “%1” addresses. (acc43c9) 2023-01-04 Weblate * Added translation using Weblate (Chinese (Traditional, Hong Kong)) (f000925) 2023-01-04 Allan Nordhøy * Translated using Weblate (Norwegian Bokmål) (e992b07) 2023-01-04 Mike Gabriel * Deleted translation using Weblate (Chinese (Traditional, Hong Kong)) (752b6d2) 2023-01-04 Weblate * Added translation using Weblate (Pampanga) (626d623) * Added translation using Weblate (Chinese (Min Nan)) (6065b7d) * Added translation using Weblate (Norwegian Bokmål) (da9dc48) * Added translation using Weblate (Kurdish (Southern)) (fb6aca7) * Added translation using Weblate (French (Switzerland)) (fbabde0) * Added translation using Weblate (Kurdish (Northern)) (d62256d) * Added translation using Weblate (Shan) (be5e50f) * Added translation using Weblate (Bemba) (b891c00) * Added translation using Weblate (Oromo) (1ddc774) * Added translation using Weblate (Afar) (9dc5d80) * Added translation using Weblate (Dhivehi) (a922107) * Added translation using Weblate (Bengali (Bangladesh)) (94e2afe) * Added translation using Weblate (Kabyle) (b48626d) * Added translation using Weblate (Nyanja) (9024ca8) * Added translation using Weblate (French (Canada)) (3b0ed8d) * Added translation using Weblate (Chinese (Simplified)) (846d885) * Added translation using Weblate (Chinese (Traditional)) (1802736) * Added translation using Weblate (English (Canada)) (51299d3) * Added translation using Weblate (English (Australia)) (d785181) * Added translation using Weblate (Sindhi) (6fb3091) * Added translation using Weblate (Burmese) (c69199d) * Added translation using Weblate (Lojban) (c864d7c) * Added translation using Weblate (Sardinian) (2568901) * Added translation using Weblate (English (United States)) (2ac2736) * Added translation using Weblate (Slovenian) (882daa0) * Added translation using Weblate (Sinhala) (798bf1a) * Added translation using Weblate (Slovak) (b2ba7ea) * Added translation using Weblate (Khmer (Central)) (84fea54) * Added translation using Weblate (Korean) (18deb5b) * Added translation using Weblate (Albanian) (6770c9c) * Added translation using Weblate (Serbian) (b57fc2d) * Added translation using Weblate (Georgian) (cd0cb7e) * Added translation using Weblate (Finnish) (dc9b5cb) * Added translation using Weblate (Persian) (be1252b) * Added translation using Weblate (Swedish) (984202f) * Added translation using Weblate (French) (60d18f7) * Added translation using Weblate (Spanish) (e6c4310) * Added translation using Weblate (Dutch) (e22c62c) * Added translation using Weblate (Indonesian) (6143843) * Added translation using Weblate (Azerbaijani) (dc62c48) * Added translation using Weblate (Arabic) (640b09f) * Added translation using Weblate (Italian) (884026e) * Added translation using Weblate (Amharic) (a7a9569) * Added translation using Weblate (Uyghur) (7d4e415) * Added translation using Weblate (Malay) (2ac9814) * Added translation using Weblate (Polish) (eda4030) * Added translation using Weblate (Macedonian) (d068d54) * Added translation using Weblate (Maori) (8ffe04e) * Added translation using Weblate (Malayalam) (49ba734) * Added translation using Weblate (Friulian) (23d713f) * Added translation using Weblate (Malagasy) (9a72ef5) * Added translation using Weblate (Hebrew) (bee3c65) * Added translation using Weblate (Hindi) (dd7c964) * Added translation using Weblate (Hungarian) (cad3a53) * Added translation using Weblate (Croatian) (a0f9770) * Added translation using Weblate (Armenian) (6b1d7d3) * Added translation using Weblate (English (United Kingdom)) (4fdc60d) * Added translation using Weblate (Icelandic) (3b0ebd1) * Added translation using Weblate (Punjabi) (025dfbe) * Added translation using Weblate (Portuguese) (b966561) * Added translation using Weblate (Pashto) (c4549ad) * Added translation using Weblate (Czech) (bde0812) * Added translation using Weblate (Welsh) (1ad90b1) * Added translation using Weblate (Catalan) (9195343) * Added translation using Weblate (Japanese) (b523180) * Added translation using Weblate (Bosnian) (8459a53) * Added translation using Weblate (Breton) (095b7d5) * Added translation using Weblate (Asturian) (5639a72) * Added translation using Weblate (Ukrainian) (5ebb732) * Added translation using Weblate (Bulgarian) (53dc7be) * Added translation using Weblate (Belarusian) (843bf69) * Added translation using Weblate (Romanian) (a779978) * Added translation using Weblate (Russian) (5d2e13b) * Added translation using Weblate (Basque) (f966cde) * Added translation using Weblate (Esperanto) (ebbf866) * Added translation using Weblate (Greek) (af61fbd) * Added translation using Weblate (Danish) (3e0a0d4) * Added translation using Weblate (Portuguese (Brazil)) (b94a320) * Added translation using Weblate (Chinese (Traditional, Hong Kong)) (3c0f38f) * Added translation using Weblate (Tamil) (1c0f3ce) * Added translation using Weblate (Telugu) (29ce971) * Added translation using Weblate (Tajik) (dde4abb) * Added translation using Weblate (Thai) (3621ead) * Added translation using Weblate (Turkmen) (eb237eb) * Added translation using Weblate (Lithuanian) (52dfa4b) * Added translation using Weblate (Latvian) (bf94fc9) * Added translation using Weblate (Turkish) (45fa0f1) * Added translation using Weblate (Lao) (07f79f9) * Added translation using Weblate (Lingala) (c542a9a) * Added translation using Weblate (Luxembourgish) (081a809) * Added translation using Weblate (Galician) (f3c152a) * Added translation using Weblate (Gaelic) (4b63ab7) * Added translation using Weblate (Valencian) (b5e7060) * Added translation using Weblate (Gujarati) (6c5fec6) 2023-01-03 Weblate * Added translation using Weblate (Urdu) (20d06b5) * Added translation using Weblate (Tetum) (c9ff509) * Added translation using Weblate (Ido) (0905012) * Added translation using Weblate (Scots) (5c760ae) * Added translation using Weblate (Franco-Provençal) (001e706) 2023-01-03 Mike Gabriel * Added translation using Weblate (German) (5f97098) 2023-01-03 Marius Gripsgard * Release 0.1.1 (699e549) (tag: 0.1.1) 2023-01-03 Mike Gabriel * Merge branch 'personal/mariogrip/disablemirclient' into 'main' (61b38e5) 2023-01-03 Marius Gripsgard * Add option to disable mirclient overlay (efefbdf) 2022-12-23 Ratchanan Srirattanamet * Merge branch 'hatato-master-patch-38554' into 'main' (1c4680a) 2020-10-28 Hatato * Fix generic URL regex, add test for URL with path. (3a5b7bf) 2022-12-12 Marius Gripsgard * Merge branch 'personal/fredldotme/clickurls' into 'main' (1749b75) 2022-12-12 Alfred Neumayer * data & debian: Re-introduce click hook (3b13fd1) 2022-09-30 Mike Gabriel * Merge branch 'array-build-fix' into 'main' (09ca481) 2022-09-29 Andres Salomon * Fix build failure in Debian unstable (231a258) 2022-09-19 Ratchanan Srirattanamet * Merge branch 'fix-bad-url-helper-app-id' into 'main' (8986d2e) 2022-09-19 Guido Berhoerster * Rename app ID of the bad-url-helper to be consistent (3f57972) 2022-09-08 Ratchanan Srirattanamet * Merge branch 'fix-startup' into 'main' (caac470) 2022-09-05 Guido Berhoerster * Make OverlayTrackerMir connection handling more robust (85b26e7) * Add ordering dependency on graphical-session.target (b169dd7) 2022-09-01 Ratchanan Srirattanamet * Merge branch 'fix-sqlite-busy' into 'main' (57a0af1) 2022-09-01 Guido Berhoerster * Fix concurrent sqlite DB access issues (dd332a5) 2022-08-01 Ratchanan Srirattanamet * Merge branch 'fix-dbus-apparmor-check' into 'main' (45f2606) 2022-08-01 Guido Berhoerster * Allow DBus activation by AppArmor-confined apps (cda8186) 2022-06-02 Guido Berhoerster * Merge branch 'dbus-start-on-send' into 'main' (c71438a) 2022-06-01 Jami Kettunen * Start com.lomiri.URLDispatcher D-Bus service if not running (148b45b) 2022-05-16 Ratchanan Srirattanamet * Merge branch 'update-directory' into 'main' (0da1bf8) 2022-04-28 Guido Berhoerster * Watch URL files and update the database (94537b9) 2022-05-03 Ratchanan Srirattanamet * Merge branch 'qml-fixes' into 'main' (6794ca1) 2022-04-25 Guido Berhoerster * Add back dependencies for QML apps (c397c6d) * Fix path of bad-url dialog (99e8790) * Merge branch 'hatato-fix-bad-url-and-dump' into 'main' (3a52545) 2022-03-25 Ratchanan Srirattanamet * Merge branch 'dbus-activation' into 'main' (8e3b764) 2022-03-22 Guido Berhoerster * Start lomiri-url-dispatcher using DBus activation (4189423) 2022-01-20 Jesse Pullinen * Use Lomiri components in bad-url (d7fa842) * Fix lomiri-url-dispatcher-dump looking in the wrong directory (2356c30) 2021-11-10 Marius Gripsgard * Merge branch 'glib-extern' into 'main' (cce9e6e) 2021-05-31 Ratchanan Srirattanamet * Merge branch 'ubports/glib-deprecation' into 'main' (849c18a) 2021-05-14 Rodney Dawes * Fix main loop deprecation warnings too. (6f15e32) * Rename the .bzrignore to .gitignore (078cb84) * Stop using deprecated GTimeVal. (33d5b59) 2021-04-04 Luca Weiss * Fix compile error with new glib versions (d355a02) 2021-03-23 Rodney * Merge branch 'personal/peat-psuwit/start-building-master' into 'main' (ef11846) 2021-03-19 Marius Gripsgard * Merge branch 'personal/peat-psuwit/sync-debian-pkg' into 'main' (eca7beb) 2021-03-20 Ratchanan Srirattanamet * Move Jenkinsfile to debian/ per the new guideline (3428397) * Update Jenkinsfile to use shared library (7d95904) * New Debian changelog entry; remove Debian revision number (5b3401e) 2021-01-29 Ratchanan Srirattanamet * debian/*: Adopt DEB packaging from official Debian package where appropriate (02d4975) 2020-09-28 Marius Gripsgard * Merge branch 'mr/fix-missing-include-stdexcept' into 'master' (558aa7d) 2020-09-27 Mike Gabriel * service/bad-url/exec-tool.cpp: Fix missing include of (for std::runtime_error()). (0205bff) 2020-05-28 Mike Gabriel * gui/lomiri-url-dispatcher-gui.qml: Make placeholder text more generic. (29c32df) * gui/lomiri-url-dispatcher-gui.qml: Fix QML namespace of Lomiri.Compoments. (4e4b57f) * gui/lomiri-url-dispatcher-gui.desktop.in: Add Keywords= key. (5b5298a) * release 0.1.0 (5d33ebf) (tag: 0.1.0) * NEWS: start with empty file (81ec4c1) 2020-05-27 Mike Gabriel * tests/url_dispatcher_testability: Disable build time tests (they require a systemd user session, it seems) and drop test_fake_disptacher.py from installation path, it contains build time cruft. (1e0b9f2) * development file: Drop API_VERSION from file names and paths. (c993efe) * tests/url-db-test.cc: Don't hard-code DB_SCHEMA_VERSION. (aae06c3) 2020-05-20 Mike Gabriel * Fork url-dispatcher as lomiri-url-dispatcher. (bba45cd) 2018-10-07 Rodney * Remove scopes checker. (#6) (b9a83f5) 2018-06-12 Marius Gripsgard * Merge pull request #3 from vanyasem/bionic (f7b7e00) 2018-06-11 Ivan Semkin * Force rerun the CI (9a46599) * Force rerun the CI (2e08ddb) 2018-06-08 Ivan Semkin * Add missing -pthread flag (b3df852) 2018-06-04 Dan Chapman * Merge pull request #1 from dobey/no-whoopsie (2b0df70) 2018-06-02 Rodney Dawes * Add missing include. (e8cf0dc) * Remove dependency on whoopsie. (0f806e7) 2018-02-13 Marius Gripsgard * Release for bionic (679c9bf) * Merge remote-tracking branch 'u8/master' into bionic (be23010) 2017-12-28 Marius Gripsgard * Update Jenkinsfile (ca7eb5d) 2017-10-13 Marius Gripsgard * Imported to UBports (7fab611) 2017-03-28 Bileto Bot * Releasing 0.1+17.04.20170328-0ubuntu1 (809126e) 2017-03-28 Rodney Dawes * Convert service main process and url-dispatcher tool code to C++. (1d12c44) * Use libwhoopsie for reporting recoverable problems. (5b86338) * The unity8-dash interface is actually com.canonical.UnityDash. (26cbec8) * Fix deprecation warning in mir mock. (47108da) 2017-03-18 Bileto Bot * Releasing 0.1+17.04.20170318-0ubuntu1 (decb1d7) 2017-03-18 Ted Gould * Remove Upstart from the test suite and replace it with systemd (e8ec068) * Update bad-url exec tool to UAL C++ interface (010cb62) 2017-03-17 Ted Gould * Remove tabs for dobey (5259653) * Turn UAL up to 11 (432a135) * Make return values clearer (f4efef6) 2017-03-16 Ted Gould * Fix up the service test to not use Upstart (b3d42d3) * This test no longer does anything useful (74ec78c) * Make the icon have a white background for the U8 launcher (52fea44) * Make the test GUI single instance (3ef6ffe) * Simplify the exec tool with C++ UAL API (3d76545) 2017-03-15 Rodney Dawes * Convert the service main process code to c++. (c29bbe8) * Add test for calling url-dispatcher without args. (a8fa4dd) 2017-03-14 Rodney Dawes * Convert the url-dispatcher tool to C++. (073e95e) * Fix indentation. (97539bf) * Fix deprecation warning in mir mock. (5ffa295) * The unity8-dash interface is actually com.canonical.UnityDash. (74438d6) * Use libwhoopsie for reporting recoverable problems. (56fac2e) 2017-03-14 Bileto Bot * Releasing 0.1+17.04.20170314-0ubuntu1 (66ba2e1) 2017-03-14 Rodney Dawes * Remove unused gsettings cmake module. (24dd1e4) * Use gdbus integration from cmake-extras. (c1d4cd0) * Use cmake-extras intltool support. Enable langpack support. (06fb2b6) * Use the coverage support from cmake-extras. (b2f16e9) * Use gmock module from cmake-extras. (fbcadbc) * Remove click usage and support. (d71bd4d) 2017-03-14 Charles Kerr * Honor XDG_CACHE_HOME in url-dispatcher-dump and url-dispatcher.conf (f41cef9) 2017-03-14 Rodney Dawes * Merge up changes from parents. (1910a11) 2017-03-13 Rodney Dawes * Fix the conflict. (013ec5d) 2017-03-10 Rodney Dawes * Remove a couple more references to click. (ec688cc) * Override ubuntu_app_launch_triplet_to_app_id for the app id tests. Remove the extraneous app-id tess which are testing ual, not url-dispatcher. Put a few app id tests in dispatcher tests to cover dispatcher_url_to_appid. (845a4aa) 2017-03-09 Rodney Dawes * Merge trunk. (5d85a07) 2017-03-08 Bileto Bot * Releasing 0.1+17.04.20170308.1-0ubuntu1 (211eb2c) 2017-03-08 Rodney Dawes * Don't use upstart to get unity8 pid. (dabc07d) * Fix more indentation. (76328d4) * Fix indentation in dispatch_send_to_overlay (c09d463) * Get the unity8 pid from dbus instead. (b15118b) * Don't run initctl in the python test. (4e47f35) * Fix indentation for one line in tab-infested code. (d2b85ec) * Don't use upstart to get unity8 pid. (66d6f7e) 2017-03-06 Rodney Dawes * Remove unused gsettings cmake module. (ac9aa7c) * Use gdbus integration from cmake-extras. (93d3879) * Merge up fix-coverage. (869ff24) * Remove extraneous comment about coverage. (d508136) 2017-03-03 Rodney Dawes * Use cmake-extras intltool support. Enable langpack support. (5978d10) * Oops, use the right variable for tests. (e59e2fa) * Use the coverage support from cmake-extras. (7e44785) * Use gmock module from cmake-extras. (54ffcc8) 2017-02-28 Rodney Dawes * Remove click usage and support. (afc5cc4) 2017-02-27 Bileto Bot * Releasing 0.1+17.04.20170227.2-0ubuntu1 (239ee4b) 2017-02-27 Rodney Dawes * Remove tests that depend on libertine, as url-dispatcher has no support for handlers in libertine anyway. (66b207d) 2017-02-27 Ken VanDine * Handle UAL API bump (0519511) 2017-02-27 Rodney Dawes * Actually, just remove the test, as url-dispatcher doesn't support libertine. (0cc188f) * Temporarily disable the tests which depend on libertine. (0ea1bc0) 2017-02-27 Ken VanDine * Handle UAL API bump (6fb0117) 2016-12-06 Bileto Bot * Releasing 0.1+17.04.20161206-0ubuntu1 (248b69f) 2016-12-06 Ted Gould * Start after Unity8 so it has a chance to set the MIR_SOCKET (6486c6c) * Instead of sleeping make the refresh tasks low enough priority they don't get in the way (LP: #1645793) (4a0d979) 2016-12-01 Ted Gould * Stop on U8 as well (bf0f9a2) 2016-11-16 Ted Gould * Make sure that U8 has set the proper MIR_SOCKET (7d86c79) 2016-11-10 Charles Kerr * sync with trunk (1c09331) 2016-11-10 Ted Gould * Instead of sleeping make the refresh tasks low enough priority they don't get in the way (4f52f41) 2016-11-08 Bileto Bot * Releasing 0.1+17.04.20161108-0ubuntu1 (c1ec36b) 2016-11-08 Michael Terry * Support running inside a snap. (5570781) * Merge from trunk (810cbba) * Drop env var in 'start on' stanza -- doesn't work, and isn't needed in snap mode anyway (df55821) 2016-11-07 Bileto Bot * Releasing 0.1+17.04.20161107-0ubuntu1 (5d3c184) * Crossbuilding Fixes; App ID should allow package names with dots. (LP: #1591342) (LP: #1606498); Check versions of appid:// urls to reduce the number of invalid appids we send to UAL (LP: #1352656); Scope testing for the scope:// URL and overlays that should be over the das. Protect the dash from getting NULL urls (LP: #1476257. Make sure URL Overlays are shutdown on exit; Remove the wildcard that is confusing the update script (LP: #1461496); Not using a message that isn't set properly (LP: #1608009); Fixing tests to adjust for UAL change. Add a small GUI helper tool for testing; Show error dialog over apps that use Bad URLs (LP: #1370008) (bd5b9bb) 2016-11-07 Ted Gould * Be more specific so that the packages don't conflict (aba0d65) 2016-11-03 Ted Gould * Fixes from review (b98bb99) 2016-11-02 Ted Gould * Fixing multiple lookups (b652716) * Fixing cast to be more C++-ish (4470879) 2016-09-23 Michael Terry * Support snap paths if we're running in one (7bd2774) 2016-09-20 Ted Gould * Forgot the container config (40935b3) * Merge issues from trunk (85bbec6) * Updating changelog to have all the branches in it (a1cf515) * Fixing the environment for the appid test (706d753) 2016-08-30 Ted Gould * Bad URL prompt (8357838) * Merge lp:~ted/url-dispatcher/gui-tool/ (4ea4ea3) * Merge lp:~ted/url-dispatcher/ual-snappy-autopkgtest/ (018eedf) * Merge lp:~ted/url-dispatcher/lp1608009-no-message/ (ba82665) * Merge lp:~larryprice/url-dispatcher/appid-with-dots (999808b) * Merge lp:~ted/url-dispatcher/update-no-wildcard (84c984c) * Merge lp:~ted/url-dispatcher/kill-helpers-on-exit (b2a9ed7) * Merge lp:~ted/url-dispatcher/lp1476257-activate-dash-desktop (0a1f2f8) * Merge lp:~ted/url-dispatcher/is-scope-check (1102fd4) * Merge lp:~ted/url-dispatcher/check-appid-urls (4886988) * Merge lp:~fboucault/url-dispatcher/crossbuild_fixes (ca1bd7f) * Grab the crossbuild branch to resolve conflicts (90737ea) 2016-08-26 Charles Kerr * honor /tmp/charles-cache and /home/charles when referencing urls-1.db (7dc0932) 2016-08-18 Ted Gould * Adding some translation framework (30165ca) 2016-08-17 Ted Gould * Make it so that we can get translations for these strings (4fa4e88) * Make sure to only have the protocol in the error (60ab817) * Add the GUI package (79a1bdd) * Fix the prefix (f9f9e65) * Adding a GUI tool for sending URLs (5e18db3) 2016-08-16 Ted Gould * Installing the apparmor profile (c070eac) * Fix the control file (50581a5) * Move all the overlay management into common functions (aa5ad4f) 2016-08-16 Bileto Bot * Releasing 0.1+16.10.20160816.1-0ubuntu1 (10348c8) * No chnage rebuild for UAL migration; No change rebuild for s390x. (7050020) 2016-08-16 Ted Gould * No chnage rebuild for UAL migration (810484a) * Catching up a version (d33c261) 2016-08-15 Ted Gould * Grabbing the snappy test fix branch (3529c8b) * Adding in apparmor config for the helper (2252b5a) * Switch the AppID to be something defined staticly (b2bec40) * Looks like a large rename, but I started this revision months ago and just got back to it, not entirely sure (4c85d82) * Fixing the service test (259fa10) * Make the appid tests happy (456e64c) * Not using a message that isn't set properly (5794273) 2016-08-10 Ted Gould * Adding a TODO for using the GMock based mock (31d86d1) * 2016 (f50cd45) * Use the C99 bool type (df42f0c) * Use default constructor/destructors (e7ceeb1) * Learn real good like what year it is (58cc23d) * Vertically compress code (6b8d83b) * Fix build type check (20c1899) * Merge trunk (da6e371) 2016-08-09 Ted Gould * Update to trunk and resolve conflicts (1b00d39) * Combine the checks on out_appid (f37afd3) * Updating to current trunk (8691682) 2016-08-08 Ted Gould * No change rebuild (61dd1ca) 2016-08-04 Larry Price * Adding test (971d6aa) * Accept '.' in appid for libertine apps (3edda49) 2016-07-19 Florian Boucault * Crossbuilding fixes. (03974b9) 2015-11-10 CI Train Bot * Releasing 0.1+16.04.20151110-0ubuntu1 (9f18bac) 2015-11-10 Ted Gould * Remove the cache if the service fails to start. Fail to start if we can't create the database. Fixes: #1483854 Approved by: PS Jenkins bot, Ken VanDine (4c71c44) 2015-11-06 Ted Gould * Make sure to exit with the code from the service (50c8473) * Use -ne (9c207ea) * Attaching bug (577fa24) * Test the status of URL dispatcher instead of relying on a fail from Upstart (ee73f5f) 2015-09-04 Ted Gould * Catch stopping instead of stopped (e1ab562) * These aren't used because the refresh happens when the new instance starts (88a9964) * Adding in an extra job instead (20fff91) 2015-09-03 Ted Gould * Make stopping with failure clean the cache and rebuild it (04c295c) * Make it so that if DB creation fails we die (dd5e642) 2015-08-29 Ted Gould * Getting a map in there (d022e75) * Convert the overlays to using a structure (17cda01) * Setting up Mir test for both types of TPS (4a04b91) * Adding to Bad URL to the UAL signal stop tests (0c5f900) 2015-08-28 Ted Gould * Fixes to make everything work again with the tests. (96293c3) * Connect in the bad overlay dialog (d1a3576) * Adding in the bad URL tracker (282dfa2) 2015-07-21 Ted Gould * Protect the dash from getting NULL urls (68b9089) 2015-07-17 CI Train Bot * Releasing 0.1+15.10.20150717-0ubuntu1 (7d5b02f) 2015-07-17 Andreas Pokorny * unchagned for mir release 0.14.0 Approved by: PS Jenkins bot (48e5f35) 2015-06-26 Ted Gould * Forgot license headers (55542bc) * Putting in a test that handles the case of overlaying on top of the Dash (2a8eb7b) * Sending a SIGTERM so that we can write out coverage results (caa3c8b) 2015-06-25 Ted Gould * Fix to use the memory we kept (7a367f3) * Adding some bad testing and ensuring we're allowing underscores for scopes (8af73da) * Basic scope test (841d8ad) * Scope metadata is a 0%)#$&!(#$ (b0f09bd) * Only clear the data if there is a place to clear (223a8fd) * Make it so we don't inherit from the shared_ptr (9786a8c) * Make it so that the mock can take exceptions (b9e30f8) * Made an insertable mock (78bcf40) * Inserting a facade so that we can test this. So stupid. (96e3228) 2015-06-25 Andreas Pokorny * unchanged for mir release 0.14.0 (74f358e) 2015-06-23 Ted Gould * Trying to get some scope mocking in here (9518841) 2015-06-22 Ted Gould * Don't leak memory (a342ac4) * Warnings on bad parameters (6d544df) * Sneaky Tabs (7f0763e) * Don't need to protect delete from nullptr (b893a51) * Warning if something other than NotFound (a36a021) * Scope is now a keyword, let's avoid it. (e3912d1) * Comment to help the next guy/gal (150b872) * Support disabing scope checking for testing (09a82e7) * It's C++, let's use that when we can. (39602f5) * Steal getting a pid from an Upstart job from pay service and push it into the scope detection (391e52b) * Make sure to add it to debian as well (371aea5) * Adding a PID check (678b46d) * Change the tests to the new prototypes (7e9587b) * Check the scope URL to ensure the App ID is correct (f27d932) * Link in the scope checker (bcf7e7f) * A connection to the Scopes Runtime (10cfa86) * Adding Unity Scopes to the build (fe7c4ef) 2015-06-19 Ted Gould * Ensure the URL dialog has what it needs (d8b51db) * Make CMake happy having two exec-tools (bc02013) * Adding an exec tool for bad-urls (dd7c25c) * GPL it (819996c) * Install the QML file (24c4ed6) * Clean up the string and use an argument (c6792a0) * Clean up text (daa2e93) * Couple clean ups (2b7abf7) * First pass at a dialog (a55f468) * Attaching bug (acb705a) * Add a check for handling bad versions (1b17dec) * Check to ensure that a given app id is the current version (4e2c8d4) * Make sure to clean up untrusted helpers (52f2414) * Remove the wildcard that is confusing the script (c93c6cb) 2015-06-12 CI Train Bot * Releasing 0.1+15.10.20150612-0ubuntu1 (ba3aff9) 2015-06-12 Ted Gould * Support URL Overlays of content in a trusted session without a desktop file Approved by: PS Jenkins bot, Charles Kerr (76e1896) * Provide a small tool to dump the URL DB in a readable form Approved by: PS Jenkins bot, Charles Kerr (ace3789) * Add upstart build dep for tests on Wily Approved by: PS Jenkins bot, Charles Kerr (197ea51) * Clean up a couple of warnings (1d4a110) 2015-06-11 Ted Gould * Making internal functions private (7f92e04) * Remove (void) as a function prototype (e1c3c76) * Switch linking option to not include the pthread library, but instead ask for it directly (2d99dcf) 2015-06-08 Ted Gould * Allow dir to be NULL (660782a) * Fixing the dispatcher test to match the fixes in the exec tool test (0aec676) * Make the exec-tool test work with the directory feature (and test it) (93d6e57) * Fix CMake file to use PROGRAMS (da1e450) * Grab Upstart dep (100b55c) * Grab Upstart dep (6900fd8) * Add upstart build dep for tests on Wily (ee44607) 2015-06-05 Ted Gould * Add the libclick dev package (e2bd11d) * Adding in directory support for the new UAL (06d8e33) 2015-05-20 Ted Gould * Ensure Mir has pthread (785f1f9) * Grab the exec tool too (2c2414e) 2015-05-19 Ted Gould * Make the mir mock an ld preload for non-mir testing (45c64ee) * Make it so that VIM can handle the comment syntax (8fbf15c) * Adding copyright headers (bc64c00) * Put a bad call in (6b3364b) * Mir signal stops (6156b19) * Signal a stop from UAL to make sure the Mir session gets cleaned up (9edd88a) 2015-05-18 Ted Gould * Add in some Mir mock checking and such (10b7b51) * Testing adding a bunch of overlays (4fa37d9) * Switch from a DBus Mock to a UAL mock (2dd036a) * Making sure to remove not going back on the loop twice (dcbe7ca) * Overlay test (8193586) * Adding in a base for the overlay tracker testing (7e61e1c) * Stealing the Mir mock (635809f) * Matching the desktop file (5013287) * Make sure the data hits the bus (4f6d0bf) * Get a basic test going (c66d1a9) * Allow directory overrides in the exec tool (3057b53) * Move blocking the recoverable problems down the stack (2112e99) * Add checking overlay tests (ea74753) * Add in a first overlay test (a856abf) * Add in support for test defined overlays (f0b638f) 2015-05-16 Ted Gould * Unref a variant and realize a TODO (f5626be) * Connect in the dispatcher and the tracker (da11a9b) * Pass along the URL as well (46fc6a8) * Add in some more error handling (d9ff2cb) * Connect into the UAL events and handle them (d280f77) * Clean up a bit (8ff5a20) 2015-05-15 Ted Gould * Track AppID as well (9b6ad41) * Setup a helper and start mir session tracking (7eca659) * Get a mock in there (8f38326) * Putting in the middle an interface to make it a little easier to test. (21f9630) * Start to flesh out the overlay tracker (1e086b8) * Steal glib-thread from pay-service (2e4b16d) * Add the overlay tracker into things (f934801) * Make sure non-archive bugs to go the package in LP (da5ac79) * Make the apport hook use the same tool (4b0db16) * Install the dumper (7627c85) * Install it (2047a12) * A small shell script to dump the contents of the URL DB in a useful way. (a84adbb) * Don't use the C file, use the lib that we have (481cf2f) * Determine whether something is an overlay (87d06f3) * Insert the overlay code (cd851db) * Connect in some recoverable problems (8e5c62f) * Add in directory search support (bd38149) 2015-05-14 Ted Gould * Building the tool (e20abc7) * Steal exec tool from Pay Service (6165f3f) * Make it so tht we have two click hooks, one for URLs and one for overlays (bc06936) 2015-05-13 Ted Gould * Require UAL 0.5 (a055c8c) 2015-01-23 CI Train Bot * Releasing 0.1+15.04.20150123-0ubuntu1 (146964c) 2015-01-23 Ted Gould * Special handling for intent URLs Fixes: #1407709 Approved by: Charles Kerr, PS Jenkins bot (afda3c0) * Small fixes from rtm review (c5b71a7) * Don't get the domain from the regular expression if we're not going to use it. (6c5aab9) * Makeing intent_domain static (12bf240) 2015-01-09 Ted Gould * Update to trunk (110a540) * Add an update directory test for intent input (f8ccecc) * Block intents that don't have a domain specified (e09d4fc) * Intent special case testing (62ad443) 2015-01-08 Ted Gould * Special handle intent domains (00b935d) 2014-12-11 CI Train Bot * Releasing 0.1+15.04.20141211-0ubuntu1 (35f3ae7) 2014-12-11 Ted Gould * Fix domain handling in generic regular expression Fixes: #1401612 Approved by: Charles Kerr (6ac6f46) * Regex wack-a-mole (abc9832) * Attching bug (6ffcee8) * Adding a webapp subdomain test (7f2002b) 2014-10-31 CI bot * Releasing 0.1+15.04.20141031-0ubuntu1 (d5f412a) 2014-10-31 Jussi Pakkanen * Ensure that tables always exist. Approved by: Ted Gould, PS Jenkins bot (f4c3010) 2014-10-31 Ted Gould * Making generic regular expression more robust Fixes: 1351222, 1384460 Approved by: Charles Kerr, PS Jenkins bot (c53e908) 2014-10-31 Jussi Pakkanen * Do a rollback when update operations fail so there are no dangling transactions. Approved by: Ted Gould, PS Jenkins bot (0c71ba9) * General cleanups Approved by: Ted Gould, PS Jenkins bot (8a542d3) 2014-10-30 Jussi Pakkanen * Dammit. (6544562) * Created test for double creation. (ad500b7) 2014-10-29 Jussi Pakkanen * Ensure tables always exist. (9c5b712) 2014-10-29 Ted Gould * Adding a test for tel: with slashes (8f08afa) 2014-10-29 Jussi Pakkanen * Do a rollback if transaction fails. (d378bb8) 2014-10-28 Jussi Pakkanen * Made -Wpedantic off in non-debug builds to work around bug caused by gdbus-codegen. (1930f8b) * Generate python test file in build directory. (2651a61) * A few dead assignment fixes from Clang static analyzer. (e1f2302) * Created ignore file and populated it with common things. (456479a) * Moved test configuration from command line options to a configuration header. (04e5683) 2014-10-24 Jussi Pakkanen * Fix header guards. (f86fbf6) * Use nullptr in C++. (84ea7fd) * Enable more warnings and fix issues raised. (633e69e) 2014-10-23 Ted Gould * Attaching bug (e3feae5) * Adding the test from the bug (6408782) * Fixing the test (9640fda) * A helpful debug name (b9ad98c) * Check that we thing we got an app id (064c9cb) * Adding a tel test (58d0840) * Make the generic regular expression more general (ad8a9be) 2014-09-25 CI bot * Releasing 0.1+14.10.20140925-0ubuntu1 (1ea218d) 2014-09-25 Ted Gould * Update tests to work with new UAL requirements Fixes: 1370735 Approved by: Charles Kerr, PS Jenkins bot (6a56441) * Drop file based URLs for Music and Video Fixes: 1340952 Approved by: Charles Kerr (2731cb6) 2014-09-22 Ted Gould * Changing variable name to be more descriptive (af06fe5) * Updating to trunk (2ef2697) 2014-09-17 Ted Gould * Attaching bug (45eb6ab) * Adding a desktop file for lookup with the new UAL (a51b127) 2014-09-05 CI bot * Releasing 0.1+14.10.20140905.1-0ubuntu1 (71ca09f) 2014-09-05 Ted Gould * Throw a bad_url on the appid 'unconfined' Approved by: Charles Kerr, PS Jenkins bot (58585e2) 2014-09-02 Ted Gould * Make it so the bad-url errors are easier to find in Daisy (786c9c4) * Throw a bad_url on the appid 'unconfined' (738e82b) 2014-08-27 CI bot * Releasing 0.1+14.10.20140827-0ubuntu1 (012e752) 2014-08-27 Ted Gould * Support for unity8-dash URLs even though it's not an application Fixes: 1361349 Approved by: Michał Sawicz, Charles Kerr, PS Jenkins bot (44f9ef7) * Split update jobs into independent jobs Approved by: Charles Kerr, PS Jenkins bot (47b90ea) 2014-08-26 Ted Gould * Adding in a test for the focus signal (847dcd8) * Check the parameters to ensure the URL is there (a455fce) * Adding in a dash mock (a4531ee) 2014-08-25 Ted Gould * Setting up the dispatching of the URL (cb63496) * Add a URL db to the test (fc3c45c) * Create a test with a dash mock (cf9cbf0) * Dropping the scope regular expression in favor of having the dash provide a url configuration file. (337705a) * Add testing for the scope URI format (acff153) * Actually send the Open request to the dash (0785f54) * Match the scope regular expression (01eee5a) * Add a function to send to the dash (1e67dee) * Adding in a scope regular expression (cae34e4) 2014-08-20 Ted Gould * Split the update into two different jobs (7ec366c) * We don't use the utilities anymore, just the lib which will get automatically grabbed (fb66629) * Drop workaround for 1302117 (4f83418) 2014-08-19 CI bot * Releasing 0.1+14.10.20140819.1-0ubuntu1 (c8772f5) 2014-08-19 Ted Gould * Test replacing a timestamp Approved by: PS Jenkins bot, Rodney Dawes (75dad66) * Ensure send works even without a mainloop Fixes: 1356077 Approved by: Charles Kerr, PS Jenkins bot (db52f29) * Use dbus-test-runner for the tests (8af7113) * Don't start it, just wait (42dd2ef) 2014-08-18 Ted Gould * Check to see if URL Dispatcher is running and then send status (c8bb6c6) 2014-08-17 Ted Gould * Just looking for the DB file (dfc6d3d) * Test to ensure we can update with the same value (46b32a3) * Ensuring that URL disptcher gets started before us (6750187) 2014-08-15 Ted Gould * Attaching bug (6627e1d) * Avoid getting the proxy so that we can just call one level of indirection (60d18ad) * Adding a test for using the lib without a mainloop (9e96052) 2014-08-14 Ted Gould * Adding a test to ensure we can replace a timestamp (124fa00) 2014-07-24 CI bot * Releasing 0.1+14.10.20140724-0ubuntu1 (1f9d4c0) * Replaced 0replaceme with real versions. (006a8e0) 2014-07-24 Brendan Donegan * Add url-dispatcher-testability binary package. Approved by: Ted Gould, Leo Arias (764cbb0) 2014-07-24 Ted Gould * Add a TestURL function to determine which AppID will be used for a given URL Approved by: Charles Kerr, PS Jenkins bot (64fcddc) * Make the database handle multiple writers more robustly Approved by: Charles Kerr, PS Jenkins bot (a51189b) 2014-07-23 Ted Gould * Test the error case as well (866973f) * Handle multiple URLs (4929890) * Test the test url function on the service (ca183c5) * Go throught the array with a counter (14df0dd) 2014-07-22 Leo Arias * Added python3:Depends as suggested by Colin. (70df07c) 2014-07-22 Brendan Donegan * Use .in file to set bin_dir (4a508ad) 2014-07-21 Brendan Donegan * Add copyright header (3f5ac46) * Update signature (d8757bf) 2014-07-20 Brendan Donegan * CTest works now (8911bdd) 2014-07-17 Ted Gould * Add documentation for return value (f838715) 2014-07-17 Brendan Donegan * CMake changes to get url_dispatcher_testability tested with CMake (b9c5d6d) * Refactor fake dispatcher to split into two modules (5cab705) 2014-07-16 Ted Gould * Add symbol (f679743) * Test the restriction feature (8bc2d95) * Pull the restriction logic into its own function so that we can test it (1dc13e5) * Ensure we're testing the restricted function as well (361f16a) * Fix libtest for new API (da7ea35) * Ensure we always send a string (4c90b0a) 2014-07-16 Brendan Donegan * Add url-dispatcher-tools to control file (c6823b4) 2014-07-15 Ted Gould * Send a formal error if we get restricted (8efa01f) * Refactor to handle the case of the restricted package. (b095c8e) * Send along the package information for restricted dispatch (706600e) * Add package to the dispatch URL method (7b8413f) * Some documentation, which is a good thing (c3a1d0c) * Add a dispatch restricted prototype (56ff6b8) * Adjust test to new API (f5ba3b1) 2014-07-15 Brendan Donegan * Add python3-fixtures to build-deps (a164bc5) 2014-07-15 Ted Gould * Look through the URLs we're given (6332eaf) * Changing API to be sets of strings (9e57a87) 2014-07-15 Brendan Donegan * Add testtools as a build-dep (38b1eca) 2014-07-15 Ted Gould * Attaching bug (2af4f0a) * Dropping the file URL tests (5207156) * Drop the file based URLs (ad174ff) 2014-07-15 Brendan Donegan * Add url-dispatcher-testability which provides a fake URL dispatcher for testing, and a test for the same. (7ec335d) 2014-07-14 Ted Gould * Adding in new symbol (4cec94e) * Adding a test for the TestURL library function (ca42f33) * Access function for the URL test (e59caa4) 2014-07-12 Ted Gould * Align to new API (b3c6b9b) * Refactoring test to handle new API (05c4525) * Rename function to make more sense (1c2cd5a) * Rename the function to have it make more sense (fc94b0d) 2014-07-11 Ted Gould * Adding a test URL handler (081cdba) * Making dispatch_url a little more generic (e753052) * Add a TestURL method (3bc1e72) 2014-07-09 Ted Gould * Create the tables all at once in a transaction. h/t Pete and Michal (af22c7a) 2014-07-07 Ted Gould * Make it so that we try to ensure the updates all happen as sequentially as possible so we don't get in fights over the database (33ddd5b) * Put the database into WAL mode for shared memory overlaping of writes (7d9ed32) 2014-06-19 CI bot * Releasing 0.1+14.10.20140619-0ubuntu1 (eb20a50) 2014-06-19 Ted Gould * Improving error messages and collecting more data (4fae33d) 2014-06-06 Ted Gould * Oops, Python (a072cf8) * Adding in apport help from the cache (cef5f85) * Better error messages through strings (ed966ef) * Fix dir_search leak on error (a858e71) 2014-06-04 CI bot * Releasing 0.1+14.10.20140604-0ubuntu1 (f7a5662) 2014-06-04 Ted Gould * Recoverable errors on DB errors on update (afb2dd9) * Merge and review policies (35aa2fc) * Const our strings (bef5db6) * Update to trunk (f1acfd3) 2014-06-01 CI bot * Releasing 0.1+14.10.20140601-0ubuntu1 (03c4ac0) 2014-06-01 Ted Gould * Changing to Ubuntu App Launch (cdc5cb1) 2014-05-27 Ted Gould * Add error for unable to set the notification time as well (8701326) * Add recoverable errors for database issues (d00434e) * UAL rename (4dc4731) 2014-05-26 Ted Gould * Missed a build variable (792bc3d) * Changing to Ubuntu App Launch (b3e8b41) 2014-04-03 CI bot * Releasing 0.1+14.04.20140403-0ubuntu1 (67948fe) 2014-04-03 Ted Gould * Fix cache directory permissions if they got messed up Fixes: 1290997 (ac631e9) * Marking this as 'fixed' for url-dispatcher (338868d) * Putting in umasks for now (e17db7e) * Fixing the cache directory permissions if they're broke (c232d50) 2014-03-31 CI bot * Releasing 0.1+14.04.20140331.1-0ubuntu1 (631d257) 2014-03-31 Ted Gould * Migrate test suite to use libclick based libual (07f4f5c) * Switch to using libupstart-app-launch for discovering AppIDs (46db324) * Make it so that URLs can be installed with configuration files. (950a097) * Add a timeout before tearing down the bus (6b84cf7) 2014-03-24 Ted Gould * Make these tests work with the new scheme better (48121e7) * Switch from a click command like to a click db based test (3391e95) 2014-03-14 Ted Gould * Update to trunk (b69be32) * Update to trunk (c1313b9) * Free the fail string (cbf3bc8) * Make a failure to close a recoverable problem (55e527a) * Only check if a directory (c2be298) * Change function name to match logic of return (42b8573) * Error if protocol is NULL (442ec67) * Make sure to free GError (d4482cb) * Adding author notes in copyright headers (6b4a597) 2014-02-17 CI bot * Releasing 0.1+14.04.20140217.1-0ubuntu1 (7005302) 2014-02-17 Ted Gould * Update Upstart mock for the new UAL (7809355) * Flushing trunk with a release (9cdd060) 2014-02-13 Ted Gould * Don't remove the source here, do that when it gets removed below (b392973) * Update Upstart mock for the new UAL (e46c872) 2014-02-04 Ted Gould * Adding some merge review policies (8044d31) * Some manual tests (797afa5) 2014-01-30 Ted Gould * Flushing trunk with a release (ad5c197) 2014-01-29 Ted Gould * Drop runtime dep on click. UAL has one, but we don't. (d74ebc9) * Drop the click exec variable we aren't using anyway (ba0c4e2) 2014-01-28 Ted Gould * Getting the tests working with the new world order (22cdd0b) * Switch to the UAL function for resolving the triplet (f156466) 2014-01-14 Ted Gould * Forgot to add deps on sqlite3 (fc12991) 2014-01-13 Ted Gould * Change home directory notation (1fb3695) * Fixing the regular expression to make the / optional (bfa9b6f) * Trying to work around a seeming Upstart bug (24a513b) * Selecting files so we get less errors (314aa18) * Print on removing files (c4059c3) * Add a schema version to make our lives easier later (d4c2e30) * Reshuffle so we only handle the case if we can make things better (a71a0e1) * Check out the directory and handle files (586396b) * Fix warning (9b98d4c) * Switching to events to be a little cleaner (b8cf531) * Simplifying (9a3fc24) * Include click in the packaging (4d34349) * Add in a click hook for URLs (d6b346d) * Switch to using the update job instead of calling the utility for single instance per-directory (8443787) * Switching to one job with a match instead of two jobs (cabb272) * Update to all the new naming (9ee03a5) * Add test to ensure we don't duplicate entries on files that haven't been updated (3d2d946) * Make sure to put the cache into a test directory (9fb0e22) * We don't support that anymore (1d93009) * Special casing the file URLs, we can't kill them :-( (fc45b2a) * Dropping the alarm test, it's not testing anything new anymore (c860062) * Setup the URL database to have the test entries in it (5f30e58) * Use the right match variable (bf69b03) * Add a generic protocol regular expression to grab the db entries (cd25bcb) * Test to ensure removing a directory removes the entries for it (b50f00b) * Test to ensure removing a file removes the entiry in the DB (dc48783) * Switching so if a directory doesn't exist we'll remove all entries that were for it in the database (9f6b5ee) * Need a return (bea7e67) * Handling removal of deleted files (69e661a) * Splitting up the communcation to the database into multiple execs (e4b1783) * Test to ensure removal (fails) (bf86d6a) * Add a test for a directory that isn't there (13117fa) * Function to remove file data (53581ca) * Fix a typo in the tests (697b18d) * Build the search term in C (fda6931) * Adding a test to find the files (8e6a954) * Return the files that are in a directory (0e1445c) 2014-01-10 Ted Gould * Add a compeating URL file (93d9b75) * Make sure the lenght goes the right direction (6bf7095) * Adding a test for suffix basics (cb8e309) * Making sure to copy the memory right away (9c5596a) * Making the SQL do our work and suffix and sort for us (2890606) * Fixing up the test, making things work (15296af) * Fixing the SQL (c00c6cc) * Get the URL back in the test (c89ca52) * Flsehing out how to get the url from the db (17ab155) * Adding a function to find a URL (e65c9d8) * Switch from having the hardcoded list of paterns to using the database to look them up (bc4591f) * Filter out extra noise from coverage (b62171c) * Same URL from more files (bdfc7b0) * Make sure the urls are unique (e5e031e) * Check for duplicate entries in the same file (2c34541) * Adding one with lots of different entries (7f4aad3) * XML file to test (b445f7c) * Make sure we know what suffixs we have (93db36c) * Boot strapping the varried test (b0783aa) * Moving the directory so we can have more (b38d652) * Move the DB creation just to make sure we can have two connections to the DB (c2fd315) * Checking for a URL in the database as well (9fa8138) * Check for a file in the DB (961ecbc) * Make the full filename instead of just the file name in the directory (c46c8e0) * Adding a test for a simple single entry that is good (1f89a07) * Flesh out the not existing test (33e3ed4) * Adding a basic test for the directory update tool (7293513) 2014-01-09 Ted Gould * Fixing out of tree builds (bf1a3f9) * Insert a URL as well (726934f) * Make sure to return false if we can't find any data (3ef10df) * Check out the timestamps (a5fe642) * Check the types of the columns to ensure everything is there (dc9de8d) * Setting up the URL db test framework (a99c9de) * Putting the DB code into its own lib to make testing easier (bbb7249) * Fleshing out setting the timestamp (d85aa8e) * Code to hopefully get the timestamp (be9903a) * Fleshing out inserting a URL (ec8d2bb) * Doing the per entry url handling (6ef4bda) * Start parsing up the url discription file (5b2d585) * Do the checks on file modification times (7065592) * Fleshing out main (33095f6) * Adding an update directory tool (e190b26) * Copyright header (a8dafa9) * Prototyping out some new functions (26b822d) * Make a url-db header (e2640be) * Change to url-db so we can throw other things there (f4b254d) 2014-01-08 Ted Gould * Adding in some code to create a database all nice like (6c7e0b5) * Get the constant builder templates (9cd7f18) * Adding a create db sql list and along with a script to test it (11ccee7) 2014-01-03 Ted Gould * Adding in an architecture diagram (598fd0c) 2014-01-02 Ted Gould * Adding in the refresh job (5f81bee) * Adding watch upstart jobs (17f1ff3) 2013-12-10 Łukasz 'sil2100' Zemczak * Merge back two distro release changelog entries (50be5da) * We don't care for the arch change bits (28b35ec) * Merge back two distro release changelog entries (46b3937) 2013-12-06 Ted Gould * Upgrading to libupstart-app-launch v2. (ed00403) * Upgrading to libupstart-app-launch v2 (31bc3bc) 2013-11-20 Ted Gould * Add tests for the library and service as a binary. (91f2840) * Grab dbusmock for the test suite (ee6fa83) 2013-11-08 Ted Gould * Make sure there aren't two app ids and that we don't leak a string (3670735) * Make sure to let the environment go (2471d9a) * Unref the test variant (779fef3) 2013-11-07 Ted Gould * Make sure to TERM so we get the coverage results (721b6c6) * Add a sigterm handler (4e0ceca) * Make sure we have our env var for the session bus usage (87d4bdb) * A test that actually runs the service (c2733bb) * Better name (ce9944c) * A bit more sane (3d4f93d) * Fleshing out the test, but it's not right yet (e9d4a20) * Setup our fixture (e5bbc82) * Adding a dummy test for the lib (a4a4320) * Depend on dbustest (8ebd68a) 2013-10-14 Automatic PS uploader * Releasing 0.1+13.10.20131014.2-0ubuntu1 (revision 38 from lp:url-dispatcher). (889cd5e) * Releasing 0.1+13.10.20131014.2-0ubuntu1, based on r38 (169a943) 2013-10-14 Michal Hruby * Revert the definition change for mediaplayer, it'll remain a non-click app for now. (4c87993) * Fix test (59c6513) * Revert the mediaplayer change to click (d4e9401) 2013-10-09 Ted Gould * Switching many core apps to Click App ID's. (5a569c9) 2013-10-08 Ted Gould * Adding more tests with each format we want to ensure works (53cf9a5) * Adding in test data and hitting it (fa11673) * Adding some test click manifests (c0282d7) * Switching packages that are going to be clicks over to the searchable app id (b3ee4e8) * Make a #define for current version (5822513) * Allow custom URIs to have variable based package specifications. (6d7e8e8) * Merge trunk to resolve conflicts (f49bf86) * Use 'click info' to get the manifest. Fixes: https://bugs.launchpad.net/bugs/1232118. (e56cb8e) * Adds the appid:// URL format. (2274055) 2013-10-05 Ted Gould * Add built directories to the includes (25affdc) 2013-10-04 Ted Gould * Update to trunk (930021e) * Adding a test for a custom URI with wildcards (e60d90d) * Making sure we get the test custom URI (fb2348e) * Adding a custom URI that we can use for testing (e7b50d8) * If we have no app id make sure to check our search version (f853a3f) * Make it so that we can have a triplet in the app structure (837efcf) * Make our click tester do info instead of pkgdir (3c158c8) * Use 'click info' to get the manifest file (bf6f5d5) * Make sure to note the runtime deps on click (314c86d) * Attaching bug (e8ffc48) 2013-10-03 Automatic PS uploader * Releasing 0.1+13.10.20131003-0ubuntu1 (revision 32 from lp:url-dispatcher). (043afe3) * Releasing 0.1+13.10.20131003-0ubuntu1, based on r32 (351dcd4) 2013-10-02 Ted Gould * Adding the alarm URL pattern. Fixes: https://bugs.launchpad.net/bugs/1233176. (a121046) 2013-10-01 Ted Gould * Again (80794b1) * Using the right app (aee4bc2) * Adding the alarm URL pattern (d5dd5fd) 2013-09-27 Ted Gould * Adding a calendar URL. Fixes: https://bugs.launchpad.net/bugs/1231136. (64a1f01) * Make dispatcher more testable and add some application:/// tests. (7c386c5) * Enfoce the ///. Fixes: https://bugs.launchpad.net/bugs/1231444. (046ae19) * Adding calendar testing (14a85d3) * Grab test harness (d17789b) 2013-09-26 Ted Gould * Cherry pick r43 from the app-id-url branch to make cancelling better (148c993) * Make click error (0b63d9e) * Test on a list of apps (3506213) * Fixing cut-and-paste error (873ba55) * Make it so that we can handle cancelling better (9650cbd) * Add some wildcards into the mix (cdd6858) * Getting soem flesh on them tests! (23388e3) * Setup an environment we can beleive in (5911e7a) * Adding in an app id test (27583e6) * Merge testability branch (ac9f83f) * Make sure to get gtest too (8d984cc) * Make sure to cancel everything when we shutdown (b7be879) * Need to allow the period character (baf3599) * Adding some more format tests (ab20dca) * Add negative tests (cf7aa1f) * Make sure to set the variable to NULL as well (1ec2eb3) * Forgot to add this to the VCS, learned the hard way (0c57bea) * Oh, a real test! (de1075f) * Copyright (cdc2035) * Making it so we can pull values out of the mock (9df44a5) * Set up the dispatcher and a bus to run it under (13f908c) * Ensure our prototypes match (36e2ffa) * Include the dispatcher header (77bbd16) * Make it so that we can dispatch a URL externally without using the dbus interface (f927d79) * Mock'in away (542c173) * Adding a stub test in (3e58425) * Adding testing as a theory (36e80aa) * Adding a base file for testing (d7cfbb8) * Pull the core dispatcher stuff into a lib (be11798) * Pulling the main out of dispatcher (e998e2e) * Enfoce the /// (644628e) * Make sure we have 3 / (e83dcfd) * Adding a calendar URL (70764db) 2013-09-24 Automatic PS uploader * Releasing 0.1+13.10.20130924.1-0ubuntu1 (revision 27 from lp:url-dispatcher). (362d30b) * Releasing 0.1+13.10.20130924.1-0ubuntu1, based on r27 (27ee082) 2013-09-20 Ted Gould * Report a recoverable problem on Bad URLs. (a32748f) 2013-09-19 Automatic PS uploader * Releasing 0.1+13.10.20130919.3-0ubuntu1 (revision 25 from lp:url-dispatcher). (54bd1c5) 2013-09-19 Ted Gould * Fix building the argument string to handle memory better (124fcc9) 2013-09-19 Automatic PS uploader * Releasing 0.1+13.10.20130919.3-0ubuntu1, based on r25 (c0149ae) 2013-09-18 Ted Gould * Add URLs for PIM apps. (b38c8e2) * Add Messages (5e78526) * Add address book (b8e2629) * Fix the URI environment variable by properly using libupstart-app-launch. (219bd33) * Fix the name of the dialer-app. (30ea30d) * Kill the TODO and use the lib (7d32e6b) * Add in Upstart App Launch (284dca7) 2013-09-17 Ted Gould * Adding in a good manifest (1fd804a) * A little utility to 'emulate' click for us (f60e8ec) * Small clean ups (cf96544) * Adding C++ (0c73a03) * Adding in Google Test (63fd897) 2013-09-18 Automatic PS uploader * Releasing 0.1+13.10.20130917.1-0ubuntu1 (revision 21 from lp:url-dispatcher). (cad9da6) 2013-09-17 Ted Gould * Adding in a testing directory (a2909c6) * Make it so that we can replace the click executable with an environment variable (9815cc3) * Missing that dot character, some people use it in URLs (05495e4) * Discover the app name from the manifest (15c95af) 2013-09-17 Automatic PS uploader * Releasing 0.1+13.10.20130917.1-0ubuntu1, based on r21 (5471f5b) 2013-09-17 Ted Gould * Handle current version (5a3d385) * Split out functions for using the manifest to determine the results. (04877b6) * Figure out the manifest file and parse it (b2e7d8d) * Add in JSON GLib to the build (ed0c08e) * Checking for precise versions and handling the easy case (66b6338) * Send back a bad URL if we can't find the app (caf6102) * Add in an App ID regular expresion handler (5ef9ca5) 2013-09-16 Ted Gould * Make it a little clearer what is happening here (47f40cd) * URLs for music and video application launching. (fcdff14) * Switch the library relationship to the service to a Suggests. (280663d) * Reporting the issue to the bug tracker, take that! (a763f19) * Set ourselves up to get the PID of the caller (d787f13) * Call webbrowser for http/https URLs. (468952d) * Stealing the recoverable problem code from URL dispatcher, trying to make it a little more modular (aa99d8f) * Adding TODOs for the file based URLs (7ed86c3) * Change name of telephony app (e904a7e) * Ted's rule of regular expressions: When in doubt, add extra backslashes (714ad03) * Pull the username part into a define (5c130cf) * Add video (70a29d3) * Adding some music URLs (908fbe1) * Comments (a0216eb) * Start the webbrowser on HTTP/HTTPS requests (5db0d09) 2013-09-15 Ted Gould * Switch the library relationship to the service to a Suggests (c2ac586) 2013-08-23 Automatic PS uploader * Releasing 0.1+13.10.20130823-0ubuntu1 (revision 17 from lp:url-dispatcher). (1f21336) * Releasing 0.1+13.10.20130823-0ubuntu1, based on r17 (66a71f3) 2013-08-22 Ted Gould * Adding a URL format for system settings. (5468246) 2013-08-21 Ted Gould * Adding a URL for system settings (d3796da) 2013-07-26 Automatic PS uploader * Releasing 0.1+13.10.20130726-0ubuntu1 (revision 15 from lp:url-dispatcher). (4290731) * Releasing 0.1+13.10.20130726-0ubuntu1, based on r15 (273d5f5) 2013-07-25 Łukasz 'sil2100' Zemczak * Add symbols file, modify the package's short descriptions. (c23d162) * Missed pre-depends (23e2102) * Add symbols file, modify the package's short descriptions (ec7b08b) 2013-07-25 Automatic PS uploader * Releasing 0.1+13.10.20130725.1-0ubuntu1 (revision 13 from lp:url-dispatcher). (0663b01) * Releasing 0.1+13.10.20130725.1-0ubuntu1, based on r13 (c8a8de5) 2013-07-18 Łukasz 'sil2100' Zemczak * Additional packaging changes, since some things got missed last time. (71085d8) 2013-07-16 Łukasz 'sil2100' Zemczak * Argh, we need gdbus-codegen, so libglib2.0-dev is needed (along with python) (0b1d6df) * Change the order, missing Pre-Depends: in one package (cf925d9) * Additional packaging changes, since some things got missed last time (537edba) 2013-07-10 Łukasz 'sil2100' Zemczak * Modifications related to compliance with our packaging standards. (132fc57) * Modifications related to compliance with our packaging standards (4d2a927) 2013-07-10 Ted Gould * Flesh out the service. (5ec0ca1) * Flesh out the library. (fc0bb58) 2013-07-09 Ted Gould * Protecting from symbol theives (23b5b43) * Print g_spawn error (547be1f) * Make sure to use the return value of bad_url() (be37a29) * Make sure to not keep a ref to the bus (12c6919) * Use G_DEFINE_QUARK to save some code (83bfe31) * Make sure to free the generated command line (7dda97a) * Freeing the match info even on non-match (dd585da) * Make sure to unref the proxy (9622350) 2013-07-08 Ted Gould * Setting up a table of URLS to look to try and match others (73f61d3) * Fixing match and added debug info (1147306) * Flesh out a pre-libupstart version of the signal emitting (1272871) * Handle the application URLs (21a303a) * Generate an error on a bad URL (262028f) * Get the name, and handle loss (69ddf31) * Connecting in the interface skeleton (c82ebae) * Getting the dbus connection (8659b09) * Got a main loop, let's get started (44bf769) 2013-07-03 Ted Gould * Handling the URL being dispatched out there (9488b72) * Fleshing out the proxy getting (10b2c8a) * Getting the proxy callback setup (831ee8b) * Adding the generated headers into the build (283789f) 2013-06-28 Ted Gould * Packaging (a51df66) * A build system (924cd83) * A package config file (b5dbd55) * Adding in the base service (a36aefe) * Making the naming consistent (c72a417) * A little command line utility using the lib (a906f91) * Adding in some basis for a library (c395694) 2013-06-27 Ted Gould * Basic data stuff we need (728415d) * Discussing the point of the project (fbc0e4b) lomiri-url-dispatcher-0.1.3/MERGE-REVIEW000066400000000000000000000010201446007567600175230ustar00rootroot00000000000000 This documents the expections that the project has on what both submitters and reviewers should ensure that they've done for a merge into the project. == Submitter Responsibilities == * Ensure the project compiles and the test suite executes without error * Ensure that non-obvious code has comments explaining it == Reviewer Responsibilities == * Did the Jenkins build compile? Pass? Run unit tests successfully? * Are there appropriate tests to cover any new functionality? * Run all the appropriate manual tests lomiri-url-dispatcher-0.1.3/NEWS000066400000000000000000000025441446007567600164550ustar00rootroot00000000000000Overview of changes in lomiri-url-dispatcher 0.1.3 - Upgrade C++ standard to C++17 (fixes build with googletest 1.13.0) Overview of changes in lomiri-url-dispatcher 0.1.2 - Support lomiri-app-launch's no-mirclient-build. - Require lomiri-app-launch >= 0.1.3. - CMake: Bump mininum version requirement to 3.5. - Modernize i18n. - Localization files (gettext) added. - Translation updates. Overview of changes in lomiri-url-dispatcher 0.1.1 - service/bad-url/exec-tool.cpp: Fix missing include of (for std::runtime_error()). - debian/*: Adopt DEB packaging from official Debian package where appropriate - Fix compile error with new glib versions - Stop using deprecated GTimeVal. - Start lomiri-url-dispatcher using DBus activation - Use Lomiri components in bad-url and correct db path in -dump - Fix QML dialog - Watch URL files and update the database - Start com.lomiri.URLDispatcher D-Bus service if not running - Allow DBus activation by AppArmor-confined apps - Fix concurrent sqlite DB access issues - Add ordering dependency and make lomiri-url-service more robust - Rename app ID of the bad-url-helper to be consistent - Re-introduce click hook - Fix generic URL regex. - Add option to disable mirclient overlay Overview of changes in lomiri-url-dispatcher 0.1.0 - Fork / renamed from url-dispatcher. . lomiri-url-dispatcher-0.1.3/README.md000066400000000000000000000015451446007567600172350ustar00rootroot00000000000000# Lomiri URL Dispatcher ## Introduction This is a small handler to take URLs and do what is appropriate with them. That could be anything from launching a web browser to just starting an application. This is done over DBus because application confinement doesn't allow for doing it from a confined application otherwise. It's important the that applications can't know about each other, so this is a fire and forget type operation. ## i18n: Translating Lomiri URL Dispatcher into your Language You can easily contribute to the localization of this project (i.e. the translation into your language) by visiting (and signing up with) the Hosted Weblate service: https://hosted.weblate.org/projects/lomiri/lomiri-url-dispatcher The localization platform of this project is sponsored by Hosted Weblate via their free hosting plan for Libre and Open Source Projects. lomiri-url-dispatcher-0.1.3/cmake/000077500000000000000000000000001446007567600170315ustar00rootroot00000000000000lomiri-url-dispatcher-0.1.3/cmake/ConstantBuilderTemplates.cmake000066400000000000000000000007321446007567600250140ustar00rootroot00000000000000 file(READ "${input}" input_contents) string(REGEX REPLACE "\n" " " input_on_one_line "${input_contents}") set(new_contents "\#include \"${name}.h\"\nconst char * ${const_name} = \"${input_on_one_line}\";\n") if (EXISTS "${file_target}") file(READ "${file_target}" old_contents) if(NOT new_contents EQUAL old_contents) file(WRITE "${file_target}" "${new_contents}") endif() else() file(WRITE "${file_target}" "${new_contents}") endif() lomiri-url-dispatcher-0.1.3/cmake/UseConstantBuilder.cmake000066400000000000000000000012321446007567600236060ustar00rootroot00000000000000cmake_minimum_required(VERSION 3.5) if(POLICY CMP0011) cmake_policy(SET CMP0011 NEW) endif(POLICY CMP0011) macro(add_constant_template outfiles name const_name input) set(file_target "${CMAKE_CURRENT_BINARY_DIR}/${name}.c") add_custom_command( OUTPUT ${file_target} COMMAND ${CMAKE_COMMAND} "-Dname=${name}" "-Dfile_target=${file_target}" "-Dconst_name=${const_name}" "-Dinput=${input}" -P "${CMAKE_SOURCE_DIR}/cmake/ConstantBuilderTemplates.cmake" DEPENDS "${CMAKE_SOURCE_DIR}/cmake/ConstantBuilderTemplates.cmake" "${input}" ) list(APPEND ${outfiles} "${file_target}") endmacro(add_constant_template) lomiri-url-dispatcher-0.1.3/cmake/UseGlibGeneration.cmake000066400000000000000000000054451446007567600234110ustar00rootroot00000000000000cmake_minimum_required(VERSION 3.5) if(POLICY CMP0011) cmake_policy(SET CMP0011 NEW) endif(POLICY CMP0011) find_program(GLIB_MKENUMS glib-mkenums) find_program(GLIB_GENMARSHAL glib-genmarshal) macro(add_glib_marshal outfiles name prefix otherinclude) add_custom_command( OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${name}.h" COMMAND ${GLIB_GENMARSHAL} --header "--prefix=${prefix}" "${CMAKE_CURRENT_SOURCE_DIR}/${name}.list" > "${CMAKE_CURRENT_BINARY_DIR}/${name}.h" DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/${name}.list" ) add_custom_command( OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${name}.c" COMMAND echo "\\#include \\\"${otherinclude}\\\"" > "${CMAKE_CURRENT_BINARY_DIR}/${name}.c" COMMAND echo "\\#include \\\"glib-object.h\\\"" >> "${CMAKE_CURRENT_BINARY_DIR}/${name}.c" COMMAND echo "\\#include \\\"${name}.h\\\"" >> "${CMAKE_CURRENT_BINARY_DIR}/${name}.c" COMMAND ${GLIB_GENMARSHAL} --body "--prefix=${prefix}" "${CMAKE_CURRENT_SOURCE_DIR}/${name}.list" >> "${CMAKE_CURRENT_BINARY_DIR}/${name}.c" DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/${name}.list" "${CMAKE_CURRENT_BINARY_DIR}/${name}.h" ) list(APPEND ${outfiles} "${CMAKE_CURRENT_BINARY_DIR}/${name}.c") endmacro(add_glib_marshal) macro(add_glib_enumtypes_t outfiles name htemplate ctemplate) add_custom_command( OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${name}.h" COMMAND ${GLIB_MKENUMS} --template "${htemplate}" ${ARGN} > "${CMAKE_CURRENT_BINARY_DIR}/${name}.h" WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} DEPENDS ${ARGN} "${htemplate}" ) add_custom_command( OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${name}.c" COMMAND ${GLIB_MKENUMS} --template "${ctemplate}" ${ARGN} > "${CMAKE_CURRENT_BINARY_DIR}/${name}.c" WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} DEPENDS ${ARGN} ${ctemplate} "${CMAKE_CURRENT_BINARY_DIR}/${name}.h" ) list(APPEND ${outfiles} "${CMAKE_CURRENT_BINARY_DIR}/${name}.c") endmacro(add_glib_enumtypes_t) macro(add_glib_enumtypes outfiles name namespace includeguard) set(htemplate "${CMAKE_CURRENT_BINARY_DIR}/${name}.h.template") set(ctemplate "${CMAKE_CURRENT_BINARY_DIR}/${name}.c.template") # Write the .h template add_custom_command( OUTPUT ${htemplate} ${ctemplate} COMMAND ${CMAKE_COMMAND} "-Dctemplate=${ctemplate}" "-Dhtemplate=${htemplate}" "-Dname=${name}" "-Dnamespace=${namespace}" "-Dincludeguard=${includeguard}" "\"-Dheaders=${ARGN}\"" -P "${CMAKE_SOURCE_DIR}/cmake/GlibGenerationTemplates.cmake" DEPENDS "${CMAKE_SOURCE_DIR}/cmake/GlibGenerationTemplates.cmake" ${headers} ) add_glib_enumtypes_t(${outfiles} ${name} ${htemplate} ${ctemplate} ${ARGN}) endmacro(add_glib_enumtypes) lomiri-url-dispatcher-0.1.3/data/000077500000000000000000000000001446007567600166625ustar00rootroot00000000000000lomiri-url-dispatcher-0.1.3/data/CMakeLists.txt000066400000000000000000000037751446007567600214360ustar00rootroot00000000000000 ########################### # Set stuff ########################### set(pkglibexecdir "${CMAKE_INSTALL_FULL_LIBEXECDIR}/lomiri-url-dispatcher") set(datadir "${CMAKE_INSTALL_FULL_DATADIR}") ########################### # DBus Interfaces, Service ########################### configure_file( com.lomiri.URLDispatcher.service.in ${CMAKE_CURRENT_BINARY_DIR}/com.lomiri.URLDispatcher.service ) install( FILES ${CMAKE_CURRENT_BINARY_DIR}/com.lomiri.URLDispatcher.service DESTINATION ${DBUSSERVICEDIR} ) install( FILES com.lomiri.URLDispatcher.xml DESTINATION ${DBUSIFACEDIR} ) ########################### # systemd ########################### configure_file( lomiri-url-dispatcher.service.in ${CMAKE_CURRENT_BINARY_DIR}/lomiri-url-dispatcher.service ) configure_file( lomiri-url-dispatcher-update-system-dir.path.in ${CMAKE_CURRENT_BINARY_DIR}/lomiri-url-dispatcher-update-system-dir.path ) configure_file( lomiri-url-dispatcher-update-system-dir.service.in ${CMAKE_CURRENT_BINARY_DIR}/lomiri-url-dispatcher-update-system-dir.service ) configure_file( lomiri-url-dispatcher-update-user-dir.path.in ${CMAKE_CURRENT_BINARY_DIR}/lomiri-url-dispatcher-update-user-dir.path ) configure_file( lomiri-url-dispatcher-update-user-dir.service.in ${CMAKE_CURRENT_BINARY_DIR}/lomiri-url-dispatcher-update-user-dir.service ) install( FILES ${CMAKE_CURRENT_BINARY_DIR}/lomiri-url-dispatcher.service ${CMAKE_CURRENT_BINARY_DIR}/lomiri-url-dispatcher-update-system-dir.path ${CMAKE_CURRENT_BINARY_DIR}/lomiri-url-dispatcher-update-system-dir.service ${CMAKE_CURRENT_BINARY_DIR}/lomiri-url-dispatcher-update-user-dir.path ${CMAKE_CURRENT_BINARY_DIR}/lomiri-url-dispatcher-update-user-dir.service DESTINATION ${SYSTEMD_USER_UNIT_DIR} ) ########################### # Click Hook ########################### configure_file("lomiri-url-dispatcher.hook.in" "${CMAKE_SOURCE_DIR}/debian/lomiri-url-dispatcher.hook" @ONLY ) ########################### # QML ########################### install( FILES bad-url.qml DESTINATION ${datadir}/lomiri-url-dispatcher ) lomiri-url-dispatcher-0.1.3/data/bad-url.qml000066400000000000000000000022641446007567600207270ustar00rootroot00000000000000/* * Copyright © 2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Lomiri.Components 1.0 import Lomiri.Components.Popups 1.0 MainView { applicationName: "com.lomiri.url-dispatcher.bad-url-prompt" automaticOrientation: true backgroundColor: "transparent" anchors.fill: parent Component { id: dialog Dialog { title: i18n.tr("Unrecognized Address") text: i18n.tr("Cannot open “%1” addresses.").arg(Qt.application.arguments[2].split(':')[0]) Button { text: i18n.tr("OK") color: LomiriColors.orange onClicked: Qt.quit() } } } Component.onCompleted: PopupUtils.open(dialog) } lomiri-url-dispatcher-0.1.3/data/com.lomiri.URLDispatcher.service.in000066400000000000000000000003141446007567600253670ustar00rootroot00000000000000[D-BUS Service] Name=com.lomiri.URLDispatcher Exec=@CMAKE_INSTALL_FULL_LIBEXECDIR@/lomiri-url-dispatcher/lomiri-url-dispatcher SystemdService=lomiri-url-dispatcher.service AssumedAppArmorLabel=unconfined lomiri-url-dispatcher-0.1.3/data/com.lomiri.URLDispatcher.xml000066400000000000000000000006041446007567600241240ustar00rootroot00000000000000 lomiri-url-dispatcher-0.1.3/data/lomiri-url-dispatcher-update-system-dir.path.in000066400000000000000000000002711446007567600277420ustar00rootroot00000000000000[Unit] Description=Lomiri URL dispatcher directory watcher [Path] PathChanged=@CMAKE_INSTALL_FULL_DATAROOTDIR@/lomiri-url-dispatcher/urls/ [Install] WantedBy=graphical-session.target lomiri-url-dispatcher-0.1.3/data/lomiri-url-dispatcher-update-system-dir.service.in000066400000000000000000000004341446007567600304470ustar00rootroot00000000000000[Unit] Description=Lomiri URL dispatcher system directory updater [Service] Type=oneshot ExecStart=@CMAKE_INSTALL_FULL_LIBEXECDIR@/lomiri-url-dispatcher/lomiri-update-directory @CMAKE_INSTALL_FULL_DATAROOTDIR@/lomiri-url-dispatcher/urls/ [Install] WantedBy=graphical-session.target lomiri-url-dispatcher-0.1.3/data/lomiri-url-dispatcher-update-user-dir.path.in000066400000000000000000000002431446007567600273730ustar00rootroot00000000000000[Unit] Description=Lomiri URL dispatcher directory watcher [Path] PathChanged=%h/.config/lomiri-url-dispatcher/urls/ [Install] WantedBy=graphical-session.target lomiri-url-dispatcher-0.1.3/data/lomiri-url-dispatcher-update-user-dir.service.in000066400000000000000000000004041446007567600300760ustar00rootroot00000000000000[Unit] Description=Lomiri URL dispatcher user directory updater [Service] Type=oneshot ExecStart=@CMAKE_INSTALL_FULL_LIBEXECDIR@/lomiri-url-dispatcher/lomiri-update-directory %h/.config/lomiri-url-dispatcher/urls/ [Install] WantedBy=graphical-session.target lomiri-url-dispatcher-0.1.3/data/lomiri-url-dispatcher.hook.in000066400000000000000000000002771446007567600243760ustar00rootroot00000000000000Pattern: ${home}/.cache/lomiri-url-dispatcher/urls/${id}.url-dispatcher Exec: @pkglibexecdir@/lomiri-update-directory $HOME/.cache/lomiri-url-dispatcher/urls/ User-Level: yes Hook-Name: urls lomiri-url-dispatcher-0.1.3/data/lomiri-url-dispatcher.service.in000066400000000000000000000003241446007567600250670ustar00rootroot00000000000000[Unit] Description=Lomiri URL dispatcher After=graphical-session.target [Service] Type=dbus BusName=com.lomiri.URLDispatcher ExecStart=@CMAKE_INSTALL_FULL_LIBEXECDIR@/lomiri-url-dispatcher/lomiri-url-dispatcher lomiri-url-dispatcher-0.1.3/debian/000077500000000000000000000000001446007567600171735ustar00rootroot00000000000000lomiri-url-dispatcher-0.1.3/debian/Jenkinsfile000066400000000000000000000006511446007567600213610ustar00rootroot00000000000000@Library('ubports-build-tools') _ buildAndProvideDebianPackage() // Or if the package consists entirely of arch-independent packages: // (optional optimization, will confuse BlueOcean's live view at build stage) // buildAndProvideDebianPackage(/* isArchIndependent */ true) // Optionally, to skip building on some architectures (amd64 is always built): // buildAndProvideDebianPackage(false, /* ignoredArchs */ ['arm64']) lomiri-url-dispatcher-0.1.3/debian/apparmor/000077500000000000000000000000001446007567600210145ustar00rootroot00000000000000lomiri-url-dispatcher-0.1.3/debian/apparmor/lomiri-url-dispatcher-bad-url-helper000066400000000000000000000004751446007567600277650ustar00rootroot00000000000000# vim:syntax=apparmor #include # Mostly unconfined. Don't allow capability or any mount rules. Also ensure that # exec inherits from this profile profile lomiri-url-dispatcher-bad-url-helper (attach_disconnected) { network, / rwkl, /** rwlkm, /** pix, dbus, signal, ptrace, unix, } lomiri-url-dispatcher-0.1.3/debian/changelog000066400000000000000000000322771446007567600210600ustar00rootroot00000000000000lomiri-url-dispatcher (0.1.3) unstable; urgency=medium * Upstream-provided Debian package for lomiri-url-dispatcher. See upstream ChangeLog for recent changes. -- UBports developers Wed, 26 Jul 2023 03:49:50 +0200 lomiri-url-dispatcher (0.1.2) unstable; urgency=medium * Upstream-provided Debian package for lomiri-url-dispatcher. See upstream ChangeLog for recent changes. -- UBports developers Sun, 05 Feb 2023 01:37:53 +0100 lomiri-url-dispatcher (0.1.1) unstable; urgency=medium [ UBports developers ] * Upstream-provided Debian package for lomiri-url-dispatcher. See upstream ChangeLog for recent changes. -- UBports developers Tue, 03 Jan 2023 09:19:33 +0100 lomiri-url-dispatcher (0.1.0-0) unstable; urgency=medium * Upstream-provided Debian package for lomiri-url-dispatcher. See upstream ChangeLog for recent changes. -- Mike Gabriel Thu, 28 May 2020 07:57:14 +0200 url-dispatcher (0.2+ubports) bionic; urgency=medium * Imported to UBports -- UBports auto importer Fri, 13 Oct 2017 19:54:36 +0200 url-dispatcher (0.1+17.04.20170328-0ubuntu1) zesty; urgency=medium * Fix deprecation warning in mir mock. * The unity8-dash interface is actually com.canonical.UnityDash. * Use libwhoopsie for reporting recoverable problems. * Convert service main process and url-dispatcher tool code to C++. -- Rodney Dawes Tue, 28 Mar 2017 18:29:07 +0000 url-dispatcher (0.1+17.04.20170318-0ubuntu1) zesty; urgency=medium * Update bad-url exec tool to UAL C++ interface * Remove Upstart from the test suite and replace it with systemd -- Ted Gould Sat, 18 Mar 2017 19:59:26 +0000 url-dispatcher (0.1+17.04.20170314-0ubuntu1) zesty; urgency=medium [ Charles Kerr ] * Honor XDG_CACHE_HOME in url-dispatcher-dump and url-dispatcher.conf [ Rodney Dawes ] * Remove click usage and support. * Use gmock module from cmake-extras. * Use the coverage support from cmake-extras. * Use cmake-extras intltool support. * Use gdbus integration from cmake-extras. * Remove unused gsettings cmake module. -- Rodney Dawes Tue, 14 Mar 2017 14:35:03 +0000 url-dispatcher (0.1+17.04.20170308.1-0ubuntu1) zesty; urgency=medium * Don't use upstart to get unity8 pid. -- Rodney Dawes Wed, 08 Mar 2017 20:43:30 +0000 url-dispatcher (0.1+17.04.20170227.2-0ubuntu1) zesty; urgency=medium [ Ken VanDine ] * Handle UAL API bump [ Rodney Dawes ] * Remove tests that depend on libertine, as url-dispatcher has no support for handlers in libertine anyway. -- Rodney Dawes Mon, 27 Feb 2017 19:07:50 +0000 url-dispatcher (0.1+17.04.20161206-0ubuntu1) zesty; urgency=medium [ Ted Gould ] * Instead of sleeping make the refresh tasks low enough priority they don't get in the way (LP: #1645793) * Start after Unity8 so it has a chance to set the MIR_SOCKET -- Michael Terry Tue, 06 Dec 2016 14:38:17 +0000 url-dispatcher (0.1+17.04.20161108-0ubuntu1) zesty; urgency=medium * Support running inside a snap. -- Michael Terry Tue, 08 Nov 2016 22:16:56 +0000 url-dispatcher (0.1+17.04.20161107-0ubuntu1) zesty; urgency=medium [ Florian Boucault ] * Crossbuilding Fixes [ Larry Price ] * App ID should allow package names with dots. (LP: #1591342) (LP: #1606498) [ Ted Gould ] * Check versions of appid:// urls to reduce the number of invalid appids we send to UAL (LP: #1352656) * Scope testing for the scope:// URL and overlays that should be over the dash * Protect the dash from getting NULL urls (LP: #1476257) * Make sure URL Overlays are shutdown on exit * Remove the wildcard that is confusing the update script (LP: #1461496) * Not using a message that isn't set properly (LP: #1608009) * Fixing tests to adjust for UAL changes * Add a small GUI helper tool for testing * Show error dialog over apps that use Bad URLs (LP: #1370008) -- Ted Gould Mon, 07 Nov 2016 16:33:15 +0000 url-dispatcher (0.1+16.10.20160816.1-0ubuntu1) yakkety; urgency=medium * No chnage rebuild for UAL migration -- Ted Gould Tue, 16 Aug 2016 15:20:27 +0000 url-dispatcher (0.1+16.04.20151110-0ubuntu2) xenial; urgency=high * No change rebuild for s390x. -- Dimitri John Ledkov Fri, 11 Dec 2015 01:30:51 +0000 url-dispatcher (0.1+16.04.20151110-0ubuntu1) xenial; urgency=medium [ CI Train Bot ] * New rebuild forced. [ Ted Gould ] * Remove the cache if the service fails to start. Fail to start if we can't create the database. (LP: #1483854) -- Bill Filler Tue, 10 Nov 2015 14:37:07 +0000 url-dispatcher (0.1+15.10.20150717-0ubuntu1) wily; urgency=medium [ Andreas Pokorny ] * unchagned for mir release 0.14.0 -- CI Train Bot Fri, 17 Jul 2015 12:37:44 +0000 url-dispatcher (0.1+15.10.20150612-0ubuntu1) wily; urgency=medium [ Ted Gould ] * Add upstart build dep for tests on Wily * Provide a small tool to dump the URL DB in a readable form * Support URL Overlays of content in a trusted session without a desktop file -- CI Train Bot Fri, 12 Jun 2015 16:00:40 +0000 url-dispatcher (0.1+15.04.20150123-0ubuntu1) vivid; urgency=low [ Ted Gould ] * Special handling for intent URLs (LP: #1407709) -- Ubuntu daily release Fri, 23 Jan 2015 15:19:33 +0000 url-dispatcher (0.1+15.04.20141211-0ubuntu1) vivid; urgency=low [ Ted Gould ] * Fix domain handling in generic regular expression (LP: #1401612) -- Ubuntu daily release Thu, 11 Dec 2014 19:43:40 +0000 url-dispatcher (0.1+15.04.20141031-0ubuntu1) vivid; urgency=low [ Ted Gould ] * Making generic regular expression more robust (LP: #1351222) [ Jussi Pakkanen ] * General cleanups * Do a rollback when update operations fail so there are no dangling transactions. * Ensure that tables always exist. -- Ubuntu daily release Fri, 31 Oct 2014 15:51:36 +0000 url-dispatcher (0.1+14.10.20140925-0ubuntu1) utopic; urgency=low [ Ted Gould ] * Drop file based URLs for Music and Video (LP: #1340952) * Update tests to work with new UAL requirements (LP: #1370735) -- Ubuntu daily release Thu, 25 Sep 2014 13:29:40 +0000 url-dispatcher (0.1+14.10.20140905.1-0ubuntu1) utopic; urgency=low [ Ted Gould ] * Throw a bad_url on the appid 'unconfined' -- Ubuntu daily release Fri, 05 Sep 2014 03:40:44 +0000 url-dispatcher (0.1+14.10.20140827-0ubuntu1) utopic; urgency=low [ Ted Gould ] * Split update jobs into independent jobs * Support for unity8-dash URLs even though it's not an application (LP: #1361349) -- Ubuntu daily release Wed, 27 Aug 2014 02:10:21 +0000 url-dispatcher (0.1+14.10.20140819.1-0ubuntu1) utopic; urgency=low [ Ted Gould ] * Ensure send works even without a mainloop (LP: #1356077) * Test replacing a timestamp -- Ubuntu daily release Tue, 19 Aug 2014 21:01:10 +0000 url-dispatcher (0.1+14.10.20140724-0ubuntu1) utopic; urgency=low [ Ubuntu daily release ] * debian/liburl-dispatcher1.symbols: auto-update to released version [ Ted Gould ] * Make the database handle multiple writers more robustly * Add a TestURL function to determine which AppID will be used for a given URL [ Leo Arias ] * Add url-dispatcher-testability binary package. [ Brendan Donegan ] * Add url-dispatcher-testability binary package. -- Ubuntu daily release Thu, 24 Jul 2014 17:10:14 +0000 url-dispatcher (0.1+14.10.20140619-0ubuntu1) utopic; urgency=low [ Ted Gould ] * Improving error messages and collecting more data -- Ubuntu daily release Thu, 19 Jun 2014 02:43:30 +0000 url-dispatcher (0.1+14.10.20140604-0ubuntu1) utopic; urgency=low [ Ted Gould ] * Merge and review policies * Recoverable errors on DB errors on update -- Ubuntu daily release Wed, 04 Jun 2014 19:07:02 +0000 url-dispatcher (0.1+14.10.20140601-0ubuntu1) utopic; urgency=low [ Ted Gould ] * Changing to Ubuntu App Launch -- Ubuntu daily release Sun, 01 Jun 2014 20:53:35 +0000 url-dispatcher (0.1+14.04.20140403-0ubuntu1) trusty; urgency=low [ Ted Gould ] * Fix cache directory permissions if they got messed up (LP: #1290997) -- Ubuntu daily release Thu, 03 Apr 2014 21:17:00 +0000 url-dispatcher (0.1+14.04.20140331.1-0ubuntu1) trusty; urgency=low [ Ted Gould ] * Make it so that URLs can be installed with configuration files. * Switch to using libupstart-app-launch for discovering AppIDs * Migrate test suite to use libclick based libual -- Ubuntu daily release Mon, 31 Mar 2014 17:18:43 +0000 url-dispatcher (0.1+14.04.20140217.1-0ubuntu1) trusty; urgency=low [ Ted Gould ] * Add tests for the library and service as a binary. * Upgrading to libupstart-app-launch v2. * Flushing trunk with a release * Update Upstart mock for the new UAL -- Ubuntu daily release Mon, 17 Feb 2014 17:58:44 +0000 url-dispatcher (0.1+14.04.20131209.1-0ubuntu2) trusty; urgency=low * Restrict on which arch we build url-dispatcher due to the ust build-dep -- Didier Roche Mon, 09 Dec 2013 13:41:41 +0100 url-dispatcher (0.1+14.04.20131209.1-0ubuntu1) trusty; urgency=low * Cherry-pick libupstart-app-launch API/ABI bump from trunk -- Łukasz 'sil2100' Zemczak Fri, 06 Dec 2013 14:32:26 +0100 url-dispatcher (0.1+13.10.20131014.2-0ubuntu1) saucy; urgency=low [ Michal Hruby ] * Revert the definition change for mediaplayer, it'll remain a non- click app for now. [ Ted Gould ] * Adds the appid:// URL format. * Use 'click info' to get the manifest. (LP: #1232118) * Allow custom URIs to have variable based package specifications. * Switching many core apps to Click App ID's. [ Ubuntu daily release ] * Automatic snapshot from revision 38 -- Ubuntu daily release Mon, 14 Oct 2013 18:07:27 +0000 url-dispatcher (0.1+13.10.20131003-0ubuntu1) saucy; urgency=low [ Ted Gould ] * Enfoce the ///. (LP: #1231444) * Make dispatcher more testable and add some application:/// tests. * Adding a calendar URL. (LP: #1231136) * Adding the alarm URL pattern. (LP: #1233176) [ Ubuntu daily release ] * Automatic snapshot from revision 32 -- Ubuntu daily release Thu, 03 Oct 2013 02:08:19 +0000 url-dispatcher (0.1+13.10.20130924.1-0ubuntu1) saucy; urgency=low [ Ted Gould ] * Report a recoverable problem on Bad URLs. [ Ubuntu daily release ] * Automatic snapshot from revision 27 -- Ubuntu daily release Tue, 24 Sep 2013 06:09:10 +0000 url-dispatcher (0.1+13.10.20130919.3-0ubuntu1) saucy; urgency=low [ Ted Gould ] * Fix the name of the dialer-app. * Fix the URI environment variable by properly using libupstart-app- launch. * Add URLs for PIM apps. [ Ubuntu daily release ] * Automatic snapshot from revision 25 -- Ubuntu daily release Thu, 19 Sep 2013 14:05:04 +0000 url-dispatcher (0.1+13.10.20130917.1-0ubuntu1) saucy; urgency=low [ Ted Gould ] * Call webbrowser for http/https URLs. * Switch the library relationship to the service to a Suggests. * URLs for music and video application launching. [ Ubuntu daily release ] * Automatic snapshot from revision 21 -- Ubuntu daily release Tue, 17 Sep 2013 22:11:05 +0000 url-dispatcher (0.1+13.10.20130823-0ubuntu1) saucy; urgency=low [ Ted Gould ] * Adding a URL format for system settings. [ Ubuntu daily release ] * Automatic snapshot from revision 17 -- Ubuntu daily release Fri, 23 Aug 2013 02:06:01 +0000 url-dispatcher (0.1+13.10.20130726-0ubuntu1) saucy; urgency=low [ Łukasz 'sil2100' Zemczak ] * Add symbols file, modify the package's short descriptions. [ Ubuntu daily release ] * Automatic snapshot from revision 15 -- Ubuntu daily release Fri, 26 Jul 2013 00:02:46 +0000 url-dispatcher (0.1+13.10.20130725.1-0ubuntu1) saucy; urgency=low [ Łukasz 'sil2100' Zemczak ] * Remove debian/watch * debian/control: - Modifications related to compliance with our packaging standards * Add copyright info to the source code * Automatic snapshot from revision 11 (bootstrap) * Additional packaging changes, since some things got missed last time. [ Ubuntu daily release ] * Automatic snapshot from revision 13 -- Ubuntu daily release Thu, 25 Jul 2013 07:52:47 +0000 url-dispatcher (0.1-0ubuntu1) saucy; urgency=low * Start -- Ted Gould Thu, 27 Jun 2013 11:36:18 -0500 lomiri-url-dispatcher-0.1.3/debian/control000066400000000000000000000116231446007567600206010ustar00rootroot00000000000000Source: lomiri-url-dispatcher Section: gnome Priority: optional Maintainer: UBports developers Build-Depends: cmake, cmake-extras (>= 1.2), dbus-test-runner, debhelper-compat (= 12), dh-apparmor, dh-python, gcovr, googletest, intltool, lcov, libapparmor-dev, libdbus-1-dev, libdbustest1-dev (>= 14.04.0), libglib2.0-dev, libgtest-dev, libjson-glib-dev, libsqlite3-dev, liblomiri-app-launch-dev (>= 0.1.3), python3, python3-dbusmock, python3-fixtures, python3-nose, python3-testtools, sqlite3, systemd, Standards-Version: 4.5.1 Rules-Requires-Root: no Homepage: https://gitlab.com/ubports/core/lomiri-url-dispatcher Package: lomiri-url-dispatcher Architecture: any Multi-Arch: same Pre-Depends: ${misc:Pre-Depends}, Depends: ${misc:Depends}, ${shlibs:Depends}, lomiri-url-dispatcher-common (>= ${source:Version}), # For the bad URL dialog qtchooser, qml-module-lomiri-components, Description: Lomiri Operating Environment service for requesting URLs to be opened Allows applications to request a URL to be opened and handled by another process without seeing the list of other applications on the system or starting them inside its own Application Confinement. . This package provides a service for the Lomiri URL Dispatcher Package: lomiri-url-dispatcher-common Architecture: all Multi-Arch: foreign Pre-Depends: ${misc:Pre-Depends}, Depends: ${misc:Depends}, Description: Lomiri Operating Environment service for requesting URLs to be opened (common files) Allows applications to request a URL to be opened and handled by another process without seeing the list of other applications on the system or starting them inside its own Application Confinement. . This package provides arch-indep files for Lomiri URL Dispatcher server and client (esp. locale files). Package: lomiri-url-dispatcher-tools Architecture: any Depends: lomiri-url-dispatcher (= ${binary:Version}), ${misc:Depends}, ${shlibs:Depends}, Description: Tools for working with the Lomiri URL Dispatcher Allows applications to request a URL to be opened and handled by another process without seeing the list of other applications on the system or starting them inside its own Application Confinement. . This package provides tools for working with the Lomiri URL Dispatcher. Package: lomiri-url-dispatcher-tools-gui Architecture: any Depends: lomiri-url-dispatcher (= ${binary:Version}), ${misc:Depends}, ${shlibs:Depends}, qtchooser, qml-module-lomiri-components-labs, Description: GUI tools for working with the Lomiri URL Dispatcher Allows applications to request a URL to be opened and handled by another process without seeing the list of other applications on the system or starting them inside its own Application Confinement. . This package provides GUI tools for working with the Lomiri URL Dispatcher. Package: liblomiri-url-dispatcher0 Section: libs Architecture: any Multi-Arch: same Pre-Depends: ${misc:Pre-Depends}, Depends: ${misc:Depends}, ${shlibs:Depends}, lomiri-url-dispatcher-common (>= ${source:Version}), Suggests: lomiri-url-dispatcher (= ${binary:Version}), Description: Library for sending requests to the Lomiri URL Dispatcher Allows applications to request a URL to be opened and handled by another process without seeing the list of other applications on the system or starting them inside its own Application Confinement. . This package contains shared libraries to be used by applications. Package: liblomiri-url-dispatcher-dev Section: libdevel Architecture: any Multi-Arch: same Pre-Depends: ${misc:Pre-Depends}, Depends: libglib2.0-dev, liblomiri-url-dispatcher0 (= ${binary:Version}), ${misc:Depends}, ${shlibs:Depends}, Description: Development files for consumers of the Lomiri URL Dispatcher Allows applications to request a URL to be opened and handled by another process without seeing the list of other applications on the system or starting them inside its own Application Confinement. . This package contains files that are needed to build applications. Package: lomiri-url-dispatcher-testability Architecture: all Depends: ${misc:Depends}, python3, python3-dbusmock, python3-dbus, Description: Fake Lomiri URL Dispatcher for use in testing Allows applications to request a URL to be opened and handled by another process without seeing the list of other applications on the system or starting them inside its own Application Confinement. . This package contains a fake Lomiri URL Dispatcher for use in testing. lomiri-url-dispatcher-0.1.3/debian/copyright000066400000000000000000000126651446007567600211400ustar00rootroot00000000000000Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ Upstream-Name: URL Dispatcher Upstream-Contact: Marius Gripsgard Source: https://gitlab.com/ubports/core/lomiri-url-dispatcher Files: .bzrignore CMakeLists.txt ChangeLog Jenkinsfile MERGE-REVIEW NEWS README cmake/ConstantBuilderTemplates.cmake cmake/UseConstantBuilder.cmake cmake/UseGlibGeneration.cmake data/CMakeLists.txt data/com.lomiri.URLDispatcher.xml docs/URL*Dispatcher*Architecture.svg gui/CMakeLists.txt gui/lomiri-url-dispatcher-gui.desktop.in gui/lomiri-url-dispatcher-gui.qml gui/lomiri-url-dispatcher-gui.svg liblomiri-url-dispatcher/lomiri-url-dispatcher.pc.in po/CMakeLists.txt po/genpotfiles.sh po/url-dispatcher.pot service/CMakeLists.txt service/bad-url/CMakeLists.txt service/create-db-sql.h service/create-db.sql service/url-overlay/CMakeLists.txt tests/CMakeLists.txt tests/manual tests/overlay-dir/com.test.good_application_1.2.3.desktop tests/test-config.h.in tests/test-sql.sh tests/test-urls-intent/intent-mixed.url-dispatcher tests/test-urls-intent/intent-no-good.url-dispatcher tests/test-urls-intent/intent-single.url-dispatcher tests/test-urls-simple/single-good.url-dispatcher tests/test-urls-varied/bad-filename-suffix.url-launcher tests/test-urls-varied/dup-file-1.url-dispatcher tests/test-urls-varied/dup-file-2.url-dispatcher tests/test-urls-varied/duplicate.url-dispatcher tests/test-urls-varied/lots-o-entries.url-dispatcher tests/test-urls-varied/not-json.url-dispatcher tests/test-urls-varied/object-base.url-dispatcher tests/ual-link-farm/com.test.good_app1_1.2.3.desktop tests/ual-link-farm/com.test.multiple_app-first_1.2.3.desktop tests/url_dispatcher_testability/CMakeLists.txt tests/url_dispatcher_testability/__init__.py tests/xdg-cache/libertine-container/container-id/rootfs/usr/share/applications/org.canonical.app1.desktop tests/xdg-data/applications/foo-bar.desktop tests/xdg-data/libertine/ContainersConfig.json tools/CMakeLists.txt tools/lomiri-url-dispatcher-dump Copyright: 2013-2017, Canonical, Ltd. License: LGPL-3 Comment: No license headers in files. Assuming license and copyright holders from other project files (and the COPYING file). Files: liblomiri-url-dispatcher/lomiri-url-dispatcher.c liblomiri-url-dispatcher/lomiri-url-dispatcher.h service/dispatcher.c service/dispatcher.h service/service.cpp service/update-directory.c service/url-db.c service/url-db.h tests/apparmor-mock.c tests/apparmor-mock.h tests/directory-update-test.cc tests/dispatcher-test.cc tests/lib-test-no-main.c tests/lib-test.cc tests/lomiri-app-launch-mock.c tests/lomiri-app-launch-mock.h tests/service-test.cc tests/url-db-test.cc tools/url-dispatcher.cpp Copyright: 2013, Canonical, Ltd. 2013-2017, Canonical, Ltd. 2014, Canonical, Ltd. 2015, Canonical, Ltd. 2017, Canonical, Ltd. License: LGPL-3 Files: data/bad-url.qml service/bad-url/exec-tool.cpp service/glib-thread.cpp service/glib-thread.h service/overlay-tracker-iface.h service/overlay-tracker-mir.cpp service/overlay-tracker-mir.h service/overlay-tracker.cpp service/overlay-tracker.h service/url-overlay/exec-tool.c tests/systemd-mock.h Copyright: 2014, Canonical Ltd. 2015, Canonical Ltd. 2017, Canonical Ltd. License: GPL-3 Files: tests/mir-mock.cpp tests/mir-mock.h tests/overlay-tracker-mock.h tests/overlay-tracker-test.cpp Copyright: 2015, Canonical, Ltd. License: GPL-3 Files: tests/url_dispatcher_testability/fake_dispatcher.py tests/url_dispatcher_testability/fixture_setup.py tests/url_dispatcher_testability/test_fake_dispatcher.py.in Copyright: 2014, Canonical Ltd. License: LGPL-3 Files: liblomiri-url-dispatcher/CMakeLists.txt Copyright: 2013-2017, Canonical Ltd. License: LGPL-3 Comment: Generated file. . No license headers in files. Assuming license and copyright holders from other project files (and the COPYING file). Files: debian/* Copyright: 2013-2017, Canonical, Ltd. 2020, Mike Gabriel License: LGPL-3 License: LGPL-3 This package is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; version 3 of the License. . This package is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. . You should have received a copy of the GNU General Public License along with this program. If not, see . . On Debian systems, the complete text of the GNU Lesser General Public License can be found in "/usr/share/common-licenses/LGPL-3". License: GPL-3 This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3 of the License. . This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. . You should have received a copy of the GNU General Public License along with this program. If not, see . . On Debian systems, the full text of the GNU General Public License version 3 can be found in the file /usr/share/common-licenses/GPL-3. lomiri-url-dispatcher-0.1.3/debian/liblomiri-url-dispatcher-dev.install000066400000000000000000000001721446007567600262450ustar00rootroot00000000000000usr/include/liblomiri-url-dispatcher/* usr/lib/*/liblomiri-url-dispatcher.so usr/lib/*/pkgconfig/lomiri-url-dispatcher.pc lomiri-url-dispatcher-0.1.3/debian/liblomiri-url-dispatcher0.install000066400000000000000000000000511446007567600255450ustar00rootroot00000000000000usr/lib/*/liblomiri-url-dispatcher.so.0* lomiri-url-dispatcher-0.1.3/debian/liblomiri-url-dispatcher0.symbols000066400000000000000000000003651446007567600255770ustar00rootroot00000000000000liblomiri-url-dispatcher.so.0 liblomiri-url-dispatcher0 #MINVER# *Build-Depends-Package: liblomiri-url-dispatcher-dev lomiri_url_dispatch_send@Base 0.1.1 lomiri_url_dispatch_send_restricted@Base 0.1.1 lomiri_url_dispatch_url_appid@Base 0.1.1 lomiri-url-dispatcher-0.1.3/debian/lomiri-url-dispatcher-common.install000066400000000000000000000000211446007567600262610ustar00rootroot00000000000000usr/share/locale/lomiri-url-dispatcher-0.1.3/debian/lomiri-url-dispatcher-testability.install000066400000000000000000000001021446007567600273260ustar00rootroot00000000000000usr/lib/python*/dist-packages/lomiri_url_dispatcher_testability/* lomiri-url-dispatcher-0.1.3/debian/lomiri-url-dispatcher-tools-gui.install000066400000000000000000000000751446007567600267240ustar00rootroot00000000000000usr/share/applications/ usr/share/lomiri-url-dispatcher/gui/ lomiri-url-dispatcher-0.1.3/debian/lomiri-url-dispatcher-tools-gui.lintian-overrides000066400000000000000000000002721446007567600307130ustar00rootroot00000000000000# we launch a QML/QtQuick application, so this is ok... lomiri-url-dispatcher-tools-gui: desktop-command-not-in-package usr/share/applications/lomiri-url-dispatcher-gui.desktop qmlscene lomiri-url-dispatcher-0.1.3/debian/lomiri-url-dispatcher-tools.install000066400000000000000000000000361446007567600261370ustar00rootroot00000000000000usr/bin/lomiri-url-dispatcher lomiri-url-dispatcher-0.1.3/debian/lomiri-url-dispatcher-tools.lintian-overrides000066400000000000000000000002321446007567600301250ustar00rootroot00000000000000# WIP: https://gitlab.com/ubports/core/lomiri-url-dispatcher/-/issues/1 lomiri-url-dispatcher-tools: binary-without-manpage usr/bin/lomiri-url-dispatcher lomiri-url-dispatcher-0.1.3/debian/lomiri-url-dispatcher.install000066400000000000000000000005611446007567600250040ustar00rootroot00000000000000usr/lib/*/lomiri-url-dispatcher usr/lib/*/lomiri-app-launch/url-overlay/exec-tool usr/lib/*/lomiri-app-launch/bad-url/exec-tool usr/share/dbus-1 usr/lib/systemd/user usr/share/lomiri-url-dispatcher/bad-url.qml usr/bin/lomiri-url-dispatcher-dump debian/apparmor/lomiri-url-dispatcher-bad-url-helper etc/apparmor.d debian/lomiri-url-dispatcher.hook usr/share/click/hooks lomiri-url-dispatcher-0.1.3/debian/lomiri-url-dispatcher.lintian-overrides000066400000000000000000000002311446007567600267660ustar00rootroot00000000000000# WIP: https://gitlab.com/ubports/core/lomiri-url-dispatcher/-/issues/1 lomiri-url-dispatcher: binary-without-manpage usr/bin/lomiri-url-dispatcher-dump lomiri-url-dispatcher-0.1.3/debian/rules000077500000000000000000000012231446007567600202510ustar00rootroot00000000000000#!/usr/bin/make -f export DPKG_GENSYMBOLS_CHECK_LEVEL = 4 export G_MESSAGES_DEBUG=all export URL_DISPATCHER_DISABLE_RECOVERABLE_ERROR=1 ifneq ($(DEB_BUILD_GNU_TYPE),$(DEB_HOST_GNU_TYPE)) export DEB_BUILD_PROFILES := cross endif include /usr/share/dpkg/buildflags.mk # see FEATURE AREAS in dpkg-buildflags(1) export DEB_BUILD_MAINT_OPTIONS = hardening=+all %: dh $@ override_dh_auto_configure: dh_auto_configure -- -DCMAKE_BUILD_TYPE=debug override_dh_missing: dh_missing --fail-missing override_dh_apparmor: dh_apparmor --profile-name=lomiri-url-dispatcher-bad-url-helper -p lomiri-url-dispatcher override_dh_auto_test: dh_auto_test --no-parallel lomiri-url-dispatcher-0.1.3/debian/source/000077500000000000000000000000001446007567600204735ustar00rootroot00000000000000lomiri-url-dispatcher-0.1.3/debian/source/format000066400000000000000000000000041446007567600217000ustar00rootroot000000000000001.0 lomiri-url-dispatcher-0.1.3/docs/000077500000000000000000000000001446007567600167015ustar00rootroot00000000000000lomiri-url-dispatcher-0.1.3/docs/URL Dispatcher Architecture.svg000066400000000000000000000451101446007567600245370ustar00rootroot00000000000000 image/svg+xml URL DispatcherUser Service DBus URL DispatcherUpdate Tool SQLiteURLCache Upstart Click Click PackageInstall orRemoval Session InitRefresh Configurationfile change Readonly Readwrite Upstart AppLaunch lomiri-url-dispatcher-0.1.3/gui/000077500000000000000000000000001446007567600165355ustar00rootroot00000000000000lomiri-url-dispatcher-0.1.3/gui/CMakeLists.txt000066400000000000000000000012051446007567600212730ustar00rootroot00000000000000include(FindGettext) install(FILES lomiri-url-dispatcher-gui.qml lomiri-url-dispatcher-gui.svg DESTINATION "${CMAKE_INSTALL_DATADIR}/lomiri-url-dispatcher/gui/") install(FILES ${CMAKE_CURRENT_BINARY_DIR}/lomiri-url-dispatcher-gui.desktop DESTINATION "${CMAKE_INSTALL_DATADIR}/applications/") configure_file(${DESKTOP_FILE}.in.in ${DESKTOP_FILE}.in) add_custom_target(${DESKTOP_FILE} ALL COMMENT "Merging translations into ${DESKTOP_FILE}..." COMMAND ${GETTEXT_MSGFMT_EXECUTABLE} --desktop --template=${CMAKE_CURRENT_BINARY_DIR}/${DESKTOP_FILE}.in -o ${DESKTOP_FILE} -d ${CMAKE_SOURCE_DIR}/po ) lomiri-url-dispatcher-0.1.3/gui/lomiri-url-dispatcher-gui.desktop.in.in000066400000000000000000000006141446007567600261440ustar00rootroot00000000000000[Desktop Entry] Name=Lomiri URL Dispatcher GUI Icon=@CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_DATADIR@/lomiri-url-dispatcher/gui/lomiri-url-dispatcher-gui.svg Type=Application Exec=qmlscene @CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_DATADIR@/lomiri-url-dispatcher/gui/lomiri-url-dispatcher-gui.qml Keywords=Lomiri;URL;dispatcher;request;open;application; X-Ubuntu-Touch=true X-Ubuntu-Single-Instance=true lomiri-url-dispatcher-0.1.3/gui/lomiri-url-dispatcher-gui.qml000066400000000000000000000020251446007567600242500ustar00rootroot00000000000000import QtQuick 2.4 import Lomiri.Components 1.3 import Lomiri.Components.ListItems 1.3 MainView { applicationName: "lomiri-url-dispatcher-gui" Page { header: PageHeader { title: i18n.tr("URL Dispatcher GUI") flickable: flickme } Flickable { id: flickme anchors.fill: parent Column { anchors.fill: parent ListItem { contentItem.anchors { leftMargin: units.gu(2) rightMargin: units.gu(2) topMargin: units.gu(1) bottomMargin: units.gu(1) } TextField { id: textbox anchors.fill: parent placeholderText: i18n.tr("URL (e.g. 'https://example.com')") } } ListItem { contentItem.anchors { leftMargin: units.gu(2) rightMargin: units.gu(2) topMargin: units.gu(1) bottomMargin: units.gu(1) } Button { anchors.fill: parent text: i18n.tr("Send URL") onClicked: { console.log("Sending URL: " + textbox.text) Qt.openUrlExternally(textbox.text) } } } } } } } lomiri-url-dispatcher-0.1.3/gui/lomiri-url-dispatcher-gui.svg000066400000000000000000000401021446007567600242540ustar00rootroot00000000000000 image/svg+xml lomiri-url-dispatcher-0.1.3/liblomiri-url-dispatcher/000077500000000000000000000000001446007567600226575ustar00rootroot00000000000000lomiri-url-dispatcher-0.1.3/liblomiri-url-dispatcher/CMakeLists.txt000066400000000000000000000030601446007567600254160ustar00rootroot00000000000000 ########################### # Version Information ########################### set(API_VERSION 0) set(ABI_VERSION 0) ########################### # Lib ########################### set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fvisibility=hidden") include_directories(${CMAKE_CURRENT_BINARY_DIR}) set(DISPATCHER_HEADERS lomiri-url-dispatcher.h ) set(DISPATCHER_SOURCES lomiri-url-dispatcher.c ) add_library(dispatcher SHARED ${DISPATCHER_SOURCES}) set_target_properties(dispatcher PROPERTIES VERSION ${API_VERSION}.0.0 SOVERSION ${ABI_VERSION} OUTPUT_NAME "lomiri-url-dispatcher" ) target_link_libraries(dispatcher service-generated ${GLIB2_LIBRARIES} ${GOBJECT2_LIBRARIES} -Wl,--no-undefined ) ########################### # Coverage ########################### set_property(GLOBAL APPEND PROPERTY COVERAGE_TARGETS dispatcher) ########################### # Pkg Config ########################### set(DISPATCHER_PC "lomiri-url-dispatcher.pc") set(apiversion "${API_VERSION}") set(libdir "${CMAKE_INSTALL_FULL_LIBDIR}") set(includedir "${CMAKE_INSTALL_FULL_INCLUDEDIR}") set(VERSION "${ABI_VERSION}") configure_file("lomiri-url-dispatcher.pc.in" "${CMAKE_CURRENT_BINARY_DIR}/${DISPATCHER_PC}" @ONLY) ########################### # Installation ########################### install( FILES ${DISPATCHER_HEADERS} DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/liblomiri-url-dispatcher" ) install( FILES "${CMAKE_CURRENT_BINARY_DIR}/${DISPATCHER_PC}" DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig" ) install( TARGETS dispatcher LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} ) lomiri-url-dispatcher-0.1.3/liblomiri-url-dispatcher/lomiri-url-dispatcher.c000066400000000000000000000106431446007567600272460ustar00rootroot00000000000000/** * Copyright (C) 2013 Canonical, Ltd. * * This program is free software: you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License version 3, as published by * the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranties of MERCHANTABILITY, * SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * */ #include "lomiri-url-dispatcher.h" #include typedef struct _dispatch_data_t dispatch_data_t; struct _dispatch_data_t { LomiriURLDispatchCallback cb; gpointer user_data; gchar * url; gchar * package; }; static void lomiri_url_dispatched (GObject * obj, GAsyncResult * res, gpointer user_data) { GError * error = NULL; dispatch_data_t * dispatch_data = (dispatch_data_t *)user_data; g_dbus_connection_call_finish( G_DBUS_CONNECTION(obj), res, &error); if (error != NULL) { g_warning("Unable to dispatch url '%s':%s", dispatch_data->url, error->message); g_error_free(error); if (dispatch_data->cb != NULL) { dispatch_data->cb(dispatch_data->url, FALSE, dispatch_data->user_data); } } else { if (dispatch_data->cb != NULL) { dispatch_data->cb(dispatch_data->url, TRUE, dispatch_data->user_data); } } g_free(dispatch_data->url); g_free(dispatch_data->package); g_free(dispatch_data); return; } void lomiri_url_dispatch_send (const gchar * url, LomiriURLDispatchCallback cb, gpointer user_data) { lomiri_url_dispatch_send_restricted(url, NULL, cb, user_data); } void lomiri_url_dispatch_send_restricted (const gchar * url, const gchar * package, LomiriURLDispatchCallback cb, gpointer user_data) { GError * error = NULL; GDBusConnection * bus = g_bus_get_sync(G_BUS_TYPE_SESSION, NULL, &error); if (error != NULL) { g_warning("Unable to get session bus: %s", error->message); g_error_free(error); return; } dispatch_data_t * dispatch_data = NULL; if (cb != NULL) { dispatch_data = g_new0(dispatch_data_t, 1); dispatch_data->cb = cb; dispatch_data->user_data = user_data; dispatch_data->url = g_strdup(url); dispatch_data->package = g_strdup(package); } g_dbus_connection_call(bus, "com.lomiri.URLDispatcher", "/com/lomiri/URLDispatcher", "com.lomiri.URLDispatcher", "DispatchURL", g_variant_new("(ss)", url, package ? package : ""), NULL, G_DBUS_CALL_FLAGS_NONE, -1, /* timeout */ NULL, /* cancelable */ cb != NULL ? lomiri_url_dispatched : NULL, dispatch_data); if (cb == NULL) { g_dbus_connection_flush_sync(bus, NULL, NULL); } g_object_unref(bus); return; } gchar ** lomiri_url_dispatch_url_appid (const gchar ** urls) { GError * error = NULL; GDBusConnection * bus = g_bus_get_sync(G_BUS_TYPE_SESSION, NULL, &error); if (error != NULL) { g_warning("Unable to get session bus: %s", error->message); g_error_free(error); return NULL; } GVariant * vurls = g_variant_new_strv(urls, -1); GVariant * vparam = g_variant_new_tuple(&vurls, 1); GVariant * retval = NULL; retval = g_dbus_connection_call_sync(bus, "com.lomiri.URLDispatcher", "/com/lomiri/URLDispatcher", "com.lomiri.URLDispatcher", "TestURL", vparam, G_VARIANT_TYPE("(as)"), G_DBUS_CALL_FLAGS_NONE, -1, /* timeout */ NULL, /* cancelable */ &error); if (error != NULL) { g_warning("Unable to test URL with URL Dispatcher: %s", error->message); g_error_free(error); g_object_unref(bus); return NULL; } GVariant * varstr = g_variant_get_child_value(retval, 0); gchar ** appids = g_variant_dup_strv(varstr, NULL); g_variant_unref(varstr); g_variant_unref(retval); g_object_unref(bus); return appids; } lomiri-url-dispatcher-0.1.3/liblomiri-url-dispatcher/lomiri-url-dispatcher.h000066400000000000000000000061011446007567600272450ustar00rootroot00000000000000/** * Copyright (C) 2013 Canonical, Ltd. * * This program is free software: you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License version 3, as published by * the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranties of MERCHANTABILITY, * SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * */ #include #ifndef LOMIRI_URL_DISPATCH_H #define LOMIRI_URL_DISPATCH_H 1 #pragma GCC visibility push(default) G_BEGIN_DECLS typedef void (*LomiriURLDispatchCallback) (const gchar * url, gboolean success, gpointer user_data); /** * lomiri_url_dispatch_send: * @url: URL to send to the dispatcher * @cb: Function to call with the result of the URL processing * @user_data: data pointer for @cb * * Sends a URL to the dispatcher for processing. Most of the time, * things will work out and that URL will result in an application * being opened with the URL as requested. In some cases the URL * may not have a valid handler and an error will be returned. In * that case a bug will be filled on this package. */ void lomiri_url_dispatch_send (const gchar * url, LomiriURLDispatchCallback cb, gpointer user_data); /** * lomiri_url_dispatch_send_restricted: * @url: URL to send to the dispatcher * @cb: Function to call with the result of the URL processing * @user_data: data pointer for @cb * * Very much like lomiri_url_dispatch_send() except that it also says which * package is allowed to have the URL. This should be checked with the * lomiri_url_dispatch_url_appid() function ahead of time, but is used to avoid * races that can occur between the test and the processing. */ void lomiri_url_dispatch_send_restricted (const gchar * url, const gchar * package, LomiriURLDispatchCallback cb, gpointer user_data); /** * lomiri_url_dispatch_url_appid: * @urls: URLs to check the AppIDs for * * Takes a list of URLs and return which AppIDs will be launched to * handle those URLs. * * NOTE: This function is *not* available for confined applications and * only for trusted helpers. It could result in discovery of which * applications are installed on the system if exposed. * * Return value: (transfer full): Returns the AppIDs that match the * same order as @urls. Full transfer, free with g_strfreev(). */ gchar ** lomiri_url_dispatch_url_appid (const gchar ** urls); G_END_DECLS #pragma GCC visibility pop #endif /* LOMIRI_URL_DISPATCH_H */ lomiri-url-dispatcher-0.1.3/liblomiri-url-dispatcher/lomiri-url-dispatcher.pc.in000066400000000000000000000004501446007567600300260ustar00rootroot00000000000000libdir=@libdir@ includedir=@includedir@ Cflags: -I${includedir}/liblomiri-url-dispatcher Requires: glib-2.0 gio-2.0 Libs: -L${libdir} -llomiri-url-dispatcher Name: liblomiri-url-dispatcher Description: A Lomiri Operating Environment library for requesting a URL to be opened Version: @VERSION@ lomiri-url-dispatcher-0.1.3/po/000077500000000000000000000000001446007567600163675ustar00rootroot00000000000000lomiri-url-dispatcher-0.1.3/po/CMakeLists.txt000066400000000000000000000037441446007567600211370ustar00rootroot00000000000000include(FindGettext) find_program(GETTEXT_XGETTEXT_EXECUTABLE xgettext) if("${GETTEXT_XGETTEXT_EXECUTABLE}" STREQUAL "GETTEXT_XGETTEXT_EXECUTABLE-NOTFOUND") message(FATAL_ERROR "Could not find xgettext") endif() set(DOMAIN ${PROJECT_NAME}) set(POT_FILE ${DOMAIN}.pot) file(STRINGS ${CMAKE_CURRENT_SOURCE_DIR}/LINGUAS LINGUAS REGEX "^[^#].*") string(REGEX MATCHALL "[^ \t]+" LANGS "${LINGUAS}") configure_file(${CMAKE_CURRENT_SOURCE_DIR}/POTFILES.in ${CMAKE_CURRENT_BINARY_DIR}/POTFILES COPYONLY) add_custom_target(${POT_FILE} ALL COMMENT "Generating translation template" COMMAND ${GETTEXT_XGETTEXT_EXECUTABLE} -o ${POT_FILE} --from-code=UTF-8 --language=Desktop --package-name='${PROJECT_NAME}' --copyright-holder='Canonical Ltd.' -D ${CMAKE_BINARY_DIR} gui/${DESKTOP_FILE}.in COMMAND ${GETTEXT_XGETTEXT_EXECUTABLE} -o ${POT_FILE} -D ${CMAKE_SOURCE_DIR} -D ${CMAKE_CURRENT_SOURCE_DIR} -D ${CMAKE_CURRENT_BINARY_DIR} --from-code=UTF-8 --c++ --qt --add-comments=TRANSLATORS --keyword=_ --keyword=tr --keyword=tr:1,2 --package-name='${PROJECT_NAME}' --copyright-holder='Canonical Ltd.' --join-existing --files-from=${CMAKE_CURRENT_BINARY_DIR}/POTFILES) foreach(LANG ${LANGS}) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/${LANG}.po ${CMAKE_CURRENT_BINARY_DIR}/${LANG}.po COPYONLY) endforeach(LANG) gettext_process_pot_file(${POT_FILE} ALL INSTALL_DESTINATION ${CMAKE_INSTALL_LOCALEDIR} LANGUAGES ${LANGS}) lomiri-url-dispatcher-0.1.3/po/LINGUAS000066400000000000000000000005461446007567600174210ustar00rootroot00000000000000aa am ar ast az be bem bg bn_BD br bs ca ca@valencia cs cy da de dv el en_AU en_CA en_GB en_US eo es eu fa fi fr fr_CA fr_CH frp fur gd gl gu he hi hr hu hy id io is it ja jbo ka kab km kmr ko lb ln lo lt lv mg mi mk ml ms my nan nb_NO nl ny om pa pam pl ps pt pt_BR ro ru sc sco sd sdh shn si sk sl sq sr sv ta te tet tg th tk tr ug uk ur zh_CN zh_HK zh_TW lomiri-url-dispatcher-0.1.3/po/POTFILES.in000066400000000000000000000007401446007567600201450ustar00rootroot00000000000000data/bad-url.qml gui/lomiri-url-dispatcher-gui.qml liblomiri-url-dispatcher/lomiri-url-dispatcher.c liblomiri-url-dispatcher/lomiri-url-dispatcher.h service/bad-url/exec-tool.cpp service/create-db-sql.h service/dispatcher.h service/glib-thread.cpp service/glib-thread.h service/overlay-tracker.cpp service/overlay-tracker.h service/overlay-tracker-iface.h service/overlay-tracker-mir.cpp service/overlay-tracker-mir.h service/service.cpp service/url-db.h tools/url-dispatcher.cpp lomiri-url-dispatcher-0.1.3/po/aa.po000066400000000000000000000022301446007567600173050ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: aa\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "" #: data/bad-url.qml:35 msgid "OK" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "" lomiri-url-dispatcher-0.1.3/po/am.po000066400000000000000000000022301446007567600173210ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: am\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "" #: data/bad-url.qml:35 msgid "OK" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "" lomiri-url-dispatcher-0.1.3/po/ar.po000066400000000000000000000022301446007567600173260ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: ar\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "" #: data/bad-url.qml:35 msgid "OK" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "" lomiri-url-dispatcher-0.1.3/po/ast.po000066400000000000000000000022311446007567600175140ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: ast\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "" #: data/bad-url.qml:35 msgid "OK" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "" lomiri-url-dispatcher-0.1.3/po/az.po000066400000000000000000000022301446007567600173360ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: az\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "" #: data/bad-url.qml:35 msgid "OK" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "" lomiri-url-dispatcher-0.1.3/po/be.po000066400000000000000000000022301446007567600173120ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: be\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "" #: data/bad-url.qml:35 msgid "OK" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "" lomiri-url-dispatcher-0.1.3/po/bem.po000066400000000000000000000022311446007567600174700ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: bem\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "" #: data/bad-url.qml:35 msgid "OK" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "" lomiri-url-dispatcher-0.1.3/po/bg.po000066400000000000000000000022301446007567600173140ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: bg\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "" #: data/bad-url.qml:35 msgid "OK" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "" lomiri-url-dispatcher-0.1.3/po/bn_BD.po000066400000000000000000000022331446007567600176730ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: bn_BD\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "" #: data/bad-url.qml:35 msgid "OK" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "" lomiri-url-dispatcher-0.1.3/po/br.po000066400000000000000000000022301446007567600173270ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: br\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "" #: data/bad-url.qml:35 msgid "OK" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "" lomiri-url-dispatcher-0.1.3/po/bs.po000066400000000000000000000022301446007567600173300ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: bs\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "" #: data/bad-url.qml:35 msgid "OK" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "" lomiri-url-dispatcher-0.1.3/po/ca.po000066400000000000000000000022301446007567600173070ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: ca\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "" #: data/bad-url.qml:35 msgid "OK" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "" lomiri-url-dispatcher-0.1.3/po/ca@valencia.po000066400000000000000000000022411446007567600211140ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: ca@valencia\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "" #: data/bad-url.qml:35 msgid "OK" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "" lomiri-url-dispatcher-0.1.3/po/cs.po000066400000000000000000000030571446007567600173410ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: 2023-04-02 03:46+0000\n" "Last-Translator: Jozef Mlich \n" "Language-Team: Czech \n" "Language: cs\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" "X-Generator: Weblate 4.17-dev\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "GUI pro odesílání URL v Lomiri" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "Lomiri;URL;odesílatel;požadavek;otevřít;aplikace;" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "Nerozpoznaná adresa" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "Nelze otevřít adresu „%1“." #: data/bad-url.qml:35 msgid "OK" msgstr "OK" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "GUI pro odesílání URL" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "URL (například 'https://neběží.cz')" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "Odeslat URL" lomiri-url-dispatcher-0.1.3/po/cy.po000066400000000000000000000022301446007567600173370ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: cy\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "" #: data/bad-url.qml:35 msgid "OK" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "" lomiri-url-dispatcher-0.1.3/po/da.po000066400000000000000000000022301446007567600173100ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: da\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "" #: data/bad-url.qml:35 msgid "OK" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "" lomiri-url-dispatcher-0.1.3/po/de.po000066400000000000000000000027661446007567600173320ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: 2023-06-28 04:34+0000\n" "Last-Translator: \"J. Lavoie\" \n" "Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 4.18.1\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "Lomiri URL-Zuweiser GUI" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "Lomiri;URL;zuweisen;anfordern;öffnen;Anwendung;" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "Nicht erkannte Adresse" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "Kann Adresse \"%1\" nicht öffnen." #: data/bad-url.qml:35 msgid "OK" msgstr "OK" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "URL-Zuweiser GUI" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "URL (z.B. 'https://beispiel.com')" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "Sende URL" lomiri-url-dispatcher-0.1.3/po/dv.po000066400000000000000000000022301446007567600173350ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: dv\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "" #: data/bad-url.qml:35 msgid "OK" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "" lomiri-url-dispatcher-0.1.3/po/el.po000066400000000000000000000022301446007567600173240ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: el\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "" #: data/bad-url.qml:35 msgid "OK" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "" lomiri-url-dispatcher-0.1.3/po/en_AU.po000066400000000000000000000022331446007567600177160ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: en_AU\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "" #: data/bad-url.qml:35 msgid "OK" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "" lomiri-url-dispatcher-0.1.3/po/en_CA.po000066400000000000000000000025341446007567600177000ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: 2023-06-28 04:34+0000\n" "Last-Translator: \"Rudra Harsh V.Singh\" \n" "Language-Team: English (Canada) \n" "Language: en_CA\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 4.18.1\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "" #: data/bad-url.qml:35 msgid "OK" msgstr "OK" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "" lomiri-url-dispatcher-0.1.3/po/en_GB.po000066400000000000000000000022331446007567600177010ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: en_GB\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "" #: data/bad-url.qml:35 msgid "OK" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "" lomiri-url-dispatcher-0.1.3/po/en_US.po000066400000000000000000000022331446007567600177400ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: en_US\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "" #: data/bad-url.qml:35 msgid "OK" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "" lomiri-url-dispatcher-0.1.3/po/eo.po000066400000000000000000000025151446007567600173350ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: 2023-02-16 22:38+0000\n" "Last-Translator: phlostically \n" "Language-Team: Esperanto \n" "Language: eo\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 4.16-dev\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "" #: data/bad-url.qml:35 msgid "OK" msgstr "Bone" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "" lomiri-url-dispatcher-0.1.3/po/es.po000066400000000000000000000031321446007567600173350ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: 2023-04-06 21:55+0000\n" "Last-Translator: gallegonovato \n" "Language-Team: Spanish \n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 4.17-dev\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "Interfaz gráfica del usuario para Lomiri URL Dispatcher" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "Lomiri;URL;despachador;solicitud;abrir;aplicación;" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "Dirección desconocida" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "No se pueden abrir las direcciones \"%1\"." #: data/bad-url.qml:35 msgid "OK" msgstr "De acuerdo" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "Interfaz gráfica de usuario del asignador de URL" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "URL (por ejemplo, 'https://example.com')" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "Enviar URL" lomiri-url-dispatcher-0.1.3/po/eu.po000066400000000000000000000022301446007567600173350ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: eu\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "" #: data/bad-url.qml:35 msgid "OK" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "" lomiri-url-dispatcher-0.1.3/po/fa.po000066400000000000000000000022301446007567600173120ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: fa\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "" #: data/bad-url.qml:35 msgid "OK" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "" lomiri-url-dispatcher-0.1.3/po/fi.po000066400000000000000000000022301446007567600173220ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: fi\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "" #: data/bad-url.qml:35 msgid "OK" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "" lomiri-url-dispatcher-0.1.3/po/fr.po000066400000000000000000000027471446007567600173500ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: 2023-01-14 17:50+0000\n" "Last-Translator: Timothy G. <22472919+GTimothy@users.noreply.github.com>\n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" "X-Generator: Weblate 4.15.1-dev\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "Adresse non reconnue" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "" #: data/bad-url.qml:35 msgid "OK" msgstr "OK" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "" #~ msgid "Ubuntu can't open addresses of type “%1”." #~ msgstr "Ubuntu ne peut pas ouvrir des adresses du type \"%1\"." lomiri-url-dispatcher-0.1.3/po/fr_CA.po000066400000000000000000000022331446007567600177010ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: fr_CA\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "" #: data/bad-url.qml:35 msgid "OK" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "" lomiri-url-dispatcher-0.1.3/po/fr_CH.po000066400000000000000000000022331446007567600177100ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: fr_CH\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "" #: data/bad-url.qml:35 msgid "OK" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "" lomiri-url-dispatcher-0.1.3/po/frp.po000066400000000000000000000022311446007567600175140ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: frp\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "" #: data/bad-url.qml:35 msgid "OK" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "" lomiri-url-dispatcher-0.1.3/po/fur.po000066400000000000000000000022311446007567600175210ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: fur\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "" #: data/bad-url.qml:35 msgid "OK" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "" lomiri-url-dispatcher-0.1.3/po/gd.po000066400000000000000000000022301446007567600173160ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: gd\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "" #: data/bad-url.qml:35 msgid "OK" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "" lomiri-url-dispatcher-0.1.3/po/genpotfiles.sh000077500000000000000000000001671446007567600212510ustar00rootroot00000000000000#!/bin/sh sed '/^#/d s/^[[].*] *// /^[ ]*$/d' \ "`dirname ${0}`/POTFILES.in" | sed '$!s/$/ \\/' > POTFILES lomiri-url-dispatcher-0.1.3/po/gl.po000066400000000000000000000022301446007567600173260ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: gl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "" #: data/bad-url.qml:35 msgid "OK" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "" lomiri-url-dispatcher-0.1.3/po/gu.po000066400000000000000000000022301446007567600173370ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: gu\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "" #: data/bad-url.qml:35 msgid "OK" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "" lomiri-url-dispatcher-0.1.3/po/he.po000066400000000000000000000022301446007567600173200ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: he\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "" #: data/bad-url.qml:35 msgid "OK" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "" lomiri-url-dispatcher-0.1.3/po/hi.po000066400000000000000000000025211446007567600173270ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: 2023-06-28 04:34+0000\n" "Last-Translator: \"Rudra Harsh V.Singh\" \n" "Language-Team: Hindi \n" "Language: hi\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" "X-Generator: Weblate 4.18.1\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "" #: data/bad-url.qml:35 msgid "OK" msgstr "ठीक" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "" lomiri-url-dispatcher-0.1.3/po/hr.po000066400000000000000000000022301446007567600173350ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: hr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "" #: data/bad-url.qml:35 msgid "OK" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "" lomiri-url-dispatcher-0.1.3/po/hu.po000066400000000000000000000022301446007567600173400ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: hu\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "" #: data/bad-url.qml:35 msgid "OK" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "" lomiri-url-dispatcher-0.1.3/po/hy.po000066400000000000000000000022301446007567600173440ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: hy\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "" #: data/bad-url.qml:35 msgid "OK" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "" lomiri-url-dispatcher-0.1.3/po/id.po000066400000000000000000000022301446007567600173200ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: id\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "" #: data/bad-url.qml:35 msgid "OK" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "" lomiri-url-dispatcher-0.1.3/po/io.po000066400000000000000000000022301446007567600173330ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: io\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "" #: data/bad-url.qml:35 msgid "OK" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "" lomiri-url-dispatcher-0.1.3/po/is.po000066400000000000000000000022301446007567600173370ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: is\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "" #: data/bad-url.qml:35 msgid "OK" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "" lomiri-url-dispatcher-0.1.3/po/it.po000066400000000000000000000030631446007567600173450ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: 2023-04-02 03:46+0000\n" "Last-Translator: Sylke Vicious \n" "Language-Team: Italian \n" "Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 4.17-dev\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "Interfaccia grafica del dispatcher URL di Lomiri" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "Lomiri;URL;dispatcher;richiesta;apri;applicazione;" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "Indirizzo non Riconosciuto" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "Impossibile aprire “%1” indirizzi." #: data/bad-url.qml:35 msgid "OK" msgstr "OK" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "Interfaccia grafica del dispatcher URL" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "URL (es. 'https://example.com')" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "Invia URL" lomiri-url-dispatcher-0.1.3/po/ja.po000066400000000000000000000024661446007567600173310ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: 2023-07-14 02:23+0000\n" "Last-Translator: NPL \n" "Language-Team: Japanese \n" "Language: ja\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Weblate 5.0-dev\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "" #: data/bad-url.qml:35 msgid "OK" msgstr "OK" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "" lomiri-url-dispatcher-0.1.3/po/jbo.po000066400000000000000000000022311446007567600174770ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: jbo\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "" #: data/bad-url.qml:35 msgid "OK" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "" lomiri-url-dispatcher-0.1.3/po/ka.po000066400000000000000000000025311446007567600173230ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: 2023-04-11 20:27+0000\n" "Last-Translator: Temuri Doghonadze \n" "Language-Team: Georgian \n" "Language: ka\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 4.17-dev\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "" #: data/bad-url.qml:35 msgid "OK" msgstr "დიახ" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "" lomiri-url-dispatcher-0.1.3/po/kab.po000066400000000000000000000022311446007567600174620ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: kab\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "" #: data/bad-url.qml:35 msgid "OK" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "" lomiri-url-dispatcher-0.1.3/po/km.po000066400000000000000000000022301446007567600173330ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: km\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "" #: data/bad-url.qml:35 msgid "OK" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "" lomiri-url-dispatcher-0.1.3/po/kmr.po000066400000000000000000000022311446007567600175160ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: kmr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "" #: data/bad-url.qml:35 msgid "OK" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "" lomiri-url-dispatcher-0.1.3/po/ko.po000066400000000000000000000022301446007567600173350ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: ko\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "" #: data/bad-url.qml:35 msgid "OK" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "" lomiri-url-dispatcher-0.1.3/po/lb.po000066400000000000000000000022301446007567600173210ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: lb\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "" #: data/bad-url.qml:35 msgid "OK" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "" lomiri-url-dispatcher-0.1.3/po/ln.po000066400000000000000000000022301446007567600173350ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: ln\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "" #: data/bad-url.qml:35 msgid "OK" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "" lomiri-url-dispatcher-0.1.3/po/lo.po000066400000000000000000000022301446007567600173360ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: lo\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "" #: data/bad-url.qml:35 msgid "OK" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "" lomiri-url-dispatcher-0.1.3/po/lomiri-url-dispatcher.pot000066400000000000000000000023051446007567600233320ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the lomiri-url-dispatcher package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: lomiri-url-dispatcher\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "" #: data/bad-url.qml:35 msgid "OK" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "" lomiri-url-dispatcher-0.1.3/po/lt.po000066400000000000000000000022301446007567600173430ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: lt\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "" #: data/bad-url.qml:35 msgid "OK" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "" lomiri-url-dispatcher-0.1.3/po/lv.po000066400000000000000000000022301446007567600173450ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: lv\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "" #: data/bad-url.qml:35 msgid "OK" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "" lomiri-url-dispatcher-0.1.3/po/mg.po000066400000000000000000000022301446007567600173270ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: mg\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "" #: data/bad-url.qml:35 msgid "OK" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "" lomiri-url-dispatcher-0.1.3/po/mi.po000066400000000000000000000022301446007567600173310ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: mi\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "" #: data/bad-url.qml:35 msgid "OK" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "" lomiri-url-dispatcher-0.1.3/po/mk.po000066400000000000000000000022301446007567600173330ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: mk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "" #: data/bad-url.qml:35 msgid "OK" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "" lomiri-url-dispatcher-0.1.3/po/ml.po000066400000000000000000000022301446007567600173340ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: ml\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "" #: data/bad-url.qml:35 msgid "OK" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "" lomiri-url-dispatcher-0.1.3/po/ms.po000066400000000000000000000022301446007567600173430ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: ms\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "" #: data/bad-url.qml:35 msgid "OK" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "" lomiri-url-dispatcher-0.1.3/po/my.po000066400000000000000000000022301446007567600173510ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: my\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "" #: data/bad-url.qml:35 msgid "OK" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "" lomiri-url-dispatcher-0.1.3/po/nan.po000066400000000000000000000022311446007567600175010ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: nan\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "" #: data/bad-url.qml:35 msgid "OK" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "" lomiri-url-dispatcher-0.1.3/po/nb_NO.po000066400000000000000000000033021446007567600177200ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: 2023-03-02 14:39+0000\n" "Last-Translator: Allan Nordhøy \n" "Language-Team: Norwegian Bokmål \n" "Language: nb_NO\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 4.16.2-dev\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "Lomiri-nettadresseavhendingsgrensesnitt" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "Lomiri;nettadresse;avhender;forespørsel;åpen;program;" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "Ugjenkjent adresse" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "Kan ikke åpne «%1»-adresser." #: data/bad-url.qml:35 msgid "OK" msgstr "OK" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "Nettadresseavhendingsgrensesnitt" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "Nettadresse (f.eks. «https://eksempel.no»)" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "Send nettadresse" #, fuzzy #~ msgid "Ubuntu can't open addresses of type “%1”." #~ msgstr "Ubuntu kan ikke åpne adresser av typen «%1»." lomiri-url-dispatcher-0.1.3/po/nl.po000066400000000000000000000030011446007567600173320ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: 2023-02-22 13:39+0000\n" "Last-Translator: Heimen Stoffels \n" "Language-Team: Dutch \n" "Language: nl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 4.16-dev\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "Lomiri Url-verwerkingsapp" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "Lomiri;url;verwerking;verzoek;openen;app;" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "Niet-herkend adres" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "‘%1’ kan niet worden geopend." #: data/bad-url.qml:35 msgid "OK" msgstr "Oké" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "Url-verwerkingsapp" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "Url (bijv. ‘https://voorbeeld.nl’)" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "Url versturen" lomiri-url-dispatcher-0.1.3/po/ny.po000066400000000000000000000022301446007567600173520ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: ny\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "" #: data/bad-url.qml:35 msgid "OK" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "" lomiri-url-dispatcher-0.1.3/po/om.po000066400000000000000000000022301446007567600173370ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: om\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "" #: data/bad-url.qml:35 msgid "OK" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "" lomiri-url-dispatcher-0.1.3/po/pa.po000066400000000000000000000022301446007567600173240ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: pa\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "" #: data/bad-url.qml:35 msgid "OK" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "" lomiri-url-dispatcher-0.1.3/po/pam.po000066400000000000000000000022311446007567600175020ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: pam\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "" #: data/bad-url.qml:35 msgid "OK" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "" lomiri-url-dispatcher-0.1.3/po/pl.po000066400000000000000000000032261446007567600173450ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: 2023-02-06 03:01+0000\n" "Last-Translator: gnu-ewm \n" "Language-Team: Polish \n" "Language: pl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2;\n" "X-Generator: Weblate 4.16-dev\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "Lomiri;URL;dispatcher;zapytanie;otwórz;aplikacja;" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "Nierozpoznany adres" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "Nie można otworzyć adresów \"%1\"." #: data/bad-url.qml:35 msgid "OK" msgstr "OK" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "Adres URL (np. „https://example.com”)" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "Wyślij adres URL" #~ msgid "Ubuntu can't open addresses of type “%1”." #~ msgstr "Ubuntu nie może otworzyć adresów typu \"%1\"." lomiri-url-dispatcher-0.1.3/po/ps.po000066400000000000000000000022301446007567600173460ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: ps\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "" #: data/bad-url.qml:35 msgid "OK" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "" lomiri-url-dispatcher-0.1.3/po/pt.po000066400000000000000000000032321446007567600173520ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: 2023-02-07 21:41+0000\n" "Last-Translator: Ivo Xavier \n" "Language-Team: Portuguese \n" "Language: pt\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" "X-Generator: Weblate 4.16-dev\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "GUI do Lomiri URL Dispatcher" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "Lomiri;URL;dispatcher;pedido;abrir;aplicação;" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "Endereço não reconhecido" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "Não é possível abrir endereços “%1”." #: data/bad-url.qml:35 msgid "OK" msgstr "OK" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "GUI do URL Dispatcher" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "URL (por exemplo, 'https://example.com')" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "Enviar URL" #~ msgid "Ubuntu can't open addresses of type “%1”." #~ msgstr "O Lomiri não pode abrir endereços do tipo “%1”." lomiri-url-dispatcher-0.1.3/po/pt_BR.po000066400000000000000000000022331446007567600177350ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "" #: data/bad-url.qml:35 msgid "OK" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "" lomiri-url-dispatcher-0.1.3/po/ro.po000066400000000000000000000022301446007567600173440ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: ro\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "" #: data/bad-url.qml:35 msgid "OK" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "" lomiri-url-dispatcher-0.1.3/po/ru.po000066400000000000000000000037461446007567600173670ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: 2023-02-18 17:33+0000\n" "Last-Translator: Sergii Horichenko \n" "Language-Team: Russian \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Generator: Weblate 4.16-dev\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "Графический интерфейс диспетчера URL-адресов Lomiri" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "" "Lomiri;URL;dispatcher;request;open;application;приложение;программа;диспетчер" ";запрос;открыть;" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "Нераспознанный адрес" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "Не удается открыть адреса \"%1\"." #: data/bad-url.qml:35 msgid "OK" msgstr "OK" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "Графический интерфейс диспетчера URL-адресов" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "URL (напр. \"https://example.com\")" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "Отправить URL" #~ msgid "Ubuntu can't open addresses of type “%1”." #~ msgstr "Ubuntu не может открывать адреса типа \"%1\"." lomiri-url-dispatcher-0.1.3/po/sa.po000066400000000000000000000026011446007567600173310ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the lomiri-url-dispatcher package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: lomiri-url-dispatcher\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: 2023-07-14 02:23+0000\n" "Last-Translator: \"Rudra Harsh V.Singh\" \n" "Language-Team: Sanskrit \n" "Language: sa\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n==1 ? 0 : n==2 ? 1 : 2;\n" "X-Generator: Weblate 5.0-dev\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "" #: data/bad-url.qml:35 msgid "OK" msgstr "अस्तु" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "" lomiri-url-dispatcher-0.1.3/po/sc.po000066400000000000000000000022301446007567600173310ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: sc\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "" #: data/bad-url.qml:35 msgid "OK" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "" lomiri-url-dispatcher-0.1.3/po/sco.po000066400000000000000000000022311446007567600175110ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: sco\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "" #: data/bad-url.qml:35 msgid "OK" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "" lomiri-url-dispatcher-0.1.3/po/sd.po000066400000000000000000000022301446007567600173320ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: sd\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "" #: data/bad-url.qml:35 msgid "OK" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "" lomiri-url-dispatcher-0.1.3/po/sdh.po000066400000000000000000000022311446007567600175030ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: sdh\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "" #: data/bad-url.qml:35 msgid "OK" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "" lomiri-url-dispatcher-0.1.3/po/shn.po000066400000000000000000000022311446007567600175150ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: shn\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "" #: data/bad-url.qml:35 msgid "OK" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "" lomiri-url-dispatcher-0.1.3/po/si.po000066400000000000000000000022301446007567600173370ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: si\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "" #: data/bad-url.qml:35 msgid "OK" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "" lomiri-url-dispatcher-0.1.3/po/sk.po000066400000000000000000000022301446007567600173410ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: sk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "" #: data/bad-url.qml:35 msgid "OK" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "" lomiri-url-dispatcher-0.1.3/po/sl.po000066400000000000000000000022301446007567600173420ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: sl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "" #: data/bad-url.qml:35 msgid "OK" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "" lomiri-url-dispatcher-0.1.3/po/sq.po000066400000000000000000000022301446007567600173470ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: sq\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "" #: data/bad-url.qml:35 msgid "OK" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "" lomiri-url-dispatcher-0.1.3/po/sr.po000066400000000000000000000022301446007567600173500ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: sr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "" #: data/bad-url.qml:35 msgid "OK" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "" lomiri-url-dispatcher-0.1.3/po/sv.po000066400000000000000000000026411446007567600173620ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: 2023-02-27 18:36+0000\n" "Last-Translator: Luna Jernberg \n" "Language-Team: Swedish \n" "Language: sv\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 4.16-dev\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "Oigenkänd adress" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "Kan inte öppna “%1” adresser." #: data/bad-url.qml:35 msgid "OK" msgstr "OK" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "URL (e.g. 'https://exempel.com')" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "Skicka URL" lomiri-url-dispatcher-0.1.3/po/ta.po000066400000000000000000000022301446007567600173300ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: ta\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "" #: data/bad-url.qml:35 msgid "OK" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "" lomiri-url-dispatcher-0.1.3/po/te.po000066400000000000000000000022301446007567600173340ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: te\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "" #: data/bad-url.qml:35 msgid "OK" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "" lomiri-url-dispatcher-0.1.3/po/tet.po000066400000000000000000000022311446007567600175210ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: tet\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "" #: data/bad-url.qml:35 msgid "OK" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "" lomiri-url-dispatcher-0.1.3/po/tg.po000066400000000000000000000022301446007567600173360ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: tg\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "" #: data/bad-url.qml:35 msgid "OK" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "" lomiri-url-dispatcher-0.1.3/po/th.po000066400000000000000000000022301446007567600173370ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: th\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "" #: data/bad-url.qml:35 msgid "OK" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "" lomiri-url-dispatcher-0.1.3/po/tk.po000066400000000000000000000022301446007567600173420ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: tk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "" #: data/bad-url.qml:35 msgid "OK" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "" lomiri-url-dispatcher-0.1.3/po/tr.po000066400000000000000000000022301446007567600173510ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: tr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "" #: data/bad-url.qml:35 msgid "OK" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "" lomiri-url-dispatcher-0.1.3/po/ug.po000066400000000000000000000022301446007567600173370ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: ug\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "" #: data/bad-url.qml:35 msgid "OK" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "" lomiri-url-dispatcher-0.1.3/po/uk.po000066400000000000000000000037031446007567600173510ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: 2023-02-06 17:51+0000\n" "Last-Translator: Sergii Horichenko \n" "Language-Team: Ukrainian \n" "Language: uk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Generator: Weblate 4.16-dev\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "Графічний інтерфейс диспетчера URL-адрес Lomiri" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "" "Lomiri;URL;диспетчер;запит;відкрити;програма;dispatcher;request;open;applicat" "ion;" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "Невизначена адреса" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "Не вдається відкрити адреси \"%1\"." #: data/bad-url.qml:35 msgid "OK" msgstr "ОК" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "Графічний інтерфейс диспетчера URL-адрес" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "URL (напр. \"https://example.com\")" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "Надіслати URL" #~ msgid "Ubuntu can't open addresses of type “%1”." #~ msgstr "Ubuntu не може відкривати адреси типу «%1»." lomiri-url-dispatcher-0.1.3/po/ur.po000066400000000000000000000030011446007567600173470ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: 2023-01-06 18:49+0000\n" "Last-Translator: Muhammad \n" "Language-Team: Urdu \n" "Language: ur\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 4.15.1-dev\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "ناقابل شناخت پتہ" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "" #: data/bad-url.qml:35 msgid "OK" msgstr "ٹھیک ہے" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "" #~ msgid "Ubuntu can't open addresses of type “%1”." #~ msgstr "اوبنٹو \"%1\" کے طرح کے اڈریس نہیں کھول سکتا۔" lomiri-url-dispatcher-0.1.3/po/zh_CN.po000066400000000000000000000022351446007567600177320ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: zh_Hans\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "" #: data/bad-url.qml:35 msgid "OK" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "" lomiri-url-dispatcher-0.1.3/po/zh_HK.po000066400000000000000000000022401446007567600177300ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: zh_Hant_HK\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "" #: data/bad-url.qml:35 msgid "OK" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "" lomiri-url-dispatcher-0.1.3/po/zh_TW.po000066400000000000000000000022351446007567600177640ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-02-04 17:00+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: zh_Hant\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: gui/lomiri-url-dispatcher-gui.desktop.in:3 msgid "Lomiri URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.desktop.in:7 msgid "Lomiri;URL;dispatcher;request;open;application;" msgstr "" #: data/bad-url.qml:31 msgid "Unrecognized Address" msgstr "" #: data/bad-url.qml:32 #, qt-format msgid "Cannot open “%1” addresses." msgstr "" #: data/bad-url.qml:35 msgid "OK" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:10 msgid "URL Dispatcher GUI" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:32 msgid "URL (e.g. 'https://example.com')" msgstr "" #: gui/lomiri-url-dispatcher-gui.qml:46 msgid "Send URL" msgstr "" lomiri-url-dispatcher-0.1.3/service/000077500000000000000000000000001446007567600174115ustar00rootroot00000000000000lomiri-url-dispatcher-0.1.3/service/CMakeLists.txt000066400000000000000000000052611446007567600221550ustar00rootroot00000000000000 include(UseConstantBuilder) include_directories(${CMAKE_CURRENT_SOURCE_DIR}) add_definitions( -DOVERLAY_SYSTEM_DIRECTORY="${CMAKE_INSTALL_FULL_DATADIR}/lomiri-url-dispatcher/url-overlays" ) ########################### # Generated Lib ########################### add_gdbus_codegen( SERVICE_GENERATED service-iface com.lomiri.URLDispatcher. ${CMAKE_SOURCE_DIR}/data/com.lomiri.URLDispatcher.xml NAMESPACE ServiceIface ) add_library(service-generated STATIC ${SERVICE_GENERATED_SOURCES}) target_link_libraries(service-generated ${GLIB2_LIBRARIES} ${GOBJECT2_LIBRARIES} ${GIO2_LIBRARIES} ) ########################### # Dispatcher Lib ########################### if(enable_mirclient) set(OVERLAY_MIR_SOURCES overlay-tracker-mir.h overlay-tracker-mir.cpp ) add_definitions(-DUSE_MIRCLIENT=1) endif() add_library(dispatcher-lib STATIC dispatcher.h dispatcher.c glib-thread.h glib-thread.cpp overlay-tracker.h overlay-tracker.cpp overlay-tracker-iface.h ${OVERLAY_MIR_SOURCES} ) target_link_libraries(dispatcher-lib url-db-lib service-generated -pthread ${APPARMOR_LIBRARIES} ${GLIB2_LIBRARIES} ${GOBJECT2_LIBRARIES} ${GIO2_LIBRARIES} ${SQLITE_LIBRARIES} ${LOMIRI_APP_LAUNCH_LIBRARIES} ) ########################### # URL DB Lib ########################### set(URL_DB_SOURCES url-db.c url-db.h create-db-sql.h ) add_constant_template(URL_DB_SOURCES create-db-sql create_db_sql "${CMAKE_CURRENT_SOURCE_DIR}/create-db.sql" ) add_library(url-db-lib STATIC ${URL_DB_SOURCES} ) target_link_libraries(url-db-lib ${GLIB2_LIBRARIES} ${SQLITE_LIBRARIES} ) ########################### # Service Executable ########################### include_directories(${CMAKE_CURRENT_BINARY_DIR}) add_executable(service-exec service.cpp) set_target_properties(service-exec PROPERTIES OUTPUT_NAME "lomiri-url-dispatcher") target_link_libraries(service-exec dispatcher-lib) ########################### # Update Directory ########################### add_executable(update-directory update-directory.c) set_target_properties(update-directory PROPERTIES OUTPUT_NAME "lomiri-update-directory") target_link_libraries(update-directory ${GIO2_LIBRARIES} ${JSONGLIB_LIBRARIES} url-db-lib) ########################### # Coverage ########################### set_property( GLOBAL APPEND PROPERTY COVERAGE_TARGETS dispatcher-lib url-db-lib service-exec update-directory) ########################### # Installation ########################### install( TARGETS service-exec update-directory RUNTIME DESTINATION "${CMAKE_INSTALL_FULL_LIBEXECDIR}/lomiri-url-dispatcher" ) ########################### # Exec Tools ########################### add_subdirectory(url-overlay) add_subdirectory(bad-url) lomiri-url-dispatcher-0.1.3/service/bad-url/000077500000000000000000000000001446007567600207375ustar00rootroot00000000000000lomiri-url-dispatcher-0.1.3/service/bad-url/CMakeLists.txt000066400000000000000000000010021446007567600234700ustar00rootroot00000000000000########################### # Bad URL Exec Tool ########################### add_definitions( -DQML_BAD_URL="${CMAKE_INSTALL_FULL_DATADIR}/lomiri-url-dispatcher/bad-url.qml" ) add_executable(bad-url-exec-tool exec-tool.cpp) set_target_properties(bad-url-exec-tool PROPERTIES OUTPUT_NAME "exec-tool") target_link_libraries(bad-url-exec-tool ${GIO2_LIBRARIES} ${LOMIRI_APP_LAUNCH_LIBRARIES}) install( TARGETS bad-url-exec-tool RUNTIME DESTINATION "${CMAKE_INSTALL_FULL_LIBEXECDIR}/lomiri-app-launch/bad-url" ) lomiri-url-dispatcher-0.1.3/service/bad-url/exec-tool.cpp000066400000000000000000000022251446007567600233430ustar00rootroot00000000000000/* * Copyright © 2015 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Ted Gould */ #include #include #include int main (int argc, char * argv[]) { try { lomiri::app_launch::Helper::setExec({"qmlscene", QML_BAD_URL}); return EXIT_SUCCESS; } catch (std::runtime_error &e) { g_warning("Unable to set helper: %s", e.what()); return EXIT_FAILURE; } catch (...) { g_warning("Unknown failure setting exec line"); return EXIT_FAILURE; } } lomiri-url-dispatcher-0.1.3/service/create-db-sql.h000066400000000000000000000000621446007567600222030ustar00rootroot00000000000000#pragma once extern const char * create_db_sql; lomiri-url-dispatcher-0.1.3/service/create-db.sql000066400000000000000000000005021446007567600217550ustar00rootroot00000000000000pragma journal_mode = WAL; begin transaction; create table if not exists configfiles (name text unique, timestamp bigint); create table if not exists urls (sourcefile integer, protocol text, domainsuffix text); create unique index if not exists urls_index on urls (sourcefile, protocol, domainsuffix); commit transaction; lomiri-url-dispatcher-0.1.3/service/dispatcher.c000066400000000000000000000402511446007567600217050ustar00rootroot00000000000000/** * Copyright (C) 2013-2017 Canonical, Ltd. * * This program is free software: you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License version 3, as published by * the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranties of MERCHANTABILITY, * SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Ted Gould * */ #include #include #include "dispatcher.h" #include "service-iface.h" #include "url-db.h" /* Globals */ static OverlayTracker * tracker = NULL; static GCancellable * cancellable = NULL; static ServiceIfaceComLomiriURLDispatcher * skel = NULL; static GRegex * applicationre = NULL; static GRegex * appidre = NULL; static GRegex * genericre = NULL; static GRegex * intentre = NULL; static sqlite3 * urldb = NULL; /* Errors */ enum { ERROR_BAD_URL, ERROR_RESTRICTED_URL }; G_DEFINE_QUARK(url_dispatcher, url_dispatcher_error) /* Register our errors */ static void register_dbus_errors () { g_dbus_error_register_error(url_dispatcher_error_quark(), ERROR_BAD_URL, "com.lomiri.URLDispatcher.BadURL"); g_dbus_error_register_error(url_dispatcher_error_quark(), ERROR_RESTRICTED_URL, "com.lomiri.URLDispatcher.RestrictedURL"); return; } /* We should have the PID now so we can make sure to file the problem on the right package. */ static void recoverable_problem_file (GObject * obj, GAsyncResult * res, gpointer user_data) { gchar * badurl = (gchar *)user_data; GVariant * pid_tuple = NULL; GError * error = NULL; pid_tuple = g_dbus_connection_call_finish(G_DBUS_CONNECTION(obj), res, &error); if (error != NULL) { g_warning("Unable to get PID for calling program with URL '%s': %s", badurl, error->message); g_free(badurl); g_error_free(error); return; } guint32 pid = 0; g_variant_get(pid_tuple, "(u)", &pid); g_variant_unref(pid_tuple); /* Popup the bad url dialog */ overlay_tracker_badurl(tracker, pid, badurl); /* Log the bad url request */ g_warning("Unable to open url '%s' requested from pid '%u'.", badurl, pid); g_free(badurl); return; } /* Error based on the fact that we're using a restricted launch but the package doesn't match */ /* NOTE: Only sending back the data we were given. We don't want people to be able to parse the error as an info leak */ static gboolean restricted_appid (GDBusMethodInvocation * invocation, const gchar * url, const gchar * package) { g_dbus_method_invocation_return_error(invocation, url_dispatcher_error_quark(), ERROR_RESTRICTED_URL, "URL '%s' does not have a handler in package '%s'", url, package); return TRUE; } /* Say that we have a bad URL and report a recoverable error on the process that sent it to us. */ static gboolean bad_url (GDBusMethodInvocation * invocation, const gchar * url) { const gchar * sender = g_dbus_method_invocation_get_sender(invocation); GDBusConnection * conn = g_dbus_method_invocation_get_connection(invocation); /* transfer: none */ g_dbus_connection_call(conn, "org.freedesktop.DBus", "/", "org.freedesktop.DBus", "GetConnectionUnixProcessID", g_variant_new("(s)", sender), G_VARIANT_TYPE("(u)"), G_DBUS_CALL_FLAGS_NONE, -1, /* timeout */ NULL, /* cancellable */ recoverable_problem_file, g_strdup(url)); g_dbus_method_invocation_return_error(invocation, url_dispatcher_error_quark(), ERROR_BAD_URL, "URL '%s' is not handleable by the URL Dispatcher", url); return TRUE; } /* Print an error if we get one */ static void send_open_cb (GObject * object, GAsyncResult * res, gpointer user_data) { GError * error = NULL; g_dbus_connection_call_finish(G_DBUS_CONNECTION(object), res, &error); if (error != NULL) { /* Mostly just to free the error, but printing for debugging */ g_warning("Unable to send Open to dash: %s", error->message); g_error_free(error); } } /* Sends the URL to the dash, which isn't an app, but just on the bus generally. */ gboolean send_to_dash (const gchar * url) { if (url == NULL) { g_warning("Can not send nothing to the dash"); return FALSE; } GDBusConnection * bus = g_bus_get_sync(G_BUS_TYPE_SESSION, NULL, NULL); g_return_val_if_fail(bus != NULL, FALSE); /* Kinda sucks that we need to do this, should probably find it's way into the libUAL API if it's needed outside */ g_dbus_connection_emit_signal(bus, NULL, /* destination */ "/", /* path */ "com.lomiri.LomiriAppLaunch", /* interface */ "LomiriFocusRequest", /* signal */ g_variant_new("(s)", "lomiri-dash"), NULL); GVariantBuilder opendata; g_variant_builder_init(&opendata, G_VARIANT_TYPE_TUPLE); g_variant_builder_open(&opendata, G_VARIANT_TYPE_ARRAY); g_variant_builder_add_value(&opendata, g_variant_new_string(url)); g_variant_builder_close(&opendata); g_variant_builder_add_value(&opendata, g_variant_new_array(G_VARIANT_TYPE("{sv}"), NULL, 0)); /* Using the FD.o Application interface */ g_dbus_connection_call(bus, "com.lomiri.LomiriDash", "/lomiri_2ddash", "org.freedesktop.Application", "Open", g_variant_builder_end(&opendata), NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, send_open_cb, NULL); g_object_unref(bus); return TRUE; } /* Handles taking an application and an URL and sending them to Upstart */ gboolean dispatcher_send_to_app (const gchar * app_id, const gchar * url) { g_debug("Emitting 'application-start' for APP_ID='%s' and URLS='%s'", app_id, url); if (g_strcmp0(app_id, "lomiri-dash") == 0) { return send_to_dash(url); } const gchar * urls[2] = { url, NULL }; if (!lomiri_app_launch_start_application(app_id, urls)) { g_warning("Unable to start application '%s' with URL '%s'", app_id, url); } return TRUE; } unsigned int _get_pid_from_dbus(GDBusConnection * conn, const gchar * sender) { GError * error = NULL; unsigned int pid = 0; GVariant * callret = g_dbus_connection_call_sync(conn, "org.freedesktop.DBus", "/", "org.freedesktop.DBus", "GetConnectionUnixProcessID", g_variant_new("(s)", sender), G_VARIANT_TYPE("(u)"), G_DBUS_CALL_FLAGS_NONE, -1, /* timeout */ NULL, /* cancellable */ &error); if (error != NULL) { g_warning("Unable to get PID for '%s' from dbus: %s", sender, error->message); g_clear_error(&error); } else { g_variant_get_child(callret, 0, "u", &pid); g_variant_unref(callret); } return pid; } /* Handles setting up the overlay with the URL */ gboolean dispatcher_send_to_overlay (const gchar * app_id, const gchar * url, GDBusConnection * conn, const gchar * sender) { unsigned int pid = _get_pid_from_dbus(conn, sender); if (pid == 0) { return FALSE; } return overlay_tracker_add(tracker, app_id, pid, url); } /* Check to see if this is an overlay AppID */ gboolean dispatcher_is_overlay (const gchar * appid) { const gchar * systemdir = NULL; gboolean found = FALSE; gchar * desktopname = g_strdup_printf("%s.desktop", appid); /* First time, check the environment */ if (G_UNLIKELY(systemdir == NULL)) { systemdir = g_getenv("URL_DISPATCHER_OVERLAY_DIR"); if (systemdir == NULL) { systemdir = OVERLAY_SYSTEM_DIRECTORY; } } /* Check system dir */ if (!found) { gchar * sysdir = g_build_filename(systemdir, desktopname, NULL); found = g_file_test(sysdir, G_FILE_TEST_EXISTS); g_free(sysdir); } g_free(desktopname); return found; } /* Whether we should restrict this appid based on the package name */ gboolean dispatcher_appid_restrict (const gchar * appid, const gchar * package) { if (package == NULL || package[0] == '\0') { return FALSE; } gchar * appackage = NULL; gboolean match = FALSE; if (lomiri_app_launch_app_id_parse(appid, &appackage, NULL, NULL)) { /* Click application */ match = (g_strcmp0(package, appackage) == 0); } else { /* Legacy application */ match = (g_strcmp0(package, appid) == 0); } g_free(appackage); return !match; } /* Get a URL off of the bus */ static gboolean dispatch_url_cb (GObject * skel, GDBusMethodInvocation * invocation, const gchar * url, const gchar * package, gpointer user_data) { /* Nice debugging message depending on whether the @package variable is valid from DBus */ if (package == NULL || package[0] == '\0') { g_debug("Dispatching URL: %s", url); } else { g_debug("Dispatching Restricted URL: %s", url); g_debug("Package restriction: %s", package); } /* Check to ensure the URL is valid coming from DBus */ if (url == NULL || url[0] == '\0') { return bad_url(invocation, url); } /* Actually do it */ gchar * appid = NULL; const gchar * outurl = NULL; /* Discover the AppID */ if (!dispatcher_url_to_appid(url, &appid, &outurl)) { return bad_url(invocation, url); } /* Check for the 'unconfined' app id which is causing problems */ if (g_strcmp0(appid, "unconfined") == 0) { g_free(appid); return bad_url(invocation, url); } /* Check to see if we're allowed to use it */ if (dispatcher_appid_restrict(appid, package)) { g_free(appid); return restricted_appid(invocation, url, package); } /* We're cleared to continue */ gboolean sent = FALSE; if (!dispatcher_is_overlay(appid)) { sent = dispatcher_send_to_app(appid, outurl); } else { sent = dispatcher_send_to_overlay( appid, outurl, g_dbus_method_invocation_get_connection(invocation), g_dbus_method_invocation_get_sender(invocation)); } g_free(appid); if (sent) { g_dbus_method_invocation_return_value(invocation, NULL); } else { bad_url(invocation, url); } return sent; } /* Test a URL to find it's AppID */ static gboolean test_url_cb (GObject * skel, GDBusMethodInvocation * invocation, const gchar * const * urls, gpointer user_data) { if (urls == NULL || urls[0] == NULL || urls[0][0] == '\0') { /* Right off the bat, let's deal with these */ return bad_url(invocation, NULL); } GVariantBuilder builder; g_variant_builder_init(&builder, G_VARIANT_TYPE_ARRAY); int i; for (i = 0; urls[i] != NULL; i++) { const gchar * url = urls[i]; g_debug("Testing URL: %s", url); if (url == NULL || url[0] == '\0') { g_variant_builder_clear(&builder); return bad_url(invocation, url); } gchar * appid = NULL; const gchar * outurl = NULL; if (dispatcher_url_to_appid(url, &appid, &outurl)) { GVariant * vappid = g_variant_new_take_string(appid); g_variant_builder_add_value(&builder, vappid); } else { g_variant_builder_clear(&builder); return bad_url(invocation, url); } } GVariant * varray = g_variant_builder_end(&builder); GVariant * tuple = g_variant_new_tuple(&varray, 1); g_dbus_method_invocation_return_value(invocation, tuple); return TRUE; } /* Determine the domain for an intent using the package variable */ static gchar * intent_domain (const gchar * url) { gchar * domain = NULL; GMatchInfo * intentmatch = NULL; if (g_regex_match(intentre, url, 0, &intentmatch)) { domain = g_match_info_fetch(intentmatch, 1); g_match_info_free(intentmatch); } return domain; } /* The core of the URL handling */ gboolean dispatcher_url_to_appid (const gchar * url, gchar ** out_appid, const gchar ** out_url) { g_return_val_if_fail(url != NULL, FALSE); g_return_val_if_fail(out_appid != NULL, FALSE); /* Special case the app id */ GMatchInfo * appidmatch = NULL; if (g_regex_match(appidre, url, 0, &appidmatch)) { gchar * package = g_match_info_fetch(appidmatch, 1); gchar * app = g_match_info_fetch(appidmatch, 2); gchar * version = g_match_info_fetch(appidmatch, 3); gboolean retval = FALSE; *out_appid = lomiri_app_launch_triplet_to_app_id(package, app, version); if (*out_appid != NULL) { /* Look at the current version of the app and ensure we're not asking for an older version */ gchar * testappid = lomiri_app_launch_triplet_to_app_id(package, app, NULL); if (g_strcmp0(*out_appid, testappid) != 0) { retval = FALSE; g_clear_pointer(out_appid, g_free); } else { retval = TRUE; } g_free(testappid); } g_free(package); g_free(app); g_free(version); g_match_info_free(appidmatch); return retval; } /* Special case the application URL */ GMatchInfo * appmatch = NULL; if (g_regex_match(applicationre, url, 0, &appmatch)) { *out_appid = g_match_info_fetch(appmatch, 1); g_match_info_free(appmatch); return TRUE; } g_match_info_free(appmatch); /* Check the URL db */ GMatchInfo * genericmatch = NULL; if (g_regex_match(genericre, url, 0, &genericmatch)) { gboolean found = FALSE; gchar * protocol = g_match_info_fetch(genericmatch, 1); gchar * domain = NULL; /* We special case the intent domain (further comment there) */ if (g_strcmp0(protocol, "intent") == 0) { domain = intent_domain(url); } else { domain = g_match_info_fetch(genericmatch, 2); } *out_appid = url_db_find_url(urldb, protocol, domain); g_debug("Protocol '%s' for domain '%s' resulting in app id '%s'", protocol, domain, *out_appid); if (*out_appid != NULL) { found = TRUE; if (out_url != NULL) { *out_url = url; } } g_free(protocol); g_free(domain); g_match_info_free(genericmatch); return found; } g_match_info_free(genericmatch); return FALSE; } /* We're goin' down cap'n */ static void name_lost (GDBusConnection * con, const gchar * name, gpointer user_data) { GMainLoop * mainloop = (GMainLoop *)user_data; g_warning("Unable to get name '%s'", name); g_main_loop_quit(mainloop); return; } /* Callback when we're connected to dbus */ static void bus_got (GObject * obj, GAsyncResult * res, gpointer user_data) { GMainLoop * mainloop = (GMainLoop *)user_data; GDBusConnection * bus = NULL; GError * error = NULL; bus = g_bus_get_finish(res, &error); if (error != NULL) { if (!g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { g_error("Unable to connect to D-Bus"); g_main_loop_quit(mainloop); } g_error_free(error); return; } register_dbus_errors(); g_dbus_interface_skeleton_export(G_DBUS_INTERFACE_SKELETON(skel), bus, "/com/lomiri/URLDispatcher", &error); if (error != NULL) { g_error("Unable to export interface skeleton: %s", error->message); g_main_loop_quit(mainloop); return; } g_bus_own_name_on_connection(bus, "com.lomiri.URLDispatcher", G_BUS_NAME_OWNER_FLAGS_NONE, /* flags */ NULL, /* name acquired */ name_lost, user_data, NULL); /* user data */ g_object_unref(bus); return; } /* Initialize all the globals */ gboolean dispatcher_init (GMainLoop * mainloop, OverlayTracker * intracker) { tracker = intracker; cancellable = g_cancellable_new(); urldb = url_db_create_database(); g_return_val_if_fail(urldb != NULL, FALSE); applicationre = g_regex_new("^application:///([a-zA-Z0-9_\\.-]*)\\.desktop$", 0, 0, NULL); appidre = g_regex_new("^appid://([a-z0-9\\.-]*)/([a-zA-Z0-9-\\.]*)/([a-zA-Z0-9\\.-]*)$", 0, 0, NULL); genericre = g_regex_new("^([a-z][a-z0-9]*):(?://(?:.*@)?([a-zA-Z0-9\\.\\-_]*)(?::[0-9]*)?/?)?(.*)?$", 0, 0, NULL); intentre = g_regex_new("^intent://.*package=([a-zA-Z0-9\\.]*);.*$", 0, 0, NULL); g_bus_get(G_BUS_TYPE_SESSION, cancellable, bus_got, mainloop); skel = service_iface_com_lomiri_urldispatcher_skeleton_new(); g_signal_connect(skel, "handle-dispatch-url", G_CALLBACK(dispatch_url_cb), NULL); g_signal_connect(skel, "handle-test-url", G_CALLBACK(test_url_cb), NULL); return TRUE; } /* Clean up all the globals */ gboolean dispatcher_shutdown () { g_cancellable_cancel(cancellable); g_object_unref(cancellable); g_object_unref(skel); g_regex_unref(applicationre); g_regex_unref(appidre); g_regex_unref(genericre); g_regex_unref(intentre); sqlite3_close(urldb); return TRUE; } lomiri-url-dispatcher-0.1.3/service/dispatcher.h000066400000000000000000000026101446007567600217070ustar00rootroot00000000000000/** * Copyright (C) 2013 Canonical, Ltd. * * This program is free software: you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License version 3, as published by * the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranties of MERCHANTABILITY, * SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Ted Gould * */ #ifndef DISPATCHER_H #define DISPATCHER_H 1 #include #include "overlay-tracker.h" G_BEGIN_DECLS gboolean dispatcher_init (GMainLoop * mainloop, OverlayTracker * tracker); gboolean dispatcher_shutdown (); gboolean dispatcher_url_to_appid (const gchar * url, gchar ** out_appid, const gchar ** out_url); gboolean dispatcher_appid_restrict (const gchar * appid, const gchar * package); gboolean dispatcher_is_overlay (const gchar * appid); gboolean dispatcher_send_to_app (const gchar * appid, const gchar * url); gboolean dispatcher_send_to_overlay (const gchar * app_id, const gchar * url, GDBusConnection * conn, const gchar * sender); G_END_DECLS #endif /* DISPATCHER_H */ lomiri-url-dispatcher-0.1.3/service/glib-thread.cpp000066400000000000000000000124471446007567600223070ustar00rootroot00000000000000/* * Copyright © 2015 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Ted Gould */ #include "glib-thread.h" namespace GLib { ContextThread::ContextThread (std::function beforeLoop, std::function afterLoop) : _context(nullptr) , _loop(nullptr) { _cancel = std::shared_ptr(g_cancellable_new(), [](GCancellable * cancel) { if (cancel != nullptr) { g_cancellable_cancel(cancel); g_object_unref(cancel); } }); std::promise, std::shared_ptr>> context_promise; /* NOTE: We copy afterLoop but reference beforeLoop. We're blocking so we know that beforeLoop will stay valid long enough, but we can't say the same for afterLoop */ _thread = std::thread([&context_promise, &beforeLoop, afterLoop, this]() -> void { /* Build up the context and loop for the async events and a place for GDBus to send its events back to */ auto context = std::shared_ptr(g_main_context_new(), [](GMainContext * context) { g_clear_pointer(&context, g_main_context_unref); }); auto loop = std::shared_ptr(g_main_loop_new(context.get(), FALSE), [](GMainLoop * loop) { g_clear_pointer(&loop, g_main_loop_unref); }); g_main_context_push_thread_default(context.get()); beforeLoop(); /* Free's the constructor to continue */ auto pair = std::pair, std::shared_ptr>(context, loop); context_promise.set_value(pair); if (!g_cancellable_is_cancelled(_cancel.get())) { g_main_loop_run(loop.get()); } afterLoop(); }); /* We need to have the context and the mainloop ready before other functions on this object can work properly. So we wait for them and set them on this thread. */ auto context_future = context_promise.get_future(); context_future.wait(); auto context_value = context_future.get(); _context = context_value.first; _loop = context_value.second; if (_context == nullptr || _loop == nullptr) { throw std::runtime_error("Unable to create GLib Thread"); } } ContextThread::~ContextThread () { quit(); } void ContextThread::quit () { g_cancellable_cancel(_cancel.get()); /* Force the cancellation on ongoing tasks */ if (_loop != nullptr) { g_main_loop_quit(_loop.get()); /* Quit the loop */ } /* Joining here because we want to ensure that the final afterLoop() function is run before returning */ if (std::this_thread::get_id() != _thread.get_id()) { if (_thread.joinable()) { _thread.join(); } } } bool ContextThread::isCancelled () { return g_cancellable_is_cancelled(_cancel.get()) == TRUE; } std::shared_ptr ContextThread::getCancellable () { return _cancel; } void ContextThread::simpleSource (std::function srcBuilder, std::function work) { if (isCancelled()) { throw std::runtime_error("Trying to execute work on a GLib thread that is shutting down."); } /* Copy the work so that we can reuse it */ /* Lifecycle is handled with the source pointer when we attach it to the context. */ auto heapWork = new std::function(work); auto source = std::shared_ptr(srcBuilder(), [](GSource * src) { g_clear_pointer(&src, g_source_unref); } ); g_source_set_callback(source.get(), [](gpointer data) -> gboolean { std::function* heapWork = reinterpret_cast *>(data); (*heapWork)(); return G_SOURCE_REMOVE; }, heapWork, [](gpointer data) { std::function* heapWork = reinterpret_cast *>(data); delete heapWork; }); g_source_attach(source.get(), _context.get()); } void ContextThread::executeOnThread (std::function work) { simpleSource(g_idle_source_new, work); } void ContextThread::timeout (const std::chrono::milliseconds& length, std::function work) { simpleSource([length]() { return g_timeout_source_new(length.count()); }, work); } void ContextThread::timeoutSeconds (const std::chrono::seconds& length, std::function work) { simpleSource([length]() { return g_timeout_source_new_seconds(length.count()); }, work); } } // ns GLib lomiri-url-dispatcher-0.1.3/service/glib-thread.h000066400000000000000000000051551446007567600217520ustar00rootroot00000000000000/* * Copyright © 2015 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Ted Gould */ #include #include #include namespace GLib { class ContextThread { std::thread _thread; std::shared_ptr _context; std::shared_ptr _loop; std::shared_ptr _cancel; public: ContextThread (std::function beforeLoop = [] {}, std::function afterLoop = [] {}); ~ContextThread (); void quit (); bool isCancelled (); std::shared_ptr getCancellable (); void executeOnThread (std::function work); template auto executeOnThread (std::function work) -> T { if (std::this_thread::get_id() == _thread.get_id()) { /* Don't block if we're on the same thread */ return work(); } std::promise promise; std::function magicFunc = [&promise, &work] () -> void { promise.set_value(work()); }; executeOnThread(magicFunc); auto future = promise.get_future(); future.wait(); return future.get(); } void timeout (const std::chrono::milliseconds& length, std::function work); template void timeout (const std::chrono::duration& length, std::function work) { return timeout(std::chrono::duration_cast(length), work); } void timeoutSeconds (const std::chrono::seconds& length, std::function work); template void timeoutSeconds (const std::chrono::duration& length, std::function work) { return timeoutSeconds(std::chrono::duration_cast(length), work); } private: void simpleSource (std::function srcBuilder, std::function work); }; } lomiri-url-dispatcher-0.1.3/service/overlay-tracker-iface.h000066400000000000000000000016761446007567600237530ustar00rootroot00000000000000/* * Copyright © 2015 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Ted Gould */ #pragma once class OverlayTrackerIface { public: virtual ~OverlayTrackerIface() = default; virtual bool addOverlay (const char * appid, unsigned long pid, const char * url) = 0; virtual bool badUrl (unsigned long pid, const char * url) = 0; }; lomiri-url-dispatcher-0.1.3/service/overlay-tracker-mir.cpp000066400000000000000000000143021446007567600240140ustar00rootroot00000000000000/* * Copyright © 2015 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Ted Gould */ #include #include "overlay-tracker-mir.h" #include static const char * OVERLAY_HELPER_TYPE = "url-overlay"; static const char * BAD_URL_HELPER_TYPE = "bad-url"; static const char * BAD_URL_APP_ID = "lomiri-url-dispatcher-bad-url-helper"; OverlayTrackerMir::OverlayTrackerMir () : thread([this] { /* Setup Helper Observer */ lomiri_app_launch_observer_add_helper_stop(overlayHelperStoppedStatic, OVERLAY_HELPER_TYPE, this); lomiri_app_launch_observer_add_helper_stop(overlayHelperStoppedStatic, BAD_URL_HELPER_TYPE, this); }, [this] { /* Remove Helper Observer */ lomiri_app_launch_observer_delete_helper_stop(overlayHelperStoppedStatic, OVERLAY_HELPER_TYPE, this); lomiri_app_launch_observer_delete_helper_stop(overlayHelperStoppedStatic, BAD_URL_HELPER_TYPE, this); }) { mir = std::shared_ptr([] { gchar * path = g_build_filename(g_get_user_runtime_dir(), "mir_socket_trusted", NULL); MirConnection * con = mir_connect_sync(path, "url-dispatcher"); g_free(path); return con; }(), [] (MirConnection * connection) { if (connection != nullptr) mir_connection_release(connection); }); if (!mir || !mir_connection_is_valid(mir.get())) { throw std::runtime_error("Unable to connect to Mir"); } } /* Enforce a shutdown order, sessions before connection */ OverlayTrackerMir::~OverlayTrackerMir () { thread.executeOnThread([this] { for (auto& sessionType : ongoingSessions) { while (!sessionType.second.empty()) { removeSession(sessionType.first, sessionType.second.begin()->session.get()); } } return true; }); mir.reset(); } bool OverlayTrackerMir::addOverlay (const char * appid, unsigned long pid, const char * url) { return addOverlayCore(OVERLAY_HELPER_TYPE, appid, pid, url, overlaySessionStateChangedStatic); } bool OverlayTrackerMir::addOverlayCore (const char * helper_id, const char * appid, unsigned long pid, const char * url, void (*stateChangedFunction) (MirPromptSession*, MirPromptSessionState, void *)) { OverlayData data; data.appid = appid; std::string surl(url); return thread.executeOnThread([this, helper_id, &data, pid, surl, stateChangedFunction] { g_debug("Setting up over lay for PID %d with '%s'", int(pid), data.appid.c_str()); data.session = std::shared_ptr( mir_connection_create_prompt_session_sync(mir.get(), pid, stateChangedFunction, this), [] (MirPromptSession * session) { if (session) mir_prompt_session_release_sync(session); }); if (!data.session) { g_critical("Unable to create trusted prompt session for %d with appid '%s'", (int)pid, data.appid.c_str()); return false; } std::array urls { surl.c_str(), nullptr }; auto instance = lomiri_app_launch_start_session_helper(helper_id, data.session.get(), data.appid.c_str(), urls.data()); if (instance == nullptr) { g_critical("Unable to start helper for %d with appid '%s'", int(pid), data.appid.c_str()); return false; } data.instanceid = instance; ongoingSessions[helper_id].push_back(data); g_free(instance); return true; }); } bool OverlayTrackerMir::badUrl (unsigned long pid, const char * url) { return addOverlayCore(BAD_URL_HELPER_TYPE, BAD_URL_APP_ID, pid, url, badUrlSessionStateChangedStatic); } void OverlayTrackerMir::overlaySessionStateChangedStatic (MirPromptSession * session, MirPromptSessionState state, void * user_data) { reinterpret_cast(user_data)->sessionStateChanged(session, state, OVERLAY_HELPER_TYPE); } void OverlayTrackerMir::badUrlSessionStateChangedStatic (MirPromptSession * session, MirPromptSessionState state, void * user_data) { reinterpret_cast(user_data)->sessionStateChanged(session, state, BAD_URL_HELPER_TYPE); } void OverlayTrackerMir::removeSession (const std::string &type, MirPromptSession * session) { g_debug("Removing session: %p", (void*)session); auto& sessions = ongoingSessions[type]; for (auto it = sessions.begin(); it != sessions.end(); it++) { if (it->session.get() == session) { lomiri_app_launch_stop_multiple_helper(type.c_str(), it->appid.c_str(), it->instanceid.c_str()); sessions.erase(it); break; } } } void OverlayTrackerMir::sessionStateChanged (MirPromptSession * session, MirPromptSessionState state, const std::string &type) { if (state != mir_prompt_session_state_stopped) { /* We only care about the stopped state */ return; } /* Executing on the Mir thread, which is nice and all, but we want to get back on our thread */ thread.executeOnThread([this, type, session]() { removeSession(type, session); }); } void OverlayTrackerMir::overlayHelperStoppedStatic (const gchar * appid, const gchar * instanceid, const gchar * helpertype, gpointer user_data) { reinterpret_cast(user_data)->overlayHelperStopped(appid, instanceid, helpertype); } void OverlayTrackerMir::overlayHelperStopped(const gchar * appid, const gchar * instanceid, const gchar * helpertype) { /* This callback will happen on our thread already, we don't need to proxy it on */ if (g_strcmp0(helpertype, OVERLAY_HELPER_TYPE) != 0 && g_strcmp0(helpertype, BAD_URL_HELPER_TYPE) != 0) { return; } /* Making the code in the loop easier to read by using std::string outside */ std::string sappid(appid); std::string sinstanceid(instanceid); for (auto it = ongoingSessions[helpertype].begin(); it != ongoingSessions[helpertype].end(); it++) { if (it->appid == sappid && it->instanceid == sinstanceid) { ongoingSessions[helpertype].erase(it); break; } } } lomiri-url-dispatcher-0.1.3/service/overlay-tracker-mir.h000066400000000000000000000044351446007567600234670ustar00rootroot00000000000000/* * Copyright © 2015 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Ted Gould */ #pragma once #include #include #include #include #include #include "glib-thread.h" #include "overlay-tracker-iface.h" class OverlayTrackerMir : public OverlayTrackerIface { private: struct OverlayData { std::string appid; std::string instanceid; std::shared_ptr session; }; GLib::ContextThread thread; std::shared_ptr mir; std::map> ongoingSessions; public: OverlayTrackerMir (); ~OverlayTrackerMir (); bool addOverlay (const char * appid, unsigned long pid, const char * url) override; bool badUrl (unsigned long pid, const char * url) override; private: /* Overlay Functions */ void removeSession (const std::string &type, MirPromptSession * session); static void badUrlSessionStateChangedStatic (MirPromptSession * session, MirPromptSessionState state, void * user_data); static void overlaySessionStateChangedStatic (MirPromptSession * session, MirPromptSessionState state, void * user_data); void sessionStateChanged (MirPromptSession * session, MirPromptSessionState state, const std::string &type); static void overlayHelperStoppedStatic (const gchar * appid, const gchar * instanceid, const gchar * helpertype, gpointer user_data); void overlayHelperStopped(const gchar * appid, const gchar * instanceid, const gchar * helpertype); bool addOverlayCore (const gchar * helperid, const gchar * appid, unsigned long pid, const gchar * url, void (*stateChangedFunction) (MirPromptSession*, MirPromptSessionState, void *)); }; lomiri-url-dispatcher-0.1.3/service/overlay-tracker.cpp000066400000000000000000000041501446007567600232270ustar00rootroot00000000000000/* * Copyright © 2015 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Ted Gould */ #include "overlay-tracker.h" #include "overlay-tracker-iface.h" #ifdef USE_MIRCLIENT #include "overlay-tracker-mir.h" #endif OverlayTracker * overlay_tracker_new () { #ifdef USE_MIRCLIENT try { OverlayTrackerMir * cpptracker = new OverlayTrackerMir(); return reinterpret_cast(cpptracker); } catch (...) { return nullptr; } #else return nullptr; #endif } void overlay_tracker_delete (OverlayTracker * tracker) { g_return_if_fail(tracker != nullptr); #ifdef USE_MIRCLIENT auto cpptracker = reinterpret_cast(tracker); delete cpptracker; #endif return; } gboolean overlay_tracker_add (OverlayTracker * tracker, const char * appid, unsigned long pid, const gchar * url) { g_return_val_if_fail(tracker != nullptr, FALSE); g_return_val_if_fail(appid != nullptr, FALSE); g_return_val_if_fail(pid != 0, FALSE); g_return_val_if_fail(url != nullptr, FALSE); #ifdef USE_MIRCLIENT return reinterpret_cast(tracker)->addOverlay(appid, pid, url) ? TRUE : FALSE; #else return FALSE; #endif } gboolean overlay_tracker_badurl (OverlayTracker * tracker, unsigned long pid, const gchar * url) { g_return_val_if_fail(tracker != nullptr, FALSE); g_return_val_if_fail(pid != 0, FALSE); g_return_val_if_fail(url != nullptr, FALSE); #ifdef USE_MIRCLIENT return reinterpret_cast(tracker)->badUrl(pid, url) ? TRUE : FALSE; #else return FALSE; #endif } lomiri-url-dispatcher-0.1.3/service/overlay-tracker.h000066400000000000000000000022171446007567600226760ustar00rootroot00000000000000/* * Copyright © 2015 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Ted Gould */ #pragma once #include typedef struct _OverlayTracker OverlayTracker; #ifdef __cplusplus extern "C" { #endif OverlayTracker * overlay_tracker_new (); void overlay_tracker_delete (OverlayTracker * tracker); gboolean overlay_tracker_add (OverlayTracker * tracker, const char * appid, unsigned long pid, const char * url); gboolean overlay_tracker_badurl (OverlayTracker * tracker, unsigned long pid, const char * url); #ifdef __cplusplus } #endif lomiri-url-dispatcher-0.1.3/service/service.cpp000066400000000000000000000030731446007567600215600ustar00rootroot00000000000000/** * Copyright (C) 2013-2017 Canonical, Ltd. * * This program is free software: you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License version 3, as published by * the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranties of MERCHANTABILITY, * SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * */ #include "dispatcher.h" #include #include #include /* Where it all begins */ int main (int argc, char * argv[]) { auto mainloop = g_main_loop_new(nullptr, false); g_unix_signal_add(SIGTERM, [](gpointer user_data) { g_main_loop_quit(static_cast(user_data)); return G_SOURCE_REMOVE; }, mainloop); auto tracker = overlay_tracker_new(); #ifdef USE_MIRCLIENT if (!tracker) { g_printerr("failed to set up overlay tracker\n"); return 1; } #endif /* Initialize Dispatcher */ if (!dispatcher_init(mainloop, tracker)) { g_printerr("failed to initialize dispatcher\n"); return 1; } /* Run Main */ g_main_loop_run(mainloop); /* Clean up globals */ dispatcher_shutdown(); overlay_tracker_delete(tracker); g_main_loop_unref(mainloop); return 0; } lomiri-url-dispatcher-0.1.3/service/update-directory.c000066400000000000000000000142411446007567600230430ustar00rootroot00000000000000/** * Copyright © 2014 Canonical, Ltd. * * This program is free software: you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License version 3, as published by * the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranties of MERCHANTABILITY, * SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Ted Gould * */ #include #include #include "url-db.h" typedef struct { const gchar * filename; sqlite3 * db; } urldata_t; static void each_url (JsonArray * array, guint index, JsonNode * value, gpointer user_data) { urldata_t * urldata = (urldata_t *)user_data; if (!JSON_NODE_HOLDS_OBJECT(value)) { g_warning("File %s: Array entry %d not an object", urldata->filename, index); return; } JsonObject * obj = json_node_get_object(value); const gchar * protocol = NULL; const gchar * suffix = NULL; if (json_object_has_member(obj, "protocol")) { protocol = json_object_get_string_member(obj, "protocol"); } if (json_object_has_member(obj, "domain-suffix")) { suffix = json_object_get_string_member(obj, "domain-suffix"); } if (protocol == NULL) { g_warning("File %s: Array entry %d doesn't contain a 'protocol'", urldata->filename, index); return; } if (g_strcmp0(protocol, "intent") == 0) { /* Special handling for intent, we have to have a domain suffix there because otherwise things will get crazy as we're handling it by package lookup in the service. */ if (suffix == NULL) { g_warning("File %s: Array entry %d is an 'intent' protocol but doesn't have a package name", urldata->filename, index); return; } } if (!url_db_insert_url(urldata->db, urldata->filename, protocol, suffix)) { g_warning("Unable to add protocol '%s' with suffix '%s' from '%s'.", protocol, suffix, urldata->filename); } } static void insert_urls_from_file (const gchar * filename, sqlite3 * db) { GError * error = NULL; JsonParser * parser = json_parser_new(); json_parser_load_from_file(parser, filename, &error); if (error != NULL) { g_warning("Unable to parse JSON in '%s': %s", filename, error->message); g_object_unref(parser); g_error_free(error); return; } JsonNode * rootnode = json_parser_get_root(parser); if (!JSON_NODE_HOLDS_ARRAY(rootnode)) { g_warning("File '%s' does not have an array as its root node", filename); g_object_unref(parser); return; } JsonArray * rootarray = json_node_get_array(rootnode); urldata_t urldata = { .filename = filename, .db = db }; json_array_foreach_element(rootarray, each_url, &urldata); g_object_unref(parser); } static gboolean check_file_outofdate (const gchar * filename, sqlite3 * db) { g_debug("Processing file: %s", filename); guint64 dbtime = 0; guint64 filetime = 0; GFile * file = g_file_new_for_path(filename); g_return_val_if_fail(file != NULL, FALSE); GFileInfo * info = g_file_query_info(file, G_FILE_ATTRIBUTE_TIME_MODIFIED, G_FILE_QUERY_INFO_NONE, NULL, NULL); GDateTime * dt = g_file_info_get_modification_date_time(info); filetime = g_date_time_to_unix(dt); g_date_time_unref(dt); g_object_unref(info); g_object_unref(file); if (url_db_get_file_motification_time(db, filename, &dbtime)) { if (filetime <= dbtime) { g_debug("\tup-to-date: %s", filename); return FALSE; } } if (!url_db_set_file_motification_time(db, filename, filetime)) { g_warning("Error updating SQLite with file '%s'.", filename); return FALSE; } return TRUE; } /* Remove a file from the database */ static void remove_file (gpointer key, gpointer value, gpointer user_data) { const gchar * filename = (const gchar *)key; g_debug(" Removing file: %s", filename); if (!url_db_remove_file((sqlite3*)user_data, filename)) { g_warning("Unable to remove file: %s", filename); } } /* In the beginning, there was main, and that was good */ int main (int argc, char * argv[]) { if (argc != 2) { g_printerr("Usage: %s \n", argv[0]); return 1; } sqlite3 * db = url_db_create_database(); g_return_val_if_fail(db != NULL, -1); /* Check out what we got and recover */ gchar * dirname = g_strdup(argv[1]); if (!g_file_test(dirname, G_FILE_TEST_IS_DIR) && !g_str_has_suffix(dirname, "/")) { gchar * upone = g_path_get_dirname(dirname); /* Upstart will give us filenames a bit, let's handle them */ if (g_file_test(upone, G_FILE_TEST_IS_DIR)) { g_free(dirname); dirname = upone; } else { /* If the dirname function doesn't help, stick with what we were given, the whole thing coulda been deleted */ g_free(upone); } } /* Get the current files in the directory in the DB so we know if any got dropped */ GHashTable * startingdb = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL); GList * files = url_db_files_for_dir(db, dirname); GList * cur; for (cur = files; cur != NULL; cur = g_list_next(cur)) { g_hash_table_add(startingdb, cur->data); } g_list_free(files); /* Open the directory on the file system and start going through it */ if (g_file_test(dirname, G_FILE_TEST_IS_DIR)) { GDir * dir = g_dir_open(dirname, 0, NULL); g_return_val_if_fail(dir != NULL, -1); const gchar * name = NULL; while ((name = g_dir_read_name(dir)) != NULL) { if (g_str_has_suffix(name, ".url-dispatcher")) { gchar * fullname = g_build_filename(dirname, name, NULL); if (check_file_outofdate(fullname, db)) { insert_urls_from_file(fullname, db); } g_hash_table_remove(startingdb, fullname); g_free(fullname); } } g_dir_close(dir); } /* Remove deleted files */ g_hash_table_foreach(startingdb, remove_file, db); g_hash_table_destroy(startingdb); int close_status = sqlite3_close(db); if (close_status != SQLITE_OK) { g_critical("Error closing SQLite db: %d", close_status); } g_debug("Directory '%s' is up-to-date", dirname); g_free(dirname); return 0; } lomiri-url-dispatcher-0.1.3/service/url-db.c000066400000000000000000000231541446007567600207470ustar00rootroot00000000000000/** * Copyright © 2014 Canonical, Ltd. * * This program is free software: you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License version 3, as published by * the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranties of MERCHANTABILITY, * SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Ted Gould * */ #include #include "url-db.h" #include "create-db-sql.h" sqlite3 * url_db_create_database () { const gchar * cachedir = g_getenv("URL_DISPATCHER_CACHE_DIR"); /* Mostly for testing */ if (G_LIKELY(cachedir == NULL)) { cachedir = g_get_user_cache_dir(); } gchar * urldispatchercachedir = g_build_filename(cachedir, "lomiri-url-dispatcher", NULL); if (!g_file_test(urldispatchercachedir, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR)) { gint cachedirokay = g_mkdir_with_parents(urldispatchercachedir, 1 << 6 | 1 << 7 | 1 << 8); // 700 if (cachedirokay != 0) { g_warning("Unable to make or find cache directory '%s'", urldispatchercachedir); g_free(urldispatchercachedir); return NULL; } } gchar * dbfilename = g_build_filename(urldispatchercachedir, "urls-" DB_SCHEMA_VERSION ".db", NULL); g_free(urldispatchercachedir); int open_status = SQLITE_ERROR; sqlite3 * db = NULL; open_status = sqlite3_open(dbfilename, &db); if (open_status != SQLITE_OK) { g_warning("Unable to open URL database: %s", sqlite3_errmsg(db)); g_free(dbfilename); if (db != NULL) { sqlite3_close(db); } return NULL; } sqlite3_busy_timeout(db, 3000); g_free(dbfilename); int exec_status = SQLITE_ERROR; char * failstring = NULL; /* If the tables already exist, this command does nothing, because * the SQL says to create "if not exists". We run it always to * make this robust against the case where we are killed between * creating the db file and creating the tables. */ exec_status = sqlite3_exec(db, create_db_sql, NULL, NULL, &failstring); if (exec_status != SQLITE_OK) { g_warning("Unable to create tables: %s", failstring); sqlite3_free(failstring); sqlite3_close(db); return NULL; } return db; } gboolean url_db_get_file_motification_time (sqlite3 * db, const gchar * filename, guint64 * time) { g_return_val_if_fail(db != NULL, FALSE); g_return_val_if_fail(filename != NULL, FALSE); g_return_val_if_fail(time != NULL, FALSE); sqlite3_stmt * stmt; if (sqlite3_prepare_v2(db, "select timestamp from configfiles where name = ?1", -1, /* length */ &stmt, NULL) != SQLITE_OK) { g_warning("Unable to parse SQL to get file times: %s", sqlite3_errmsg(db)); return FALSE; } sqlite3_bind_text(stmt, 1, filename, -1, SQLITE_TRANSIENT); gboolean valueset = FALSE; int exec_status = SQLITE_ROW; while ((exec_status = sqlite3_step(stmt)) == SQLITE_ROW) { if (*time != 0) { g_warning("Seemingly two timestamps for the same file"); } *time = sqlite3_column_int(stmt, 0); valueset = TRUE; } sqlite3_finalize(stmt); if (exec_status != SQLITE_DONE) { g_warning("Unable to execute insert"); return FALSE; } return valueset; } gboolean url_db_set_file_motification_time (sqlite3 * db, const gchar * filename, guint64 time) { g_return_val_if_fail(db != NULL, FALSE); g_return_val_if_fail(filename != NULL, FALSE); sqlite3_stmt * stmt; if (sqlite3_prepare_v2(db, "insert or replace into configfiles values (?1, ?2)", -1, /* length */ &stmt, NULL) != SQLITE_OK) { g_warning("Unable to parse SQL to set file times: %s", sqlite3_errmsg(db)); return FALSE; } sqlite3_bind_text(stmt, 1, filename, -1, SQLITE_TRANSIENT); sqlite3_bind_int(stmt, 2, time); int exec_status = SQLITE_ROW; while ((exec_status = sqlite3_step(stmt)) == SQLITE_ROW) {} sqlite3_finalize(stmt); if (exec_status != SQLITE_DONE) { g_warning("Unable to execute insert"); return FALSE; } return TRUE; } gboolean url_db_insert_url (sqlite3 * db, const gchar * filename, const gchar * protocol, const gchar * domainsuffix) { g_return_val_if_fail(db != NULL, FALSE); g_return_val_if_fail(filename != NULL, FALSE); g_return_val_if_fail(protocol != NULL, FALSE); if (domainsuffix == NULL) { domainsuffix = ""; } sqlite3_stmt * stmt; if (sqlite3_prepare_v2(db, "insert or replace into urls select rowid, ?2, ?3 from configfiles where name = ?1", -1, /* length */ &stmt, NULL) != SQLITE_OK) { g_warning("Unable to parse SQL to insert"); return FALSE; } sqlite3_bind_text(stmt, 1, filename, -1, SQLITE_TRANSIENT); sqlite3_bind_text(stmt, 2, protocol, -1, SQLITE_TRANSIENT); sqlite3_bind_text(stmt, 3, domainsuffix, -1, SQLITE_TRANSIENT); int exec_status = SQLITE_ROW; while ((exec_status = sqlite3_step(stmt)) == SQLITE_ROW) {} sqlite3_finalize(stmt); if (exec_status != SQLITE_DONE) { g_warning("Unable to execute insert: %s", sqlite3_errmsg(db)); return FALSE; } return TRUE; } gchar * url_db_find_url (sqlite3 * db, const gchar * protocol, const gchar * domainsuffix) { g_return_val_if_fail(db != NULL, NULL); g_return_val_if_fail(protocol != NULL, NULL); if (domainsuffix == NULL) { domainsuffix = ""; } sqlite3_stmt * stmt; if (sqlite3_prepare_v2(db, "select configfiles.name from configfiles, urls where urls.sourcefile = configfiles.rowid and urls.protocol = ?1 and ?2 like '%' || urls.domainsuffix order by length(urls.domainsuffix) desc limit 1", -1, /* length */ &stmt, NULL) != SQLITE_OK) { g_warning("Unable to parse SQL to find url: %s", sqlite3_errmsg(db)); return NULL; } sqlite3_bind_text(stmt, 1, protocol, -1, SQLITE_TRANSIENT); sqlite3_bind_text(stmt, 2, domainsuffix, -1, SQLITE_TRANSIENT); gchar * filename = NULL; int exec_status = SQLITE_ROW; while ((exec_status = sqlite3_step(stmt)) == SQLITE_ROW && filename == NULL) { filename = g_strdup((const gchar *)sqlite3_column_text(stmt, 0)); } gchar * output = NULL; if (filename != NULL) { g_debug("Found file: '%s'", filename); gchar * basename = g_path_get_basename(filename); gchar * suffix = g_strrstr(basename, ".url-dispatcher"); if (suffix != NULL) /* This should never not happen, but it's too scary not to throw this 'if' in */ suffix[0] = '\0'; output = g_strdup(basename); g_free(basename); g_free(filename); } sqlite3_finalize(stmt); if (exec_status != SQLITE_DONE) { g_warning("Unable to execute insert: %s", sqlite3_errmsg(db)); g_free(output); return NULL; } return output; } GList * url_db_files_for_dir (sqlite3 * db, const gchar * dir) { g_return_val_if_fail(db != NULL, NULL); if (dir == NULL) { dir = ""; } sqlite3_stmt * stmt; if (sqlite3_prepare_v2(db, "select name from configfiles where name like ?1", -1, /* length */ &stmt, NULL) != SQLITE_OK) { g_warning("Unable to parse SQL to find files: %s", sqlite3_errmsg(db)); return NULL; } gchar * dir_search = g_strdup_printf("%s%%", dir); sqlite3_bind_text(stmt, 1, dir_search, -1, SQLITE_TRANSIENT); GList * filelist = NULL; int exec_status = SQLITE_ROW; while ((exec_status = sqlite3_step(stmt)) == SQLITE_ROW) { gchar * name = g_strdup((const gchar *)sqlite3_column_text(stmt, 0)); filelist = g_list_prepend(filelist, name); } sqlite3_finalize(stmt); g_free(dir_search); if (exec_status != SQLITE_DONE) { g_warning("Unable to execute insert: %s", sqlite3_errmsg(db)); g_list_free_full(filelist, g_free); return NULL; } return filelist; } /* Remove a file from the database along with all URLs that were built because of it. */ gboolean url_db_remove_file (sqlite3 * db, const gchar * path) { g_return_val_if_fail(db != NULL, FALSE); g_return_val_if_fail(path != NULL, FALSE); /* Start a transaction so the database doesn't end up in an inconsistent state */ if (sqlite3_exec(db, "begin", NULL, NULL, NULL) != SQLITE_OK) { g_warning("Unable to start transaction to delete: %s", sqlite3_errmsg(db)); return FALSE; } /* Remove all URLs for file */ sqlite3_stmt * stmt; if (sqlite3_prepare_v2(db, "delete from urls where sourcefile in (select rowid from configfiles where name = ?1);", -1, /* length */ &stmt, NULL) != SQLITE_OK) { g_warning("Unable to parse SQL to remove urls: %s", sqlite3_errmsg(db)); goto rollback; } sqlite3_bind_text(stmt, 1, path, -1, SQLITE_TRANSIENT); int exec_status = SQLITE_ROW; while ((exec_status = sqlite3_step(stmt)) == SQLITE_ROW) { } sqlite3_finalize(stmt); if (exec_status != SQLITE_DONE) { g_warning("Unable to execute removal of URLs: %s", sqlite3_errmsg(db)); goto rollback; } /* Remove references to the file */ stmt = NULL; if (sqlite3_prepare_v2(db, "delete from configfiles where name = ?1;", -1, /* length */ &stmt, NULL) != SQLITE_OK) { g_warning("Unable to parse SQL to remove urls: %s", sqlite3_errmsg(db)); goto rollback; } sqlite3_bind_text(stmt, 1, path, -1, SQLITE_TRANSIENT); while ((exec_status = sqlite3_step(stmt)) == SQLITE_ROW) { } sqlite3_finalize(stmt); if (exec_status != SQLITE_DONE) { g_warning("Unable to execute removal of file: %s", sqlite3_errmsg(db)); goto rollback; } /* Commit the full transaction */ if (sqlite3_exec(db, "commit", NULL, NULL, NULL) != SQLITE_OK) { g_warning("Unable to commit transaction to delete: %s", sqlite3_errmsg(db)); goto rollback; } return TRUE; rollback: if (sqlite3_exec(db, "rollback", NULL, NULL, NULL) != SQLITE_OK) { g_warning("Unable to rollback transaction: %s", sqlite3_errmsg(db)); } return FALSE; } lomiri-url-dispatcher-0.1.3/service/url-db.h000066400000000000000000000042621446007567600207530ustar00rootroot00000000000000/** * Copyright © 2014 Canonical, Ltd. * * This program is free software: you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License version 3, as published by * the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranties of MERCHANTABILITY, * SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Author: Ted Gould * */ #ifndef URL_DB_H #define URL_DB_H 1 #include #include #define DB_SCHEMA_VERSION "1" G_BEGIN_DECLS sqlite3 * url_db_create_database (); gboolean url_db_get_file_motification_time (sqlite3 * db, const gchar * filename, guint64 * time); gboolean url_db_set_file_motification_time (sqlite3 * db, const gchar * filename, guint64 time); gboolean url_db_insert_url (sqlite3 * db, const gchar * filename, const gchar * protocol, const gchar * domainsuffix); gchar * url_db_find_url (sqlite3 * db, const gchar * protocol, const gchar * domainsuffix); GList * url_db_files_for_dir (sqlite3 * db, const gchar * dir); gboolean url_db_remove_file (sqlite3 * db, const gchar * path); G_END_DECLS #endif /* URL_DB_H */ lomiri-url-dispatcher-0.1.3/service/url-overlay/000077500000000000000000000000001446007567600216725ustar00rootroot00000000000000lomiri-url-dispatcher-0.1.3/service/url-overlay/CMakeLists.txt000066400000000000000000000006661446007567600244420ustar00rootroot00000000000000 ########################### # URL Overlay Exec Tool ########################### add_executable(url-overlay-exec-tool exec-tool.c) set_target_properties(url-overlay-exec-tool PROPERTIES OUTPUT_NAME "exec-tool") target_link_libraries(url-overlay-exec-tool ${GIO2_LIBRARIES} ${LOMIRI_APP_LAUNCH_LIBRARIES}) install( TARGETS url-overlay-exec-tool RUNTIME DESTINATION "${CMAKE_INSTALL_FULL_LIBEXECDIR}/lomiri-app-launch/url-overlay" ) lomiri-url-dispatcher-0.1.3/service/url-overlay/exec-tool.c000066400000000000000000000062521446007567600237420ustar00rootroot00000000000000/* * Copyright © 2014 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Ted Gould */ #include #include #include gchar * build_exec (const gchar * appid, const gchar * directory) { gchar * appid_desktop = g_strdup_printf("%s.desktop", appid); gchar * desktopfilepath = g_build_filename(directory, appid_desktop, NULL); g_free(appid_desktop); if (!g_file_test(desktopfilepath, G_FILE_TEST_EXISTS)) { g_free(desktopfilepath); return NULL; } GError * error = NULL; GKeyFile * keyfile = g_key_file_new(); g_key_file_load_from_file(keyfile, desktopfilepath, G_KEY_FILE_NONE, &error); if (error != NULL) { g_error("Unable to read url-overlay desktop file '%s': %s", desktopfilepath, error->message); g_free(desktopfilepath); g_key_file_free(keyfile); g_error_free(error); return NULL; } g_free(desktopfilepath); if (!g_key_file_has_key(keyfile, "Desktop Entry", "Exec", NULL)) { g_error("Desktop file for '%s' in '%s' does not have 'Exec' key", appid, directory); g_key_file_free(keyfile); return NULL; } gchar * exec = g_key_file_get_string(keyfile, "Desktop Entry", "Exec", NULL); g_key_file_free(keyfile); return exec; } gchar * build_dir (const gchar * appid) { gchar * package = NULL; /* 'Parse' the App ID */ if (!lomiri_app_launch_app_id_parse(appid, &package, NULL, NULL)) { g_warning("Unable to parse App ID: '%s'", appid); return NULL; } return NULL; } int main (int argc, char * argv[]) { /* Build up our exec */ const gchar * appid = g_getenv("APP_ID"); if (appid == NULL) { g_critical("APP_ID not set for url-overlay."); return -1; } gchar * exec = NULL; /* Allow for environment override */ const gchar * envdir = g_getenv("URL_DISPATCHER_OVERLAY_DIR"); if (G_UNLIKELY(envdir != NULL)) { /* Mostly for testing */ exec = build_exec(appid, envdir); } /* Try the system directory */ if (exec == NULL) { exec = build_exec(appid, OVERLAY_SYSTEM_DIRECTORY); } if (exec == NULL) { g_warning("Invalid appid '%s' for url overlay.", appid); return -1; } gchar * dir = build_dir(appid); /* NOTE: Dir will be NULL for system apps */ GDBusConnection * bus = g_bus_get_sync(G_BUS_TYPE_SESSION, NULL, NULL); g_return_val_if_fail(bus != NULL, -1); gboolean sended = lomiri_app_launch_helper_set_exec(exec, dir); g_free(exec); g_free(dir); /* Ensuring the messages get on the bus before we quit */ g_dbus_connection_flush_sync(bus, NULL, NULL); g_clear_object(&bus); if (sended) { return 0; } else { g_critical("Unable to send exec to Upstart"); return -1; } } lomiri-url-dispatcher-0.1.3/tests/000077500000000000000000000000001446007567600171135ustar00rootroot00000000000000lomiri-url-dispatcher-0.1.3/tests/CMakeLists.txt000066400000000000000000000062041446007567600216550ustar00rootroot00000000000000find_package(GMock) set(APP_ID_TEST_URI 1) configure_file(test-config.h.in test-config.h) include_directories(${CMAKE_CURRENT_BINARY_DIR}) ########################### # Mock Lib ########################### add_library(mock-lib STATIC apparmor-mock.h apparmor-mock.c lomiri-app-launch-mock.h lomiri-app-launch-mock.c) target_link_libraries(mock-lib ${GLIB2_LIBRARIES} ) ########################### # Mir Mock Lib ########################### if(enable_mirclient) add_library(mir-mock-lib SHARED mir-mock.h mir-mock.cpp) target_link_libraries(mir-mock-lib -pthread ${GLIB2_LIBRARIES} ) set_target_properties(mir-mock-lib PROPERTIES OUTPUT_NAME "mir-mock" ) add_definitions(-DUSE_MIRCLIENT=1) endif() ########################### # Dispatcher test ########################### include_directories("${CMAKE_SOURCE_DIR}/service") add_executable (dispatcher-test dispatcher-test.cc) target_link_libraries (dispatcher-test dispatcher-lib mock-lib gtest ${LOMIRI_APP_LAUNCH_LIBRARIES} ${DBUSTEST_LIBRARIES} ${GMOCK_LIBRARIES}) add_test (dispatcher-test dispatcher-test) ########################### # lib test ########################### add_executable (lib-test-no-main lib-test-no-main.c) target_link_libraries (lib-test-no-main dispatcher) add_executable (lib-test lib-test.cc) target_link_libraries (lib-test dispatcher gtest ${DBUSTEST_LIBRARIES} ${GMOCK_LIBRARIES}) add_test (lib-test lib-test) ########################### # service test ########################### add_executable (service-test service-test.cc ${CMAKE_SOURCE_DIR}/service/glib-thread.cpp) target_link_libraries (service-test url-db-lib -pthread dispatcher gtest ${DBUSTEST_LIBRARIES} ${LOMIRI_APP_LAUNCH_LIBRARIES} ${GMOCK_LIBRARIES}) add_test (service-test service-test) ########################### # create db test ########################### add_test (NAME create-db-test COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/test-sql.sh" "${CMAKE_SOURCE_DIR}/service/create-db.sql") ########################### # update directory test ########################### add_executable (directory-update-test directory-update-test.cc) target_link_libraries (directory-update-test url-db-lib gtest ${GMOCK_LIBRARIES}) add_test (directory-update-test directory-update-test) ########################### # url db test ########################### add_executable (url-db-test url-db-test.cc) target_link_libraries (url-db-test url-db-lib gtest ${GMOCK_LIBRARIES}) add_test (url-db-test url-db-test) add_subdirectory(url_dispatcher_testability) ########################### # overlay tracker test ########################### if(enable_mirclient) add_executable (overlay-tracker-test overlay-tracker-test.cpp) target_link_libraries (overlay-tracker-test dispatcher-lib mir-mock-lib mock-lib gtest ${GMOCK_LIBRARIES} ${GIO2_LIBRARIES} ${DBUSTEST_LIBRARIES}) add_test (overlay-tracker-test overlay-tracker-test) endif() ########################### # Coverage ########################### set_property( GLOBAL APPEND PROPERTY COVERAGE_TESTS directory-update-test dispatcher-test exec-tool-test lib-test overlay-tracker-test service-test url-db-test ) lomiri-url-dispatcher-0.1.3/tests/apparmor-mock.c000066400000000000000000000020131446007567600220230ustar00rootroot00000000000000/** * Copyright © 2015 Canonical, Ltd. * * This program is free software: you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License version 3, as published by * the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranties of MERCHANTABILITY, * SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * */ #include #include const char * aa_mock_gettask_profile = NULL; int aa_gettaskcon (pid_t pid, char ** profile, char ** mode) { g_debug("Gettask Con '%s'", aa_mock_gettask_profile); if (aa_mock_gettask_profile == NULL) { return 1; } if (profile != NULL) { *profile = g_strdup(aa_mock_gettask_profile); } return 0; } lomiri-url-dispatcher-0.1.3/tests/apparmor-mock.h000066400000000000000000000013431446007567600220350ustar00rootroot00000000000000/** * Copyright © 2015 Canonical, Ltd. * * This program is free software: you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License version 3, as published by * the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranties of MERCHANTABILITY, * SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * */ #pragma once extern const char * aa_mock_gettask_profile; lomiri-url-dispatcher-0.1.3/tests/directory-update-test.cc000066400000000000000000000264421446007567600236730ustar00rootroot00000000000000/** * Copyright © 2014 Canonical, Ltd. * * This program is free software: you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License version 3, as published by * the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranties of MERCHANTABILITY, * SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * */ #include "test-config.h" #include #include "url-db.h" #include class DirectoryUpdateTest : public ::testing::Test { protected: gchar * cachedir = nullptr; virtual void SetUp() { cachedir = g_build_filename(CMAKE_BINARY_DIR, "url-db-test-cache", nullptr); g_setenv("URL_DISPATCHER_CACHE_DIR", cachedir, TRUE); } virtual void TearDown() { gchar * cmdline = g_strdup_printf("rm -rf \"%s\"", cachedir); g_spawn_command_line_sync(cmdline, nullptr, nullptr, nullptr, nullptr); g_free(cmdline); g_free(cachedir); } int get_file_count (sqlite3 * db) { sqlite3_stmt * stmt; if (sqlite3_prepare_v2(db, "select count(*) from configfiles", -1, /* length */ &stmt, nullptr) != SQLITE_OK) { g_warning("Unable to parse SQL to get file times"); return 0; } int retval = 0; int exec_status = SQLITE_ROW; while ((exec_status = sqlite3_step(stmt)) == SQLITE_ROW) { retval = sqlite3_column_int(stmt, 0); } sqlite3_finalize(stmt); if (exec_status != SQLITE_DONE) { g_warning("Unable to execute insert"); return 0; } return retval; } int get_url_count (sqlite3 * db) { sqlite3_stmt * stmt; if (sqlite3_prepare_v2(db, "select count(*) from urls", -1, /* length */ &stmt, nullptr) != SQLITE_OK) { g_warning("Unable to parse SQL to get file times"); return 0; } int retval = 0; int exec_status = SQLITE_ROW; while ((exec_status = sqlite3_step(stmt)) == SQLITE_ROW) { retval = sqlite3_column_int(stmt, 0); } sqlite3_finalize(stmt); if (exec_status != SQLITE_DONE) { g_warning("Unable to execute insert"); return 0; } return retval; } bool has_file (sqlite3 * db, const char * filename) { sqlite3_stmt * stmt; if (sqlite3_prepare_v2(db, "select count(*) from configfiles where name = ?1", -1, /* length */ &stmt, nullptr) != SQLITE_OK) { g_warning("Unable to parse SQL to get file times"); return false; } sqlite3_bind_text(stmt, 1, filename, -1, SQLITE_TRANSIENT); int retval = 0; int exec_status = SQLITE_ROW; while ((exec_status = sqlite3_step(stmt)) == SQLITE_ROW) { retval = sqlite3_column_int(stmt, 0); } sqlite3_finalize(stmt); if (exec_status != SQLITE_DONE) { g_warning("Unable to execute insert"); return false; } if (retval > 1) { g_warning("Database contains more than one instance of '%s'", filename); return false; } return retval == 1; } bool has_url (sqlite3 * db, const char * protocol, const char * domainsuffix) { sqlite3_stmt * stmt; if (sqlite3_prepare_v2(db, "select count(*) from urls where protocol = ?1 and domainsuffix = ?2", -1, /* length */ &stmt, nullptr) != SQLITE_OK) { g_warning("Unable to parse SQL to get file times"); return false; } sqlite3_bind_text(stmt, 1, protocol, -1, SQLITE_TRANSIENT); sqlite3_bind_text(stmt, 2, domainsuffix, -1, SQLITE_TRANSIENT); int retval = 0; int exec_status = SQLITE_ROW; while ((exec_status = sqlite3_step(stmt)) == SQLITE_ROW) { retval = sqlite3_column_int(stmt, 0); } sqlite3_finalize(stmt); if (exec_status != SQLITE_DONE) { g_warning("Unable to execute insert"); return false; } if (retval > 1) { g_warning("Database contains more than one instance of protocol '%s'", protocol); return false; } return retval == 1; } }; TEST_F(DirectoryUpdateTest, DirDoesntExist) { sqlite3 * db = url_db_create_database(); gchar * cmdline = g_strdup_printf("%s \"%s\"", UPDATE_DIRECTORY_TOOL, CMAKE_SOURCE_DIR "/this-does-not-exist"); g_spawn_command_line_sync(cmdline, nullptr, nullptr, nullptr, nullptr); g_free(cmdline); EXPECT_EQ(0, get_file_count(db)); EXPECT_EQ(0, get_url_count(db)); sqlite3_close(db); } TEST_F(DirectoryUpdateTest, SingleGoodItem) { sqlite3 * db = url_db_create_database(); gchar * cmdline = g_strdup_printf("%s \"%s\"", UPDATE_DIRECTORY_TOOL, UPDATE_DIRECTORY_URLS); g_spawn_command_line_sync(cmdline, nullptr, nullptr, nullptr, nullptr); g_free(cmdline); EXPECT_EQ(1, get_file_count(db)); EXPECT_EQ(1, get_url_count(db)); EXPECT_TRUE(has_file(db, UPDATE_DIRECTORY_URLS "/single-good.url-dispatcher")); EXPECT_TRUE(has_url(db, "http", "ubuntu.com")); sqlite3_close(db); } TEST_F(DirectoryUpdateTest, RerunAgain) { gchar * cmdline = nullptr; sqlite3 * db = url_db_create_database(); cmdline = g_strdup_printf("%s \"%s\"", UPDATE_DIRECTORY_TOOL, UPDATE_DIRECTORY_URLS); g_spawn_command_line_sync(cmdline, nullptr, nullptr, nullptr, nullptr); g_free(cmdline); EXPECT_EQ(1, get_file_count(db)); EXPECT_EQ(1, get_url_count(db)); cmdline = g_strdup_printf("%s \"%s\"", UPDATE_DIRECTORY_TOOL, UPDATE_DIRECTORY_URLS); g_spawn_command_line_sync(cmdline, nullptr, nullptr, nullptr, nullptr); g_free(cmdline); EXPECT_EQ(1, get_file_count(db)); EXPECT_EQ(1, get_url_count(db)); cmdline = g_strdup_printf("%s \"%s\"", UPDATE_DIRECTORY_TOOL, UPDATE_DIRECTORY_URLS); g_spawn_command_line_sync(cmdline, nullptr, nullptr, nullptr, nullptr); g_free(cmdline); EXPECT_EQ(1, get_file_count(db)); EXPECT_EQ(1, get_url_count(db)); sqlite3_close(db); } TEST_F(DirectoryUpdateTest, VariedItems) { sqlite3 * db = url_db_create_database(); gchar * cmdline = g_strdup_printf("%s \"%s\"", UPDATE_DIRECTORY_TOOL, UPDATE_DIRECTORY_VARIED); g_spawn_command_line_sync(cmdline, nullptr, nullptr, nullptr, nullptr); g_free(cmdline); EXPECT_EQ(6, get_file_count(db)); EXPECT_EQ(13, get_url_count(db)); /* object-base.url-dispatcher */ EXPECT_TRUE(has_file(db, UPDATE_DIRECTORY_VARIED "/object-base.url-dispatcher")); EXPECT_FALSE(has_url(db, "object", "object-base.com")); /* bad-filename-suffix.url-launcher */ EXPECT_FALSE(has_file(db, UPDATE_DIRECTORY_VARIED "/bad-filename-suffix.url-launcher")); EXPECT_FALSE(has_url(db, "badsuffix", "bad.suffix.com")); /* not-json.url-dispatcher */ EXPECT_TRUE(has_file(db, UPDATE_DIRECTORY_VARIED "/not-json.url-dispatcher")); EXPECT_FALSE(has_url(db, "notjson", "not.json.com")); /* lots-o-entries.url-dispatcher */ EXPECT_TRUE(has_file(db, UPDATE_DIRECTORY_VARIED "/lots-o-entries.url-dispatcher")); EXPECT_TRUE(has_url(db, "lots0", "lots.com")); EXPECT_TRUE(has_url(db, "lots1", "lots.com")); EXPECT_TRUE(has_url(db, "lots2", "lots.com")); EXPECT_TRUE(has_url(db, "lots3", "lots.com")); EXPECT_TRUE(has_url(db, "lots4", "lots.com")); EXPECT_TRUE(has_url(db, "lots5", "lots.com")); EXPECT_TRUE(has_url(db, "lots6", "lots.com")); EXPECT_TRUE(has_url(db, "lots7", "lots.com")); EXPECT_TRUE(has_url(db, "lots8", "lots.com")); EXPECT_TRUE(has_url(db, "lots9", "lots.com")); /* duplicate.url-dispatcher */ EXPECT_TRUE(has_file(db, UPDATE_DIRECTORY_VARIED "/duplicate.url-dispatcher")); EXPECT_TRUE(has_url(db, "duplicate", "dup.licate.com")); /* dup-file-1.url-dispatcher */ /* dup-file-2.url-dispatcher */ EXPECT_TRUE(has_file(db, UPDATE_DIRECTORY_VARIED "/dup-file-1.url-dispatcher")); EXPECT_TRUE(has_file(db, UPDATE_DIRECTORY_VARIED "/dup-file-2.url-dispatcher")); EXPECT_FALSE(has_url(db, "dupfile", "this.is.in.two.file.org")); sqlite3_close(db); } TEST_F(DirectoryUpdateTest, RemoveFile) { gchar * cmdline; sqlite3 * db = url_db_create_database(); /* A temporary directory to put files in */ gchar * datadir = g_build_filename(CMAKE_BINARY_DIR, "remove-file-data", nullptr); g_mkdir_with_parents(datadir, 1 << 6 | 1 << 7 | 1 << 8); // 700 ASSERT_TRUE(g_file_test(datadir, (GFileTest)(G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR))); /* Copy the files */ cmdline = g_strdup_printf("cp \"%s/%s\" \"%s\"", UPDATE_DIRECTORY_URLS, "single-good.url-dispatcher", datadir); g_spawn_command_line_sync(cmdline, nullptr, nullptr, nullptr, nullptr); g_free(cmdline); /* Run the tool */ cmdline = g_strdup_printf("%s \"%s\"", UPDATE_DIRECTORY_TOOL, datadir); g_spawn_command_line_sync(cmdline, nullptr, nullptr, nullptr, nullptr); g_free(cmdline); EXPECT_EQ(1, get_file_count(db)); EXPECT_EQ(1, get_url_count(db)); /* Kill the files */ cmdline = g_strdup_printf("rm \"%s/%s\"", datadir, "single-good.url-dispatcher"); g_spawn_command_line_sync(cmdline, nullptr, nullptr, nullptr, nullptr); g_free(cmdline); /* Run the tool */ cmdline = g_strdup_printf("%s \"%s\"", UPDATE_DIRECTORY_TOOL, datadir); g_spawn_command_line_sync(cmdline, nullptr, nullptr, nullptr, nullptr); g_free(cmdline); EXPECT_EQ(0, get_file_count(db)); EXPECT_EQ(0, get_url_count(db)); /* Cleanup */ cmdline = g_strdup_printf("rm -rf \"%s\"", datadir); g_spawn_command_line_sync(cmdline, nullptr, nullptr, nullptr, nullptr); g_free(cmdline); sqlite3_close(db); } TEST_F(DirectoryUpdateTest, RemoveDirectory) { gchar * cmdline; sqlite3 * db = url_db_create_database(); /* A temporary directory to put files in */ gchar * datadir = g_build_filename(CMAKE_BINARY_DIR, "remove-directory-data", nullptr); g_mkdir_with_parents(datadir, 1 << 6 | 1 << 7 | 1 << 8); // 700 ASSERT_TRUE(g_file_test(datadir, (GFileTest)(G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR))); /* Copy the files */ cmdline = g_strdup_printf("cp \"%s/%s\" \"%s\"", UPDATE_DIRECTORY_URLS, "single-good.url-dispatcher", datadir); g_spawn_command_line_sync(cmdline, nullptr, nullptr, nullptr, nullptr); g_free(cmdline); /* Run the tool */ cmdline = g_strdup_printf("%s \"%s/\"", UPDATE_DIRECTORY_TOOL, datadir); g_spawn_command_line_sync(cmdline, nullptr, nullptr, nullptr, nullptr); g_free(cmdline); EXPECT_EQ(1, get_file_count(db)); EXPECT_EQ(1, get_url_count(db)); /* Kill the dir */ cmdline = g_strdup_printf("rm -rf \"%s\"", datadir); g_spawn_command_line_sync(cmdline, nullptr, nullptr, nullptr, nullptr); g_free(cmdline); /* Run the tool */ cmdline = g_strdup_printf("%s \"%s/\"", UPDATE_DIRECTORY_TOOL, datadir); g_spawn_command_line_sync(cmdline, nullptr, nullptr, nullptr, nullptr); g_free(cmdline); EXPECT_EQ(0, get_file_count(db)); EXPECT_EQ(0, get_url_count(db)); /* Cleanup */ sqlite3_close(db); } TEST_F(DirectoryUpdateTest, IntentTest) { sqlite3 * db = url_db_create_database(); gchar * cmdline = g_strdup_printf("%s \"%s\"", UPDATE_DIRECTORY_TOOL, UPDATE_DIRECTORY_INTENT); g_spawn_command_line_sync(cmdline, nullptr, nullptr, nullptr, nullptr); g_free(cmdline); EXPECT_EQ(3, get_file_count(db)); EXPECT_EQ(3, get_url_count(db)); EXPECT_TRUE(has_file(db, UPDATE_DIRECTORY_INTENT "/intent-single.url-dispatcher")); EXPECT_TRUE(has_file(db, UPDATE_DIRECTORY_INTENT "/intent-mixed.url-dispatcher")); EXPECT_TRUE(has_file(db, UPDATE_DIRECTORY_INTENT "/intent-no-good.url-dispatcher")); EXPECT_TRUE(has_url(db, "intent", "intent.single")); EXPECT_TRUE(has_url(db, "intent", "intent.mixed")); EXPECT_TRUE(has_url(db, "intent", "intent.mixed.again")); sqlite3_close(db); } lomiri-url-dispatcher-0.1.3/tests/dispatcher-test.cc000066400000000000000000000267331446007567600225400ustar00rootroot00000000000000/** * Copyright (C) 2013 Canonical, Ltd. * * This program is free software: you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License version 3, as published by * the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranties of MERCHANTABILITY, * SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * */ #include "test-config.h" #include #include #include #include "dispatcher.h" #include "lomiri-app-launch-mock.h" #include "overlay-tracker-mock.h" #include "url-db.h" #include "apparmor-mock.h" class DispatcherTest : public ::testing::Test { private: GTestDBus * testbus = nullptr; GMainLoop * mainloop = nullptr; gchar * cachedir = nullptr; protected: OverlayTrackerMock tracker; GDBusConnection * session = nullptr; virtual void SetUp() { g_setenv("URL_DISPATCHER_OVERLAY_DIR", OVERLAY_TEST_DIR, TRUE); cachedir = g_build_filename(CMAKE_BINARY_DIR, "dispatcher-test-cache", nullptr); g_setenv("URL_DISPATCHER_CACHE_DIR", cachedir, TRUE); sqlite3 * db = url_db_create_database(); guint64 timestamp; timestamp = 12345; url_db_set_file_motification_time(db, "/testdir/com.ubuntu.calendar_calendar_9.8.2343.url-dispatcher", timestamp); url_db_insert_url(db, "/testdir/com.ubuntu.calendar_calendar_9.8.2343.url-dispatcher", "calendar", nullptr); url_db_set_file_motification_time(db, "/testdir/com.ubuntu.dialer_dialer_1234.url-dispatcher", timestamp); url_db_insert_url(db, "/testdir/com.ubuntu.dialer_dialer_1234.url-dispatcher", "tel", NULL); url_db_set_file_motification_time(db, "/testdir/magnet-test.url-dispatcher", timestamp); url_db_insert_url(db, "/testdir/magnet-test.url-dispatcher", "magnet", NULL); url_db_set_file_motification_time(db, "/testdir/browser.url-dispatcher", timestamp); url_db_insert_url(db, "/testdir/browser.url-dispatcher", "http", NULL); url_db_set_file_motification_time(db, "/testdir/webapp.url-dispatcher", timestamp); url_db_insert_url(db, "/testdir/webapp.url-dispatcher", "http", "foo.com"); url_db_set_file_motification_time(db, "/testdir/intenter.url-dispatcher", timestamp); url_db_insert_url(db, "/testdir/intenter.url-dispatcher", "intent", "my.android.package"); sqlite3_close(db); testbus = g_test_dbus_new(G_TEST_DBUS_NONE); g_test_dbus_up(testbus); session = g_bus_get_sync(G_BUS_TYPE_SESSION, NULL, NULL); mainloop = g_main_loop_new(nullptr, FALSE); dispatcher_init(mainloop, reinterpret_cast(&tracker)); return; } virtual void TearDown() { dispatcher_shutdown(); /* Clean up queued events */ while (g_main_context_pending(nullptr)) { g_main_context_iteration(nullptr, TRUE); } g_main_loop_unref(mainloop); lomiri_app_launch_mock_clear_last_app_id(); /* let other threads settle */ g_usleep(500000); g_clear_object(&session); g_test_dbus_down(testbus); g_object_unref(testbus); gchar * cmdline = g_strdup_printf("rm -rf \"%s\"", cachedir); g_spawn_command_line_sync(cmdline, nullptr, nullptr, nullptr, nullptr); g_free(cmdline); g_free(cachedir); return; } }; TEST_F(DispatcherTest, AppIdTest) { gchar * out_appid = nullptr; const gchar * out_url = nullptr; /* Good sanity check */ dispatcher_url_to_appid("appid://foobar/baz/1.2.3", &out_appid, &out_url); ASSERT_STREQ("foobar_baz_1.2.3", out_appid); dispatcher_send_to_app(out_appid, out_url); EXPECT_STREQ("foobar_baz_1.2.3", lomiri_app_launch_mock_get_last_app_id()); lomiri_app_launch_mock_clear_last_app_id(); lomiri_app_launch_mock_clear_last_version(); g_clear_pointer(&out_appid, g_free); out_url = nullptr; /* No version at all */ dispatcher_url_to_appid("appid://com.test.good/app1", &out_appid, &out_url); EXPECT_STREQ(nullptr, out_appid); EXPECT_EQ(nullptr, out_url); lomiri_app_launch_mock_clear_last_app_id(); lomiri_app_launch_mock_clear_last_version(); g_clear_pointer(&out_appid, g_free); out_url = nullptr; /* App that would be in a libertine container */ dispatcher_url_to_appid("appid://container-id/org.canonical.app1/0.0", &out_appid, &out_url); EXPECT_STREQ("container-id_org.canonical.app1_0.0", out_appid); EXPECT_EQ(nullptr, out_url); dispatcher_send_to_app(out_appid, out_url); EXPECT_STREQ("container-id_org.canonical.app1_0.0", lomiri_app_launch_mock_get_last_app_id()); lomiri_app_launch_mock_clear_last_app_id(); g_clear_pointer(&out_appid, g_free); out_url = nullptr; } TEST_F(DispatcherTest, ApplicationTest) { gchar * out_appid = nullptr; const gchar * out_url = nullptr; /* Good sanity check */ dispatcher_url_to_appid("application:///foo.desktop", &out_appid, &out_url); dispatcher_send_to_app(out_appid, out_url); ASSERT_STREQ("foo", lomiri_app_launch_mock_get_last_app_id()); lomiri_app_launch_mock_clear_last_app_id(); /* No .desktop */ dispatcher_url_to_appid("application:///foo", &out_appid, &out_url); dispatcher_send_to_app(out_appid, out_url); ASSERT_TRUE(nullptr == lomiri_app_launch_mock_get_last_app_id()); lomiri_app_launch_mock_clear_last_app_id(); /* Missing a / */ dispatcher_url_to_appid("application://foo.desktop", &out_appid, &out_url); dispatcher_send_to_app(out_appid, out_url); ASSERT_TRUE(nullptr == lomiri_app_launch_mock_get_last_app_id()); lomiri_app_launch_mock_clear_last_app_id(); /* Good with hyphens */ dispatcher_url_to_appid("application:///my-really-cool-app.desktop", &out_appid, &out_url); dispatcher_send_to_app(out_appid, out_url); ASSERT_STREQ("my-really-cool-app", lomiri_app_launch_mock_get_last_app_id()); lomiri_app_launch_mock_clear_last_app_id(); /* Good Click Style */ dispatcher_url_to_appid("application:///com.test.foo_bar-app_0.3.4.desktop", &out_appid, &out_url); dispatcher_send_to_app(out_appid, out_url); ASSERT_STREQ("com.test.foo_bar-app_0.3.4", lomiri_app_launch_mock_get_last_app_id()); lomiri_app_launch_mock_clear_last_app_id(); return; } TEST_F(DispatcherTest, RestrictionTest) { /* nullptr cases */ EXPECT_FALSE(dispatcher_appid_restrict("foo-bar", nullptr)); EXPECT_FALSE(dispatcher_appid_restrict("foo-bar", "")); /* Legacy case, full match */ EXPECT_FALSE(dispatcher_appid_restrict("foo-bar", "foo-bar")); EXPECT_FALSE(dispatcher_appid_restrict("foo_bar", "foo_bar")); EXPECT_TRUE(dispatcher_appid_restrict("foo_bar", "foo-bar")); /* Click case, match package */ EXPECT_FALSE(dispatcher_appid_restrict("com.test.foo_bar-app_0.3.4", "com.test.foo")); EXPECT_TRUE(dispatcher_appid_restrict("com.test.foo_bar-app_0.3.4", "com.test.bar")); EXPECT_TRUE(dispatcher_appid_restrict("com.test.foo_bar-app", "com.test.bar")); } TEST_F(DispatcherTest, CalendarTest) { gchar * out_appid = nullptr; const gchar * out_url = nullptr; /* Base Calendar */ dispatcher_url_to_appid("calendar:///?starttime=196311221830Z", &out_appid, &out_url); dispatcher_send_to_app(out_appid, out_url); ASSERT_STREQ("com.ubuntu.calendar_calendar_9.8.2343", lomiri_app_launch_mock_get_last_app_id()); lomiri_app_launch_mock_clear_last_app_id(); /* Two Slash, nothing else */ dispatcher_url_to_appid("calendar://", &out_appid, &out_url); dispatcher_send_to_app(out_appid, out_url); ASSERT_STREQ("com.ubuntu.calendar_calendar_9.8.2343", lomiri_app_launch_mock_get_last_app_id()); lomiri_app_launch_mock_clear_last_app_id(); return; } TEST_F(DispatcherTest, DialerTest) { gchar * out_appid = NULL; const gchar * out_url = NULL; /* Base Telephone */ EXPECT_TRUE(dispatcher_url_to_appid("tel:+442031485000", &out_appid, &out_url)); EXPECT_STREQ("com.ubuntu.dialer_dialer_1234", out_appid); g_free(out_appid); /* Tel with bunch of commas */ EXPECT_TRUE(dispatcher_url_to_appid("tel:911,,,1,,1,,2", &out_appid, &out_url)); EXPECT_STREQ("com.ubuntu.dialer_dialer_1234", out_appid); g_free(out_appid); /* Telephone with slashes */ EXPECT_TRUE(dispatcher_url_to_appid("tel:///+442031485000", &out_appid, &out_url)); EXPECT_STREQ("com.ubuntu.dialer_dialer_1234", out_appid); g_free(out_appid); return; } TEST_F(DispatcherTest, MagnetTest) { gchar * out_appid = NULL; const gchar * out_url = NULL; EXPECT_TRUE(dispatcher_url_to_appid("magnet:?xt=urn:ed2k:31D6CFE0D16AE931B73C59D7E0C089C0&xl=0&dn=zero_len.fil&xt=urn:bitprint:3I42H3S6NNFQ2MSVX7XZKYAYSCX5QBYJ.LWPNACQDBZRYXW3VHJVCJ64QBZNGHOHHHZWCLNQ&xt=urn:md5:D41D8CD98F00B204E9800998ECF8427E", &out_appid, &out_url)); EXPECT_STREQ("magnet-test", out_appid); g_free(out_appid); return; } TEST_F(DispatcherTest, WebappTest) { gchar * out_appid = NULL; const gchar * out_url = NULL; /* Browser test */ EXPECT_TRUE(dispatcher_url_to_appid("http://ubuntu.com", &out_appid, &out_url)); EXPECT_STREQ("browser", out_appid); g_free(out_appid); /* Webapp test */ EXPECT_TRUE(dispatcher_url_to_appid("http://foo.com", &out_appid, &out_url)); EXPECT_STREQ("webapp", out_appid); g_free(out_appid); EXPECT_TRUE(dispatcher_url_to_appid("http://foo.com/bar", &out_appid, &out_url)); EXPECT_STREQ("webapp", out_appid); g_free(out_appid); EXPECT_TRUE(dispatcher_url_to_appid("http://m.foo.com", &out_appid, &out_url)); EXPECT_STREQ("webapp", out_appid); g_free(out_appid); return; } TEST_F(DispatcherTest, IntentTest) { gchar * out_appid = nullptr; const gchar * out_url = nullptr; /* Intent basic test */ EXPECT_TRUE(dispatcher_url_to_appid("intent://foo.google.com/maps#Intent;scheme=http;package=my.android.package;end", &out_appid, &out_url)); EXPECT_STREQ("intenter", out_appid); g_free(out_appid); /* Not our intent test */ out_appid = nullptr; EXPECT_FALSE(dispatcher_url_to_appid("intent://foo.google.com/maps#Intent;scheme=http;package=not.android.package;end", &out_appid, &out_url)); EXPECT_EQ(nullptr, out_appid); /* Ensure domain is ignored */ out_appid = nullptr; EXPECT_FALSE(dispatcher_url_to_appid("intent://my.android.package/maps#Intent;scheme=http;package=not.android.package;end", &out_appid, &out_url)); EXPECT_EQ(nullptr, out_appid); return; } DbusTestDbusMock * setupPidMock() { auto mock = dbus_test_dbus_mock_new("com.lomiri.LomiriDash"); dbus_test_task_set_name(DBUS_TEST_TASK(mock), "LomiriDash"); dbus_test_task_run(DBUS_TEST_TASK(mock)); return mock; } #ifdef USE_MIRCLIENT TEST_F(DispatcherTest, OverlayTest) { EXPECT_TRUE(dispatcher_is_overlay("com.test.good_application_1.2.3")); EXPECT_FALSE(dispatcher_is_overlay("com.test.bad_application_1.2.3")); EXPECT_TRUE(dispatcher_send_to_overlay ("com.test.good_application_1.2.3", "overlay://ubuntu.com", session, g_dbus_connection_get_unique_name(session))); ASSERT_EQ(1, tracker.addedOverlays.size()); EXPECT_EQ("com.test.good_application_1.2.3", std::get<0>(tracker.addedOverlays[0])); EXPECT_EQ(getpid(), std::get<1>(tracker.addedOverlays[0])); EXPECT_EQ("overlay://ubuntu.com", std::get<2>(tracker.addedOverlays[0])); tracker.addedOverlays.clear(); auto pidmock = setupPidMock(); EXPECT_TRUE(dispatcher_send_to_overlay ("com.test.good_application_1.2.3", "overlay://ubuntu.com", session, g_dbus_connection_get_unique_name(session))); ASSERT_EQ(1, tracker.addedOverlays.size()); EXPECT_EQ("com.test.good_application_1.2.3", std::get<0>(tracker.addedOverlays[0])); EXPECT_NE(0, std::get<1>(tracker.addedOverlays[0])); EXPECT_EQ("overlay://ubuntu.com", std::get<2>(tracker.addedOverlays[0])); g_object_unref(pidmock); return; } #endiflomiri-url-dispatcher-0.1.3/tests/lib-test-no-main.c000066400000000000000000000015501446007567600223370ustar00rootroot00000000000000/** * Copyright (C) 2013 Canonical, Ltd. * * This program is free software: you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License version 3, as published by * the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranties of MERCHANTABILITY, * SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * */ #include #include int main (int argc, char * argv[]) { lomiri_url_dispatch_send("foo://bar/barish", NULL, NULL); return 0; } lomiri-url-dispatcher-0.1.3/tests/lib-test.cc000066400000000000000000000114431446007567600211500ustar00rootroot00000000000000/** * Copyright (C) 2013 Canonical, Ltd. * * This program is free software: you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License version 3, as published by * the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranties of MERCHANTABILITY, * SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * */ #include "test-config.h" #include #include #include #include class LibTest : public ::testing::Test { protected: DbusTestService * service = nullptr; DbusTestDbusMock * mock = nullptr; DbusTestDbusMockObject * obj = nullptr; GDBusConnection * bus = nullptr; virtual void SetUp() { service = dbus_test_service_new(nullptr); mock = dbus_test_dbus_mock_new("com.lomiri.URLDispatcher"); obj = dbus_test_dbus_mock_get_object(mock, "/com/lomiri/URLDispatcher", "com.lomiri.URLDispatcher", nullptr); dbus_test_dbus_mock_object_add_method(mock, obj, "DispatchURL", G_VARIANT_TYPE("(ss)"), nullptr, /* out */ "", /* python */ nullptr); /* error */ dbus_test_dbus_mock_object_add_method(mock, obj, "TestURL", G_VARIANT_TYPE("as"), G_VARIANT_TYPE("as"), "ret = ['appid']", /* python */ nullptr); /* error */ dbus_test_service_add_task(service, DBUS_TEST_TASK(mock)); dbus_test_service_start_tasks(service); bus = g_bus_get_sync(G_BUS_TYPE_SESSION, nullptr, nullptr); g_dbus_connection_set_exit_on_close(bus, FALSE); g_object_add_weak_pointer(G_OBJECT(bus), (gpointer *)&bus); return; } virtual void TearDown() { g_clear_object(&mock); g_clear_object(&service); g_object_unref(bus); unsigned int cleartry = 0; while (bus != nullptr && cleartry < 100) { g_usleep(100000); while (g_main_context_pending(nullptr)) g_main_context_iteration(nullptr, TRUE); cleartry++; } return; } }; static void simple_cb (const gchar * /*url*/, gboolean /*success*/, gpointer user_data) { g_main_loop_quit(static_cast(user_data)); } TEST_F(LibTest, BaseTest) { GMainLoop * main = g_main_loop_new(nullptr, FALSE); lomiri_url_dispatch_send("foo://bar/barish", simple_cb, main); /* Give it some time to send and reply */ g_main_loop_run(main); g_main_loop_unref(main); guint callslen = 0; const DbusTestDbusMockCall * calls = dbus_test_dbus_mock_object_get_method_calls(mock, obj, "DispatchURL", &callslen, nullptr); // ASSERT_NE(calls, nullptr); ASSERT_EQ(callslen, 1); GVariant * check = g_variant_new_parsed("('foo://bar/barish', '')"); g_variant_ref_sink(check); ASSERT_TRUE(g_variant_equal(calls->params, check)); g_variant_unref(check); } TEST_F(LibTest, NoMain) { /* Spawning a non-main caller */ g_spawn_command_line_sync(LIB_TEST_NO_MAIN_HELPER, nullptr, nullptr, nullptr, nullptr); guint callslen = 0; const DbusTestDbusMockCall * calls = dbus_test_dbus_mock_object_get_method_calls(mock, obj, "DispatchURL", &callslen, nullptr); // ASSERT_NE(calls, nullptr); ASSERT_EQ(callslen, 1); GVariant * check = g_variant_new_parsed("('foo://bar/barish', '')"); g_variant_ref_sink(check); ASSERT_TRUE(g_variant_equal(calls->params, check)); g_variant_unref(check); } TEST_F(LibTest, RestrictedTest) { GMainLoop * main = g_main_loop_new(nullptr, FALSE); lomiri_url_dispatch_send_restricted("foo://bar/barish", "bar-package", simple_cb, main); /* Give it some time to send and reply */ g_main_loop_run(main); g_main_loop_unref(main); guint callslen = 0; const DbusTestDbusMockCall * calls = dbus_test_dbus_mock_object_get_method_calls(mock, obj, "DispatchURL", &callslen, nullptr); // ASSERT_NE(calls, nullptr); ASSERT_EQ(callslen, 1); GVariant * check = g_variant_new_parsed("('foo://bar/barish', 'bar-package')"); g_variant_ref_sink(check); ASSERT_TRUE(g_variant_equal(calls->params, check)); g_variant_unref(check); } TEST_F(LibTest, TestTest) { const gchar * urls[2] = { "foo://bar/barish", nullptr }; gchar ** appids = lomiri_url_dispatch_url_appid(urls); EXPECT_EQ(1, g_strv_length(appids)); EXPECT_STREQ("appid", appids[0]); g_strfreev(appids); guint callslen = 0; const DbusTestDbusMockCall * calls = dbus_test_dbus_mock_object_get_method_calls(mock, obj, "TestURL", &callslen, nullptr); // ASSERT_NE(calls, nullptr); ASSERT_EQ(callslen, 1); GVariant * check = g_variant_new_parsed("(['foo://bar/barish'],)"); g_variant_ref_sink(check); ASSERT_TRUE(g_variant_equal(calls->params, check)); g_variant_unref(check); } lomiri-url-dispatcher-0.1.3/tests/lomiri-app-launch-mock.c000066400000000000000000000111351446007567600235300ustar00rootroot00000000000000/** * Copyright (C) 2013 Canonical, Ltd. * * This program is free software: you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License version 3, as published by * the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranties of MERCHANTABILITY, * SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * */ #include #include "lomiri-app-launch-mock.h" #include static gchar * last_appid = NULL; static gchar * last_version = NULL; gchar * lomiri_app_launch_triplet_to_app_id (const gchar * pkg, const gchar * app, const gchar * version) { g_return_val_if_fail(pkg != NULL, NULL); g_return_val_if_fail(app != NULL, NULL); if (version != NULL && strlen(version) != 0) { lomiri_app_launch_mock_clear_last_version(); last_version = g_strdup(version); } else if (last_version == NULL) { last_version = g_strdup("current-user-version"); } return g_strdup_printf("%s_%s_%s", pkg, app, last_version); } void lomiri_app_launch_mock_clear_last_version () { g_free(last_version); last_version = NULL; } gboolean lomiri_app_launch_start_application (const gchar * appid, const gchar * const * uris) { lomiri_app_launch_mock_clear_last_app_id(); last_appid = g_strdup(appid); return TRUE; } void lomiri_app_launch_mock_clear_last_app_id () { g_free(last_appid); last_appid = NULL; return; } gchar * lomiri_app_launch_mock_get_last_app_id () { return last_appid; } LomiriAppLaunchHelperObserver lomiri_app_launch_mock_observer_helper_stop_func = NULL; gchar * lomiri_app_launch_mock_observer_helper_stop_type = NULL; void * lomiri_app_launch_mock_observer_helper_stop_user_data = NULL; gboolean lomiri_app_launch_observer_add_helper_stop (LomiriAppLaunchHelperObserver func, const gchar * type, gpointer user_data) { lomiri_app_launch_mock_observer_helper_stop_func = func; lomiri_app_launch_mock_observer_helper_stop_type = g_strdup(type); lomiri_app_launch_mock_observer_helper_stop_user_data = user_data; return TRUE; } gboolean lomiri_app_launch_observer_delete_helper_stop (LomiriAppLaunchHelperObserver func, const gchar * type, gpointer user_data) { gboolean same = lomiri_app_launch_mock_observer_helper_stop_func == func && g_strcmp0(lomiri_app_launch_mock_observer_helper_stop_type, type) == 0 && lomiri_app_launch_mock_observer_helper_stop_user_data == user_data; lomiri_app_launch_mock_observer_helper_stop_func = NULL; g_clear_pointer(&lomiri_app_launch_mock_observer_helper_stop_type, g_free); lomiri_app_launch_mock_observer_helper_stop_user_data = NULL; return same; } gchar * lomiri_app_launch_mock_last_start_session_helper = NULL; #ifdef LAL_USE_MIRCLIENT MirPromptSession * lomiri_app_launch_mock_last_start_session_session = NULL; #endif gchar * lomiri_app_launch_mock_last_start_session_appid = NULL; gchar ** lomiri_app_launch_mock_last_start_session_uris = NULL; #ifdef LAL_USE_MIRCLIENT gchar * lomiri_app_launch_start_session_helper (const gchar * type, MirPromptSession * session, const gchar * appid, const gchar * const * uris) { g_clear_pointer(&lomiri_app_launch_mock_last_start_session_helper, g_free); g_clear_pointer(&lomiri_app_launch_mock_last_start_session_appid, g_free); g_clear_pointer(&lomiri_app_launch_mock_last_start_session_uris, g_strfreev); lomiri_app_launch_mock_last_start_session_helper = g_strdup(type); lomiri_app_launch_mock_last_start_session_session = session; lomiri_app_launch_mock_last_start_session_appid = g_strdup(appid); lomiri_app_launch_mock_last_start_session_uris = g_strdupv((gchar **)uris); return g_strdup("instance"); } #endif gchar * lomiri_app_launch_mock_last_stop_helper = NULL; gchar * lomiri_app_launch_mock_last_stop_appid = NULL; gchar * lomiri_app_launch_mock_last_stop_instance = NULL; gboolean lomiri_app_launch_stop_multiple_helper (const gchar * helper_type, const gchar * appid, const gchar * instance) { g_clear_pointer(&lomiri_app_launch_mock_last_stop_helper, g_free); g_clear_pointer(&lomiri_app_launch_mock_last_stop_appid, g_free); g_clear_pointer(&lomiri_app_launch_mock_last_stop_instance, g_free); lomiri_app_launch_mock_last_stop_helper = g_strdup(helper_type); lomiri_app_launch_mock_last_stop_appid = g_strdup(appid); lomiri_app_launch_mock_last_stop_instance = g_strdup(instance); return TRUE; } lomiri-url-dispatcher-0.1.3/tests/lomiri-app-launch-mock.h000066400000000000000000000032611446007567600235360ustar00rootroot00000000000000/** * Copyright (C) 2013 Canonical, Ltd. * * This program is free software: you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License version 3, as published by * the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranties of MERCHANTABILITY, * SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * */ #ifndef UPSTART_APP_LAUNCH_MOCK #define UPSTART_APP_LAUNCH_MOCK 1 #include #include G_BEGIN_DECLS void lomiri_app_launch_mock_clear_last_version (); void lomiri_app_launch_mock_clear_last_app_id (); gchar * lomiri_app_launch_mock_get_last_app_id (); extern LomiriAppLaunchHelperObserver lomiri_app_launch_mock_observer_helper_stop_func; extern gchar * lomiri_app_launch_mock_observer_helper_stop_type; extern void * lomiri_app_launch_mock_observer_helper_stop_user_data; extern gchar * lomiri_app_launch_mock_last_start_session_helper; #ifdef LAL_ENABLE_MIRCLIENT extern MirPromptSession * lomiri_app_launch_mock_last_start_session_session; #endif extern gchar * lomiri_app_launch_mock_last_start_session_appid; extern gchar ** lomiri_app_launch_mock_last_start_session_uris; extern gchar * lomiri_app_launch_mock_last_stop_helper; extern gchar * lomiri_app_launch_mock_last_stop_appid; extern gchar * lomiri_app_launch_mock_last_stop_instance; G_END_DECLS #endif /* UPSTART_APP_LAUNCH_MOCK */ lomiri-url-dispatcher-0.1.3/tests/manual000066400000000000000000000014251446007567600203150ustar00rootroot00000000000000Test-case url-dispatcher/settings-second-activation
Open the system settings app
Settings app should open, focus, and be showing the category selection screen
Open the laucher using the left swipe/dt>
Select the Ubuntu button to return to the home screen
The settings apps should not be visible
Open the power indicator by swiping from the top by the battery icon
At the top of the screen there should be a "Battery" header
Select the "Settings" item at the bottom of the indicator entries
The indicator should close
The settings application should come to focus
The settings app should display the battery settings
lomiri-url-dispatcher-0.1.3/tests/mir-mock.cpp000066400000000000000000000066011446007567600213400ustar00rootroot00000000000000/** * Copyright © 2015 Canonical, Ltd. * * This program is free software: you can redistribute it and/or modify it under * the terms of the GNU General Public License version 3, as published by * the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranties of MERCHANTABILITY, * SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * */ #include "mir-mock.h" #include #include #include MirPromptSession * mir_mock_valid_trust_session = (MirPromptSession *)"In the circle of trust"; static bool valid_trust_connection = true; static int trusted_fd = 1234; MirPromptSession * mir_mock_last_released_session = NULL; pid_t mir_mock_last_trust_pid = 0; void (*mir_mock_last_trust_func)(MirPromptSession *, MirPromptSessionState, void*data) = NULL; void * mir_mock_last_trust_data = NULL; MirPromptSession * mir_connection_create_prompt_session_sync(MirConnection *, pid_t pid, void (*func)(MirPromptSession *, MirPromptSessionState, void*data), void * context) { mir_mock_last_trust_pid = pid; mir_mock_last_trust_func = func; mir_mock_last_trust_data = context; if (valid_trust_connection) { return mir_mock_valid_trust_session; } else { return nullptr; } } void mir_prompt_session_release_sync (MirPromptSession * session) { mir_mock_last_released_session = session; if (session != mir_mock_valid_trust_session) { std::cerr << "Releasing a Mir Trusted Prompt that isn't valid" << std::endl; exit(1); } } MirWaitHandle * mir_prompt_session_new_fds_for_prompt_providers (MirPromptSession * session, unsigned int numfds, MirClientFdCallback cb, void * data) { if (session != mir_mock_valid_trust_session) { std::cerr << "Releasing a Mir Trusted Prompt that isn't valid" << std::endl; exit(1); } std::thread * thread = new std::thread([session, numfds, cb, data]() { std::vector fdlist(numfds); for (unsigned int i = 0; i < numfds; i++) fdlist[i] = trusted_fd; cb(session, numfds, fdlist.data(), data); }); return reinterpret_cast(thread); } void mir_wait_for (MirWaitHandle * wait) { auto thread = reinterpret_cast(wait); if (thread->joinable()) thread->join(); delete thread; } static const char * valid_connection_str = "Valid Mir Connection"; static std::pair last_connection; static bool valid_connection = true; void mir_mock_connect_return_valid (bool valid) { valid_connection = valid; } std::pair mir_mock_connect_last_connect () { return last_connection; } MirConnection * mir_connect_sync (char const * server, char const * appname) { last_connection = std::pair(server, appname); if (valid_connection) { return (MirConnection *)(valid_connection_str); } else { return nullptr; } } bool mir_connection_is_valid (MirConnection * con) { return true; } void mir_connection_release (MirConnection * con) { if (reinterpret_cast(con) != valid_connection_str) { std::cerr << "Releasing a Mir Connection that isn't valid" << std::endl; exit(1); } } void mir_mock_set_trusted_fd (int fd) { trusted_fd = fd; } lomiri-url-dispatcher-0.1.3/tests/mir-mock.h000066400000000000000000000024121446007567600210010ustar00rootroot00000000000000/** * Copyright © 2015 Canonical, Ltd. * * This program is free software: you can redistribute it and/or modify it under * the terms of the GNU General Public License version 3, as published by * the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranties of MERCHANTABILITY, * SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * */ #ifndef MIR_MOCK_H #define MIR_MOCK_H 1 #include #include #include #include void mir_mock_connect_return_valid (bool valid); std::pair mir_mock_connect_last_connect (); void mir_mock_set_trusted_fd (int fd); extern MirPromptSession * mir_mock_valid_trust_session; extern MirPromptSession * mir_mock_last_released_session; extern pid_t mir_mock_last_trust_pid; extern void (*mir_mock_last_trust_func)(MirPromptSession *, MirPromptSessionState, void*data); extern void * mir_mock_last_trust_data; #endif // MIR_MOCK_H lomiri-url-dispatcher-0.1.3/tests/overlay-dir/000077500000000000000000000000001446007567600213505ustar00rootroot00000000000000lomiri-url-dispatcher-0.1.3/tests/overlay-dir/com.test.good_application_1.2.3.desktop000066400000000000000000000000341446007567600305270ustar00rootroot00000000000000[Desktop Entry] Exec=foobar lomiri-url-dispatcher-0.1.3/tests/overlay-tracker-mock.h000066400000000000000000000023651446007567600233330ustar00rootroot00000000000000/** * Copyright © 2015 Canonical, Ltd. * * This program is free software: you can redistribute it and/or modify it under * the terms of the GNU General Public License version 3, as published by * the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranties of MERCHANTABILITY, * SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * */ #pragma once #include "overlay-tracker-iface.h" #include class OverlayTrackerMock : public OverlayTrackerIface { public: std::vector> addedOverlays; std::vector> addedBadUrl; bool addOverlay (const char * appid, unsigned long pid, const char * url) { addedOverlays.push_back(std::make_tuple(std::string(appid), pid, std::string(url))); return true; } bool badUrl (unsigned long pid, const char * url) { addedBadUrl.push_back(std::make_pair(pid, std::string(url))); return true; } }; lomiri-url-dispatcher-0.1.3/tests/overlay-tracker-test.cpp000066400000000000000000000123101446007567600237030ustar00rootroot00000000000000/** * Copyright © 2015 Canonical, Ltd. * * This program is free software: you can redistribute it and/or modify it under * the terms of the GNU General Public License version 3, as published by * the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranties of MERCHANTABILITY, * SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * */ #include #include "test-config.h" #include #include #include #include "overlay-tracker-mir.h" #include "lomiri-app-launch-mock.h" #include "mir-mock.h" class OverlayTrackerTest : public ::testing::Test { protected: virtual void SetUp() { g_setenv("URL_DISPATCHER_DISABLE_RECOVERABLE_ERROR", "1", TRUE); g_setenv("LD_PRELOAD", MIR_MOCK_PATH, TRUE); return; } virtual void TearDown() { return; } static gboolean quit_loop (gpointer ploop) { g_main_loop_quit((GMainLoop *)ploop); return FALSE; } void pause (int time) { GMainLoop * loop = g_main_loop_new(nullptr, FALSE); g_timeout_add(time, quit_loop, loop); g_main_loop_run(loop); g_main_loop_unref(loop); } }; TEST_F(OverlayTrackerTest, BasicCreation) { auto tracker = new OverlayTrackerMir(); delete tracker; } TEST_F(OverlayTrackerTest, AddOverlay) { auto tracker = new OverlayTrackerMir(); auto mirconn = mir_mock_connect_last_connect(); EXPECT_EQ("mir_socket_trusted", mirconn.first.substr(mirconn.first.size() - 18)); EXPECT_EQ("url-dispatcher", mirconn.second); EXPECT_TRUE(tracker->addOverlay("app-id", 5, "http://no-name-yet.com")); EXPECT_EQ(5, mir_mock_last_trust_pid); EXPECT_STREQ("url-overlay", lomiri_app_launch_mock_last_start_session_helper); EXPECT_STREQ("app-id", lomiri_app_launch_mock_last_start_session_appid); EXPECT_STREQ("http://no-name-yet.com", lomiri_app_launch_mock_last_start_session_uris[0]); delete tracker; EXPECT_STREQ("url-overlay", lomiri_app_launch_mock_last_stop_helper); EXPECT_STREQ("app-id", lomiri_app_launch_mock_last_stop_appid); EXPECT_STREQ("instance", lomiri_app_launch_mock_last_stop_instance); } TEST_F(OverlayTrackerTest, OverlayABunch) { OverlayTrackerMir tracker; std::uniform_int_distribution<> randpid(1, 32000); std::mt19937 rand; /* Testing adding a bunch of overlays, we're using pretty standard data structures, but let's make sure we didn't break 'em */ for (auto name : std::vector{"warty", "hoary", "breezy", "dapper", "edgy", "feisty", "gutsy", "hardy", "intrepid", "jaunty", "karmic", "lucid", "maverick", "natty", "oneiric", "precise", "quantal", "raring", "saucy", "trusty", "utopic", "vivid", "wily"}) { int pid = randpid(rand); tracker.addOverlay(name.c_str(), pid, "http://ubuntu.com/releases"); EXPECT_EQ(pid, mir_mock_last_trust_pid); EXPECT_EQ(name, lomiri_app_launch_mock_last_start_session_appid); } } void ualStop (const char * helper_type, std::function addFunc) { auto tracker = new OverlayTrackerMir(); /* Call with the overlay before it is set */ lomiri_app_launch_mock_observer_helper_stop_func("app-id", "instance", helper_type, lomiri_app_launch_mock_observer_helper_stop_user_data); EXPECT_TRUE(addFunc(tracker)); mir_mock_last_released_session = nullptr; lomiri_app_launch_mock_observer_helper_stop_func("app-id", "instance", helper_type, lomiri_app_launch_mock_observer_helper_stop_user_data); delete tracker; EXPECT_NE(nullptr, mir_mock_last_released_session); } TEST_F(OverlayTrackerTest, UALSignalStop) { ualStop("url-overlay", [](OverlayTrackerMir * tracker) { return tracker->addOverlay("app-id", 5, "http://no-name-yet.com"); }); ualStop("bad-url", [](OverlayTrackerMir * tracker) { return tracker->badUrl(5, "http://no-name-yet.com"); }); } void mirStop (const char * helper_type, const char * appid, std::function addFunc) { g_clear_pointer(&lomiri_app_launch_mock_last_stop_helper, g_free); g_clear_pointer(&lomiri_app_launch_mock_last_stop_appid, g_free); g_clear_pointer(&lomiri_app_launch_mock_last_stop_instance, g_free); auto tracker = new OverlayTrackerMir(); EXPECT_TRUE(addFunc(tracker)); /* Try a badie */ mir_mock_last_trust_func((MirPromptSession *)1337, mir_prompt_session_state_stopped, mir_mock_last_trust_data); EXPECT_NE(nullptr, mir_mock_last_trust_func); mir_mock_last_trust_func(mir_mock_valid_trust_session, mir_prompt_session_state_stopped, mir_mock_last_trust_data); delete tracker; EXPECT_STREQ(helper_type, lomiri_app_launch_mock_last_stop_helper); EXPECT_STREQ(appid, lomiri_app_launch_mock_last_stop_appid); EXPECT_STREQ("instance", lomiri_app_launch_mock_last_stop_instance); } TEST_F(OverlayTrackerTest, MirSignalStop) { mirStop("url-overlay", "app-id", [](OverlayTrackerMir * tracker) { return tracker->addOverlay("app-id", 5, "http://no-name-yet.com"); }); mirStop("bad-url", "lomiri-url-dispatcher-bad-url-helper", [](OverlayTrackerMir * tracker) { return tracker->badUrl(5, "http://no-name-yet.com"); }); } lomiri-url-dispatcher-0.1.3/tests/service-test.cc000066400000000000000000000200771446007567600220450ustar00rootroot00000000000000/** * Copyright (C) 2013 Canonical, Ltd. * * This program is free software: you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License version 3, as published by * the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranties of MERCHANTABILITY, * SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * */ #include "test-config.h" #include #include #include #include #include "url-db.h" #include "systemd-mock.h" #define CGROUP_DIR (CMAKE_BINARY_DIR "/systemd-service-test-cgroups") class ServiceTest : public ::testing::Test { protected: DbusTestService * service = nullptr; DbusTestDbusMock * dashmock = nullptr; DbusTestProcess * dispatcher = nullptr; std::shared_ptr systemd; GDBusConnection * bus = nullptr; virtual void SetUp() { g_setenv("LOMIRI_APP_LAUNCH_USE_SESSION", "1", TRUE); g_setenv("LOMIRI_APP_LAUNCH_SYSTEMD_CGROUP_ROOT", CGROUP_DIR, TRUE); g_setenv("LOMIRI_APP_LAUNCH_SYSTEMD_PATH", "/this/should/not/exist", TRUE); g_setenv("URL_DISPATCHER_DISABLE_RECOVERABLE_ERROR", "1", TRUE); g_setenv("XDG_DATA_DIRS", XDG_DATA_DIRS, TRUE); g_setenv("LD_PRELOAD", MIR_MOCK_PATH, TRUE); SetUpDb(); service = dbus_test_service_new(nullptr); dispatcher = dbus_test_process_new(URL_DISPATCHER_SERVICE); dbus_test_task_set_name(DBUS_TEST_TASK(dispatcher), "Dispatcher"); dbus_test_service_add_task(service, DBUS_TEST_TASK(dispatcher)); /* Systemd Mock */ systemd = std::make_shared( std::list{ {"application-legacy", "single", {}, getpid(), {getpid()}}, }, CGROUP_DIR); dbus_test_service_add_task(service, *systemd); /* Dash Mock */ dashmock = dbus_test_dbus_mock_new("com.lomiri.LomiriDash"); DbusTestDbusMockObject * fdoobj = dbus_test_dbus_mock_get_object(dashmock, "/lomiri_2ddash", "org.freedesktop.Application", nullptr); dbus_test_dbus_mock_object_add_method(dashmock, fdoobj, "Open", G_VARIANT_TYPE("(asa{sv})"), nullptr, /* return */ "", /* python */ nullptr); /* error */ dbus_test_task_set_name(DBUS_TEST_TASK(dashmock), "LomiriDash"); dbus_test_service_add_task(service, DBUS_TEST_TASK(dashmock)); /* Start your engines! */ dbus_test_service_start_tasks(service); bus = g_bus_get_sync(G_BUS_TYPE_SESSION, nullptr, nullptr); g_dbus_connection_set_exit_on_close(bus, FALSE); g_object_add_weak_pointer(G_OBJECT(bus), (gpointer *)&bus); return; } virtual void TearDown() { kill(dbus_test_process_get_pid(dispatcher), SIGTERM); systemd.reset(); g_clear_object(&dispatcher); g_clear_object(&dashmock); g_clear_object(&service); g_object_unref(bus); unsigned int cleartry = 0; while (bus != nullptr && cleartry < 100) { pause(100); cleartry++; } TearDownDb(); return; } void SetUpDb () { const gchar * cachedir = CMAKE_BINARY_DIR "/service-test-cache"; ASSERT_EQ(0, g_mkdir_with_parents(cachedir, 0700)); g_setenv("XDG_CACHE_HOME", cachedir, TRUE); sqlite3 * db = url_db_create_database(); guint64 time = 5; url_db_set_file_motification_time(db, "/lomiri-dash.url-dispatcher", time); url_db_insert_url(db, "/lomiri-dash.url-dispatcher", "thingish", nullptr); sqlite3_close(db); } void TearDownDb () { g_spawn_command_line_sync("rm -rf " CMAKE_BINARY_DIR "/service-test-cache", nullptr, nullptr, nullptr, nullptr); } static gboolean quit_loop (gpointer ploop) { g_main_loop_quit((GMainLoop *)ploop); return FALSE; } void pause (int time) { GMainLoop * loop = g_main_loop_new(nullptr, FALSE); g_timeout_add(time, quit_loop, loop); g_main_loop_run(loop); g_main_loop_unref(loop); } }; static void simple_cb (const gchar * /*url*/, gboolean /*success*/, gpointer user_data) { g_main_loop_quit(static_cast(user_data)); } TEST_F(ServiceTest, InvalidTest) { GMainLoop * main = g_main_loop_new(nullptr, FALSE); /* Send an invalid URL */ lomiri_url_dispatch_send("foo://bar/barish", simple_cb, main); /* Give it some time to send and reply */ g_main_loop_run(main); g_main_loop_unref(main); auto calls = systemd->unitCalls(); ASSERT_EQ(0u, calls.size()); } TEST_F(ServiceTest, ApplicationTest) { GMainLoop * main = g_main_loop_new(nullptr, FALSE); /* Send an invalid URL */ lomiri_url_dispatch_send("application:///foo-bar.desktop", simple_cb, main); /* Give it some time to send and reply */ g_main_loop_run(main); g_main_loop_unref(main); /* Check to see it called systemd */ auto calls = systemd->unitCalls(); ASSERT_EQ(1u, calls.size()); /* FIXME: we need to strip the instance ID from calls.begin()->name first and match that against SystemdMock::instanceName(...) */ //EXPECT_EQ(SystemdMock::instanceName({"application-legacy", "foo-bar", "", 0, {}}), calls.begin()->name); } TEST_F(ServiceTest, TestURLTest) { /* Simple */ const char * testurls[] = { "application:///foo-bar.desktop", nullptr }; gchar ** appids = lomiri_url_dispatch_url_appid(testurls); ASSERT_EQ(1u, g_strv_length(appids)); EXPECT_STREQ("foo-bar", appids[0]); g_strfreev(appids); /* Multiple */ const char * multiurls[] = { "application:///bar-foo.desktop", "application:///foo-bar.desktop", nullptr }; gchar ** multiappids = lomiri_url_dispatch_url_appid(multiurls); ASSERT_EQ(2u, g_strv_length(multiappids)); EXPECT_STREQ("bar-foo", multiappids[0]); EXPECT_STREQ("foo-bar", multiappids[1]); g_strfreev(multiappids); /* Error URL */ const char * errorurls[] = { "foo://bar/no/url", nullptr }; gchar ** errorappids = lomiri_url_dispatch_url_appid(errorurls); ASSERT_EQ(0u, g_strv_length(errorappids)); g_strfreev(errorappids); } void focus_signal_cb (GDBusConnection * /*connection*/, const gchar * /*sender_name*/, const gchar * /*object_path*/, const gchar * /*interface_name*/, const gchar * /*signal_name*/, GVariant * /*parameters*/, gpointer user_data) { guint * focus_count = (guint *)user_data; *focus_count = *focus_count + 1; g_debug("Focus signaled: %d", *focus_count); } TEST_F(ServiceTest, LomiriDashTest) { guint focus_count = 0; GDBusConnection * bus = g_bus_get_sync(G_BUS_TYPE_SESSION, nullptr, nullptr); guint focus_signal = g_dbus_connection_signal_subscribe(bus, nullptr, /* sender */ "com.lomiri.LomiriAppLaunch", "LomiriFocusRequest", "/", "lomiri-dash", /* arg0 */ G_DBUS_SIGNAL_FLAGS_NONE, focus_signal_cb, &focus_count, nullptr); /* destroy func */ DbusTestDbusMockObject * fdoobj = dbus_test_dbus_mock_get_object(dashmock, "/lomiri_2ddash", "org.freedesktop.Application", nullptr); GMainLoop * main = g_main_loop_new(nullptr, FALSE); /* Send an invalid URL */ lomiri_url_dispatch_send("thingish://foo-bar", simple_cb, main); /* Give it some time to send and reply */ g_main_loop_run(main); g_main_loop_unref(main); guint callslen = 0; auto calls = dbus_test_dbus_mock_object_get_method_calls(dashmock, fdoobj, "Open", &callslen, nullptr); EXPECT_EQ(1u, callslen); EXPECT_TRUE(g_variant_equal(calls[0].params, g_variant_new_parsed("(['thingish://foo-bar'], @a{sv} {})"))); EXPECT_EQ(1u, focus_count); g_dbus_connection_signal_unsubscribe(bus, focus_signal); g_clear_object(&bus); } lomiri-url-dispatcher-0.1.3/tests/systemd-mock.h000066400000000000000000000523351446007567600217130ustar00rootroot00000000000000/* * Copyright © 2017 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * Authors: * Ted Gould */ #include #include #include #include #include #include #include #include #include #include "glib-thread.h" class SystemdMock { public: struct Instance { std::string job; std::string appid; std::string instanceid; pid_t primaryPid; std::vector pids; }; private: DbusTestDbusMock* mock = nullptr; DbusTestDbusMockObject* managerobj = nullptr; GLib::ContextThread thread; std::list> insts; void throwError(GError* error) { if (error == nullptr) { return; } auto message = std::string{"Error in systemd mock: "} + error->message; g_error_free(error); throw std::runtime_error{message}; } public: SystemdMock(const std::list& instances, const std::string& controlGroupPath) { GError* error = nullptr; mock = dbus_test_dbus_mock_new("org.freedesktop.systemd1"); dbus_test_task_set_bus(DBUS_TEST_TASK(mock), DBUS_TEST_SERVICE_BUS_SESSION); dbus_test_task_set_name(DBUS_TEST_TASK(mock), "systemd"); managerobj = dbus_test_dbus_mock_get_object(mock, "/org/freedesktop/systemd1", "org.freedesktop.systemd1.Manager", nullptr); dbus_test_dbus_mock_object_add_method(mock, managerobj, "Subscribe", nullptr, nullptr, "", nullptr); dbus_test_dbus_mock_object_add_method( mock, managerobj, "ListUnits", nullptr, G_VARIANT_TYPE("(a(ssssssouso))"), /* ret type */ ("ret = [ " + std::accumulate(instances.begin(), instances.end(), std::string{}, [](const std::string accum, const Instance& inst) { std::string retval = accum; if (!retval.empty()) { retval += ", "; } retval += std::string{"("} + /* start tuple */ "'" + instanceName(inst) + "', " + /* id */ "'unused', " + /* description */ "'unused', " + /* load state */ "'unused', " + /* active state */ "'unused', " + /* substate */ "'unused', " + /* following */ "'/unused', " + /* path */ "5, " + /* jobId */ "'unused', " + /* jobType */ "'" + instancePath(inst) + "'" + /* jobPath */ ")"; /* finish tuple */ return retval; }) + "]") .c_str(), &error); throwError(error); dbus_test_dbus_mock_object_add_method( mock, managerobj, "GetUnit", G_VARIANT_TYPE_STRING, G_VARIANT_TYPE_OBJECT_PATH, /* ret type */ ("ret = '/'\n" + std::accumulate(instances.begin(), instances.end(), std::string{}, [](const std::string accum, const Instance& inst) { std::string retval = accum; retval += "if args[0] == '" + instanceName(inst) + "':\n"; retval += "\tret = '" + instancePath(inst) + "'\n"; return retval; })) .c_str(), &error); throwError(error); dbus_test_dbus_mock_object_add_method( mock, managerobj, "StopUnit", G_VARIANT_TYPE("(ss)"), G_VARIANT_TYPE_OBJECT_PATH, /* ret type */ std::accumulate(instances.begin(), instances.end(), std::string{}, [](const std::string accum, const Instance& inst) { std::string retval = accum; retval += "if args[0] == '" + instanceName(inst) + "':\n"; retval += "\tret = '" + instancePath(inst) + "'\n"; return retval; }) .c_str(), &error); throwError(error); dbus_test_dbus_mock_object_add_method( mock, managerobj, "StartTransientUnit", G_VARIANT_TYPE("(ssa(sv)a(sa(sv)))"), G_VARIANT_TYPE_OBJECT_PATH, /* ret type */ std::accumulate(instances.begin(), instances.end(), std::string{"ret = '/'\n"}, [](const std::string accum, const Instance& inst) { std::string retval = accum; retval += "if args[0] == '" + instanceName(inst) + "':\n"; retval += "\traise dbus.exceptions.DBusException('Already running app" + instanceName(inst) + "', name='org.freedesktop.systemd1.UnitExists')\n"; return retval; }) .c_str(), &error); throwError(error); dbus_test_dbus_mock_object_add_method(mock, managerobj, "ResetFailedUnit", G_VARIANT_TYPE_STRING, nullptr, /* ret type */ "", &error); throwError(error); for (auto& instance : instances) { auto obj = dbus_test_dbus_mock_get_object(mock, instancePath(instance).c_str(), "org.freedesktop.systemd1.Service", &error); throwError(error); dbus_test_dbus_mock_object_add_property(mock, obj, "MainPID", G_VARIANT_TYPE_UINT32, g_variant_new_uint32(instance.primaryPid), &error); throwError(error); dbus_test_dbus_mock_object_add_property(mock, obj, "Result", G_VARIANT_TYPE_STRING, g_variant_new_string("success"), &error); throwError(error); /* Control Group */ auto dir = g_build_filename(controlGroupPath.c_str(), instancePath(instance).c_str(), nullptr); auto tasks = g_build_filename(dir, "tasks", nullptr); g_mkdir_with_parents(dir, 0777); g_file_set_contents(tasks, std::accumulate(instance.pids.begin(), instance.pids.end(), std::string{}, [](const std::string& accum, pid_t pid) { if (accum.empty()) { return std::to_string(pid); } else { return accum + "\n" + std::to_string(pid); } }) .c_str(), -1, &error); throwError(error); g_free(tasks); g_free(dir); dbus_test_dbus_mock_object_add_property(mock, obj, "ControlGroup", G_VARIANT_TYPE_STRING, g_variant_new_string(instancePath(instance).c_str()), nullptr); insts.emplace_back(std::make_pair(instance, obj)); } } ~SystemdMock() { g_debug("Destroying the Systemd Mock"); g_clear_object(&mock); } static std::string dbusSafe(const std::string& input) { std::string output = input; std::transform(output.begin(), output.end(), output.begin(), [](char in) { if (std::isalpha(in) || std::isdigit(in)) { return in; } else { return '_'; } }); return output; } static std::string instancePath(const Instance& inst) { std::string retval = std::string{"/"} + dbusSafe(inst.job) + "/" + dbusSafe(inst.appid); if (!inst.instanceid.empty()) { retval += "/" + dbusSafe(inst.instanceid); } return retval; } static std::string instanceName(const Instance& inst) { return std::string{"lomiri-app-launch--"} + inst.job + "--" + inst.appid + "--" + inst.instanceid + ".service"; } operator std::shared_ptr() { std::shared_ptr retval(DBUS_TEST_TASK(g_object_ref(mock)), [](DbusTestTask* task) { g_clear_object(&task); }); return retval; } operator DbusTestTask*() { return DBUS_TEST_TASK(mock); } operator DbusTestProcess*() { return DBUS_TEST_PROCESS(mock); } operator DbusTestDbusMock*() { return mock; } unsigned int subscribeCallsCnt() { guint len = 0; GError* error = nullptr; dbus_test_dbus_mock_object_get_method_calls(mock, /* mock */ managerobj, /* manager */ "Subscribe", /* function */ &len, /* number */ &error /* error */ ); if (error != nullptr) { g_warning("Unable to get 'Subscribe' calls from systemd mock: %s", error->message); g_error_free(error); throw std::runtime_error{"Mock disfunctional"}; } return len; } unsigned int listCallsCnt() { guint len = 0; GError* error = nullptr; dbus_test_dbus_mock_object_get_method_calls(mock, /* mock */ managerobj, /* manager */ "ListUnits", /* function */ &len, /* number */ &error /* error */ ); if (error != nullptr) { g_warning("Unable to get 'Subscribe' calls from systemd mock: %s", error->message); g_error_free(error); throw std::runtime_error{"Mock disfunctional"}; } return len; } std::list stopCalls() { guint len = 0; GError* error = nullptr; auto calls = dbus_test_dbus_mock_object_get_method_calls(mock, /* mock */ managerobj, /* manager */ "StopUnit", /* function */ &len, /* number */ &error /* error */ ); if (error != nullptr) { g_warning("Unable to get 'StopUnit' calls from systemd mock: %s", error->message); g_error_free(error); throw std::runtime_error{"Mock disfunctional"}; } std::list retval; for (unsigned int i = 0; i < len; i++) { auto& call = calls[i]; gchar* name = nullptr; gchar* inst = nullptr; g_variant_get(call.params, "(&s&s)", &name, &inst); if (name == nullptr) { g_warning("Invalid 'name' on 'StopUnit' call"); continue; } retval.emplace_back(name); } return retval; } struct TransientUnit { std::string name; std::set environment; std::string execpath; std::list execline; }; std::list unitCalls() { guint len = 0; GError* error = nullptr; auto calls = dbus_test_dbus_mock_object_get_method_calls(mock, /* mock */ managerobj, /* manager */ "StartTransientUnit", /* function */ &len, /* number */ &error /* error */ ); if (error != nullptr) { g_warning("Unable to get 'StartTransientUnit' calls from systemd mock: %s", error->message); g_error_free(error); throw std::runtime_error{"Mock disfunctional"}; } std::list retval; for (unsigned int i = 0; i < len; i++) { auto& call = calls[i]; gchar* name = nullptr; g_variant_get_child(call.params, 0, "&s", &name); if (name == nullptr) { g_warning("Invalid 'name' on 'StartTransientUnit' call"); continue; } TransientUnit unit; unit.name = name; auto paramarray = g_variant_get_child_value(call.params, 2); gchar* ckey; GVariant* var; GVariantIter iter; g_variant_iter_init(&iter, paramarray); while (g_variant_iter_loop(&iter, "(sv)", &ckey, &var)) { g_debug("Looking at parameter: %s", ckey); std::string key{ckey}; if (key == "Environment") { GVariantIter array; gchar* envvar; g_variant_iter_init(&array, var); while (g_variant_iter_loop(&array, "&s", &envvar)) { unit.environment.emplace(envvar); } } else if (key == "ExecStart") { /* a(sasb) */ if (g_variant_n_children(var) > 1) { g_warning("'ExecStart' has more than one entry, only processing the first"); } auto tuple = g_variant_get_child_value(var, 0); const gchar* cpath = nullptr; g_variant_get_child(tuple, 0, "&s", &cpath); if (cpath != nullptr) { unit.execpath = cpath; } else { g_warning("'ExecStart[0][0]' isn't a string?"); } auto vexecarray = g_variant_get_child_value(tuple, 1); GVariantIter execarray; g_variant_iter_init(&execarray, vexecarray); const gchar* execentry; while (g_variant_iter_loop(&execarray, "&s", &execentry)) { unit.execline.emplace_back(execentry); } g_clear_pointer(&vexecarray, g_variant_unref); g_clear_pointer(&tuple, g_variant_unref); } } g_variant_unref(paramarray); retval.emplace_back(unit); } return retval; } std::list resetCalls() { guint len = 0; GError* error = nullptr; auto calls = dbus_test_dbus_mock_object_get_method_calls(mock, /* mock */ managerobj, /* manager */ "ResetFailedUnit", /* function */ &len, /* number */ &error /* error */ ); if (error != nullptr) { g_warning("Unable to get 'ResetFailedUnit' calls from systemd mock: %s", error->message); g_error_free(error); throw std::runtime_error{"Mock disfunctional"}; } std::list retval; for (unsigned int i = 0; i < len; i++) { auto& call = calls[i]; gchar* name = nullptr; g_variant_get(call.params, "(&s)", &name); if (name == nullptr) { g_warning("Invalid 'name' on 'ResetFailedUnit' call"); continue; } retval.emplace_back(name); } return retval; } void managerClear() { GError* error = nullptr; dbus_test_dbus_mock_object_clear_method_calls(mock, /* mock */ managerobj, /* manager */ &error /* error */ ); if (error != nullptr) { g_warning("Unable to clear manager calls: %s", error->message); g_error_free(error); throw std::runtime_error{"Mock disfunctional"}; } } void managerEmitNew(const std::string& name, const std::string& path) { GError* error = nullptr; dbus_test_dbus_mock_object_emit_signal(mock, managerobj, "UnitNew", G_VARIANT_TYPE("(so)"), g_variant_new("(so)", name.c_str(), path.c_str()), &error); if (error != nullptr) { g_warning("Unable to emit 'UnitNew': %s", error->message); g_error_free(error); throw std::runtime_error{"Mock disfunctional"}; } } void managerEmitRemoved(const std::string& name, const std::string& path) { GError* error = nullptr; dbus_test_dbus_mock_object_emit_signal(mock, managerobj, "UnitRemoved", G_VARIANT_TYPE("(so)"), g_variant_new("(so)", name.c_str(), path.c_str()), &error); if (error != nullptr) { g_warning("Unable to emit 'UnitRemoved': %s", error->message); g_error_free(error); throw std::runtime_error{"Mock disfunctional"}; } } void managerEmitFailed(const Instance& inst, const std::string& reason = "fail") { auto instobj = std::find_if(insts.begin(), insts.end(), [inst](const std::pair& item) { return item.first.job == inst.job && item.first.appid == inst.appid && item.first.instanceid == inst.instanceid; }); if (instobj == insts.end()) { throw std::runtime_error{"Unable to find instance"}; } GError* error = nullptr; dbus_test_dbus_mock_object_update_property(mock, instobj->second, "Result", g_variant_new_string(reason.c_str()), &error); if (error != nullptr) { g_warning("Unable to set result to 'fail': %s", error->message); g_error_free(error); throw std::runtime_error{"Mock disfunctional"}; } } std::function stateFunc() { return [this] { return dbus_test_task_get_state(DBUS_TEST_TASK(mock)); }; } }; lomiri-url-dispatcher-0.1.3/tests/test-config.h.in000066400000000000000000000015641446007567600221210ustar00rootroot00000000000000#pragma once #define CMAKE_SOURCE_DIR "@CMAKE_SOURCE_DIR@" #define CMAKE_BINARY_DIR "@CMAKE_BINARY_DIR@" #define APP_ID_TEST_URI @APP_ID_TEST_URI@ #define LIB_TEST_NO_MAIN_HELPER "@CMAKE_CURRENT_BINARY_DIR@/lib-test-no-main" #define URL_DISPATCHER_SERVICE "@CMAKE_BINARY_DIR@/service/lomiri-url-dispatcher" #define XDG_DATA_DIRS "@CMAKE_CURRENT_SOURCE_DIR@/xdg-data" #define UPDATE_DIRECTORY_TOOL "@CMAKE_BINARY_DIR@/service/lomiri-update-directory" #define UPDATE_DIRECTORY_URLS "@CMAKE_CURRENT_SOURCE_DIR@/test-urls-simple" #define UPDATE_DIRECTORY_VARIED "@CMAKE_CURRENT_SOURCE_DIR@/test-urls-varied" #define UPDATE_DIRECTORY_INTENT "@CMAKE_CURRENT_SOURCE_DIR@/test-urls-intent" #define OVERLAY_TEST_DIR "@CMAKE_CURRENT_SOURCE_DIR@/overlay-dir" #define EXEC_TOOL "@CMAKE_BINARY_DIR@/service/url-overlay/exec-tool" #define MIR_MOCK_PATH "@CMAKE_CURRENT_BINARY_DIR@/libmir-mock.so" lomiri-url-dispatcher-0.1.3/tests/test-sql.sh000077500000000000000000000003601446007567600212250ustar00rootroot00000000000000#!/bin/bash TEMPFILE=`mktemp` SQLSTATUS=`sqlite3 -bail -echo -init $1 $TEMPFILE .quit 3>&1 1>&2- 2>&3- | grep ^Error` rm $TEMPFILE if [ "x$SQLSTATUS" == "x" ] ; then exit 0 else echo "SQL Parsing Error: $1" echo $SQLSTATUS exit 1 fi lomiri-url-dispatcher-0.1.3/tests/test-urls-intent/000077500000000000000000000000001446007567600223545ustar00rootroot00000000000000lomiri-url-dispatcher-0.1.3/tests/test-urls-intent/intent-mixed.url-dispatcher000066400000000000000000000002511446007567600276270ustar00rootroot00000000000000[ { "protocol": "intent", "domain-suffix": "intent.mixed" }, { "protocol": "intent" }, { "protocol": "intent", "domain-suffix": "intent.mixed.again" } ] lomiri-url-dispatcher-0.1.3/tests/test-urls-intent/intent-no-good.url-dispatcher000066400000000000000000000000771446007567600300710ustar00rootroot00000000000000[ { "protocol": "intent" }, { "protocol": "intent" } ] lomiri-url-dispatcher-0.1.3/tests/test-urls-intent/intent-single.url-dispatcher000066400000000000000000000001051446007567600300000ustar00rootroot00000000000000[ { "protocol": "intent", "domain-suffix": "intent.single" } ] lomiri-url-dispatcher-0.1.3/tests/test-urls-simple/000077500000000000000000000000001446007567600223445ustar00rootroot00000000000000lomiri-url-dispatcher-0.1.3/tests/test-urls-simple/single-good.url-dispatcher000066400000000000000000000001001446007567600274120ustar00rootroot00000000000000[ { "protocol": "http", "domain-suffix": "ubuntu.com" } ] lomiri-url-dispatcher-0.1.3/tests/test-urls-varied/000077500000000000000000000000001446007567600223255ustar00rootroot00000000000000lomiri-url-dispatcher-0.1.3/tests/test-urls-varied/bad-filename-suffix.url-launcher000066400000000000000000000001111446007567600304470ustar00rootroot00000000000000[ { "protocol": "badsuffix", "domain-suffix": "bad.suffix.com" } ] lomiri-url-dispatcher-0.1.3/tests/test-urls-varied/dup-file-1.url-dispatcher000066400000000000000000000001201446007567600270310ustar00rootroot00000000000000[ { "protocol": "dupfile", "domain-suffix": "this.is.in.two.file.org" } ] lomiri-url-dispatcher-0.1.3/tests/test-urls-varied/dup-file-2.url-dispatcher000066400000000000000000000001201446007567600270320ustar00rootroot00000000000000[ { "protocol": "dupfile", "domain-suffix": "this.is.in.two.file.org" } ] lomiri-url-dispatcher-0.1.3/tests/test-urls-varied/duplicate.url-dispatcher000066400000000000000000000002171446007567600271470ustar00rootroot00000000000000[ { "protocol": "duplicate", "domain-suffix": "dup.licate.com" }, { "protocol": "duplicate", "domain-suffix": "dup.licate.com" } ] lomiri-url-dispatcher-0.1.3/tests/test-urls-varied/lots-o-entries.url-dispatcher000066400000000000000000000011331446007567600300570ustar00rootroot00000000000000[ { "protocol": "lots0", "domain-suffix": "lots.com" }, { "protocol": "lots1", "domain-suffix": "lots.com" }, { "protocol": "lots2", "domain-suffix": "lots.com" }, { "protocol": "lots3", "domain-suffix": "lots.com" }, { "protocol": "lots4", "domain-suffix": "lots.com" }, { "protocol": "lots5", "domain-suffix": "lots.com" }, { "protocol": "lots6", "domain-suffix": "lots.com" }, { "protocol": "lots7", "domain-suffix": "lots.com" }, { "protocol": "lots8", "domain-suffix": "lots.com" }, { "protocol": "lots9", "domain-suffix": "lots.com" } ] lomiri-url-dispatcher-0.1.3/tests/test-urls-varied/not-json.url-dispatcher000066400000000000000000000001361446007567600267440ustar00rootroot00000000000000 notjson not.json.com lomiri-url-dispatcher-0.1.3/tests/test-urls-varied/object-base.url-dispatcher000066400000000000000000000001201446007567600273440ustar00rootroot00000000000000{ "first": { "protocol": "object", "domain-suffix": "object-base.com" } } lomiri-url-dispatcher-0.1.3/tests/ual-link-farm/000077500000000000000000000000001446007567600215525ustar00rootroot00000000000000lomiri-url-dispatcher-0.1.3/tests/ual-link-farm/com.test.good_app1_1.2.3.desktop000066400000000000000000000000171446007567600272700ustar00rootroot00000000000000Needs to exist lomiri-url-dispatcher-0.1.3/tests/ual-link-farm/com.test.multiple_app-first_1.2.3.desktop000066400000000000000000000000171446007567600312370ustar00rootroot00000000000000Needs to exist lomiri-url-dispatcher-0.1.3/tests/url-db-test.cc000066400000000000000000000160621446007567600215710ustar00rootroot00000000000000/** * Copyright © 2014 Canonical, Ltd. * * This program is free software: you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License version 3, as published by * the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranties of MERCHANTABILITY, * SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * */ #include "test-config.h" #include #include "url-db.h" class UrlDBTest : public ::testing::Test { protected: gchar * cachedir = nullptr; virtual void SetUp() { cachedir = g_build_filename(CMAKE_BINARY_DIR, "url-db-test-cache", nullptr); g_setenv("URL_DISPATCHER_CACHE_DIR", cachedir, TRUE); } virtual void TearDown() { gchar * cmdline = g_strdup_printf("rm -rf \"%s\"", cachedir); g_spawn_command_line_sync(cmdline, nullptr, nullptr, nullptr, nullptr); g_free(cmdline); g_free(cachedir); } bool file_list_has (GList * list, const gchar * filename) { GList * cur; for (cur = list; cur != nullptr; cur = g_list_next(cur)) { const gchar * path = (const gchar *)cur->data; gchar * basename = g_path_get_basename(path); gint same = g_strcmp0(basename, filename); g_free(basename); if (same == 0) { return true; } } return false; } }; static void verify_tables(const gchar *cachedir) { sqlite3 * db = url_db_create_database(); ASSERT_TRUE(db != nullptr); gchar * dbfile = g_build_filename(cachedir, "lomiri-url-dispatcher", "urls-" DB_SCHEMA_VERSION ".db", nullptr); EXPECT_TRUE(g_file_test(dbfile, G_FILE_TEST_EXISTS)); g_free(dbfile); const char * type = nullptr; EXPECT_EQ(SQLITE_OK, sqlite3_table_column_metadata(db, nullptr, "configfiles", "name", &type, nullptr, nullptr, nullptr, nullptr)); EXPECT_STREQ("text", type); EXPECT_EQ(SQLITE_OK, sqlite3_table_column_metadata(db, nullptr, "configfiles", "timestamp", &type, nullptr, nullptr, nullptr, nullptr)); EXPECT_STREQ("bigint", type); EXPECT_EQ(SQLITE_OK, sqlite3_table_column_metadata(db, nullptr, "urls", "sourcefile", &type, nullptr, nullptr, nullptr, nullptr)); EXPECT_STREQ("integer", type); EXPECT_EQ(SQLITE_OK, sqlite3_table_column_metadata(db, nullptr, "urls", "protocol", &type, nullptr, nullptr, nullptr, nullptr)); EXPECT_STREQ("text", type); EXPECT_EQ(SQLITE_OK, sqlite3_table_column_metadata(db, nullptr, "urls", "domainsuffix", &type, nullptr, nullptr, nullptr, nullptr)); EXPECT_STREQ("text", type); sqlite3_close(db); } TEST_F(UrlDBTest, CreateTest) { // Do it twice to ensure that url_db_create_database works // when invoked on a db that already has the tables. verify_tables(cachedir); verify_tables(cachedir); } TEST_F(UrlDBTest, TimestampTest) { sqlite3 * db = url_db_create_database(); ASSERT_TRUE(db != nullptr); guint64 time = 0; EXPECT_FALSE(url_db_get_file_motification_time(db, "/foo", &time)); time = 12345; EXPECT_TRUE(url_db_set_file_motification_time(db, "/foo", time)); time = 0; EXPECT_TRUE(url_db_get_file_motification_time(db, "/foo", &time)); EXPECT_EQ(12345, time); sqlite3_close(db); } TEST_F(UrlDBTest, UrlTest) { sqlite3 * db = url_db_create_database(); ASSERT_TRUE(db != nullptr); guint64 time = 12345; EXPECT_TRUE(url_db_set_file_motification_time(db, "/foo.url-dispatcher", time)); /* Insert and find */ EXPECT_TRUE(url_db_insert_url(db, "/foo.url-dispatcher", "bar", "foo.com")); EXPECT_STREQ("foo", url_db_find_url(db, "bar", "foo.com")); EXPECT_STREQ("foo", url_db_find_url(db, "bar", "www.foo.com")); /* Two to compete */ time = 67890; EXPECT_TRUE(url_db_set_file_motification_time(db, "/bar.url-dispatcher", time)); EXPECT_TRUE(url_db_insert_url(db, "/bar.url-dispatcher", "bar", "more.foo.com")); EXPECT_STREQ("foo", url_db_find_url(db, "bar", "www.foo.com")); EXPECT_STREQ("bar", url_db_find_url(db, "bar", "more.foo.com")); EXPECT_STREQ("bar", url_db_find_url(db, "bar", "www.more.foo.com")); sqlite3_close(db); } TEST_F(UrlDBTest, FileListTest) { sqlite3 * db = url_db_create_database(); ASSERT_TRUE(db != nullptr); guint64 time = 12345; /* One Dir */ EXPECT_TRUE(url_db_set_file_motification_time(db, "/base/directory/for/us/one.url-dispatcher", time)); EXPECT_TRUE(url_db_set_file_motification_time(db, "/base/directory/for/us/two.url-dispatcher", time)); /* No three! */ EXPECT_TRUE(url_db_set_file_motification_time(db, "/base/directory/for/us/four.url-dispatcher", time)); EXPECT_TRUE(url_db_set_file_motification_time(db, "/base/directory/for/us/five.url-dispatcher", time)); /* Another Dir */ EXPECT_TRUE(url_db_set_file_motification_time(db, "/base/directory/for/them/six.url-dispatcher", time)); GList * files = url_db_files_for_dir(db, "/base/directory/for/us"); EXPECT_TRUE(file_list_has(files, "one.url-dispatcher")); EXPECT_TRUE(file_list_has(files, "two.url-dispatcher")); EXPECT_FALSE(file_list_has(files, "three.url-dispatcher")); EXPECT_TRUE(file_list_has(files, "four.url-dispatcher")); EXPECT_TRUE(file_list_has(files, "five.url-dispatcher")); EXPECT_FALSE(file_list_has(files, "six.url-dispatcher")); g_list_free_full(files, g_free); files = url_db_files_for_dir(db, "/base/directory/for/them"); EXPECT_FALSE(file_list_has(files, "five.url-dispatcher")); EXPECT_TRUE(file_list_has(files, "six.url-dispatcher")); g_list_free_full(files, g_free); files = url_db_files_for_dir(db, "/dir/not/there"); EXPECT_EQ(0, g_list_length(files)); sqlite3_close(db); } TEST_F(UrlDBTest, RemoveFile) { sqlite3 * db = url_db_create_database(); ASSERT_TRUE(db != nullptr); guint64 time = 12345; EXPECT_TRUE(url_db_set_file_motification_time(db, "/foo.url-dispatcher", time)); /* Insert and find */ EXPECT_TRUE(url_db_insert_url(db, "/foo.url-dispatcher", "bar", "foo.com")); EXPECT_STREQ("foo", url_db_find_url(db, "bar", "foo.com")); /* Remove and not find */ EXPECT_TRUE(url_db_remove_file(db, "/foo.url-dispatcher")); EXPECT_FALSE(url_db_get_file_motification_time(db, "/foo.url-dispatcher", &time)); EXPECT_STREQ(nullptr, url_db_find_url(db, "bar", "foo.com")); sqlite3_close(db); } TEST_F(UrlDBTest, ReplaceTest) { sqlite3 * db = url_db_create_database(); ASSERT_TRUE(db != nullptr); guint64 time = 0; guint64 timetest = 0; time = 12345; EXPECT_TRUE(url_db_set_file_motification_time(db, "/foo.url-dispatcher", time)); url_db_get_file_motification_time(db, "/foo.url-dispatcher", &timetest); EXPECT_EQ(12345, timetest); /* Replace it */ time = 67890; EXPECT_TRUE(url_db_set_file_motification_time(db, "/foo.url-dispatcher", time)); url_db_get_file_motification_time(db, "/foo.url-dispatcher", &timetest); EXPECT_EQ(67890, timetest); /* Replace it again with the same value */ EXPECT_TRUE(url_db_set_file_motification_time(db, "/foo.url-dispatcher", time)); url_db_get_file_motification_time(db, "/foo.url-dispatcher", &timetest); EXPECT_EQ(67890, timetest); sqlite3_close(db); } lomiri-url-dispatcher-0.1.3/tests/url_dispatcher_testability/000077500000000000000000000000001446007567600245405ustar00rootroot00000000000000lomiri-url-dispatcher-0.1.3/tests/url_dispatcher_testability/CMakeLists.txt000066400000000000000000000017471446007567600273110ustar00rootroot00000000000000execute_process(COMMAND python3 -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())" OUTPUT_VARIABLE PYTHON_PACKAGE_DIR OUTPUT_STRIP_TRAILING_WHITESPACE) configure_file( test_fake_dispatcher.py.in test_fake_dispatcher.py ) ### FIXME: omitting test_fake_dispatcher.py (see below), it contains build time path assumptions install(FILES fixture_setup.py fake_dispatcher.py DESTINATION ${PYTHON_PACKAGE_DIR}/lomiri_url_dispatcher_testability ) #install(FILES fixture_setup.py fake_dispatcher.py ${CMAKE_CURRENT_BINARY_DIR}/test_fake_dispatcher.py # DESTINATION ${PYTHON_PACKAGE_DIR}/lomiri_url_dispatcher_testability #) ### FIXME: This test requires to use a systemd user session on the Dbus. We don't have that at build time. #add_test(fake-dispatcher dbus-test-runner --task nosetests3 --parameter ${CMAKE_CURRENT_BINARY_DIR}/test_fake_dispatcher.py) #set_tests_properties(fake-dispatcher PROPERTIES ENVIRONMENT PYTHONPATH=${CMAKE_CURRENT_SOURCE_DIR}/..) lomiri-url-dispatcher-0.1.3/tests/url_dispatcher_testability/__init__.py000066400000000000000000000000001446007567600266370ustar00rootroot00000000000000lomiri-url-dispatcher-0.1.3/tests/url_dispatcher_testability/fake_dispatcher.py000066400000000000000000000043701446007567600302320ustar00rootroot00000000000000# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # # Copyright (C) 2014 Canonical Ltd. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; version 3. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . import dbus import dbusmock import subprocess class FakeDispatcherException(Exception): pass class FakeURLDispatcherService: """Fake URL Dispatcher service using a dbusmock interface.""" def __init__(self): super(FakeURLDispatcherService, self).__init__() self.dbus_connection = dbusmock.DBusTestCase.get_dbus(system_bus=False) def start(self): """Start the fake URL Dispatcher service.""" self.dbus_mock_server = dbusmock.DBusTestCase.spawn_server( 'com.lomiri.URLDispatcher', '/com/lomiri/URLDispatcher', 'com.lomiri.URLDispatcher', system_bus=False, stdout=subprocess.PIPE) self.mock = self._get_mock_interface() self.mock.AddMethod( 'com.lomiri.URLDispatcher', 'DispatchURL', 'ss', '', '') def _get_mock_interface(self): return dbus.Interface( self.dbus_connection.get_object( 'com.lomiri.URLDispatcher', '/com/lomiri/URLDispatcher'), dbusmock.MOCK_IFACE) def stop(self): """Stop the fake URL Dispatcher service.""" self.dbus_mock_server.terminate() self.dbus_mock_server.wait() def get_last_dispatch_url_call_parameter(self): """Return the parameter used in the last call to dispatch URL.""" calls = self.mock.GetCalls() if len(calls) == 0: raise FakeDispatcherException( 'URL dispatcher has not been called.') last_call = self.mock.GetCalls()[-1] return last_call[2][0] lomiri-url-dispatcher-0.1.3/tests/url_dispatcher_testability/fixture_setup.py000066400000000000000000000022211446007567600300150ustar00rootroot00000000000000# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # # Copyright (C) 2014 Canonical Ltd. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; version 3. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . import fixtures from url_dispatcher_testability import fake_dispatcher class FakeURLDispatcher(fixtures.Fixture): def setUp(self): super(FakeURLDispatcher, self).setUp() self.fake_service = fake_dispatcher.FakeURLDispatcherService() self.addCleanup(self.fake_service.stop) self.fake_service.start() def get_last_dispatch_url_call_parameter(self): return self.fake_service.get_last_dispatch_url_call_parameter() lomiri-url-dispatcher-0.1.3/tests/url_dispatcher_testability/test_fake_dispatcher.py.in000066400000000000000000000032251446007567600316740ustar00rootroot00000000000000# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # # Copyright (C) 2014 Canonical Ltd. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; version 3. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . import testtools from url_dispatcher_testability import fixture_setup, fake_dispatcher from subprocess import call, CalledProcessError class FakeDispatcherTestCase(testtools.TestCase): def setUp(self): super(FakeDispatcherTestCase, self).setUp() self.dispatcher = fixture_setup.FakeURLDispatcher() self.useFixture(self.dispatcher) def test_url_dispatcher(self): bin_dir = "@PROJECT_BINARY_DIR@" result = call([bin_dir + '/service/lomiri-url-dispatcher', 'test://testurl']) self.assertEqual(0, result) try: last_url = self.dispatcher.get_last_dispatch_url_call_parameter() except fake_dispatcher.FakeDispatcherException: last_url = None self.assertEqual(last_url, 'test://testurl') def test_url_dispatcher_no_args(self): bin_dir = "@PROJECT_BINARY_DIR@" result = call([bin_dir + '/service/lomiri-url-dispatcher']) self.assertEqual(1, result) lomiri-url-dispatcher-0.1.3/tests/xdg-cache/000077500000000000000000000000001446007567600207365ustar00rootroot00000000000000lomiri-url-dispatcher-0.1.3/tests/xdg-cache/libertine-container/000077500000000000000000000000001446007567600246735ustar00rootroot00000000000000lomiri-url-dispatcher-0.1.3/tests/xdg-cache/libertine-container/container-id/000077500000000000000000000000001446007567600272475ustar00rootroot00000000000000lomiri-url-dispatcher-0.1.3/tests/xdg-cache/libertine-container/container-id/rootfs/000077500000000000000000000000001446007567600305635ustar00rootroot00000000000000lomiri-url-dispatcher-0.1.3/tests/xdg-cache/libertine-container/container-id/rootfs/usr/000077500000000000000000000000001446007567600313745ustar00rootroot00000000000000lomiri-url-dispatcher-0.1.3/tests/xdg-cache/libertine-container/container-id/rootfs/usr/share/000077500000000000000000000000001446007567600324765ustar00rootroot00000000000000applications/000077500000000000000000000000001446007567600351055ustar00rootroot00000000000000lomiri-url-dispatcher-0.1.3/tests/xdg-cache/libertine-container/container-id/rootfs/usr/shareorg.canonical.app1.desktop000066400000000000000000000000611446007567600420520ustar00rootroot00000000000000lomiri-url-dispatcher-0.1.3/tests/xdg-cache/libertine-container/container-id/rootfs/usr/share/applications[Desktop File] Name=App1 Exec=app1 Icon=app1.png lomiri-url-dispatcher-0.1.3/tests/xdg-data/000077500000000000000000000000001446007567600206045ustar00rootroot00000000000000lomiri-url-dispatcher-0.1.3/tests/xdg-data/applications/000077500000000000000000000000001446007567600232725ustar00rootroot00000000000000lomiri-url-dispatcher-0.1.3/tests/xdg-data/applications/foo-bar.desktop000066400000000000000000000001521446007567600262100ustar00rootroot00000000000000[Desktop Entry] Name=Foo Bar Exec=foo-bar Type=Application Icon=foo-bar.png X-Ubuntu-Single-Instance=true lomiri-url-dispatcher-0.1.3/tests/xdg-data/libertine/000077500000000000000000000000001446007567600225615ustar00rootroot00000000000000lomiri-url-dispatcher-0.1.3/tests/xdg-data/libertine/ContainersConfig.json000066400000000000000000000005221446007567600267060ustar00rootroot00000000000000{ "containerList": [ { "distro": "xenial", "id": "container-id", "installStatus": "ready", "installedApps": [], "multiarch": "disabled", "name": "Ubuntu 'Xenial Xerus'", "type": "lxc" } ], "defaultContainer": "container-id" } lomiri-url-dispatcher-0.1.3/tools/000077500000000000000000000000001446007567600171115ustar00rootroot00000000000000lomiri-url-dispatcher-0.1.3/tools/CMakeLists.txt000066400000000000000000000011101446007567600216420ustar00rootroot00000000000000 ########################### # URL Dispatcher ########################### include_directories(${CMAKE_SOURCE_DIR}/liblomiri-url-dispatcher) add_executable(lomiri-url-dispatcher url-dispatcher.cpp) target_link_libraries(lomiri-url-dispatcher dispatcher ) install( TARGETS lomiri-url-dispatcher RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" ) install( PROGRAMS lomiri-url-dispatcher-dump DESTINATION "${CMAKE_INSTALL_BINDIR}" ) ########################## # Coverage ########################### set_property(GLOBAL APPEND PROPERTY COVERAGE_TARGETS lomiri-url-dispatcher) lomiri-url-dispatcher-0.1.3/tools/lomiri-url-dispatcher-dump000077500000000000000000000003611446007567600242210ustar00rootroot00000000000000#!/bin/sh echo .quit | sqlite3 -batch -csv -cmd "select urls.protocol, urls.domainsuffix, configfiles.name from urls, configfiles where urls.sourcefile = configfiles.rowid;" "${XDG_CACHE_HOME:-$HOME/.cache}"/lomiri-url-dispatcher/urls-1.db lomiri-url-dispatcher-0.1.3/tools/url-dispatcher.cpp000066400000000000000000000026361446007567600225520ustar00rootroot00000000000000/** * Copyright (C) 2017 Canonical, Ltd. * * This program is free software: you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License version 3, as published by * the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranties of MERCHANTABILITY, * SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * */ #include "lomiri-url-dispatcher.h" int main (int argc, char * argv[]) { struct Data { GMainLoop* loop = nullptr; bool success = false; }; if (argc != 2) { g_printerr("Usage: %s \n", argv[0]); return 1; } Data data; data.loop = g_main_loop_new(nullptr, FALSE); lomiri_url_dispatch_send(argv[1], [](const gchar* url, gboolean success, gpointer user_data) { auto cbdata = static_cast(user_data); cbdata->success = success; g_main_loop_quit(cbdata->loop); }, &data); g_main_loop_run(data.loop); return !data.success; }