diff --git a/.gitignore b/.gitignore
index 53f4cd6..f3b8ece 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,5 +1,3 @@
-build*/
+brickdm
+*.o
-*~
-*.sublime-workspace
-.~lock*
diff --git a/.gitmodules b/.gitmodules
deleted file mode 100644
index 25a8b35..0000000
--- a/.gitmodules
+++ /dev/null
@@ -1,3 +0,0 @@
-[submodule "cmake"]
- path = cmake
- url = git://github.com/dlech/vala-cmake-modules
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index 647c5cc..0000000
--- a/.travis.yml
+++ /dev/null
@@ -1,21 +0,0 @@
-language: bash
-sudo: required
-dist: bionic
-env:
-- OS=debian ARCH=amd64 DIST=buster
-- OS=debian ARCH=i386 DIST=buster
-- OS=debian ARCH=armhf DIST=buster QEMU_USER_STATIC=qemu-user-static
-- OS=raspbian ARCH=armhf DIST=buster QEMU_USER_STATIC=qemu-user-static
-- OS=debian ARCH=armel DIST=buster QEMU_USER_STATIC=qemu-user-static
-cache:
- directories:
- - "$HOME/cache"
-before_install:
-- sudo apt-add-repository -y ppa:ev3dev/tools
-- sudo apt-get update
-- sudo apt-get install --yes debhelper pbuilder-ev3dev dh-systemd $QEMU_USER_STATIC
-before_script:
-- pbuilder-ev3dev base
-- git checkout -B ev3dev-buster
-script:
-- pbuilder-ev3dev build
diff --git a/CMakeLists.txt b/CMakeLists.txt
deleted file mode 100644
index b80f388..0000000
--- a/CMakeLists.txt
+++ /dev/null
@@ -1,237 +0,0 @@
-cmake_minimum_required (VERSION 3.10)
-project ("brickman" LANGUAGES C VERSION 0.10.0)
-
-option (BRICKMAN_TEST "Build the desktop test version.")
-
-list (APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake)
-
-set (DATADIR "${CMAKE_INSTALL_PREFIX}/share")
-
-set (EXEC_NAME "brickman")
-set (RELEASE_NAME "Brick Manager")
-
-# Comment this out to enable C compiler warnings
-add_definitions (-w)
-
-add_subdirectory (data)
-set (XDG_DATA_DIRS data)
-
-configure_file (src/Version.vala.in Version.vala)
-
-if (BRICKMAN_TEST)
- set (BRICKMAN_TEST_PACKAGES gtk+-3.0)
- set (BRICKMAN_SOURCE_FILES
- test/main.vala
- test/ControlPanel.vala
- test/FakeBluez5.vala
- test/FakeConnman.vala
- test/controller/FakeAboutController.vala
- test/controller/FakeBatteryController.vala
- test/controller/FakeBluetoothController.vala
- test/controller/FakeDeviceBrowserController.vala
- test/controller/FakeFileBrowserController.vala
- test/controller/FakeNetworkController.vala
- test/controller/FakeOpenRobertaController.vala
- )
-else (BRICKMAN_TEST)
- set (BRICKMAN_SOURCE_FILES
- lib/bluez5/Adapter.vala
- lib/bluez5/AgentManager.vala
- lib/bluez5/Device.vala
- lib/bluez5/Manager.vala
- lib/connman/Manager.vala
- lib/connman/Peer.vala
- lib/connman/Service.vala
- lib/connman/Technology.vala
- src/controller/AboutController.vala
- src/controller/BatteryController.vala
- src/controller/BluetoothController.vala
- src/controller/DeviceBrowserController.vala
- src/controller/FileBrowserController.vala
- src/controller/NetworkController.vala
- src/controller/OpenRobertaController.vala
- src/GlobalManager.vala
- src/main.vala
- )
-endif (BRICKMAN_TEST)
-
-set (BRICKMAN_COMMON_SOURCE_FILES
- lib/bluez5/Error.vala
- lib/bluez5/Uuid.vala
- lib/dbus/Properties.vala
- lib/systemd/Logind.vala
- lib/systemd/Systemd.vala
- lib/systemd/logind-interfaces.vala
- lib/systemd/systemd-interfaces.vala
- src/controller/IBrickManagerModule.vala
- src/dbus/Bluez5Agent.vala
- src/dbus/ConnmanAgent.vala
- src/view/AboutWindow.vala
- src/view/BatteryInfoWindow.vala
- src/view/BatteryStatusBarItem.vala
- src/view/BluetoothDeviceMenuItem.vala
- src/view/BluetoothDeviceWindow.vala
- src/view/BluetoothStatusBarItem.vala
- src/view/BluetoothWindow.vala
- src/view/BrickManagerWindow.vala
- src/view/ConnmanAgentInputDialog.vala
- src/view/DeviceBrowserWindow.vala
- src/view/FileBrowserWindow.vala
- src/view/HomeWindow.vala
- src/view/MotorBrowserWindow.vala
- src/view/MotorInfoWindow.vala
- src/view/MotorValueDialog.vala
- src/view/NetworkConnectionDnsWindow.vala
- src/view/NetworkConnectionEnetWindow.vala
- src/view/NetworkConnectionIpv4Window.vala
- src/view/NetworkConnectionMenuItem.vala
- src/view/NetworkConnectionWindow.vala
- src/view/NetworkConnectionsWindow.vala
- src/view/NetworkStatusBarItem.vala
- src/view/NetworkStatusWindow.vala
- src/view/OpenRobertaStatusBarItem.vala
- src/view/OpenRobertaWindow.vala
- src/view/PortBrowserWindow.vala
- src/view/PortInfoWindow.vala
- src/view/SelectFromListDialog.vala
- src/view/SensorBrowserWindow.vala
- src/view/SensorInfoWindow.vala
- src/view/SensorValueDialog.vala
- src/view/ShutdownDialog.vala
- src/view/SignalBars.vala
- src/view/TetheringInfoWindow.vala
- src/view/TetheringWindow.vala
- src/view/WifiMenuItem.vala
- src/view/WifiNetworkStatusWindow.vala
- src/view/WifiNetworkWindow.vala
- src/view/WifiStatusBarItem.vala
- src/view/WifiWindow.vala
-)
-
-set (DEPS_MODULES
- glib-2.0
- gobject-2.0
- gmodule-2.0
- gio-2.0
- gio-unix-2.0
- gudev-1.0
-)
-
-# see if we have a local copy of ev3devkit-0.5 that was exported by cmake
-find_package (ev3devkit-0.5 QUIET)
-
-# if we have a local build of ev3devkit-0.5, use it, otherwise use pkg-config to find it
-if (ev3devkit-0.5_FOUND)
- set(EV3DEVKIT_INCLUDEDIR ${ev3devkit-0.5_INCLUDEDIR})
- set(EV3DEVKIT_SHARED_LIB ev3devkit-0.5-shared)
- set(EV3DEVKIT_STATIC_LIB ev3devkit-0.5-static)
- set(EV3DEVKIT_VAPIDIR_OPTION "--vapidir=${ev3devkit-0.5_VAPIDIR}")
- set(EV3DEVKIT_GIRDIR_OPTION "--girdir=${ev3devkit-0.5_GIRDIR}")
- set(EV3DEVKIT_INCLUDEDIR_OPTION "--includedir=${ev3devkit-0.5_GIRDIR}")
- set(XDG_DATA_DIRS "${XDG_DATA_DIRS}:${ev3devkit-0.5_DATADIR}")
-else (ev3devkit-0.5_FOUND)
- list(APPEND DEPS_MODULES ev3devkit-0.5)
-endif (ev3devkit-0.5_FOUND)
-
-# see if we have a local copy of grx-3.0 that was exported by cmake
-find_package (grx-3.0 QUIET)
-
-# if we have a local build of grx-3.0, use it, otherwise use pkg-config to find it
-if (grx-3.0_FOUND)
- set(GRX3_INCLUDEDIR ${grx-3.0_INCLUDEDIR})
- set(GRX3_SHARED_LIB grx-3.0-shared)
- set(GRX3_STATIC_LIB grx-3.0-static)
- set(GRX3_VAPIDIR_OPTION "--vapidir=${grx-3.0_VAPIDIR}")
- set(GRX3_GIRDIR_OPTION "--girdir=${grx-3.0_GIRDIR}")
- set(GRX3_INCLUDEDIR_OPTION "--includedir=${grx-3.0_GIRDIR}")
- set(GRX3_PLUGINDIR_ENV "GRX_PLUGIN_PATH=${grx-3.0_PLUGINDIR}")
- set(GRX3_FONTCONFIG_PATH_ENV "FONTCONFIG_PATH=${grx-3.0_FONTCONFIG_PATH}")
-else (grx-3.0_FOUND)
- list(APPEND DEPS_MODULES grx-3.0)
-endif (grx-3.0_FOUND)
-
-find_package(PkgConfig REQUIRED)
-pkg_check_modules(DEPS REQUIRED ${DEPS_MODULES})
-add_definitions(${DEPS_CFLAGS})
-link_libraries(${DEPS_LIBRARIES})
-link_directories(${DEPS_LIBRARY_DIRS})
-
-if (BRICKMAN_TEST)
- pkg_check_modules(BRICKMAN_TEST_DEPS gtk+-3.0)
- add_definitions(${BRICKMAN_TEST_DEPS_CFLAGS})
- link_libraries(${BRICKMAN_TEST_DEPS_LIBRARIES})
- link_directories(${BRICKMAN_TEST_DEPS_LIBRARY_DIRS})
-endif (BRICKMAN_TEST)
-
-link_libraries(m)
-
-if (CMAKE_CROSSCOMPILING)
- # These need to be added manually for some reason. It is important that they
- # come after other calls to link_libraries or you will get linker errors.
- link_libraries(pcre resolv pthread)
-endif(CMAKE_CROSSCOMPILING)
-
-find_package(Vala REQUIRED)
-include(ValaVersion)
-ensure_vala_version("0.24" MINIMUM)
-include(ValaPrecompile)
-
-# if the binary directory is a subdirectory of the source directory, it causes
-# the build to fail when including generated .vala files that are in the binary
-# directory. The solution is to use the relative path.
-string(REPLACE "${CMAKE_CURRENT_SOURCE_DIR}/" "" BRICKMAN_RELATIVE_BINARY_DIR
- ${CMAKE_CURRENT_BINARY_DIR})
-
-vala_precompile(VALA_C ${EXEC_NAME}
- ${BRICKMAN_RELATIVE_BINARY_DIR}/Version.vala
- ${BRICKMAN_SOURCE_FILES}
- ${BRICKMAN_COMMON_SOURCE_FILES}
-PACKAGES
- ev3devkit-0.5
- glib-2.0
- gobject-2.0
- gmodule-2.0
- gio-2.0
- gio-unix-2.0
- grx-3.0
- gudev-1.0
- posix
- linux
- ${BRICKMAN_TEST_PACKAGES}
-CUSTOM_VAPIS
- bindings/*.vapi
-OPTIONS
- --target-glib=2.40
- --thread
- ${EV3DEVKIT_VAPIDIR_OPTION}
- ${GRX3_VAPIDIR_OPTION}
-)
-
-add_executable(${EXEC_NAME} ${VALA_C})
-target_include_directories(${EXEC_NAME} PRIVATE ${EV3DEVKIT_INCLUDEDIR} ${GRX3_INCLUDEDIR})
-target_link_libraries(${EXEC_NAME} PRIVATE ${EV3DEVKIT_SHARED_LIB} ${GRX3_SHARED_LIB})
-
-if (BRICKMAN_TEST)
-configure_file(
- ${CMAKE_CURRENT_SOURCE_DIR}/test/glade/ControlPanel.glade
- ${CMAKE_CURRENT_BINARY_DIR}/ControlPanel.glade COPYONLY )
-configure_file(
- ${CMAKE_CURRENT_SOURCE_DIR}/test/glade/ConnmanServiceIPv4Dialog.glade
- ${CMAKE_CURRENT_BINARY_DIR}/ConnmanServiceIPv4Dialog.glade COPYONLY )
-configure_file(
- ${CMAKE_CURRENT_SOURCE_DIR}/test/glade/ConnmanAgentRequestInputDialog.glade
- ${CMAKE_CURRENT_BINARY_DIR}/ConnmanAgentRequestInputDialog.glade COPYONLY )
-endif (BRICKMAN_TEST)
-
-add_dependencies(${EXEC_NAME} brickman_data)
-install (TARGETS ${EXEC_NAME} RUNTIME DESTINATION sbin)
-
-add_custom_target(run
- COMMAND
- XDG_DATA_DIRS=${XDG_DATA_DIRS}:/usr/local/share:/usr/share
- ${GRX3_PLUGINDIR_ENV}
- ${GRX3_FONTCONFIG_PATH_ENV}
- ./${EXEC_NAME}
- DEPENDS ${EXEC_NAME}
- WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
-)
diff --git a/COPYING b/COPYING
new file mode 100644
index 0000000..94a9ed0
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,674 @@
+ GNU 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.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU 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
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+
+ Copyright (C)
+
+ 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, either version 3 of the License, or
+ (at your option) any later version.
+
+ 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 .
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ Copyright (C)
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+.
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..9c3cad7
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,10 @@
+
+CFLAGS = -Wall `pkg-config --cflags glib-2.0` `pkg-config --cflags dbus-glib-1`
+LDLIBS = -lu8g -lm2tk -lglib-2.0 -ludev -lncurses -lupower-glib
+
+all: brickdm
+
+brickdm: brickdm_home.o brickdm_event.o brickdm_power.o
+
+clean:
+ rm -f *.o
\ No newline at end of file
diff --git a/README.md b/README.md
deleted file mode 100644
index 240775b..0000000
--- a/README.md
+++ /dev/null
@@ -1,58 +0,0 @@
-brickman
-========
-
-The ev3dev Brick Manager.
-
-Issues
-------
-
-Please report issues or feature requests at https://github.com/ev3dev/ev3dev/issues
-
-Hacking
--------
-
-Get the code:
-
-* Clone of the brickman repo.
-
- git clone git://github.com/ev3dev/brickman
- cd brickman
- git submodule update --init --recursive
-
-To build for the EV3:
-
-* Install [Docker] (requires Linux/macOS 10.10.3+/Window 10 Pro)
-* Install QEMU (Linux only)
-
- sudo apt-get install qemu-user-static
-
-* In the source code directory, run the Docker setup script
-
- ./docker/setup.sh $ARCH
-
- Where `$ARCH` is `armel` (or `armhf` if you are building for RPi
- or BeagleBone). Output will be saved to a `build-$ARCH` directory.
-
-* Build the code by running...
-
- docker exec --tty brickman_armel make install
-
-* Copy the contents of `build-$ARCH/dist/` to the EV3 and run it.
-
-[Docker]: https://www.docker.com/
-
-To build the desktop test (makes UI development much faster), in a regular terminal,
-not in Docker:
-
-* Install build dependencies:
-
- sudo apt-add-repository ppa:ev3dev/tools
- sudo apt-get update
- sudo apt-get install devscripts equivs
- sudo mk-build-deps --install debian/control
-
-* Then...
-
- cmake -P setup.cmake
- make -C build
- make -C build run
diff --git a/bindings/GLib.vapi b/bindings/GLib.vapi
deleted file mode 100644
index b9e6c04..0000000
--- a/bindings/GLib.vapi
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * brickman -- Brick Manager for LEGO Mindstorms EV3/ev3dev
- *
- * Copyright 2015 David Lechner
- *
- * 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; either version 2 of the License, or
- * (at your option) any later version.
- *
- * 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, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
- * MA 02110-1301, USA.
- */
-
-/* GLib.vapi - additional binding for GLib */
-
-[CCode (cprefix = "g_")]
-namespace GLib {
- /**
- * Replacement for GLib.IOError.from_errno (int).
- *
- * There is a bug in the vala compiler that tries to assign the return value
- * as GError* instead of int. This function returns and int like it should.
- */
- [CCode (cheader_file = "gioerror.h")]
- public int io_error_from_errno (int errno);
-}
\ No newline at end of file
diff --git a/bindings/Posix.vapi b/bindings/Posix.vapi
deleted file mode 100644
index a8e0207..0000000
--- a/bindings/Posix.vapi
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * brickman -- Brick Manager for LEGO Mindstorms EV3/ev3dev
- *
- * Copyright 2014 David Lechner
- *
- * 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; either version 2 of the License, or
- * (at your option) any later version.
- *
- * 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, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
- * MA 02110-1301, USA.
- */
-
-/* Posix.vapi - More posix bindings */
-
-namespace Posix {
- [CCode (cname = "struct utsname", destroy_function = "", has_type_id = false)]
- struct UTSName {
- public string sysname;
- public string nodename;
- public string release;
- public string version;
- public string machine;
- public string domainname;
- }
-
- [CCode (cheader_filename = "sys/utsname.h")]
- static int uname (ref UTSName buf);
-}
\ No newline at end of file
diff --git a/brickdm.c b/brickdm.c
new file mode 100644
index 0000000..301ba59
--- /dev/null
+++ b/brickdm.c
@@ -0,0 +1,229 @@
+/*
+ * brickdm -- Brick Display Manager for LEGO Mindstorms EV3/ev3dev
+ *
+ * Copyright (C) 2014 David Lechner
+ *
+ * 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, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * 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 .
+ */
+
+/*
+ * brickdm.c:
+ *
+ * This is the main program. Functions in this file include:
+ *
+ * - Grabbing a free console for displaying graphics
+ * - Handling console switching
+ * - Initalizing library data structures
+ * - Processing the main event loop
+ */
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include
+#include
+
+#include "brickdm.h"
+
+GMainLoop *loop;
+u8g_t u8g;
+GSList *root_stack = NULL;
+gboolean brickdm_needs_redraw = TRUE;
+gboolean brickdm_show_statusbar = TRUE;
+int vtnum;
+
+gboolean brickdm_sigterm_handler(gpointer user_data)
+{
+ g_main_loop_quit(loop);
+ return TRUE;
+}
+
+gboolean brickdm_sighup_handler(gpointer user_data)
+{
+ int vtfd = GPOINTER_TO_INT(user_data);
+ struct vt_stat vtstat;
+ if (isendwin()) {
+ if (ioctl(vtfd, VT_GETSTATE, &vtstat) == 0) {
+ if (vtstat.v_active == vtnum) {
+ ioctl(vtfd, VT_RELDISP, VT_ACKACQ);
+ refresh();
+ brickdm_needs_redraw = TRUE;
+ }
+ }
+ } else {
+ if (ioctl(vtfd, VT_RELDISP, 1) == 0)
+ endwin();
+ }
+ return TRUE;
+}
+
+gboolean timer_handler(gpointer user_data)
+{
+ if (!isendwin()) {
+ m2_CheckKey();
+ brickdm_needs_redraw |= m2_HandleKey();
+ if (brickdm_needs_redraw)
+ {
+ u8g_BeginDraw(&u8g);
+ m2_Draw();
+ if (brickdm_show_statusbar) {
+ /* m2_draw can change colors on us */
+ u8g_SetDefaultBackgroundColor(&u8g);
+ u8g_SetDefaultForegroundColor(&u8g);
+ brickdm_power_draw_battery_status();
+ u8g_DrawLine(&u8g, 0, 15, u8g_GetWidth(&u8g), 15);
+ }
+ u8g_EndDraw(&u8g);
+ brickdm_needs_redraw = FALSE;
+ }
+ }
+ return TRUE;
+}
+
+brickdm_root_info *brickdm_pop_root_stack(void)
+{
+ GSList *last_root = root_stack;
+ brickdm_root_info *info = NULL;
+
+ if (last_root) {
+ info = last_root->data;
+ root_stack = g_slist_delete_link(root_stack, last_root);
+ }
+ return info;
+}
+
+void brickdm_root_changed_callback(m2_rom_void_p new_root,
+ m2_rom_void_p old_root, uint8_t change_value)
+{
+ if (change_value != BRICKDM_MAX_USER_VALUE) {
+ brickdm_root_info *info = g_new(brickdm_root_info, 1);
+ info->element = old_root;
+ info->value = change_value;
+ root_stack = g_slist_prepend(root_stack, info);
+ }
+}
+
+int main(void)
+{
+ int vtfd;
+ FILE *in, *out;
+ SCREEN *term;
+ char device[32];
+ struct vt_stat vtstat;
+ int exit_value = 0;
+ struct vt_mode mode = {
+ .mode = VT_PROCESS,
+ .relsig = SIGHUP,
+ .acqsig = SIGHUP,
+ };
+
+ g_type_init();
+
+ vtfd = open("/dev/tty0", O_RDWR, 0);
+ if (vtfd < 0) {
+ perror("could not open /dev/tty0");
+ exit (1);
+ }
+ if (ioctl(vtfd, VT_GETSTATE, &vtstat) < 0) {
+ perror("tty is not virtual console");
+ exit (1);
+ }
+ if (ioctl(vtfd, VT_OPENQRY, &vtnum) < 0) {
+ perror("no free virtual consoles");
+ exit (1);
+ }
+ sprintf(device, "/dev/tty%d", vtnum);
+ if (access(device, (W_OK|R_OK)) < 0) {
+ perror("insufficient permission on tty");
+ exit (1);
+ }
+
+ ioctl(vtfd, VT_ACTIVATE, vtnum);
+ ioctl(vtfd, VT_WAITACTIVE, vtnum);
+
+ close (vtfd);
+ vtfd = open(device, O_RDWR, 0);
+ in = fdopen(vtfd, "r");
+ out = fdopen(vtfd, "w");
+ term = newterm("linux", in, out);
+ /* we are using ncurses for keyboard input only - see brickdm_event.c */
+
+ do
+ {
+ if (ioctl(vtfd, KDSETMODE, KD_GRAPHICS) < 0)
+ {
+ perror("Could not set virtual console to KD_GRAPHICS mode.");
+ exit_value = 1;
+ break;
+ }
+
+ if (ioctl(vtfd, VT_SETMODE, &mode) < 0)
+ {
+ perror("Could not set virtual console to VT_PROCESS mode.");
+ exit_value = 1;
+ break;
+ }
+
+ /* we are now free to directly access the framebuffer */
+
+ u8g_Init(&u8g, &u8g_dev_linux_fb);
+ m2_Init(&brickdm_home_root, brickdm_event_source, brickdm_event_handler,
+ m2_gh_u8g_bfs);
+ m2_SetRootChangeCallback(brickdm_root_changed_callback);
+ m2_SetU8g(&u8g, m2_u8g_box_icon);
+ m2_SetFont(0, u8g_font_7x13);
+ m2_SetFont(1, u8g_font_m2icon_9);
+ m2_SetU8gAdditionalTextXBorder(3);
+
+ loop = g_main_loop_new (NULL, FALSE);
+ g_timeout_add(50, timer_handler, NULL);
+ // TODO: glib >= 2.36 can handle user signals
+ // This would be better as SIGUSR1
+ g_unix_signal_add(SIGHUP, brickdm_sighup_handler, GINT_TO_POINTER(vtfd));
+ g_unix_signal_add(SIGINT, brickdm_sigterm_handler, NULL);
+ g_unix_signal_add(SIGTERM, brickdm_sigterm_handler, NULL);
+
+ brickdm_power_init();
+
+ g_main_loop_run(loop);
+ u8g_Stop(&u8g);
+ } while(0);
+
+ /* tear down and cleanup */
+ ioctl(vtfd, KDSETMODE, KD_TEXT);
+ mode.mode = VT_AUTO;
+ ioctl(vtfd, VT_SETMODE, &mode);
+ if (!isendwin()) {
+ endwin();
+ ioctl(vtfd, VT_ACTIVATE, vtstat.v_active);
+ ioctl(vtfd, VT_WAITACTIVE, vtstat.v_active);
+ }
+ ioctl(vtfd, VT_DISALLOCATE, vtnum);
+ delscreen(term);
+ fclose(in);
+ fclose(out);
+ close(vtfd);
+
+ return exit_value;
+}
diff --git a/brickdm.h b/brickdm.h
new file mode 100644
index 0000000..847585d
--- /dev/null
+++ b/brickdm.h
@@ -0,0 +1,59 @@
+/*
+ * brickdm -- Brick Display Manager for LEGO Mindstorms EV3/ev3dev
+ *
+ * Copyright (C) 2014 David Lechner
+ *
+ * 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, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * 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 .
+ */
+
+#ifndef __BRICKDM_H
+#define __BRICKDM_H
+
+#include
+#include
+
+/* m2tk format string for root ALIGN elemets */
+#define BRICKDM_ROOT_FMT "-1|1W64H56"
+#define BRICKDM_MAX_USER_VALUE ((uint8_t)-1)
+
+struct _brickdm_root_info {
+ m2_rom_void_p element;
+ uint8_t value;
+};
+typedef struct _brickdm_root_info brickdm_root_info;
+
+/* brickdm.c */
+extern u8g_t u8g;
+extern gboolean brickdm_needs_redraw;
+extern gboolean brickdm_show_statusbar;
+extern brickdm_root_info *brickdm_pop_root_stack(void);
+
+/* brickdm_home.c */
+M2_EXTERN_ALIGN(brickdm_home_root);
+
+/* brickdm_power.c */
+M2_EXTERN_ALIGN(brickdm_battery_root);
+M2_EXTERN_ALIGN(brickdm_shutdown_root);
+extern void brickdm_power_init(void);
+extern void brickdm_power_draw_battery_status(void);
+
+/* brickdm_event.c */
+extern uint8_t brickdm_event_source(m2_p ep, uint8_t msg);
+extern uint8_t brickdm_event_handler(m2_p ep, uint8_t msg, uint8_t arg1,
+ uint8_t arg2);
+
+/* brickdm_graphcics.c */
+extern uint8_t brickdm_gh_bfs(m2_gfx_arg_p arg);
+
+#endif /* __BRICKDM_H */
\ No newline at end of file
diff --git a/brickdm_event.c b/brickdm_event.c
new file mode 100644
index 0000000..d11512d
--- /dev/null
+++ b/brickdm_event.c
@@ -0,0 +1,174 @@
+/*
+ * brickdm -- Brick Display Manager for LEGO Mindstorms EV3/ev3dev
+ *
+ * Copyright (C) 2014 David Lechner
+ *
+ * brickdm_event_handler() copied from m2eh6bs.c
+ * m2tklib = Mini Interative Interface Toolkit Library
+ * Copyright (C) 2011 olikraus@gmail.com
+ *
+ * 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, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * 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 .
+ */
+
+/*
+ * brickdm_event.c:
+ *
+ * Implements an m2tk event source that gets keyboard input using the ncurses
+ * library.
+ */
+
+#include
+#include
+
+#include "brickdm.h"
+
+uint8_t brickdm_event_source(m2_p ep, uint8_t msg)
+{
+ switch(msg)
+ {
+ case M2_ES_MSG_GET_KEY:
+ switch (getch()) {
+ /* Actual keys on the EV3 */
+ case KEY_DOWN:
+ return M2_KEY_EVENT(M2_KEY_DATA_DOWN);
+ case KEY_UP:
+ return M2_KEY_EVENT(M2_KEY_DATA_UP);
+ case KEY_LEFT:
+ return M2_KEY_EVENT(M2_KEY_PREV);
+ case KEY_RIGHT:
+ return M2_KEY_EVENT(M2_KEY_NEXT);
+ case '\n':
+ return M2_KEY_EVENT(M2_KEY_SELECT);
+ case KEY_BACKSPACE:
+ return M2_KEY_EVENT(M2_KEY_EXIT);
+
+ /* Other keys incase a keyboard or keypad is plugged in */
+ case KEY_BTAB:
+ case KEY_PREVIOUS:
+ return M2_KEY_EVENT(M2_KEY_PREV);
+ case KEY_NEXT:
+ return M2_KEY_EVENT(M2_KEY_NEXT);
+ case KEY_ENTER:
+ case KEY_COMMAND:
+ case KEY_OPEN:
+ return M2_KEY_EVENT(M2_KEY_SELECT);
+ case KEY_CANCEL:
+ case KEY_EXIT:
+ return M2_KEY_EVENT(M2_KEY_EXIT);
+ case KEY_HOME:
+ return M2_KEY_EVENT(M2_KEY_HOME);
+ case KEY_SHOME:
+ return M2_KEY_EVENT(M2_KEY_HOME2);
+ case KEY_F(1):
+ return M2_KEY_EVENT(M2_KEY_Q1);
+ case KEY_F(2):
+ return M2_KEY_EVENT(M2_KEY_Q2);
+ case KEY_F(3):
+ return M2_KEY_EVENT(M2_KEY_Q3);
+ case KEY_F(4):
+ return M2_KEY_EVENT(M2_KEY_Q4);
+ case KEY_F(5):
+ return M2_KEY_EVENT(M2_KEY_Q5);
+ case KEY_F(6):
+ return M2_KEY_EVENT(M2_KEY_Q6);
+ case '0':
+ return M2_KEY_EVENT(M2_KEY_0);
+ case '1':
+ return M2_KEY_EVENT(M2_KEY_1);
+ case '2':
+ return M2_KEY_EVENT(M2_KEY_2);
+ case '3':
+ return M2_KEY_EVENT(M2_KEY_3);
+ case '4':
+ return M2_KEY_EVENT(M2_KEY_4);
+ case '5':
+ return M2_KEY_EVENT(M2_KEY_5);
+ case '6':
+ return M2_KEY_EVENT(M2_KEY_6);
+ case '7':
+ return M2_KEY_EVENT(M2_KEY_7);
+ case '8':
+ return M2_KEY_EVENT(M2_KEY_8);
+ case '9':
+ return M2_KEY_EVENT(M2_KEY_9);
+ case '*':
+ return M2_KEY_EVENT(M2_KEY_STAR);
+ case '#':
+ return M2_KEY_EVENT(M2_KEY_HASH);
+ }
+ return M2_KEY_NONE;
+ case M2_ES_MSG_INIT:
+ cbreak();
+ noecho();
+ keypad(stdscr, TRUE);
+ nodelay(stdscr, TRUE);
+ break;
+ }
+ return 0;
+}
+#include
+uint8_t brickdm_event_handler(m2_p ep, uint8_t msg, uint8_t arg1, uint8_t arg2)
+{
+ m2_nav_p nav = m2_get_nav(ep);
+
+ switch(msg) {
+ case M2_EP_MSG_SELECT:
+ return m2_nav_user_down(nav, 1);
+
+ case M2_EP_MSG_EXIT:
+ // if there is no valid parent, then go to the previous root
+ if (!m2_nav_user_up(nav)) {
+ brickdm_root_info *info = brickdm_pop_root_stack();
+ if (info) {
+ m2_SetRootExtended(info->element, info->value, BRICKDM_MAX_USER_VALUE);
+ g_free(info);
+ } else {
+ // TODO: show shutdown dialog
+ }
+ }
+ return 1;
+
+ case M2_EP_MSG_NEXT:
+ return m2_nav_user_next(nav);
+
+ case M2_EP_MSG_PREV:
+ return m2_nav_user_prev(nav);
+
+ case M2_EP_MSG_DATA_DOWN:
+ if ( m2_nav_data_down(nav) == 0 )
+ return m2_nav_user_next(nav);
+ return 1;
+
+ case M2_EP_MSG_DATA_UP:
+ if ( m2_nav_data_up(nav) == 0 )
+ return m2_nav_user_prev(nav);
+ return 1;
+ }
+
+ if (msg >= M2_KEY_Q1 && msg <= M2_KEY_LOOP_END) {
+ if (m2_nav_quick_key(nav, msg - M2_KEY_Q1 + 1) != 0)
+ {
+ if (m2_nav_is_data_entry(nav))
+ return m2_nav_data_up(m2_get_nav(ep));
+ return m2_nav_user_down(nav, 1);
+ }
+ }
+
+ if (msg >= M2_EL_MSG_SPACE) {
+ m2_nav_prepare_fn_arg_current_element(nav);
+ m2_fn_arg_call(msg); // assign the char
+ return m2_nav_user_next(nav); // go to next position
+ }
+ return 0;
+}
diff --git a/brickdm_home.c b/brickdm_home.c
new file mode 100644
index 0000000..295ce40
--- /dev/null
+++ b/brickdm_home.c
@@ -0,0 +1,46 @@
+/*
+ * brickdm -- Brick Display Manager for LEGO Mindstorms EV3/ev3dev
+ *
+ * Copyright (C) 2014 David Lechner
+ *
+ * based in part on GNOME Power Manager:
+ * Copyright (C) 2008-2011 Richard Hughes
+ *
+ * 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, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * 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 .
+ */
+
+/*
+ * brickdm_home.c:
+ *
+ * The home sceen for brickdm.
+ */
+
+#include "brickdm.h"
+
+m2_xmenu_entry main_menu_data[] = {
+ { "Battery", &brickdm_battery_root, NULL },
+ { "Shutdown", &brickdm_shutdown_root, NULL },
+ { NULL, NULL }
+};
+
+uint8_t main_menu_first = 0;
+uint8_t main_menu_cnt = 6;
+
+M2_X2LMENU(main_menu, "l7e20W42", &main_menu_first, &main_menu_cnt,
+ main_menu_data, '+', '-', '\0');
+M2_SPACE(main_menu_space, "W1h1");
+M2_VSB(main_menu_scroll, "l4w4r1", &main_menu_first, &main_menu_cnt);
+M2_LIST(main_menu_list_data) = { &main_menu, &main_menu_space, &main_menu_scroll };
+M2_HLIST(main_menu_hlist, NULL, main_menu_list_data);
+M2_ALIGN(brickdm_home_root, BRICKDM_ROOT_FMT, &main_menu_hlist);
\ No newline at end of file
diff --git a/brickdm_power.c b/brickdm_power.c
new file mode 100644
index 0000000..837a447
--- /dev/null
+++ b/brickdm_power.c
@@ -0,0 +1,246 @@
+/*
+ * brickdm -- Brick Display Manager for LEGO Mindstorms EV3/ev3dev
+ *
+ * Copyright (C) 2014 David Lechner
+ *
+ * based in part on GNOME Power Manager:
+ * Copyright (C) 2008-2011 Richard Hughes
+ *
+ * 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, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * 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 .
+ */
+
+/*
+ * brickdm_power.c:
+ *
+ * Reads info from the battery and provide functions for displaying that info.
+ */
+
+#include
+
+#include "brickdm.h"
+
+#define BRICKDM_POWER_EV3_BATTERY_PATH \
+ "/org/freedesktop/UPower/devices/battery_legoev3_battery"
+#define BATTERY_STRING_SIZE 10
+#define TECHNOLOGY_NAME_SIZE 30
+#define BATTERY_HIST_GRAPH_WIDTH 150
+#define BATTERY_HIST_GRAPH_HEIGHT 100
+#define BATTERY_HIST_GRAPH_FMT(width,height) "w"#width"h"#height
+
+gchar *current_device;
+gchar battery_voltage[BATTERY_STRING_SIZE+1];
+gchar battery_voltage2[BATTERY_STRING_SIZE+1];
+gchar battery_current[BATTERY_STRING_SIZE+1];
+gchar battery_power[BATTERY_STRING_SIZE+1];
+gchar technology_name[TECHNOLOGY_NAME_SIZE+1];
+gdouble battery_hist_data[BATTERY_HIST_GRAPH_WIDTH];
+
+/* battery history screen definitions */
+
+void battery_hist_graph_callback(m2_el_fnarg_p fnarg);
+
+M2_LABEL(battery_hist_label, NULL, "History:");
+M2_SPACECB(battery_hist_graph, BATTERY_HIST_GRAPH_FMT(BATTERY_HIST_GRAPH_WIDTH,
+ BATTERY_HIST_GRAPH_HEIGHT), battery_hist_graph_callback);
+M2_LIST(battery_hist_list_data) = { &battery_hist_label, &battery_hist_graph };
+M2_VLIST(battery_hist_vlist, NULL, battery_hist_list_data);
+M2_ALIGN(brickdm_battery_hist_root, BRICKDM_ROOT_FMT, &battery_hist_vlist);
+
+/* battery screen definitions */
+
+M2_LABEL(battery_stats_label, NULL, "Statistics:");
+M2_ALIGN(brickdm_battery_stats_root, BRICKDM_ROOT_FMT, &battery_stats_label);
+
+/* battery statictics screen definitions */
+
+void battery_hist_button_callback(m2_el_fnarg_p fnarg);
+
+M2_LABEL(battery_label, NULL, "Battery Info:");
+M2_BOX(battery_label_underline, "h1W48");
+M2_LABEL(technology_label, NULL, "Type:");
+M2_LABELP(technology_value, NULL, technology_name);
+M2_LABEL(voltage_label, NULL, "Voltage:");
+M2_LABELP(voltage_value, NULL, battery_voltage);
+M2_LABEL(current_label, NULL, "Current:");
+M2_LABELP(current_value, NULL, battery_current);
+M2_LABEL(power_label, NULL, "Power:");
+M2_LABELP(power_value, NULL, battery_power);
+M2_SPACE(grid_space, "w2");
+M2_LIST(data_grid_list_data) = {
+ &technology_label, &grid_space, &technology_value,
+ &voltage_label, &grid_space, &voltage_value,
+ ¤t_label, &grid_space, ¤t_value,
+ &power_label, &grid_space, &power_value,
+};
+M2_GRIDLIST(data_gird_list, "c3", data_grid_list_data);
+M2_BUTTON(goto_hist_button, "f4", " Hist ", battery_hist_button_callback);
+M2_ROOT(goto_stats_button, "f4", " Stats ", &brickdm_battery_stats_root);
+M2_LIST(button_list_data) = { &goto_hist_button, &goto_stats_button };
+M2_HLIST(button_hlist, NULL, button_list_data);
+M2_SPACE(list_space, "h5");
+M2_LIST(battery_list_data) = { &battery_label, &battery_label_underline,
+ &list_space, &data_gird_list, &list_space, &button_hlist };
+M2_VLIST(battery_vlist, NULL, battery_list_data);
+M2_ALIGN(brickdm_battery_root, BRICKDM_ROOT_FMT, &battery_vlist);
+
+/* shutdown screen definitions */
+
+void shutdown_button_callback(m2_el_fnarg_p fnarg);
+void restart_button_callback(m2_el_fnarg_p fnarg);
+
+M2_BUTTON(shutdown_button, "f12W32", "Shutdown", shutdown_button_callback);
+M2_BUTTON(restart_button, "f12W32", "Restart", restart_button_callback);
+M2_LIST(shutdown_list_data) = { &shutdown_button, &list_space, &restart_button };
+M2_VLIST(shutdown_vlist, NULL, shutdown_list_data);
+M2_ALIGN(brickdm_shutdown_root, BRICKDM_ROOT_FMT, &shutdown_vlist);
+
+void update_battery_hist_data(UpDevice *device)
+{
+ GPtrArray *array;
+ UpHistoryItem *item;
+ int i;
+
+ g_debug("Getting history.");
+ array = up_device_get_history_sync(device, "rate", 3600,
+ BATTERY_HIST_GRAPH_WIDTH, NULL, NULL);
+ if(!array) {
+ g_debug("Failed to get history.");
+ // TODO: show error on screen
+ return;
+ }
+ for (i=0; ilen; i++) {
+ item = g_ptr_array_index(array, i);
+ battery_hist_data[i] = up_history_item_get_value (item);
+ g_debug("time: %d, state: %d, value: %.2f", up_history_item_get_time(item),
+ up_history_item_get_state (item), battery_hist_data[i]);
+ }
+ g_ptr_array_unref (array);
+ brickdm_needs_redraw = TRUE;
+}
+
+void battery_hist_button_callback(m2_el_fnarg_p fnarg)
+{
+ UpDevice *device = up_device_new();
+ up_device_set_object_path_sync(device, BRICKDM_POWER_EV3_BATTERY_PATH, NULL, NULL);
+ update_battery_hist_data(device);
+ g_object_unref(device);
+ m2_SetRoot(&brickdm_battery_hist_root);
+}
+
+void battery_hist_graph_callback(m2_el_fnarg_p fnarg)
+{
+ int i;
+ g_debug("Drawing graph.");
+ for (i=0; ilen; i++) {
+ UpDevice *device = g_ptr_array_index (devices, i);
+ UpDeviceKind kind;
+ const char* object_path;
+
+ g_signal_connect(client, "device-changed",
+ G_CALLBACK(brickdm_power_device_changed_cb), NULL);
+ g_object_get(device, "kind", &kind, NULL);
+ object_path = up_device_get_object_path(device);
+ g_debug("Found %s at %s.\n", up_device_kind_to_string(kind), object_path);
+ if (g_strcmp0(BRICKDM_POWER_EV3_BATTERY_PATH, object_path) == 0)
+ brickdm_power_update_status(device);
+ }
+}
+
+void run_command(const char *command)
+{
+ g_spawn_command_line_sync(command, NULL, NULL, NULL, NULL);
+ // TODO: would be nice to check for errors
+}
+
+void shutdown_button_callback(m2_el_fnarg_p fnarg)
+{
+ run_command("poweroff");
+}
+
+void restart_button_callback(m2_el_fnarg_p fnarg)
+{
+ run_command("reboot");
+}
diff --git a/cmake b/cmake
deleted file mode 160000
index 33bbae5..0000000
--- a/cmake
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 33bbae516111fa9a382ce1467ebc84f1dce26db4
diff --git a/data/CMakeLists.txt b/data/CMakeLists.txt
deleted file mode 100644
index e59d60b..0000000
--- a/data/CMakeLists.txt
+++ /dev/null
@@ -1,37 +0,0 @@
-set (files
- openroberta-connected12x9
- openroberta-connected16x16
- openroberta-idle12x9
- openroberta-idle16x16
- splash
-)
-
-set (destination_directory ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_PROJECT_NAME})
-
-set (generated_files "")
-foreach (file ${files})
- set (in_file ${CMAKE_CURRENT_SOURCE_DIR}/${file}.pbm)
- set (out_file ${destination_directory}/${file}.png)
- list (APPEND generated_files ${out_file})
- add_custom_command (
- OUTPUT
- ${out_file}
- COMMAND
- mkdir -p ${destination_directory}
- COMMAND
- ${CMAKE_COMMAND} -Din_file="${in_file}" -Dout_file="${out_file}" -P ${CMAKE_CURRENT_SOURCE_DIR}/pnmtopng.cmake
- WORKING_DIRECTORY
- ${CMAKE_CURRENT_BINARY_DIR}
- DEPENDS
- ${in_file})
-endforeach (file)
-
-add_custom_target (brickman_data
- DEPENDS
- ${generated_files})
-
-install (
- DIRECTORY
- ${destination_directory}
- DESTINATION
- share)
\ No newline at end of file
diff --git a/data/openroberta-connected12x9.pbm b/data/openroberta-connected12x9.pbm
deleted file mode 100644
index a918695..0000000
--- a/data/openroberta-connected12x9.pbm
+++ /dev/null
@@ -1,5 +0,0 @@
-P1
-# CREATOR: GIMP PNM Filter Version 1.1
-12 9
-0000000001100110000000011011100111000100011000101000010000011001110011
-01100111001101010001100010001111111100
\ No newline at end of file
diff --git a/data/openroberta-connected16x16.pbm b/data/openroberta-connected16x16.pbm
deleted file mode 100644
index 248f335..0000000
--- a/data/openroberta-connected16x16.pbm
+++ /dev/null
@@ -1,7 +0,0 @@
-P1
-# CREATOR: GIMP PNM Filter Version 1.1
-16 16
-0000000000000000000000000001110000111000000000100100000000000001100111
-1001111000001000011000010001000001000000100100000100000010010011010011
-0010010011010011001000100001100001000001111001111000000000000000000000
-0000000000000000000000000000000000000000000000
\ No newline at end of file
diff --git a/data/openroberta-idle12x9.pbm b/data/openroberta-idle12x9.pbm
deleted file mode 100644
index be1cd76..0000000
--- a/data/openroberta-idle12x9.pbm
+++ /dev/null
@@ -1,5 +0,0 @@
-P1
-# CREATOR: GIMP PNM Filter Version 1.1
-12 9
-0000000000000110000001101011100111010100011000101000010000011100011000
-11101111011101010001100010001111111100
\ No newline at end of file
diff --git a/data/openroberta-idle16x16.pbm b/data/openroberta-idle16x16.pbm
deleted file mode 100644
index f35d8c5..0000000
--- a/data/openroberta-idle16x16.pbm
+++ /dev/null
@@ -1,7 +0,0 @@
-P1
-# CREATOR: GIMP PNM Filter Version 1.1
-16 16
-0000000000000000000000000000000000111000000111000100000000000010100111
-1001111001001000011000010001000001000000100100000100000010011000011000
-0110010111110111101000100001100001000001111001111000000000000000000000
-0000000000000000000000000000000000000000000000
\ No newline at end of file
diff --git a/data/pnmtopng.cmake b/data/pnmtopng.cmake
deleted file mode 100644
index 7cd4018..0000000
--- a/data/pnmtopng.cmake
+++ /dev/null
@@ -1,14 +0,0 @@
-# requires list of files set using -Din_file="file1" -Dout_file="file2"
-
-execute_process (
- COMMAND
- pnmtopng
- INPUT_FILE
- ${in_file}
- OUTPUT_FILE
- ${out_file}
- OUTPUT_VARIABLE
- output
- ERROR_VARIABLE
- error)
-
diff --git a/data/splash.pbm b/data/splash.pbm
deleted file mode 100644
index a11d4d2..0000000
--- a/data/splash.pbm
+++ /dev/null
@@ -1,329 +0,0 @@
-P1
-# CREATOR: GIMP PNM Filter Version 1.1
-178 128
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000011100000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000001100000000000000000
-0000000000000000000000000000000000000000000000000000000111000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000001110000000000000000000000000000000000000000000000000
-0000000000000000000000011100000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000011110000000000
-0000000000000000000000000000000000000000000000000000000000001110000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000001110000000000000000000000000000000000000000000
-0000000000000000000000000000111000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000111100000
-0000000000000000000000000000000000000000000000000000000000000000001110
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000011110000000000000000000000000000000000000
-0000000000000000000000000000000001111000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000111
-0000000000000000000000000000000000000000001100000000000000000000000000
-0111000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000011100000000000000000000000000000000
-0000000000111000000000000000000000000001110000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0011110000000000000000000000000000000000000000001110000000000000000000
-0000000111000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000111100000000000000000000000000
-0000000000000000010000000000000000000000000011110000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000011110000000000000000000000000000000000000000000000000000000000
-0000000000001110000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000111100000000000000000000
-0000000000000000000000000000000000000000000000000011100000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000011100000000000000000000000000000000000000000000000000000
-0000000000000000001110000000000110000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000111111111111000000
-0000000000001110000000000000000000000000000000000000000111100000000111
-1100000000000000001111000000000000000000000000000000000000000000000000
-0000100000000000001111111111111111110000000000011111111111100000000000
-0000000000000000000000011100000011111111000000000000000111111000000000
-0000000000000000000000000000000000000000111110000000000011111111111111
-1111100000000111111111111111111001100000000000111111100000000111000111
-1111111000000000000001111111110000000000000000000000000000000000000000
-0110011111111100000000001111100000000011111100001011111111111111111110
-0111000000001111111111000000111111111111111000000000110000111111111100
-0000000111110000000000000000000000000011111111111111000000000001111000
-0000000001110001111111100000000000100001110000001111111111100000001111
-1111111100000000000011101111110001110000000111111110000000001111111000
-0000001111111111111110000000000111000000000000011100011111100000000000
-0000000111000001111111000000000000111111111000000000000001111111111000
-0111100001111111111000000011111111110000000111111111000111100000000001
-1100000000000011110001111100000000000000000001110000111111000000000000
-0111111111100000000000000111111111000001111000111111111111000011111111
-1111100000011111110000001111000000000111000000000011111000111110000000
-0000000000000111000111110000000000000001111111111111100000000001111111
-1000000111101111111000111100011111110000110000000111111000000011110000
-0000011100000000111111000011111000000000000000000011110001111000000000
-0000000111100111111111110000000111111100000001111111111000001111000111
-1100000110000000011111100000001111000000000111000001111111100000111110
-0000000000000000001111000111100000000000000001110000011111111110000011
-1111100000000111111111000000111100011110001111110000000011110000000011
-1100000000011100111111111000000011110000000000000000000011110001111100
-0000000000000111000000001111111110000111110000000001111111100000001111
-0001111111111111100000001110000000001111000000000111111111111000000000
-1111000000000000000000000111000111111111111111110011110000000000011111
-1100011100000000000111111000000000111100011111111111111110000000000000
-0000111100000000111111111100000000000011110000000000000000000001110000
-1111111111111110000110000000000000001111000000000000000001111100000000
-0011110000111111110011111100000000000000000111000000001111110000000000
-0000000111000000000000000000000010000000111111111100000000000000000000
-0000001000000000000000000111100000000000011100000011110000001111100000
-0000000000001100000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000001110000000000000000001110000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000001000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000001111111111000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000010000000
-0011111111111111110000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000001000000000000000000000000011111100000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000010
-0000000000000000000000000000011000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000001001111111111100000000000000000110
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000100101000000011111111111111111011100000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000001001011110000000000000000000
-0101010000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000100101001111111111111111111001010110000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000001001010000000000000000
-0000100101001000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000001000101000000000000000000001001010010000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000010011010000000000
-0000000000100101000100000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000001001001000000000000000000001001100001000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000010010010000
-0000000000000000100110000010000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000010001010000000000000000000001011100000110000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000100010
-1000000000000000000000101010000011000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000010011010000000000000000000011010100000
-1000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-1001001111111111110000000001001010000010000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000100010000000000000011111111110011
-1000001000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000010001000000000000000000000001001100000110000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000100011111111111111111111111
-1111110000010000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000100001000001100000000000000000001100000100000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000001000110000100111111110
-0000000000100000110000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000001000011111110111000011000000000001000001000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000010000000000011010
-0011100000000000100000100000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000010000000001111001111101110000000001000010000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000100000000010
-0000111000001100000001100001000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000100000000001110011111000111000000010000010000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000001000000
-0000001011000110010000000001000001000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000001000000000000010100000111100000000010000
-1100000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000011
-1111111000001111111111100000000001000010000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000010000000001111111111111111111000000
-1000001000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0001100000000000000000000000000111111111100110000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000001111111111000000000000000000
-0000001000010000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000010000000111111111111111100000000010000100000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000010000100111000000000
-0001111111010000110000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000001100011110111111110111110000001111001000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000001100010001010
-0001011001111111111100100000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000011001111101111110100000101000011101000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000010000
-0000000000011111110111111010100000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000001100001111111110000000000000000111000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0011111000000000111111111111100001000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000100000000000000000000000000111
-1100000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000001000001000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000011
-0000000000000000000000000100000100000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000100000000000000000000000001000000
-0000000000000000010000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000010000011110000111100001110100001100001011100001110100000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000100001000010010000100100011
-0000010000110001001000100000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000010000100001000000010010000100000100001000010010001000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000100001000010001111100
-1000010000010000100001001000100000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000010000100001001000010010000100000100001000010001110000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000100001000010010
-0001001000010000010000100001000100000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000010000100001001000110010001100000100001000010001
-1110000011000000110000001100000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000011111000111
-1000011101000111010001111100100001001000010000110000001100000011000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000100001000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000111100000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000
\ No newline at end of file
diff --git a/debian/brickman.service b/debian/brickman.service
deleted file mode 100644
index 7e73314..0000000
--- a/debian/brickman.service
+++ /dev/null
@@ -1,15 +0,0 @@
-[Unit]
-Description=Brick Manager
-Conflicts=getty@tty1.service
-After=systemd-user-sessions.service getty@tty1.service
-
-[Service]
-Type=simple
-ExecStart=/usr/sbin/brickman
-StandardInput=tty
-TTYPath=/dev/tty1
-StandardOutput=journal
-StandardError=journal
-
-[Install]
-Alias=display-manager.service
diff --git a/debian/changelog b/debian/changelog
deleted file mode 100644
index d8feb2d..0000000
--- a/debian/changelog
+++ /dev/null
@@ -1,185 +0,0 @@
-brickman (0.10.0) testing; urgency=medium
-
- * Update for GRX 3.0.0 (fixes console switching)
- * Use brickrun to launch programs and log stderr to file
- * Remove long back press feature
-
- -- David Lechner Thu, 31 Aug 2017 15:57:10 -0500
-
-brickman (0.9.0) testing; urgency=medium
-
- * Update for ev3devKit 0.5, GRX 3.0 and stretch
- * Console switching and long back press are broken
-
- -- David Lechner Fri, 24 Mar 2017 12:53:41 -0500
-
-brickman (0.8.1) stable; urgency=medium
-
- [ Denis Demidov ]
- * Use /usr/bin/sudo instead of /sbin/runuser to launch processes from file
- browser
-
- [ David Lechner ]
- * Fix running programs with space in name
- * Change ownership of /dev/tty when running files
- * Make bluetooth "unavailible" when there are no adapters
-
- -- David Lechner Fri, 13 Jan 2017 20:15:22 -0600
-
-brickman (0.8.0) stable; urgency=medium
-
- [ Stefan Sauer ]
- * openroberta: focus on the previously selected 'connect' button
-
- [ David Lechner ]
- * Remove libgrx-dev from build-dep
- * update to ev3devKit 0.4
- * Change to directory of file before executing
- * Extend wifi connect timeout to 5 minutes
- * Close network info windows when service is removed
- * Make connecting to network cancelable
-
- -- David Lechner Fri, 17 Jun 2016 15:30:53 -0500
-
-brickman (0.7.2) stable; urgency=medium
-
- * Fix network name not changing on child windows in FakeNetworkController
- * Fixup BlueZ5 agent dialogs for larger font size.
- * Add controls for connection status to brickman test.
-
- -- David Lechner Tue, 29 Dec 2015 22:48:39 -0600
-
-brickman (0.7.1) stable; urgency=medium
-
- * Change Wi-Fi window for larger font size
-
- -- David Lechner Sat, 26 Dec 2015 16:03:01 -0600
-
-brickman (0.7.0) stable; urgency=medium
-
- * Use XDG_DATA_DIRS for data files.
- * Add platform checks for EV3 specific stuff.
- * Update for ev3dev kernel level 9.
- * Make Battery window work on non-EV3 devices.
- * Make About window work on non-EV3 devices.
- * UI changes to handle bigger font.
- * Add UI for OpenRoberta (thanks @ensonic).
- * File browser is now limited to /home/robot
- * Remove dependency on libgee (improves performance).
- * USB menu is removed.
-
- -- David Lechner Tue, 15 Dec 2015 17:16:54 -0600
-
-brickman (0.6.2) stable; urgency=medium
-
- [ David Lechner ]
- * Change polling time to 500 ms for watch window.
-
- [ Stefan Sauer ]
- * filebrowser: ensure that the tty is accesible to the user
- * brickman.service: route stdout/err to journal for easier access
-
- [ David Lechner ]
- * Now using ev3devKit as shared library.
-
- -- David Lechner Sat, 12 Sep 2015 00:30:26 -0500
-
-brickman (0.6.1) stable; urgency=medium
-
- * Change LED names to match changes in kernel.
- * Don't open a new VT when starting.
-
- -- David Lechner Wed, 20 May 2015 17:05:34 -0500
-
-brickman (0.6.0) stable; urgency=medium
-
- * Update for ev3dev kernel ABI 3 and 4 changes.
- * Show adapter in Bluetooth device name when there is more than one adapter present.
- * Fix memory leak caused by reference cycles with network service objects.
- * Add Motor browser.
-
- -- David Lechner Fri, 01 May 2015 12:09:21 -0500
-
-brickman (0.5.1) testing; urgency=medium
-
- * Add entries to control panel for setting values displayed by bluetooth agent dialogs.
- * Make Wi-Fi and Bluetooth status bar indicators invisible by default.
- * Fix potential issue with tether netmask.
- * Don't check for connected status when binding network status bar text.
- * Hide network connection button when bluetooth device is not paired.
-
- -- David Lechner Tue, 31 Mar 2015 20:06:28 -0500
-
-brickman (0.5.0) testing; urgency=medium
-
- * Added splash screen.
- * Fixed race condition that sometimes caused Wi-Fi to show incorrect powered
- state.
- * Added UI for enabling tethering via USB or Bluetooth.
- * Redesigned "Wireless and Networks" menu. Bluetooth and USB are moved under
- this menu. There is also a new separate menu for Wi-Fi.
- * Added Wi-Fi and Bluetooth status indicators in the status bar.
- * Fixed user program sound output (beep only) not stopped when program is
- killed.
- * Fixed network connection display order issue.
-
- -- David Lechner Tue, 24 Feb 2015 14:54:16 -0600
-
-brickman (0.4.0) testing; urgency=medium
-
- * Add File Browser.
-
- -- David Lechner Sun, 25 Jan 2015 19:36:25 -0600
-
-brickman (0.3.0) testing; urgency=medium
-
- * Have Bluez5.Manager hang on to object instances that it creates
- (ev3dev/ev3dev#201)
- * Add Device Browser with support for browsing ports and sensors
- (ev3dev/ev3dev#169)
- * Rearrange About window to fit long kernel version strings
-
- -- David Lechner Tue, 06 Jan 2015 22:25:38 -0600
-
-brickman (0.2.0) testing; urgency=medium
-
- * Add support for Bluetooth management. Can can now scan, pair and connect
- devices.
- * Properly handle connman restart/crash. brickman no longer restarts when
- connman service restarts.
-
- -- David Lechner Thu, 13 Nov 2014 19:51:56 -0600
-
-brickman (0.1.3) testing; urgency=medium
-
- [ WasabiFan ]
- * Add IP address to status bar
-
- [ David Lechner ]
- * fix Network status menu shrinking when technologies are removed
- * Make brickman restart when connman restarts
- * Fix build-depends due to libjpeg62 transitional packages being removed.
-
- -- David Lechner Mon, 03 Nov 2014 13:01:59 -0600
-
-brickman (0.1.2) testing; urgency=medium
-
- * Use on screen keyboard for ip address entry
- * put executable in sbin instead of bin
- * fix nameserver not working after switching from dhcp to manual
- * fix dbus property notification not working
-
- -- David Lechner Wed, 08 Oct 2014 22:55:29 -0500
-
-brickman (0.1.1) testing; urgency=medium
-
- * fix systemd service not enabled after install
- * add kernel version to about window
-
- -- David Lechner Mon, 06 Oct 2014 21:34:09 -0500
-
-brickman (0.1.0) testing; urgency=low
-
- * Initial Release.
-
- -- David Lechner Sun, 05 Oct 2014 22:06:02 -0500
diff --git a/debian/compat b/debian/compat
deleted file mode 100644
index ec63514..0000000
--- a/debian/compat
+++ /dev/null
@@ -1 +0,0 @@
-9
diff --git a/debian/control b/debian/control
deleted file mode 100644
index 3986998..0000000
--- a/debian/control
+++ /dev/null
@@ -1,18 +0,0 @@
-Source: brickman
-Section: embedded
-Priority: standard
-Maintainer: David Lechner
-Build-Depends: debhelper (>= 9), dh-systemd, cmake, valac (>= 0.24),
- libgirepository1.0-dev, libgudev-1.0-dev,
- libev3devkit-dev, netpbm
-Standards-Version: 3.9.8
-Homepage: https://www.ev3dev.org
-Vcs-Git: https://github.com/ev3dev/brickman.git
-Vcs-Browser: https://github.com/ev3dev/brickman
-
-Package: brickman
-Architecture: any
-Depends: ${shlibs:Depends}, ${misc:Depends}, systemd, connman, bluez (>= 5)
-Suggests: openrobertalab
-Description: ev3dev Brick Manager
- Provides a user interface for LEGO MINDSTORMS EV3 running ev3dev.
diff --git a/debian/copyright b/debian/copyright
deleted file mode 100644
index c23d00e..0000000
--- a/debian/copyright
+++ /dev/null
@@ -1,24 +0,0 @@
-Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
-Upstream-Name: brickman
-Source:
-
-Files: *
-Copyright: 2014 David Lechner
-License: GPL-2.0+
-
-License: GPL-2.0+
- This package 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; either version 2 of the License, or
- (at your option) any later version.
- .
- 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 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 General
- Public License version 2 can be found in "/usr/share/common-licenses/GPL-2".
\ No newline at end of file
diff --git a/debian/gbp.conf b/debian/gbp.conf
deleted file mode 100644
index 1ccead1..0000000
--- a/debian/gbp.conf
+++ /dev/null
@@ -1,3 +0,0 @@
-[DEFAULT]
-debian-branch=ev3dev-buster
-debian-tag=ev3dev-buster/%(version)s
diff --git a/debian/rules b/debian/rules
deleted file mode 100755
index 52619ce..0000000
--- a/debian/rules
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/usr/bin/make -f
-# -*- makefile -*-
-
-# Uncomment this to turn on verbose mode.
-#export DH_VERBOSE=1
-
-%:
- dh $@ --with systemd
-
-override_dh_installinit:
- # don't do anything
diff --git a/debian/source/format b/debian/source/format
deleted file mode 100644
index 89ae9db..0000000
--- a/debian/source/format
+++ /dev/null
@@ -1 +0,0 @@
-3.0 (native)
diff --git a/debian/source/options b/debian/source/options
deleted file mode 100644
index d5e47f9..0000000
--- a/debian/source/options
+++ /dev/null
@@ -1,4 +0,0 @@
-tar-ignore=.*
-tar-ignore=build*
-tar-ignore=doc/sphinx/_build
-tar-ignore=doc/sphinx/_html_extra
diff --git a/doc/navigation.fodg b/doc/navigation.fodg
deleted file mode 100644
index 3405284..0000000
--- a/doc/navigation.fodg
+++ /dev/null
@@ -1,1490 +0,0 @@
-
-
-
- David Lechner2015-02-08T22:12:08.2392762832015-02-08T23:05:21.873921595David LechnerPT51M21S28LibreOffice/4.2.7.2$Linux_X86_64 LibreOffice_project/420m0$Build-2
-
-
- 35214
- 27276
- 79278
- 41466
-
-
- view1
- false
- false
- true
- true
- false
- false
- false
- false
- true
- 1500
- false
- //////////////////////////////////////////8=
- //////////////////////////////////////////8=
-
- false
- true
- P1000,1000
- true
- 0
- 0
- true
- true
- true
- 4
- 0
- 0
- 1
- 15508
- -13450
- 121121
- 60488
- 1270
- 1270
- 127
- 127
- 127
- 1
- 127
- 1
- false
- 1500
- false
-
-
-
-
- true
- $(user)/config/standard.sob
- 0
- $(user)/config/standard.soc
- $(user)/config/standard.sod
- 1270
- false
-
-
- en
- US
-
-
-
-
-
- $(user)/config/standard.sog
- $(user)/config/standard.soh
- false
- false
- true
- true
- false
- false
- true
- false
- false
- false
- $(user)/config/standard.soe
- false
- 7
- 4
- false
- 0
- low-resolution
- psc_1310
- pgH+/3BzY18xMzEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQ1VQUzpwc2NfMTMxMAAAAAAAAAAAAAAAAAAAAAAAAAAWAAMAzAAAAAAAAAAIAFZUAAAkbQAASm9iRGF0YSAxCnByaW50ZXI9cHNjXzEzMTAKb3JpZW50YXRpb249UG9ydHJhaXQKY29waWVzPTEKY29sbGF0ZT1mYWxzZQptYXJnaW5kYWp1c3RtZW50PTAsMCwwLDAKY29sb3JkZXB0aD0yNApwc2xldmVsPTAKcGRmZGV2aWNlPTEKY29sb3JkZXZpY2U9MApQUERDb250ZXhEYXRhCkR1cGxleDpOb25lAElucHV0U2xvdDpBdXRvAFBhZ2VTaXplOkxldHRlcgAAEgBDT01QQVRfRFVQTEVYX01PREUKAERVUExFWF9PRkY=
- false
- 1
- 1
- true
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- iVBORw0KGgoAAAANSUhEUgAAAWQAAAEACAIAAAALHJs7AAAHiElEQVR4nO3dPbbjNhaFUQc1
- O4c9mR5CT6ZDz8/BS+Qlk/WBBCFK2jvyqmKReD8+uAQp3F///+u/fwD8zq9XDwB4D8IC3sB/
- /vzfS677eOchLIBkMyx+kmxrReM5556PLMd0++N5vuJrx7N/rf1ZYnRUc78u7mzlT/b590pl
- AST/Ehb7897WjPr45+WYrtytlXl+zXj6tUrtU0Yy6+viXYzWklvHj94fqCyA5F/CYit1urlz
- 2v541s+i++MpI5k1WrXDNxv9/3S/mijnUVkAyXBYHKs7rp7/9++++h3adaMqd5Xnn86Ua/EZ
- 1r95obIAkoNh0Vfy16wprHw6c2xUn3Qt7uD82uIolQWQTAiL8/P23WbCM+MZ/bf9zVTvU/Bo
- tJbfP75QWQDJwbDon8K4+hlEedKx8mnIp16L+9j/+T7/7dbxo+8EqSyAZDMsRtOr/+2x489f
- sY9qzXjWX4t396pdLX6oLIBEWMAbuEP9KCyA5Ndr74KAd6GyAJJfd7gXAu5PZQEkwgJIhAWQ
- /CMsPBkBHvlsCDBMWACJsACS34TFrE5Hz2e7bn2k9x8FOpUFkKSw6HPysT6gVzjTeQk+z/m6
- XmUBJNPCYtZ6xPne4v0qz5XOaF/p3j+yrKT0a61Z/eGTbP2m2d0bmCyFRZntz69HnO/y/Pyv
- nkfYzzw6njPjH61QVBOccazKUFkAyeSnIefNelZSZuk1X1fvENW7t8EZ1iyAC90uLD515rxP
- pcN38p4FsMgl71kc6z862v25j+fYecp4Ho95/u+tkeyf58yYYcv53yWVBZD8JixmfSpk7jEr
- rzJ6tq03UM5fS5XBa6ksgERYAImwABJhASTCAkj+ERb6ngJbVBZAIiyARFgAyfAbnCv35n7t
- GkrpfgLfQ2UBJMN7cK6Z8+8ze299EvQ+I4SifBJ6n8oCSIbD4ljHjf39qfePfHasl+oVtUDf
- w6J8f0oVc/5rH913g88w+n/ZM5UFkEwIizIrlr2zHv9ka/4s6wV9li56j7L9Oqj/qzPjH61Q
- VBPf6ViVobIAkmlhcbd9nGaNp8zSa+bnXp2Vr11N8c2sWQAXGg6LrXvdkk9bT1Ku8Kkz530q
- Hd6L9yyARYZ7nfbnF8fSa7+bRul7ft14jp1ntItKf5Nl/zxnxsznOf87oLIAkt+ERU+jWUf2
- tY9Z41lzldGzHVsVKkeqMjhGZQEkwgJIhAWQCAsgERZAIiyARFgAibAAEmEBJKlvyNzdnM6z
- c+Sj0e/5FT+7O+y7dYcxfDaVBZBMDovX7hlFZx7+NvazABa5ZA/O/fvhM/01jo2nX+v5yFkd
- T/fPc+b7c53eC+b5T/Z3RTvWd2a018n+1Z99dp2lbwiwyEBY7N/llnWEuf01Rq+yvw/V6Gi7
- Pr/td/cYnSf3jc78z38+2oXk/JO1/hN57dO6+9M3BLjQ0rDoc8J5++cZ3Rdz65i51s94+/Xg
- 3Z43nakpHs9gj1JrFsCFBnb3XvN2w6yMP7aDZunBcf6+924z9pZ3nG/LmtR3rmV4zwJYJIVF
- uZPf7/fRrzL6fkTvLTL69sSsp/FbbweM1hfXVXZ9hH0t4PGJyf4znSvWEbau9Z1vWPzQNwRY
- 5GDfkNGuFtf11zh2zNyeIMX+d2zW9/nYSGZdq5y5X310JGX831BBXEdlASTCAkiEBZAICyAR
- FkAiLIBEWACJsAASYQEkqW/Is/OfuVyzSxUwi8oCSIY/dfrDzA/vxX4WwCKX9A15VPa/6Mds
- XWu0x4Tdn/k2+oYAiwzswfmoz9L9+DMz/5keE/Bt9A0BLvSWT0PKPpRqCthizQK40CVhcf/e
- Imt6oMB9eM8CWGTC05DRvhj7b0DsHzO3x8T+Exz4JPqGAIsc7BtSjryuc8esHiW6aUOnsgCS
- rw4LdQR0Xx0WQCcsgERYAImwABJhASTCAkiEBZAMhMXd9q20FxaspLIAkoFPnT5+4tN8Du/F
- fhbAIqnX6dbuFb2XRzmmrIn03iLAI31DgEWmhUWpCM4/SdEZBM7TNwS40ME9OIH3Zc0CuNCp
- jmRXU9HALN6zABaZFhajvUXKMef7jwA/9A0BFjnYN+S5IiiO9QqZ1SUEOENlASTCAkiEBZAI
- CyARFkAiLIBEWACJsAASYQEkwgJIhAWQCAsgERZAIiyARFgAibAAEmEBJMICSIQFkAgLIBEW
- QCIsgERYAImwABJhASTCAkiEBZAICyARFkAiLIBEWACJsAASYQEkwgJIhAWQCAsgERZAIiyA
- RFgAibAAEmEBJMICSIQFkAgLIBEWQCIsgERYAImwABJhASTCAkiEBZAICyARFkAiLIBEWACJ
- sAASYQEkwgJIhAWQCAsgERZAIiyARFgAibAAEmEBJMICSIQFkAgLIBEWQCIsgERYAImwABJh
- ASTCAkiEBZAICyARFkAiLIBEWACJsAASYQEkwgJIhAWQCAsgERZAIiyARFgAibAAEmEBJMIC
- SIQFkAgLIBEWQCIsgERYAImwABJhASTCAkiEBZAICyARFkAiLIBEWACJsAASYQEkwgJIhAWQ
- CAsgERZAIiyARFgAibAAEmEBJH8D0uUwwOm/xDsAAAAASUVORK5CYII=
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- iVBORw0KGgoAAAANSUhEUgAAAWQAAAEACAIAAAALHJs7AAAFmklEQVR4nO3dMZabSBRAUQe9
- O4fezCzBm3Ho/U0gB+1Dg1+JAiHp3rCNBX088/gCifr49fu/bwD/8vHoAwCeg1jAE/jx/edD
- 9vv5nYdYAMlqLG4lW7uisezccsuyTbd9PMs9PvZ4tve1fZYYPaq5vxdXdua/7PK/K5MFkHwR
- i+3z3toZ9fPPyzZdebdWzvPnHE/fV5l9ypHM+r14FqOz5Nr2o+8PTBZA8kUs1qrTzT2nbR/P
- +WfR7eMpRzLraM0O72z0/9PtaaK8jskCSIZjcd/ccfT5f/vdV3+HdtxRlXeV++/OlH3xGs7/
- 5IXJAkjujEW/kn/ONYUz787cd1SvtC+uYP+1xVEmCyCZEIv95+2rnQn3HM/o3+2fTPV5Cj4b
- neW3ty9MFkByZyz6tzCOvgdR7nSceTfkVffFdWz/+y7/dG370c8EmSyAZDUWo/Xqf3rf9vv3
- 2I/qnOM5f188u0c91eLGZAEkYgFP4Arzo1gAycdj3wUBz8JkASQfV3gvBFyfyQJIxAJIxAJI
- xAJIxAJIxGKC0RXG+mpmZz619Og98uzEAkjEYppZ3zQ989mKnr5FJxZAIhanmnU94pynYy2f
- kL62r7JqfJliypWUvi9rqcwlFkAiFtOUs/3+6xFHrwh/372b/rf2HP/ohGKamEssgEQspjnz
- PDbrXkk5S5/ze/UnlZff3UxxBLEAErF4Sq965rzOpMOSWACJWJxquVZbWc/tuNXV9r/O6Ipw
- a+val09YWIHtscQCSMRigjPXHxvd4zl7GX21vh7n6L5MGccRCyARCyARCyARCyARCyARCyAR
- CyCxijqQmCyAxCrqQGKyABKxABKxAJJ/xGL7GQTA+zBZAIlYAIlYAMlqLMoTIm/uW/ny88/3
- 7As4h8kCSIZjsb2yQ1+NcvuJz3NX9AT2M1kAyRexuM7Z2zdi4TpMFkBy6VhcYboBbi4dC+A6
- /orF/qsVo6tRbv/c5yzgOkwWQDIQiz4d3Lca5Z71L4GjmSyA5K9YOJMDa0wWQCIWQCIWQGJF
- MiAxWQDJn1i4DwKsub3/MFkAiVgAiVgAyeqTsoB3tryOabIAErEAErEAkl2xWHue1Syjr1+2
- P/qY4VWZLIDk0rFw/ofruHQsgOuY8AzOss3yueFrP1m+ztp8Mfp9FlcrYA+TBZCkWJRVPMo2
- 22ujL39iVRG4DpMFkLxFLFytgP3eIhbAfgfGotwZcbaHZ2GyAJIUi7K6evkkRbd9n6W/svkF
- ZjFZAMlALMr5ee0TE6Ovdt++gOOYLIDkxWNh+oBZXjwWwCxiASRiASRfxMJ3N4ElkwWQiAWQ
- iAWQiAWQiAWQiAWQiAWQiAWQiAWQiAWQiAWQiAWQiAWQiAWQiAWQiAWQiAWQiAWQiAWQiAWQ
- iAWQiAWQiAWQiAWQiAWQiAWQiAWQiAWQiAWQiAWQiAWQiAWQiAWQiAWQiAWQiAWQiAWQiAWQ
- iAWQiAWQiAWQiAWQiAWQiAWQiAWQiAWQiAWQiAWQiAWQiAWQiAWQiAWQiAWQiAWQiAWQiAWQ
- iAWQiAWQiAWQiAWQiAWQiAWQiAWQiAWQiAWQiAWQiAWQiAWQiAWQiAWQiAWQiAWQiAWQiAWQ
- iAWQiAWQiAWQiAWQiAWQiAWQiAWQiAWQiAWQiAWQiAWQiAWQiAWQiAWQiAWQiAWQiAWQiAWQ
- iAWQiAWQiAWQiAWQiAWQiAWQiAWQiAWQiAWQiAWQiAWQiAWQiAWQiAWQiAWQiAWQiAWQiAWQ
- iAWQiAWQiAWQiAWQiAWQiAWQiAWQiAWQiAWQiAWQiAWQiAWQiAWQiAWQiAWQiAWQiAWQiAWQ
- iAWQiAWQiAWQiAWQiAWQiAWQiAWQiAWQiAWQiAWQiAWQiAWQiAWQiAWQiAWQiAWQiAWQ/InF
- j+8/H3scwMWZLIDkfwkdfEF9x2nBAAAAAElFTkSuQmCC
-
-
-
-
-
-
-
-
-
-
-
- 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
- /geJYU113PMM4wAAAABJRU5ErkJggg==
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- iVBORw0KGgoAAAANSUhEUgAAAWQAAAEACAIAAAALHJs7AAAF1UlEQVR4nO3dMXqjVhhA0RTe
- XcpsJkvIZlJmfyncMB/D832AEJLOKWNGPGfGl18Iw9e///39B8BPvp69AOA1iAW8gL/+/Ocp
- +12+8xALINmMxXfJts5orDu33rJs043Xs97jc9cz3tf4KDG7qnO/L+7syr/Z9b8rkwWQ/CYW
- 4+Pe1hF1+d/LNl15t1aO89esp++rzD5lJWd9X7yK2Vlya/vZ9wcmCyD5TSy2qtOde0wbr+f6
- o+h4PWUlZ63W7PDJZn9Ox9NEeR2TBZBMx2Lf3PHo4//43Vd/h/a4VZV3lcc/nSn74j1cf+WF
- yQJIdsain8m/5pzClZ/O7FvVO+2LOzh+bnGWyQJITojF8eP23Y6ER9Yz+2f7lamup2BpdpYf
- b1+YLIBkZyz6b2E8+jOI8knHlZ+GvOu+uI/x3+/6q1vbz14TZLIAks1YzNarf3Xf9sf32Fd1
- zXqu3xev7ll3tfhmsgASsYAXcIf5USyA5Ou574KAV2GyAJKvO7wXAu7PZAEkYgEkYgEkYgEk
- YgEkYvGDZ/1O5x3uVXHkDua8H7EAErFIrr/D5X2O3u7QxTexABKxmLZ1x/D+5PT1Ha7GW66V
- swnXnG1Z30V9a1/l/0+ZYo5/733NLIkFkIjFCcpRsd8v8/izXR/91PjZV55dz5H1z04opolO
- LIBELE5ztzuDnLWecpS+5vjcp7PyvZspZokFkIjFtK33uv0+3Z92pca57jPpfBqxABKxSMaf
- xp/7ZLD189zK09WWX33ceva9zuxT4/qVLOPXObJm1sQCSMTiB+c+W6xsedbT1Y4fS5/7nLd9
- Z4XKlqaMfcQCSMQCSMQCSMQCSMQCSMQCSMQCSDxFHUhMFkDiKepAYrIAErEAErEAErEAErEA
- ErEAErEAkl9i4WpOYGl5HZbJAkjEAkjEAkh+iMX4udiPM346BnA9kwWQpFhsPd/JkR9eRXm2
- 25jJAkhOi8XWs62XXx0/vXL8BKrxluttgKWtn6D+U2OyAJIUiz41rP9U2fLIawKz9k0ZJgsg
- 2flpyD7HX2d91uOsV4bP4ZwF8EAvGQvnMmCW6yyAi5wQi0ecR9i6IsMVFrDP8Z8RkwWQ/BCL
- XqPxlvuqtv5TJgh4FpMFkIgFkIgFkIgFkIgFkPwSi62rGABMFkAiFkAiFkBy6O7ewOcwWQBJ
- +t2Qrd8oNV/Aqyj3xx8zWQDJzliUu1ds3Y1iXLit3ysd3+fncfuC9zD7FJ41kwWQpKeo9yP5
- Urnb1XoKGHfuyL7K68An2DdlmCyA5NATyWbvFzzuVpliuiv3Ba/FOQvggXZeZ7F21jH5yms6
- XD/C53CdBXCREz4NOev9f7nq4cp9wTs5/m/bZAEkOz8Nmd1m66vrqeH4eq48wwKfw2QBJGIB
- JGIBJGIBJGIBJGIBJGIBJGIBJGIBJGIBJGIBJGIBJGIBJGIBJGIBJGIBJGIBJGIBJGIBJGIB
- JGIBJGIBJGIBJGIBJGIBJGIBJGIBJGIBJGIBJGIBJGIBJGIBJGIBJGIBJGIBJGIBJGIBJGIB
- JGIBJGIBJGIBJGIBJGIBJGIBJGIBJGIBJGIBJGIBJGIBJGIBJGIBJGIBJGIBJGIBJGIBJGIB
- JGIBJGIBJGIBJGIBJGIBJGIBJGIBJGIBJGIBJGIBJGIBJGIBJGIBJGIBJGIBJGIBJGIBJGIB
- JGIBJGIBJGIBJGIBJGIBJGIBJGIBJGIBJGIBJGIBJGIBJGIBJGIBJGIBJGIBJGIBJGIBJGIB
- JGIBJGIBJGIBJGIBJGIBJGIBJGIBJGIBJGIBJGIBJGIBJGIBJGIBJGIBJGIBJGIBJGIBJGIB
- JGIBJGIBJGIBJGIBJGIBJGIBJGIBJGIBJGIBJGIBJGIBJGIBJGIBJGIBJGIBJGIBJGIBJGIB
- JGIBJGIBJGIBJGIBJGIBJGIBJGIBJGIBJGIBJGIBJGIBJGIBJGIBJGIBJGIBJGIBJGIBJGIB
- JGIBJGIBJGIBJGIBJGIBJP8Dlp3xEdN4hwsAAAAASUVORK5CYII=
-
-
-
-
-
-
-
-
-
-
-
-
- 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
-
-
-
-
-
-
-
-
-
-
- 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
-
-
-
-
-
-
-
-
- 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
-
-
-
-
-
-
-
-
-
-
- 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
-
-
-
-
-
-
-
-
- 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
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 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
- vhvqMoMKiOoAAAAASUVORK5CYII=
-
-
-
-
-
-
-
-
-
-
- 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
-
-
-
-
-
-
-
-
-
-
-
-
- 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
- HQ8kAAAAAElFTkSuQmCC
-
-
-
-
-
-
-
-
- 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
-
-
-
-
-
-
-
-
-
-
- iVBORw0KGgoAAAANSUhEUgAAAWQAAAEACAIAAAALHJs7AAAHuUlEQVR4nO3dQZarRABAUQd/
- dw7djEtwMw7dn4Oe5JwIPlJAKLh35EnzQ6UTHxVCp379/c+fvwH8n1/fHgAwB7GACfzx+19f
- 2e/rOw+xAJLFWPyUbOmMxnvn3rcs23Tr43nf43fHs76v9aPE1lHt+7i4sjOf2ffXlZkFkPxH
- LNaPe0tH1NfbyzZdebdWjvPnjKfvq8x9ykj2elzMYutccmn7re8PzCyA5D9isVSdbt9j2vp4
- zj+Kro+njGSv0Zo7PNnW/0/XZxPlfswsgGRzLD6bdxx9/F9/99XfoR03qvKucvzTmbIv7uH8
- Ky/MLIDkw1j0M/nnnFM489OZz0Z1p31xBePnFrcyswCSHWIxfty+2pFwZDxb/22/MtX1FLza
- Opdf374wswCSD2PR/wrj6M8gyicdZ34actd9cR3rz+/7T5e233pNkJkFkCzGYmu9+k8/2358
- j31U54zn/H0xu299q8UPMwsgEQuYwBXmj2IBJL+++y4ImIWZBZD8usJ7IeD6zCyARCyARCyA
- RCyARCyARCwuZ96/IvX9GvcmFkAiFhfiG7G4MrEAErGYwNYV4d+/x+x9blJWVOvr2i6NbX2P
- S/uyBso1iQWQiMVktq7Svr5+yvj5ka0zkfXbnZ25MrEAErHgJOWbU8wprkwsgEQsJnCdd/Ij
- 36t2hfEzQiyARCwu5IjV1coqqn1f6yt3L21v5bR7EAsgEYvLOW6Nsr4K5si/+myOY5ZxfWIB
- JGLxUI7kbCUWQCIWQCIWQCIWQCIWQGIVdSAxswASq6gDiZkFkIgFkIgFkDwuFuVbFfb95oXy
- PVfj34V1zuPqq42sbzOyr9d7K9uM7PHo18ZcHhcL4DMPikVfX2tk5YuRe+739t3H1VctOWJf
- n23z2RhGfof386BYACMeHYty9epnV7iOrA82sibYyDbX9N3zCPf+3W716FgA3UNjsb4OeN/m
- zKNK2VdZf7xsM/Kd4H2bz25/fV62nt95zizgCA+NBbDV42JxzlUPr/czvk1XViQfX7V8309D
- mMXjYgF85nGxOOdz+6X7+ezd/vq+jpgrnTkLuPLjOnMeen2PiwXwmQfF4oiVRK/g/Md1zrUP
- Zz6uu7429vWgWAAjHheLfc9ZjFw7sNd1B+WnfZuRMWzdS9n+nMd1xL7u53GxAD4jFkAiFkAi
- FkAiFkAiFkAiFkAiFkAiFkAiFkAiFkAiFkAiFkAiFkAiFkAiFkAiFkAiFkAiFkAiFkAiFkAi
- FkAiFkAiFkAiFkAiFkAiFkAiFkAiFkAiFkAiFkAiFkAiFkAiFkAiFkAiFkAiFkAiFkAiFkAi
- FkAiFkAiFkAiFkAiFkAiFkAiFkAiFkAiFkAiFkAiFkAiFkAiFkAiFkAiFkAiFkAiFkAiFkAi
- FkAiFkAiFkAiFkAiFkAiFkAiFkAiFkAiFkAiFkAiFkAiFkAiFkAiFkAiFkAiFkAiFkAiFkAi
- FkAiFkAiFkAiFkAiFkAiFkAiFkAiFkAiFkAiFkAiFkAiFkAiFkAiFkAiFkAiFkAiFkAiFkAi
- FkAiFkAiFkAiFkAiFkAiFkAiFkAiFkAiFkAiFkAiFkAiFkAiFkAiFkCyORZ//P7XEeMATvb3
- P39u2t7MAkg2xMKcAu7k5//oPr8wswCSFAtzCrirPr8wswCS28bip5Tvc6Kl20fu80z7juH9
- eHKnWWT5XV3hOZ3FbWMB7OvmsXDcWHLEzGtGz3mk424eC2AvYvE/79vff/p6y+uZ5HKULvt6
- Pzt95rvupUextE0Zc39c5RzK0nn7pbP666Na2ksZz2fP17zEAkhuHoutR/7325eOJEtG9tX3
- snXLz4yMeestZV/l8fbf5Pr1Bfs+9nu4eSyAvTwiFuUYch1XmFNsVUbSH9dcrvMsHO0RsQDG
- icWUR4b+Hn6r785ZZnwunkMsgORBsVj6PLz/fcTSPbwf59+Pz1v3VYzML8p4jhjzEeNZGlW5
- +uP1v7/12GfxoFgAI24bi/XZQdly5J773reOZHz843ssP/3st7HXpypl+3Me+53cNhbAvsQC
- SMQCSFIsrna9ILAX3+4N7GxDLMwv4E6sSAYcYnMsZvy7QGCcmQWQiAWQiAWQiAWQiAWQbI6F
- 6yyeoHzm5ZUwO9dZAIfYEIv17yniTsp3UnklzG7r82hmASQpFo4kT7O+iqdXwj0sPctLzCyA
- ZLJY9DW1Z+S4XfQVz9nXZLEAvmWaWKyv4+Co8jReCeebJhbAd00fi7Jm1NL5/KX1qco2ZV9L
- 27xuub52huPkiPJKeL29r0JW7md9y/efXt/0sQDOcatY9PMa47eUfZV30a5i+EyfP77/q6VV
- Ttf/e+l+lmaIn43nym4VC+A4D41Fabm/vLyyMne72rNztfFs9dBYAFtNH4vvvuub5d3mXa3P
- L858dspMZ/ZXy/SxAM4xTSzKOeeyzRXGszSqcmUH796P6ltfCeu3j7+iznxlHmeaWADfNVks
- xj/FKMeWfvzZ61OVke2fZq9nZ99neWSPs5gsFsC3iAWQiAWQpFhs/a4+Zrd+5YJXwj34dm/g
- EBtisX7VAHdSzup7JczOimTAITbHwjtVfnglPI2ZBZCIBZCIBZCIBZCIBZCIBZCIBZCIBZCI
- BZCIBZCIBZCIBZCIBZD8C6bRRBYudbCHAAAAAElFTkSuQmCC
-
-
-
-
-
-
-
-
-
-
- iVBORw0KGgoAAAANSUhEUgAAAWQAAAEACAIAAAALHJs7AAAGQ0lEQVR4nO3dMXqjVhhA0RTe
- XcpsJkvIZlJmfyncaD6G5ws8EJLOKT1E4Bnn8gtk3te///39B8BPvp59AMBrEAt4AX/9+c9T
- 9vv4zkMsgGQ1Ft8lW7uisezccsuyTTc+nuUen3s8432NzxJbj2ru98WdXfkvu/y5MlkAyW9i
- MT7vrZ1RH79etunKu7Vynr/mePq+yuxTjmTW98Wr2DpLrm2/9f2ByQJIfhOLtep0c89p4+O5
- /iw6Pp5yJLOO1uzwybb+fzqeJsrrmCyAZHMs9s0dZ5//x++++ju0846qvKs8fnem7Iv3cP0n
- L0wWQLIzFv1K/jXXFK68O7PvqN5pX9zB8WuLW5ksgGRCLI6ft+92JjxyPFv/2/7JVJ+n4NHW
- WX68fWGyAJKdsei/hXH2PYhyp+PKuyHvui/uY/zvu/zTte23fibIZAEkq7HYWq/+p/u2P77H
- flTXHM/1++LVPeupFt9MFkAiFvAC7jA/igWQfD33XRDwKkwWQPJ1h/dCwP2ZLIBELIBELIBE
- LIBELIBELJ5m7rpkj695nydfeOLGOxELIBGLp/mEp2a+33f0ycQCSMTiBWxdk33tOWZb17Zc
- e4XlE7rGr1Oevd6PZ21LziYWQCIWt1bubvRrH7NWVylXWMqqFuNX3vqUas4mFkAiFi/gynNp
- 2ZdV4D+TWACJWLyAK8/A9znbX7+WJ2NiASRicWtb1xwrn1yYta+x5ap0+17H3ZD7EAsgEYtb
- OHuFt/7Ji2tWWtv6SZB9x8BcYgEkYsGtmSPuQyyARCyARCyARCyARCyAxCrqQGKyABKrqAOJ
- yQJIfomF6xfAo8d3HiYLIBELIBELIBELeEPHn2+2JBZA8kMsxs9lPLLa5XIbYK7+/1eZREwW
- QDIhFn36KNsA92SyAJITY2FegHdisgCSCbFYW2+qrPhg+oBXYbIAkmmxcDcE3pvJAkhO/JwF
- 8E5MFkDyQyzKnQ53Q+ATmCyAJMWinP/H25gg4Hpzn91vsgASsYA3dMYsLxZAIhZAIhZA8kss
- rHsKrDFZAIlYAIlYAIlYwBva9zmL8VVLsQCS9FunS/vWH5tr7bddr9zXlccAW/WfzDKJmCyA
- JMWinFE9Lwvem8kCSC6KRX/PP36+1vJP166V7HtO13n7gldnsgCSnU/KOuPMWaaP5fm836F4
- /PqsfX1zl4RPYLIAkml3Q2ZxPwXuyWQBJE+LRf9sKHAHJgsgmXY3ZLxG2fLzneUra/sav0J5
- nVn7gs9hsgCSH2LRz59ly+U25Sv79rvveLZuf2TvcLa59xZNFkAiFvCGzphtxQJIxAJIxAJI
- xAJIxAJIxAJIxAJI0rohc59ncYenSJ1xDLNe0xM9uSeTBZBs+K1T57exWTOFv2fOcPx3pk0W
- QDItFsfX4Ji7tsjWJ1AcvwqztpdyPMungYxf7ZFJhGLt563//JgsgGTD072PrNPR1+Dorzn+
- ep8Ujl8pKOu8jo9w/Dc8Pk5XOthq35RhsgCSDbEYnz/vtt7HNTNF58zPfbhmAZxoWixe8cxZ
- rhTAe/A5C+Aim2NxzXofa+f8rfsqjs8X4zVTZjnje+dzHP85MVkAyc51Q65Z72PfqhyzVjDp
- 9h3PvmMwR/AsJgsgEQsgEQsgEQsgEQsgEQsgEQsgEQsgEQsgEQsgEQsgEQsgEQsgEQsgEQsg
- EQsgEQsgEQsgEQsgEQsgEQsgEQsgEQsgEQsgEQsgEQsgEQsgEQsgEQsgEQsgEQsgEQsgEQsg
- EQsgEQsgEQsgEQsgEQsgEQsgEQsgEQsgEQsgEQsgEQsgEQsgEQsgEQsgEQsgEQsgEQsgEQsg
- EQsgEQsgEQsgEQsgEQsgEQsgEQsgEQsgEQsgEQsgEQsgEQsgEQsgEQsgEQsgEQsgEQsgEQsg
- EQsgEQsgEQsgEQsgEQsgEQsgEQsgEQsgEQsgEQsgEQsgEQsgEQsgEQsgEQsgEQsgEQsgEQsg
- EQsgEQsgEQsgEQsgEQsgEQsgEQsgEQsgEQsgEQsgEQsgEQsgEQsgEQsgEQsgEQsgEQsgEQsg
- EQsgEQsgEQsgEQsgEQsgEQsgEQsgEQsgEQsgEQsgEQsgEQsgEQsgEQsgEQsgEQsgEQsgEQsg
- EQsgEQsgEQsgEQsgEQsgEQsg+R9tMWgMO5uu2gAAAABJRU5ErkJggg==
-
-
-
-
-
-
-
-
-
-
- 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
- AElFTkSuQmCC
-
-
-
-
-
-
-
-
- iVBORw0KGgoAAAANSUhEUgAAAWQAAAEACAIAAAALHJs7AAAHTUlEQVR4nO3dS3KkxgJAUQ+0
- Ow+9GS/Bm/HQ+/NAHiiimvTlkxQU54wcagSo+71LQqHMr7//+fM3gP/z9e4TAO5BLOAG/vj9
- r7cc9+edh1gAyWIsvku29ETjtXOvW5ZtuvH5vB7xveczPtb4KrH2rI79ubiyM/9lX/93ZWQB
- JL+Ixfi6t3RF/fn1sk1X7tbKdf6c8+nHKmOfciZH/Vzcxdqx5NL2a+8PjCyA5BexWKpOd+w1
- bXw+519Fx+dTzuSoszV2eLK1/z8djybKfowsgGR1LLaNO2Zf/8d3X/0Obd5ZlbvK/Z/OlGPx
- Gc5/88LIAkg2xqI/yT/nmcKZn85sO6tPOhZXsP/Z4lpGFkByQCz2X7evdiXccz5rv7e/mep9
- Cn5aO5Yfb18YWQDJxlj038KY/RlE+aTjzE9DPvVYXMf43/f1T5e2X/tOkJEFkCzGYm29+p9u
- 237/EftZnXM+5x+Lu3vXrBbfjCyARCzgBq4wfhQLIPl6710QcBdGFkDydYV7IeD6jCyARCyA
- RCyARCyARCyARCwubc8c4uN9zp4TlM8jFkAiFjdgjiyuQCyARCw+xPjpxuufvs51VrZZOtbS
- 3OLjPRgx3YtYAIlY3EC/ki99V9l+z5X/9evGCJ9HLIBELG7gavf2ZQ4UY4rPIxZAIhYfaPbs
- Z/tHDeev08l+YgEkYnEDa9dbG1+3x29AjLc5dg20vh4nVyAWQCIWl7ZnZbN5a7gdtUKaVVrv
- RSyARCx4G+OIexELIBELIBELIBELIBELILGKOpAYWQCJVdSBxMgCSMQCSMQCSMQCSMQCSMQC
- SMQCSMRiovHbsfd6w2XtSiVHrWxiZbPrEAsgEYuJrrz25+zzOWrP1/kbQyyARCzerKxLPl4B
- 5PW7xtvMNl6R5Nj99PXljzqrJxMLIBGL2yijj77e+uynFUujof4JUdlP+XnLVyjEAkjE4qNc
- f96z86/nRhBHEQsgEYs3G9+Zb9tb4b6dtcQCSMTiEsobE+N3CpZGKMeOHcobHz+32TN+Ge/n
- nJ+Xn8QCSMTiJOMrXrlClmtmv66uvQLP2/Oe/Yy3WfpTo49txAJIxOIStl0h4UxiASRiASRi
- ASRiASRiASRiASRiASSPi8XaGaXK3r6VdzTv/sbEUb+LUfbT59d8/a67/z1f0+NiAWwjFrsc
- OxvFmY5aYWzGfowarkksgEQsFu2/Px/PSbE0B8TSEbdtc/3rcBmX3XHs9nnEAkgeF4vXu+K+
- rsTae+Y9+yzzTfVt9q8bMmNmqrLq2nhVsfKkg6M8LhbANmLxUebd2894P+UJb6Z8ErEAkofG
- 4sp3uUvPBcqo4Trrhoz3f9R8olf+d/w8D40FsJZY/EJ/8t/XyFh6nj9+zt+PPnsdjaP2X/Zj
- TZBrEgsgeXQs9s+pfdTqG+U9iKPWFlm75Yz9v3cNFLZ5dCyATixuw/WT9xILIBELIBELIBEL
- IBELIBELIBELIHloLD779w7e+xul+9cEOfZ8OMpDYwGs9bhYWJPi2/4V2Po+560JYg7OMz0u
- FsA2YvGftTNxj2edXtr+dZufW5bz6SuP9HVYuxkrsJUzLzOwG1/MJhZAIha77J+lut/Dj79S
- RkY/zbj2rp3harxuiJVBrkYsgEQsdjlqxqdjZ+5+lz2jpD1H5BxiASRi8Z+1byUe6/xRw3vv
- /4/9dOYnY415xAJIHheLbetWzHi/oJ/P/n2eM4KYsSbI9Z/UPMfjYgFs89BYbPsU4/UKuf8o
- ZcttV91571nMXhOk/LxGIud7aCyAtcQCSMQCSMQCSMQCSMQCSMQCSMQCSMQCSMRio6XfE3nC
- G4QzZqMov++7dp5UjiUWQCIWu9z3yjZj3RA+m1gAiVhM19cEef2u8cog29Yo2eOoeT3G83r3
- bTiTWACJWOxy1KjhqK/3JxHXf6rS3eU50d2JBZCIxS5nXs0+aW2Rpf9+fUKxtA3nEwsgEYvb
- OPaKOvsqvbT/8uRl21Mbn5jMJhZAIhYTrV1HY2mt8Blri1xBeR4x3qb8LXEUsQASsdjoqDVB
- XreZsUrI/u3Xfu/sbawbcj6xABKxABKxABKxABKxABKxABKxABKxABKxABKxABKxABKxABKx
- ABKxABKxABKxABKxABKxABKxABKxABKxABKxABKxABKxABKxABKxABKxABKxABKxABKxABKx
- ABKxABKxABKxABKxABKxABKxABKxABKxABKxABKxABKxABKxABKxABKxABKxABKxABKxABKx
- ABKxABKxABKxABKxABKxABKxABKxABKxABKxABKxABKxABKxABKxABKxABKxABKxABKxABKx
- ABKxABKxABKxABKxABKxABKxABKxABKxABKxABKxABKxABKxABKxABKxABKxABKxABKxABKx
- ABKxABKxABKxABKxABKxABKxABKxABKxABKxABKxABKxABKxABKxABKxABKxABKxABKxABKx
- ABKxABKxABKxABKxAJJ/Ac/opHc2OgwOAAAAAElFTkSuQmCC
-
-
-
-
-
-
-
-
- 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
- AAAAAElFTkSuQmCC
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- LEGEND:
-
-
-
-
- ENTER
-
-
-
- BACK
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 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
- IZABQvwPGb7ZbMWWQpIAAAAASUVORK5CYII=
-
-
-
-
-
-
-
-
-
-
- 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
- eDMJ1imSAAAAAElFTkSuQmCC
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/docker/armel.dockerfile b/docker/armel.dockerfile
deleted file mode 100644
index 22625f3..0000000
--- a/docker/armel.dockerfile
+++ /dev/null
@@ -1,10 +0,0 @@
-FROM ev3dev/debian-buster-armel-cross
-
-RUN sudo apt-get update && \
- DEBIAN_FRONTEND=noninteractive sudo apt-get install --yes --no-install-recommends \
- cmake \
- libev3devkit-dev \
- libgirepository1.0-dev \
- libgudev-1.0-dev \
- netpbm \
- valac
diff --git a/docker/armhf.dockerfile b/docker/armhf.dockerfile
deleted file mode 100644
index 3421486..0000000
--- a/docker/armhf.dockerfile
+++ /dev/null
@@ -1,10 +0,0 @@
-FROM ev3dev/debian-buster-armhf-cross
-
-RUN sudo apt-get update && \
- DEBIAN_FRONTEND=noninteractive sudo apt-get install --yes --no-install-recommends \
- cmake \
- libev3devkit-dev \
- libgirepository1.0-dev \
- libgudev-1.0-dev \
- netpbm \
- valac
diff --git a/docker/setup.sh b/docker/setup.sh
deleted file mode 100755
index e66ba56..0000000
--- a/docker/setup.sh
+++ /dev/null
@@ -1,49 +0,0 @@
-#!/bin/sh
-
-set -e
-
-script_dir=$(dirname $(readlink -f "$0"))
-
-case $1 in
- armel|armhf)
- arch=$1
- ;;
- *)
- echo "Error: Must specify 'armel' or 'armhf'"
- exit 1
- ;;
-esac
-
-if ! which docker >/dev/null; then
- echo "Error: Docker is not installed"
- exit 1
-fi
-
-build_dir="build-$arch"
-image_name="brickman-$arch"
-container_name="brickman_$arch"
-
-mkdir -p $build_dir
-
-docker build \
- --tag $image_name \
- --no-cache \
- --file "$script_dir/$arch.dockerfile" \
- "$script_dir/"
-
-docker rm --force $container_name >/dev/null 2>&1 || true
-docker run \
- --volume "$(readlink -f $build_dir):/build" \
- --volume "$(pwd):/src" \
- --workdir /build \
- --user $(id -u):$(id -g) \
- --name $container_name \
- --env "TERM=$TERM" \
- --env "DESTDIR=/build/dist" \
- --tty \
- --detach \
- $image_name tail
-
-docker exec --tty $container_name cmake /src -DCMAKE_BUILD_TYPE=Debug
-
-echo "Done. You can now compile by running 'docker exec --tty $container_name make'"
diff --git a/lib/bluez5/Adapter.vala b/lib/bluez5/Adapter.vala
deleted file mode 100644
index c17721f..0000000
--- a/lib/bluez5/Adapter.vala
+++ /dev/null
@@ -1,173 +0,0 @@
-/*
- * bluez5 -- DBus bindings for BlueZ 5
- *
- * Copyright (C) 2014-2015 David Lechner
- *
- * 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, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY throws IOError; 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 .
- */
-
-/*
- * Adapter.vala:
- */
-
-namespace Bluez5 {
- public class Adapter : Object {
- static HashTable adapter_map;
-
- static construct {
- adapter_map = new HashTable (str_hash, str_equal);
- }
-
- org.bluez.Adapter1 dbus_proxy;
-
- public string address { owned get { return dbus_proxy.address; } }
-
- public string name { owned get { return dbus_proxy.name; } }
-
- public string alias {
- owned get { return dbus_proxy.alias; }
- set { dbus_proxy.alias = value; }
- }
-
- public uint32 class { get { return dbus_proxy.class; } }
-
- public bool powered {
- get { return dbus_proxy.powered; }
- set { dbus_proxy.powered = value; }
- }
-
- public bool discoverable {
- get { return dbus_proxy.discoverable; }
- set { dbus_proxy.discoverable = value; }
- }
-
- public bool pairable {
- get { return dbus_proxy.pairable; }
- set { dbus_proxy.pairable = value; }
- }
-
- public uint32 pairable_timeout {
- get { return dbus_proxy.pairable_timeout; }
- set { dbus_proxy.pairable_timeout = value; }
- }
-
- public uint32 discoverable_timeout {
- get { return dbus_proxy.discoverable_timeout; }
- set { dbus_proxy.discoverable_timeout = value; }
- }
-
- public bool discovering { get { return dbus_proxy.discovering; } }
-
- public string[] uuids { owned get { return dbus_proxy.uuids; } }
-
- public string modalias { owned get { return dbus_proxy.modalias; } }
-
- internal Adapter (DBusProxy proxy) {
- dbus_proxy = (org.bluez.Adapter1)proxy;
- adapter_map[proxy.g_object_path] = this;
- proxy.g_properties_changed.connect ((changed, invalidated) => {
- var iter = changed.iterator ();
- string? name = null;
- Variant? value = null;
- while (iter.next ("{sv}", &name, &value)) {
- switch (name) {
- case "Address":
- notify_property ("address");
- break;
- case "Name":
- notify_property ("name");
- break;
- case "Alias":
- notify_property ("alias");
- break;
- case "Class":
- notify_property ("class");
- break;
- case "Powered":
- notify_property ("powered");
- break;
- case "Discoverable":
- notify_property ("discoverable");
- break;
- case "Pairable":
- notify_property ("pairable");
- break;
- case "PairableTimeout":
- notify_property ("pairable-timeout");
- break;
- case "DiscoverableTimeout":
- notify_property ("discoverable-timeout");
- break;
- case "Discovering":
- notify_property ("discovering");
- break;
- case "UUIDs":
- notify_property ("uuids");
- break;
- case "Modalias":
- notify_property ("modalias");
- break;
- default:
- critical ("Unknown d-bus property: %s", name);
- break;
- }
- }
- });
- }
-
- ~Adapter () {
- adapter_map.remove (((DBusProxy)dbus_proxy).g_object_path);
- }
-
- internal static Adapter get_for_object_path (string path) {
- return adapter_map[path];
- }
-
- public async void start_discovery () throws DBusError, IOError {
- yield dbus_proxy.start_discovery ();
- }
-
- public async void stop_discovery () throws DBusError, IOError {
- yield dbus_proxy.stop_discovery ();
- }
-
- public async void remove_device (Device device) throws DBusError, IOError {
- var path = new ObjectPath (device.object_path);
- yield dbus_proxy.remove_device (path);
- }
- }
-}
-
-namespace org.bluez {
- [DBus (name = "org.bluez.Adapter1")]
- public interface Adapter1 : Object {
- public abstract async void start_discovery () throws DBusError, IOError;
- public abstract async void stop_discovery () throws DBusError, IOError;
- public abstract async void remove_device (ObjectPath device) throws DBusError, IOError;
-
- public abstract string address { owned get; }
- public abstract string name { owned get; }
- public abstract string alias { owned get; set; }
- public abstract uint32 class { get; }
- public abstract bool powered { get; set; }
- public abstract bool discoverable { get; set; }
- public abstract bool pairable { get; set; }
- public abstract uint32 pairable_timeout { get; set; }
- public abstract uint32 discoverable_timeout { get; set; }
- public abstract bool discovering { get; }
- [DBus (name = "UUIDs")]
- public abstract string[] uuids { owned get; }
- public abstract string modalias { owned get; }
- }
-}
diff --git a/lib/bluez5/AgentManager.vala b/lib/bluez5/AgentManager.vala
deleted file mode 100644
index 18e2566..0000000
--- a/lib/bluez5/AgentManager.vala
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * bluez5 -- DBus bindings for BlueZ 5
- *
- * Copyright (C) 2014 David Lechner
- *
- * 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, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY throws IOError; 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 .
- */
-
-/*
- * AgentManager.vala:
- */
-
-namespace Bluez5 {
- public class AgentManager : Object {
- org.bluez.AgentManager1 dbus_proxy;
-
- internal AgentManager (DBusProxy proxy) {
- dbus_proxy = (org.bluez.AgentManager1)proxy;
- }
-
- public async void register_agent (ObjectPath path, AgentManagerCapability capability) throws DBusError, IOError, BlueZError
- {
- yield dbus_proxy.register_agent (path, capability);
- }
-
- public async void unregister_agent (ObjectPath path) throws DBusError, IOError, BlueZError
- {
- yield dbus_proxy.unregister_agent (path);
- }
-
- public async void request_default_agent (ObjectPath path) throws DBusError, IOError, BlueZError
- {
- yield dbus_proxy.request_default_agent (path);
- }
- }
-
- [DBus (use_string_marshalling = true)]
- public enum AgentManagerCapability {
- [DBus (value = "DisplayOnly")]
- DISPLAY_ONLY,
- [DBus (value = "DisplayYesNo")]
- DISPLAY_YES_NO,
- [DBus (value = "KeyboardOnly")]
- KEYBOARD_ONLY,
- [DBus (value = "NoInputNoOutput")]
- NO_INPUT_NO_OUTPUT,
- [DBus (value = "KeyboardDisplay")]
- KEYBOARD_DISPLAY
- }
-}
-
-namespace org.bluez {
- [DBus (name = "org.bluez.AgentManager1")]
- public interface AgentManager1 : Object {
- public abstract async void register_agent (ObjectPath agent, Bluez5.AgentManagerCapability capability) throws DBusError, IOError, Bluez5.BlueZError;
- public abstract async void unregister_agent (ObjectPath agent) throws DBusError, IOError, Bluez5.BlueZError;
- public abstract async void request_default_agent (ObjectPath agent) throws DBusError, IOError, Bluez5.BlueZError;
- }
-}
diff --git a/lib/bluez5/Device.vala b/lib/bluez5/Device.vala
deleted file mode 100644
index 98ec73b..0000000
--- a/lib/bluez5/Device.vala
+++ /dev/null
@@ -1,208 +0,0 @@
-/*
- * bluez5 -- DBus bindings for BlueZ 5
- *
- * Copyright (C) 2014-2015 David Lechner
- *
- * 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, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY throws IOError; 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 .
- */
-
-/*
- * Device.vala:
- */
-
-namespace Bluez5 {
- public class Device : Object {
- static HashTable device_map;
-
- static construct {
- device_map = new HashTable (str_hash, str_equal);
- }
-
- internal org.bluez.Device1 dbus_proxy;
-
- public ObjectPath object_path {
- owned get {
- return new ObjectPath (((DBusProxy)dbus_proxy).g_object_path);
- }
- }
-
- public string address { owned get { return dbus_proxy.address; } }
-
- public string name { owned get { return dbus_proxy.name; } }
-
- public string icon { owned get { return dbus_proxy.icon; } }
-
- public uint32 class { get { return dbus_proxy.class; } }
-
- public uint16 appearance { get { return dbus_proxy.appearance; } }
-
- public string[] uuids { owned get { return dbus_proxy.uuids; } }
-
- public bool paired { get { return dbus_proxy.paired; } }
-
- public bool connected { get { return dbus_proxy.connected; } }
-
- public bool trusted {
- get { return dbus_proxy.trusted; }
- set { dbus_proxy.trusted = value; }
- }
-
- public bool blocked {
- get { return dbus_proxy.blocked; }
- set { dbus_proxy.blocked = value; }
- }
-
- public string alias {
- owned get { return dbus_proxy.alias; }
- set { dbus_proxy.alias = value; }
- }
-
- public Adapter adapter { owned
- get {
- var path = dbus_proxy.adapter;
- return Adapter.get_for_object_path (path);
- }
- }
-
- public bool legacy_pairing { get { return dbus_proxy.legacy_pairing; } }
-
- public string modalias { owned get { return dbus_proxy.modalias; } }
-
- public int rssi { get { return dbus_proxy.rssi; } }
-
- internal Device (DBusProxy proxy) {
- dbus_proxy = (org.bluez.Device1)proxy;
- device_map[proxy.g_object_path] = this;
- proxy.g_properties_changed.connect ((changed, invalidated) => {
- var iter = changed.iterator ();
- string? name = null;
- Variant? value = null;
- while (iter.next ("{sv}", &name, &value)) {
- switch (name) {
- case "Address":
- notify_property ("address");
- break;
- case "Name":
- notify_property ("name");
- break;
- case "Icon":
- notify_property ("icon");
- break;
- case "Class":
- notify_property ("class");
- break;
- case "Appearance":
- notify_property ("appearance");
- break;
- case "UUIDs":
- notify_property ("uuids");
- break;
- case "Paired":
- notify_property ("paired");
- break;
- case "Connected":
- notify_property ("connected");
- break;
- case "Trusted":
- notify_property ("trusted");
- break;
- case "Blocked":
- notify_property ("blocked");
- break;
- case "Alias":
- notify_property ("alias");
- break;
- case "Adapter":
- notify_property ("adapter");
- break;
- case "LegacyPairing":
- notify_property ("legacy-pairing");
- break;
- case "Modalias":
- notify_property ("modalias");
- break;
- case "RSSI":
- notify_property ("rssi");
- break;
- default:
- critical ("Unknown d-bus property: %s", name);
- break;
- }
- }
- });
- }
-
- ~Device () {
- device_map.remove (((DBusProxy)dbus_proxy).g_object_path);
- }
-
- internal static Device get_for_object_path (string path) {
- return device_map[path];
- }
-
- public async void connect_device () throws DBusError, IOError {
- yield dbus_proxy.connect ();
- }
-
- public async void disconnect_device () throws DBusError, IOError {
- yield dbus_proxy.disconnect ();
- }
-
- public async void connect_profile (string uuid) throws DBusError, IOError {
- yield dbus_proxy.connect_profile (uuid);
- }
-
- public async void disconnect_profile (string uuid) throws DBusError, IOError {
- yield dbus_proxy.disconnect_profile (uuid);
- }
-
- public async void pair () throws DBusError, IOError {
- yield dbus_proxy.pair ();
- }
-
- public async void cancel_pairing () throws DBusError, IOError {
- yield dbus_proxy.cancel_pairing ();
- }
- }
-}
-
-namespace org.bluez {
- [DBus (name = "org.bluez.Device1")]
- public interface Device1 : Object {
- public abstract async void connect () throws DBusError, IOError;
- public abstract async void disconnect () throws DBusError, IOError;
- public abstract async void connect_profile (string uuid) throws DBusError, IOError;
- public abstract async void disconnect_profile (string uuid) throws DBusError, IOError;
- public abstract async void pair () throws DBusError, IOError;
- public abstract async void cancel_pairing () throws DBusError, IOError;
-
- public abstract string address { owned get; }
- public abstract string name { owned get; }
- public abstract string icon { owned get; }
- public abstract uint32 class { get; }
- public abstract uint16 appearance { get; }
- [DBus (name = "UUIDs")]
- public abstract string[] uuids { owned get; }
- public abstract bool paired { get; }
- public abstract bool connected { get; }
- public abstract bool trusted { get; set; }
- public abstract bool blocked { get; set; }
- public abstract string alias { owned get; set; }
- public abstract ObjectPath adapter { owned get; }
- public abstract bool legacy_pairing { get; }
- public abstract string modalias { owned get; }
- [DBus (name = "RSSI")]
- public abstract int16 rssi { get; }
- }
-}
diff --git a/lib/bluez5/Error.vala b/lib/bluez5/Error.vala
deleted file mode 100644
index d62810a..0000000
--- a/lib/bluez5/Error.vala
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * bluez5 -- DBus bindings for BlueZ 5
- *
- * Copyright (C) 2014 David Lechner
- *
- * 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, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY throws IOError; 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 .
- */
-
-/*
- * Error.vala:
- */
-
-namespace Bluez5 {
- [DBus (name = "org.bluez.Error")]
- public errordomain BlueZError {
- INVALID_ARGUMENTS,
- ALREADY_EXISTS,
- DOES_NOT_EXIST,
- REJECTED,
- CANCELED
- }
-}
\ No newline at end of file
diff --git a/lib/bluez5/Manager.vala b/lib/bluez5/Manager.vala
deleted file mode 100644
index 4e11f81..0000000
--- a/lib/bluez5/Manager.vala
+++ /dev/null
@@ -1,145 +0,0 @@
-/*
- * bluez5 -- DBus bindings for BlueZ 5
- *
- * Copyright (C) 2014-2015 David Lechner
- *
- * 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, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY throws IOError; 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 .
- */
-
-/*
- * Manager.vala:
- */
-
-namespace Bluez5 {
- public class Manager : Object {
- public const string SERVICE_NAME = "org.bluez";
-
- DBusObjectManagerClient client;
- HashTable adapter_map;
- HashTable device_map;
-
- delegate Type TypeFunc ();
-
- public AgentManager agent_manager { get; private set; }
-
- public signal void adapter_added (Adapter adapter);
- public signal void adapter_removed (Adapter adapter);
-
- public signal void device_added (Device device);
- public signal void device_removed (Device device);
-
- Manager () {
- adapter_map = new HashTable (str_hash, str_equal);
- device_map = new HashTable (str_hash, str_equal);
- }
-
- public static async Manager new_async () throws Error {
- var manager = new Manager ();
- weak Manager weak_manager = manager;
- manager.client = yield new DBusObjectManagerClient.for_bus (
- BusType.SYSTEM, DBusObjectManagerClientFlags.NONE, SERVICE_NAME,
- "/", (manager, object_path, interface_name) => {
- if (interface_name == null)
- return typeof (DBusObjectProxy);
- Type dev_type;
- switch (interface_name) {
- case "org.bluez.Adapter1":
- dev_type = typeof (org.bluez.Adapter1);
- break;
- case "org.bluez.AgentManager1":
- dev_type = typeof (org.bluez.AgentManager1);
- break;
- case "org.bluez.Device1":
- dev_type = typeof (org.bluez.Device1);
- break;
- default:
- return typeof (DBusProxy);
- }
- // quark stuff is workaround for bug 710817
- var q = Quark.from_string ("vala-dbus-proxy-type");
- return ((TypeFunc)dev_type.get_qdata (q)) ();
- });
- manager.client.object_added.connect ((obj) => {
- foreach (var iface in obj.get_interfaces ())
- weak_manager.on_interface_added (obj, iface);
- });
- manager.client.object_removed.connect ((obj) => {
- foreach (var iface in obj.get_interfaces ())
- weak_manager.on_interface_removed (obj, iface);
- });
- manager.client.interface_added.connect (
- weak_manager.on_interface_added);
- manager.client.interface_removed.connect (
- weak_manager.on_interface_removed);
- foreach (var obj in manager.client.get_objects ()) {
- foreach (var iface in obj.get_interfaces ()) {
- manager.on_interface_added (obj, iface);
- }
- }
- return manager;
- }
-
- /**
- * Return a list of all Adapter objects
- */
- public List get_adapters () {
- return adapter_map.get_values ();
- }
-
- /**
- * Return a list of all Device objects
- */
- public List get_devices () {
- return device_map.get_values ();
- }
-
- void on_interface_added (DBusObject obj, DBusInterface iface) {
- var path = obj.get_object_path ();
- var adapter_proxy = iface as org.bluez.Adapter1;
- if (adapter_proxy != null) {
- var adapter = new Adapter ((DBusProxy)adapter_proxy);
- adapter_map[path] = adapter;
- adapter_added (adapter);
- }
- var agent_manager_proxy = iface as org.bluez.AgentManager1;
- if (agent_manager_proxy != null) {
- agent_manager = new AgentManager ((DBusProxy)agent_manager_proxy);
- }
- var device_proxy = iface as org.bluez.Device1;
- if (device_proxy != null) {
- var device = new Device ((DBusProxy)device_proxy);
- device_map[path] = device;
- device_added (device);
- }
- }
-
- void on_interface_removed (DBusObject obj, DBusInterface iface) {
- var path = obj.get_object_path ();
- var adapter = iface as org.bluez.Adapter1;
- if (adapter != null) {
- adapter_map.remove (path);
- adapter_removed (Adapter.get_for_object_path (path));
- }
- var agent_manager_proxy = iface as org.bluez.AgentManager1;
- if (agent_manager_proxy != null) {
- agent_manager = null;
- }
- var device = iface as org.bluez.Device1;
- if (device != null) {
- device_map.remove (path);
- device_removed (Device.get_for_object_path (path));
- }
- }
- }
-}
diff --git a/lib/bluez5/Uuid.vala b/lib/bluez5/Uuid.vala
deleted file mode 100644
index 7b3b73a..0000000
--- a/lib/bluez5/Uuid.vala
+++ /dev/null
@@ -1,914 +0,0 @@
-/*
- * bluez5 -- DBus bindings for BlueZ 5
- *
- * Copyright (C) 2015 David Lechner
- *
- * 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, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY throws IOError; 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 .
- */
-
-/*
- * Uuid.vala: Bluetooth UUIDs and string conversion functions.
- */
-
-using GLib.Bus;
-
-namespace Bluez5.Uuid {
- const string 16BIT_PREFIX = "0000";
- const string BASE = "-0000-1000-8000-00805f9b34fb";
-
- /**
- * Bluetooth Core Specification
- */
- public const string SDP = 16BIT_PREFIX + "0001" + BASE;
-
- /**
- * [NO USE BY PROFILES]
- */
- public const string UDP = 16BIT_PREFIX + "0002" + BASE;
-
- /**
- * RFCOMM with TS 07.10
- */
- public const string RFCOMM = 16BIT_PREFIX + "0003" + BASE;
-
- /**
- * [NO USE BY PROFILES]
- */
- public const string TCP = 16BIT_PREFIX + "0004" + BASE;
-
- /**
- * Telephony Control Specification / TCS Binary [DEPRECATED]
- */
- public const string TCS_BIN = 16BIT_PREFIX + "0005" + BASE;
-
- /**
- * [NO USE BY PROFILES]
- */
- public const string TCS_AT = 16BIT_PREFIX + "0006" + BASE;
-
- /**
- * Attribute Protocol
- */
- public const string ATT = 16BIT_PREFIX + "0007" + BASE;
-
- /**
- * IrDA Interoperability
- */
- public const string OBEX = 16BIT_PREFIX + "0008" + BASE;
-
- /**
- * [NO USE BY PROFILES]
- */
- public const string IP = 16BIT_PREFIX + "0009" + BASE;
-
- /**
- * [NO USE BY PROFILES]
- */
- public const string FTP = 16BIT_PREFIX + "000a" + BASE;
-
- /**
- * [NO USE BY PROFILES]
- */
- public const string HTTP = 16BIT_PREFIX + "000c" + BASE;
-
- /**
- * [NO USE BY PROFILES]
- */
- public const string WSP = 16BIT_PREFIX + "000e" + BASE;
-
- /**
- * Bluetooth Network Encapsulation Protocol (BNEP)
- */
- public const string BNEP = 16BIT_PREFIX + "000f" + BASE;
-
- /**
- * Extended Service Discovery Profile (ESDP) [DEPRECATED]
- */
- public const string UPNP = 16BIT_PREFIX + "0010" + BASE;
-
- /**
- * Human Interface Device Profile (HID)
- */
- public const string HIDP = 16BIT_PREFIX + "0011" + BASE;
-
- /**
- * Hardcopy Cable Replacement Profile (HCRP)
- */
- public const string HardcopyControlChannel = 16BIT_PREFIX + "0012" + BASE;
-
- /**
- * See Hardcopy Cable Replacement Profile (HCRP)
- */
- public const string HardcopyDataChannel = 16BIT_PREFIX + "0014" + BASE;
-
- /**
- * Hardcopy Cable Replacement Profile (HCRP)
- */
- public const string HardcopyNotification = 16BIT_PREFIX + "0016" + BASE;
-
- /**
- * Audio/Video Control Transport Protocol (AVCTP)
- */
- public const string AVCTP = 16BIT_PREFIX + "0017" + BASE;
-
- /**
- * Audio/Video Distribution Transport Protocol (AVDTP)
- */
- public const string AVDTP = 16BIT_PREFIX + "0019" + BASE;
-
- /**
- * Common ISDN Access Profile (CIP) [DEPRECATED]
- */
- public const string CMTP = 16BIT_PREFIX + "001B" + BASE;
-
- /**
- * Multi-Channel Adaptation Protocol (MCAP)
- */
- public const string MCAPControlChannel = 16BIT_PREFIX + "001e" + BASE;
-
- /**
- * Multi-Channel Adaptation Protocol (MCAP)
- */
- public const string MCAPDataChannel = 16BIT_PREFIX + "001f" + BASE;
-
- /**
- * Bluetooth Core Specification
- */
- public const string L2CAP = 16BIT_PREFIX + "0100" + BASE;
-
- /**
- * Bluetooth Core Specification
- *
- * Service Class
- */
- public const string ServiceDiscoveryServer = 16BIT_PREFIX + "1000" + BASE;
-
- /**
- * Bluetooth Core Specification
- *
- * Service Class
- */
- public const string BrowseGroupDescriptor = 16BIT_PREFIX + "1001" + BASE;
-
- /**
- * Serial Port Profile (SPP)
- *
- * NOTE: The example SDP record in SPP v1.0 does not include a
- * BluetoothProfileDescriptorList attribute, but some implementations
- * may also use this Uuid for the Profile Identifier.
- *
- * Service Class/ Profile
- */
- public const string SerialPort = 16BIT_PREFIX + "1101" + BASE;
-
- /**
- * LAN Access Profile
- *
- * [DEPRECATED]
- *
- * NOTE: Used as both Service Class Identifier and Profile Identifier.
- *
- * Service Class/ Profile
- */
- public const string LANAccessUsingPPP = 16BIT_PREFIX + "1102" + BASE;
-
- /**
- * Dial-up Networking Profile (DUN)
- *
- * NOTE: Used as both Service Class Identifier and Profile Identifier.
- *
- * Service Class/ Profile
- */
- public const string DialupNetworking = 16BIT_PREFIX + "1103" + BASE;
-
- /**
- * Synchronization Profile (SYNC)
- *
- * NOTE: Used as both Service Class Identifier and Profile Identifier.
- *
- * Service Class/ Profile
- */
- public const string IrMCSync = 16BIT_PREFIX + "1104" + BASE;
-
- /**
- * Object Push Profile (OPP)
- *
- * NOTE: Used as both Service Class Identifier and Profile.
- *
- * Service Class/ Profile
- */
- public const string OBEXObjectPush = 16BIT_PREFIX + "1105" + BASE;
-
- /**
- * File Transfer Profile (FTP)
- *
- * NOTE: Used as both Service Class Identifier and Profile Identifier.
- *
- * Service Class/ Profile
- */
- public const string OBEXFileTransfer = 16BIT_PREFIX + "1106" + BASE;
-
- /**
- * Synchronization Profile (SYNC)
- */
- public const string IrMCSyncCommand = 16BIT_PREFIX + "1107" + BASE;
-
- /**
- * Headset Profile (HSP)
- *
- * NOTE: Used as both Service Class Identifier and Profile Identifier.
- *
- * Service Class/ Profile
- */
- public const string Headset = 16BIT_PREFIX + "1108" + BASE;
-
- /**
- * Cordless Telephony Profile (CTP)
- *
- * NOTE: Used as both Service Class Identifier and Profile Identifier.
- *
- * [DEPRECATED]
- *
- * Service Class/ Profile
- */
- public const string CordlessTelephony = 16BIT_PREFIX + "1109" + BASE;
-
- /**
- * Advanced Audio Distribution Profile (A2DP)
- *
- * Service Class
- */
- public const string AudioSource = 16BIT_PREFIX + "110a" + BASE;
-
- /**
- * Advanced Audio Distribution Profile (A2DP)
- *
- * Service Class
- */
- public const string AudioSink = 16BIT_PREFIX + "110b" + BASE;
-
- /**
- * Audio/Video Remote Control Profile (AVRCP)
- *
- * Service Class
- */
- public const string AV_RemoteControlTarget = 16BIT_PREFIX + "110c" + BASE;
-
- /**
- * Advanced Audio Distribution Profile (A2DP)
- *
- * Profile
- */
- public const string AdvancedAudioDistribution = 16BIT_PREFIX + "110d" + BASE;
-
- /**
- * Audio/Video Remote Control Profile (AVRCP)
- *
- * NOTE: Used as both Service Class Identifier and Profile Identifier.
- *
- * Service Class/ Profile
- */
- public const string AV_RemoteControl = 16BIT_PREFIX + "110e" + BASE;
-
- /**
- * Audio/Video Remote Control Profile (AVRCP)
- *
- * NOTE: The AVRCP specification v1.3 and later require that 0x110E also
- * be included in the ServiceClassIDList before 0x110F for backwards
- * compatibility.
- *
- * Service Class
- */
- public const string AV_RemoteControlController = 16BIT_PREFIX + "110f" + BASE;
-
- /**
- * Intercom Profile (ICP)
- *
- * NOTE: Used as both Service Class Identifier and Profile Identifier.
- *
- * [DEPRECATED]
- *
- * Service Class
- */
- public const string Intercom = 16BIT_PREFIX + "1110" + BASE;
-
- /**
- * Fax Profile (FAX)
- *
- * NOTE: Used as both Service Class Identifier and Profile Identifier.
- *
- * [DEPRECATED]
- *
- * Service Class
- */
- public const string Fax = 16BIT_PREFIX + "1111" + BASE;
-
- /**
- * Headset Profile (HSP)
- *
- * Service Class
- */
- public const string Headset_Audio_Gateway = 16BIT_PREFIX + "1112" + BASE;
-
- /**
- * Interoperability Requirements for Bluetooth technology as a WAP,
- * Bluetooth SIG [DEPRECATED]
- *
- * Service Class
- */
- public const string WAP = 16BIT_PREFIX + "1113" + BASE;
-
- /**
- * Interoperability Requirements for Bluetooth technology as a WAP,
- * Bluetooth SIG [DEPRECATED]
- *
- * Service Class
- */
- public const string WAP_CLIENT = 16BIT_PREFIX + "1114" + BASE;
-
- /**
- * Personal Area Networking Profile (PAN)
- *
- * NOTE: Used as both Service Class Identifier and Profile Identifier
- * for PANU role.
- *
- * Service Class / Profile
- */
- public const string PANU = 16BIT_PREFIX + "1115" + BASE;
-
- /**
- * Personal Area Networking Profile (PAN)
- *
- * NOTE: Used as both Service Class Identifier and Profile Identifier
- * for NAP role.
- *
- * Service Class / Profile
- */
- public const string NAP = 16BIT_PREFIX + "1116" + BASE;
-
- /**
- * Personal Area Networking Profile (PAN)
- *
- * NOTE: Used as both Service Class Identifier and Profile Identifier
- * for GN role.
- *
- * Service Class / Profile
- */
- public const string GN = 16BIT_PREFIX + "1117" + BASE;
-
- /**
- * Basic Printing Profile (BPP)
- *
- * Service Class
- */
- public const string DirectPrinting = 16BIT_PREFIX + "1118" + BASE;
-
- /**
- * See Basic Printing Profile (BPP)
- *
- * Service Class
- */
- public const string ReferencePrinting = 16BIT_PREFIX + "1119" + BASE;
-
- /**
- * Basic Imaging Profile (BIP)
- *
- * Profile
- */
- public const string BasicImagingProfile = 16BIT_PREFIX + "111a" + BASE;
-
- /**
- * Basic Imaging Profile (BIP)
- *
- * Service Class
- */
- public const string ImagingResponder = 16BIT_PREFIX + "111b" + BASE;
-
- /**
- * Basic Imaging Profile (BIP)
- *
- * Service Class
- */
- public const string ImagingAutomaticArchive = 16BIT_PREFIX + "111c" + BASE;
-
- /**
- * Basic Imaging Profile (BIP)
- *
- * Service Class
- */
- public const string ImagingReferencedObjects = 16BIT_PREFIX + "111d" + BASE;
-
- /**
- * Hands-Free Profile (HFP)
- *
- * NOTE: Used as both Service Class Identifier and Profile Identifier.
- *
- * Service Class / Profile
- */
- public const string Handsfree = 16BIT_PREFIX + "111e" + BASE;
-
- /**
- * Hands-free Profile (HFP)
- *
- * Service Class
- */
- public const string HandsfreeAudioGateway = 16BIT_PREFIX + "111f" + BASE;
-
- /**
- * Basic Printing Profile (BPP)
- *
- * Service Class
- */
- public const string DirectPrintingReferenceObjectsService = 16BIT_PREFIX + "1120" + BASE;
-
- /**
- * Basic Printing Profile (BPP)
- *
- * Service Class
- */
- public const string ReflectedUI = 16BIT_PREFIX + "1121" + BASE;
-
- /**
- * Basic Printing Profile (BPP)
- *
- * Profile
- */
- public const string BasicPrinting = 16BIT_PREFIX + "1122" + BASE;
-
- /**
- * Basic Printing Profile (BPP)
- *
- * Service Class
- */
- public const string PrintingStatus = 16BIT_PREFIX + "1123" + BASE;
-
- /**
- * Human Interface Device (HID)
- *
- * NOTE: Used as both Service Class Identifier and Profile Identifier.
- *
- * Service Class / Profile
- */
- public const string HumanInterfaceDeviceService = 16BIT_PREFIX + "1124" + BASE;
-
- /**
- * Hardcopy Cable Replacement Profile (HCRP)
- *
- * Profile
- */
- public const string HardcopyCableReplacement = 16BIT_PREFIX + "1125" + BASE;
-
- /**
- * Hardcopy Cable Replacement Profile (HCRP)
- *
- * Service Class
- */
- public const string HCR_Print = 16BIT_PREFIX + "1126" + BASE;
-
- /**
- * Hardcopy Cable Replacement Profile (HCRP)
- *
- * Service Class
- */
- public const string HCR_Scan = 16BIT_PREFIX + "1127" + BASE;
-
- /**
- * Common ISDN Access Profile (CIP)
- *
- * NOTE: Used as both Service Class Identifier and Profile Identifier.
- *
- * [DEPRECATED]
- *
- * Service Class / Profile
- */
- public const string Common_ISDN_Access = 16BIT_PREFIX + "1128" + BASE;
-
- /**
- * SIM Access Profile (SAP)
- *
- * NOTE: Used as both Service Class Identifier and Profile Identifier.
- *
- * Service Class / Profile
- */
- public const string SIM_Access = 16BIT_PREFIX + "112d" + BASE;
-
- /**
- * Phonebook Access Profile (PBAP)
- *
- * Service Class
- */
- public const string PhonebookAccessPCE = 16BIT_PREFIX + "112e" + BASE;
-
- /**
- * Phonebook Access Profile (PBAP)
- *
- * Service Class
- */
- public const string PhonebookAccessPSE = 16BIT_PREFIX + "112f" + BASE;
-
- /**
- * Phonebook Access Profile (PBAP)
- *
- * Profile
- */
- public const string PhonebookAccess = 16BIT_PREFIX + "1130" + BASE;
-
- /**
- * Headset Profile (HSP)
- *
- * NOTE: See erratum #3507.
- * 0x1108 and 0x1203 should also be included in the ServiceClassIDList
- * before 0x1131 for backwards compatibility.
- *
- * Service Class
- */
- public const string Headset_HS = 16BIT_PREFIX + "1131" + BASE;
-
- /**
- * Message Access Profile (MAP)
- *
- * Service Class
- */
- public const string MessageAccessServer = 16BIT_PREFIX + "1132" + BASE;
-
- /**
- * Message Access Profile (MAP)
- *
- * Service Class
- */
- public const string MessageNotificationServer = 16BIT_PREFIX + "1133" + BASE;
-
- /**
- * Message Access Profile (MAP)
- *
- * Profile
- */
- public const string MessageAccessProfile = 16BIT_PREFIX + "1134" + BASE;
-
- /**
- * Global Navigation Satellite System Profile (GNSS)
- *
- * Profile
- */
- public const string GNSS = 16BIT_PREFIX + "1135" + BASE;
-
- /**
- * Global Navigation Satellite System Profile (GNSS)
- *
- * Service Class
- */
- public const string GNSS_Server = 16BIT_PREFIX + "1136" + BASE;
-
- /**
- * 3D Synchronization Profile (3DSP)
- * Service Class
- */
- public const string 3D_Display = 16BIT_PREFIX + "0137" + BASE;
-
- /**
- * 3D Synchronization Profile (3DSP)
- *
- * Service Class
- */
- public const string 3D_Glasses = 16BIT_PREFIX + "1138" + BASE;
-
- /**
- * 3D Synchronization Profile (3DSP)
- *
- * Profile
- */
- public const string 3D_Synchronization = 16BIT_PREFIX + "0139" + BASE;
-
- /**
- * Multi-Profile Specification (MPS)
- *
- * Profile
- */
- public const string MPS_Profile = 16BIT_PREFIX + "113a" + BASE;
-
- /**
- * Multi-Profile Specification (MPS)
- *
- * Service Class
- */
- public const string MPS_SC = 16BIT_PREFIX + "113b" + BASE;
-
- /**
- * Calendar, Task, and Notes (CTN) Profile
- *
- * Service Class
- */
- public const string CTN_Access = 16BIT_PREFIX + "113c" + BASE;
-
- /**
- * Calendar Tasks and Notes (CTN) Profile
- *
- * Service Class
- */
- public const string CTN_Notification = 16BIT_PREFIX + "113d" + BASE;
-
- /**
- * Calendar Tasks and Notes (CTN) Profile
- *
- * Profile
- */
- public const string CTN_Profile = 16BIT_PREFIX + "113e" + BASE;
-
- /**
- * Device Identification (DID)
- *
- * NOTE: Used as both Service Class Identifier and Profile Identifier.
- *
- * Service Class / Profile
- */
- public const string PnPInformation = 16BIT_PREFIX + "1200" + BASE;
-
- /**
- * N/A
- *
- * Service Class
- */
- public const string GenericNetworking = 16BIT_PREFIX + "1201" + BASE;
-
- /**
- * N/A
- *
- * Service Class
- */
- public const string GenericFileTransfer = 16BIT_PREFIX + "1202" + BASE;
-
- /**
- * N/A
- *
- * Service Class
- */
- public const string GenericAudio = 16BIT_PREFIX + "1203" + BASE;
-
- /**
- * N/A
- *
- * Service Class
- */
- public const string GenericTelephony = 16BIT_PREFIX + "1204" + BASE;
-
- /**
- * Enhanced Service Discovery Profile (ESDP) [DEPRECATED]
- *
- * Service Class
- */
- public const string UPNP_Service = 16BIT_PREFIX + "1205" + BASE;
-
- /**
- * Enhanced Service Discovery Profile (ESDP) [DEPRECATED]
- *
- * Service Class
- */
- public const string UPNP_IP_Service = 16BIT_PREFIX + "1206" + BASE;
-
- /**
- * Enhanced Service Discovery Profile (ESDP) [DEPRECATED]
- *
- * Service Class
- */
- public const string ESDP_UPNP_IP_PAN = 16BIT_PREFIX + "1300" + BASE;
-
- /**
- * Enhanced Service Discovery Profile (ESDP) [DEPRECATED]
- *
- * Service Class
- */
- public const string ESDP_UPNP_IP_LAP = 16BIT_PREFIX + "1301" + BASE;
-
- /**
- * Enhanced Service Discovery Profile (ESDP) [DEPRECATED]
- *
- * Service Class
- */
- public const string ESDP_UPNP_L2CAP = 16BIT_PREFIX + "1302" + BASE;
-
- /**
- * Video Distribution Profile (VDP)
- *
- * Service Class
- */
- public const string VideoSource = 16BIT_PREFIX + "1303" + BASE;
-
- /**
- * Video Distribution Profile (VDP)
- *
- * Service Class
- */
- public const string VideoSink = 16BIT_PREFIX + "1304" + BASE;
-
- /**
- * Video Distribution Profile (VDP)
- *
- * Profile
- */
- public const string VideoDistribution = 16BIT_PREFIX + "1305" + BASE;
-
- /**
- * Health Device Profile
- *
- * Profile
- */
- public const string HDP = 16BIT_PREFIX + "1400" + BASE;
-
- /**
- * Health Device Profile (HDP)
- *
- * Service Class
- */
- public const string HDP_Source = 16BIT_PREFIX + "1401" + BASE;
-
- /**
- * Health Device Profile (HDP)
- *
- * Service Class
- */
- public const string HDP_Sink = 16BIT_PREFIX + "1402" + BASE;
-
- /**
- * Gets the 3 to 6 (or more) character profile name for a given Uuid.
- */
- public string to_short_profile (string uuid) {
- switch (uuid) {
- case SDP:
- return "SDP";
- case UDP:
- return "UDP";
- case RFCOMM:
- return "RFCOMM";
- case TCP:
- return "TCP";
- case TCS_BIN:
- case TCS_AT:
- return "TCS";
- case ATT:
- return "ATT";
- case OBEX:
- return "OBEX";
- case IP:
- return "IP";
- case FTP:
- return "FTP";
- case HTTP:
- return "HTTP";
- case WSP:
- return "WSP";
- case BNEP:
- return "BNEP";
- case UPNP:
- return "UPNP";
- case HIDP:
- return "HIDP";
- case HardcopyControlChannel:
- case HardcopyDataChannel:
- case HardcopyNotification:
- return "HCRP";
- case AVCTP:
- return "AVCTP";
- case AVDTP:
- return "AVDTP";
- case CMTP:
- return "CMTP";
- case MCAPControlChannel:
- case MCAPDataChannel:
- return "MCAP";
- case L2CAP:
- return "L2CAP";
- case ServiceDiscoveryServer:
- return "ServiceDiscoveryServer";
- case BrowseGroupDescriptor:
- return "BrowseGroupDescriptor";
- case SerialPort:
- return "SPP";
- case LANAccessUsingPPP:
- return "LANAccessUsingPPP";
- case DialupNetworking:
- return "DUN";
- case IrMCSync:
- return "SYNC";
- case OBEXObjectPush:
- return "OPP";
- case OBEXFileTransfer:
- return "FTP";
- case IrMCSyncCommand:
- return "SYNC";
- case Headset:
- return "HSP";
- case CordlessTelephony:
- return "CTP";
- case AudioSource:
- case AudioSink:
- return "A2DP";
- case AV_RemoteControlTarget:
- return "AVRCP";
- case AdvancedAudioDistribution:
- return "A2DP";
- case AV_RemoteControl:
- case AV_RemoteControlController:
- return "AVRCP";
- case Intercom:
- return "ICP";
- case Fax:
- return "FAX";
- case Headset_Audio_Gateway:
- return "HSP";
- case WAP:
- case WAP_CLIENT:
- return "WAP";
- case PANU:
- case NAP:
- case GN:
- return "PAN";
- case DirectPrinting:
- case ReferencePrinting:
- return "BPP";
- case BasicImagingProfile:
- case ImagingResponder:
- case ImagingAutomaticArchive:
- case ImagingReferencedObjects:
- return "BIP";
- case Handsfree:
- case HandsfreeAudioGateway:
- return "HFP";
- case DirectPrintingReferenceObjectsService:
- case ReflectedUI:
- case BasicPrinting:
- case PrintingStatus:
- return "BPP";
- case HumanInterfaceDeviceService:
- return "HID";
- case HardcopyCableReplacement:
- case HCR_Print:
- case HCR_Scan:
- return "HCRP";
- case Common_ISDN_Access:
- return "CIP";
- case SIM_Access:
- return "SAP";
- case PhonebookAccessPCE:
- case PhonebookAccessPSE:
- case PhonebookAccess:
- return "PBAP";
- case Headset_HS:
- return "HSP";
- case MessageAccessServer:
- case MessageNotificationServer:
- case MessageAccessProfile:
- return "MAP";
- case GNSS:
- case GNSS_Server:
- return "GNSS";
- case 3D_Display:
- case 3D_Glasses:
- case 3D_Synchronization:
- return "3DSP";
- case MPS_Profile:
- case MPS_SC:
- return "MPS";
- case CTN_Access:
- case CTN_Notification:
- case CTN_Profile:
- return "CTN";
- case PnPInformation:
- return "DID";
- case GenericNetworking:
- return "GenericNetworking";
- case GenericFileTransfer:
- return "GenericFileTransfer";
- case GenericAudio:
- return "GenericAudio";
- case GenericTelephony:
- return "GenericTelephony";
- case UPNP_Service:
- case UPNP_IP_Service:
- case ESDP_UPNP_IP_PAN:
- case ESDP_UPNP_IP_LAP:
- case ESDP_UPNP_L2CAP:
- return "ESDP";
- case VideoSource:
- case VideoSink:
- case VideoDistribution:
- return "VDP";
- case HDP:
- case HDP_Source:
- case HDP_Sink:
- return "HDP";
- default:
- return "Unknown";
- }
- }
-}
diff --git a/lib/connman/Manager.vala b/lib/connman/Manager.vala
deleted file mode 100644
index 7d0f9e1..0000000
--- a/lib/connman/Manager.vala
+++ /dev/null
@@ -1,325 +0,0 @@
-/*
- * connman -- DBus bindings for ConnMan
- *
- * Copyright (C) 2014-2015 David Lechner
- *
- * 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, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY throws IOError; 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 .
- */
-
-/*
- * Manager.vala:
- */
-
-namespace Connman {
- public class Manager : Object {
- public const string SERVICE_NAME = "net.connman";
-
- HashTable technology_map;
- HashTable service_map;
- List sorted_service_list;
- HashTable peer_map;
- net.connman.Manager dbus_proxy;
- weak Cancellable? on_services_changed_cancellable;
- weak Cancellable? on_peers_changed_cancellable;
-
- public ManagerState state {
- get { return dbus_proxy.state; }
- }
-
- public bool offline_mode {
- get { return dbus_proxy.offline_mode; }
- set {
- if (value == offline_mode)
- return;
- try {
- dbus_proxy.set_property_sync ("OfflineMode", value);
- } catch (Error err) {
- critical ("%s", err.message);
- }
- }
- }
-
- public signal void technology_added (Technology technology);
- public signal void services_changed (List changed);
- public signal void peers_changed (List changed);
-
- construct {
- technology_map = new HashTable (str_hash, str_equal);
- service_map = new HashTable (str_hash, str_equal);
- sorted_service_list = new List ();
- peer_map = new HashTable (str_hash, str_equal);
- }
-
- public static async Manager new_async () throws DBusError, IOError {
- var manager = new Manager ();
- weak Manager weak_manager = manager;
- manager.dbus_proxy = yield Bus.get_proxy (BusType.SYSTEM, SERVICE_NAME,
- net.connman.Manager.OBJECT_PATH);
- manager.dbus_proxy.property_changed.connect (weak_manager.on_property_changed);
- var properties = yield manager.dbus_proxy.get_properties ();
- properties.foreach ((k, v) =>
- ((DBusProxy)manager.dbus_proxy).set_cached_property (k, v));
- manager.dbus_proxy.technology_added.connect (weak_manager.on_technology_added);
- manager.dbus_proxy.technology_removed.connect (weak_manager.on_technology_removed);
- var technologies = yield manager.dbus_proxy.get_technologies ();
- foreach (var tech in technologies)
- yield manager.on_technology_added_async (tech.path);
- manager.dbus_proxy.services_changed.connect (weak_manager.on_services_changed);
- var services = yield manager.dbus_proxy.get_services ();
- yield manager.on_services_changed_async (services);
- manager.dbus_proxy.peers_changed.connect (weak_manager.on_peers_changed);
- var peers = yield manager.dbus_proxy.get_peers ();
- yield manager.on_peers_changed_async (peers);
- return manager;
- }
-
- public List get_technologies () {
- return technology_map.get_values ();
- }
-
- public Technology? get_technology (ObjectPath path) {
- return technology_map[path];
- }
-
- public Technology? get_technology_by_type (string type) {
- foreach (var technology in technology_map.get_values ()) {
- if (technology.technology_type == type)
- return technology;
- }
- return null;
- }
-
- public List get_services () {
- return sorted_service_list.copy ();
- }
-
- public Service? get_service (ObjectPath path) {
- return service_map[path];
- }
-
- public Service? get_service_by_name_and_type (string name, string type) {
- foreach (var service in service_map.get_values ()) {
- if (service.name == name && service.service_type == type)
- return service;
- }
- return null;
- }
-
- public List get_peers () {
- return peer_map.get_values ();
- }
-
- public async void register_agent (ObjectPath path) throws DBusError, IOError {
- yield dbus_proxy.register_agent (path);
- }
-
- public async void unregister_agent (ObjectPath path) throws DBusError, IOError {
- yield dbus_proxy.unregister_agent (path);
- }
-
- void on_technology_added (ObjectPath path, HashTable properties) {
- if (technology_map.contains (path)) {
- critical ("technology '%s' already exists.", path);
- }
- on_technology_added_async.begin (path);
- }
-
- async void on_technology_added_async (ObjectPath path) {
- try {
- var tech = yield Technology.new_async (path);
- technology_map[path] = tech;
- technology_added (tech);
- } catch (Error err) {
- critical ("%s", err.message);
- }
- }
-
- void on_technology_removed (ObjectPath path) {
- if (technology_map.contains (path)) {
- technology_map[path].removed ();
- technology_map.remove (path);
- }
- }
-
- void on_services_changed (net.connman.ManagerObject[] changed, ObjectPath[] removed) {
- foreach (var path in removed) {
- if (service_map.contains (path)) {
- service_map[path].removed ();
- service_map.remove (path);
- }
- }
- on_services_changed_async.begin (changed);
- }
-
- async void on_services_changed_async (net.connman.ManagerObject[] changed) {
- // We have to make this method reentrant since it is async and
- // services can change rapidly. If this method is called a 2nd time
- // before the first has completed, we forget about the current list
- // of signal objects and exit the method before emitting the
- // services-changed signal.
- if (on_services_changed_cancellable != null) {
- on_services_changed_cancellable.cancel ();
- }
- var my_cancellable = new Cancellable ();
- on_services_changed_cancellable = my_cancellable;
-
- // It is possible that the changed parameter comes from a DBus signal
- // handler. Since this is an async method we need to make our own copy
- // because the DBus signal handler will return and free the array if
- // we yield.
- var changed_copy = new net.connman.ManagerObject[changed.length];
- int i = 0;
- foreach (var c in changed) {
- changed_copy[i++] = c;
- }
- try {
- var services = new List ();
- foreach (var item in changed_copy) {
- if (service_map.contains (item.path)) {
- services.append (service_map[item.path]);
- } else {
- var service = yield Service.new_async (item.path);
- if (my_cancellable.is_cancelled ()) {
- return;
- }
- service_map[item.path] = service;
- services.append (service);
- }
- }
- sorted_service_list = services.copy ();
- services_changed (services);
- } catch (Error err) {
- critical ("%s", err.message);
- }
- if (on_services_changed_cancellable == my_cancellable) {
- on_services_changed_cancellable = null;
- }
- }
-
- void on_peers_changed (net.connman.ManagerObject[] changed, ObjectPath[] removed) {
- foreach (var path in removed) {
- if (peer_map.contains (path)) {
- peer_map[path].removed ();
- peer_map.remove (path);
- }
- }
- on_peers_changed_async.begin (changed);
- }
-
- async void on_peers_changed_async (net.connman.ManagerObject[] changed) {
- // See notes in on_services_changed_async about reentrancy and ownership
- // of ``changed`` parameter.
- if (on_peers_changed_cancellable != null)
- on_peers_changed_cancellable.cancel ();
- var my_cancellable = new Cancellable ();
- on_peers_changed_cancellable = my_cancellable;
-
- var changed_copy = new net.connman.ManagerObject[changed.length];
- int i = 0;
- foreach (var c in changed) {
- changed_copy[i++] = c;
- }
- try {
- var peers = new List ();
- foreach (var item in changed_copy) {
- if (peer_map.contains (item.path)) {
- peers.append (peer_map[item.path]);
- } else {
- var peer = yield Peer.new_async (item.path);
- if (my_cancellable.is_cancelled ()) {
- return;
- }
- peer_map[item.path] = peer;
- peers.append (peer);
- }
- }
- peers_changed (peers);
- } catch (Error err) {
- critical ("%s", err.message);
- }
- if (on_peers_changed_cancellable == my_cancellable) {
- on_peers_changed_cancellable = null;
- }
- }
-
- void on_property_changed (string name, Variant? value) {
- ((DBusProxy)dbus_proxy).set_cached_property (name, value);
- switch (name) {
- case "State":
- notify_property ("state");
- break;
- case "OfflineMode":
- notify_property ("offline-mode");
- break;
- default:
- critical ("Unknown dbus property '%s'", name);
- break;
- }
- }
- }
-
- [DBus (use_string_marshalling = true)]
- public enum ManagerState {
- [DBus (value = "offline")]
- OFFLINE,
- [DBus (value = "idle")]
- IDLE,
- [DBus (value = "ready")]
- READY,
- [DBus (value = "online")]
- ONLINE;
- }
-}
-
-namespace net.connman {
- [DBus (name = "net.connman.Manager")]
- public interface Manager : Object {
- public const string OBJECT_PATH = "/";
-
- public abstract async HashTable get_properties () throws DBusError, IOError;
- public abstract async void set_property (string name, Variant? value) throws DBusError, IOError;
- [DBus (name = "SetProperty")]
- public abstract void set_property_sync (string name, Variant? value) throws DBusError, IOError;
- public abstract async ManagerObject[] get_technologies () throws DBusError, IOError;
- public abstract async ManagerObject[] get_services () throws DBusError, IOError;
- public abstract async ManagerObject[] get_peers () throws DBusError, IOError;
- // deprecated
- //public abstract async ObjectPath ConnectProvider (HashTable provider throws DBusError, IOError;
- //public abstract async void remove_provider (ObjectPath path) throws DBusError, IOError;
- public abstract async void register_agent (ObjectPath object) throws DBusError, IOError;
- public abstract async void unregister_agent (ObjectPath object) throws DBusError, IOError;
- public abstract async void register_counter (ObjectPath path, uint accuracy, uint period) throws DBusError, IOError;
- public abstract async void unregister_counter (ObjectPath path) throws DBusError, IOError;
- public abstract async ObjectPath create_session (HashTable settings, ObjectPath notifier) throws DBusError, IOError;
- public abstract async void destroy_session (ObjectPath session) throws DBusError, IOError;
- public abstract async ObjectPath request_private_network (HashTable options, out HashTable fd) throws DBusError, IOError;
- public abstract async void release_private_network (ObjectPath path) throws DBusError, IOError;
-
- public signal void technology_added (ObjectPath path, HashTable properties);
- public signal void technology_removed (ObjectPath path);
- public signal void services_changed (ManagerObject[] changed, ObjectPath[] removed);
- public signal void peers_changed (ManagerObject[] changed, ObjectPath[] removed);
- public signal void property_changed (string name, Variant? value);
-
- public abstract Connman.ManagerState state { get; }
- public abstract bool offline_mode { get; }
- // deprecated
- //public abstract bool session_mode { get; }
- }
-
- public struct ManagerObject {
- ObjectPath path;
- HashTable properties;
- }
-}
diff --git a/lib/connman/Peer.vala b/lib/connman/Peer.vala
deleted file mode 100644
index a2b45a1..0000000
--- a/lib/connman/Peer.vala
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * connman -- DBus bindings for ConnMan
- *
- * Copyright (C) 2014-2015 David Lechner
- *
- * 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, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY throws IOError; 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 .
- */
-
-/*
- * Peer.vala:
- */
-
-namespace Connman {
- public class Peer : Object {
- const string IPV4_ADDRESS_KEY = "Address";
- const string IPV4_NETMASK_KEY = "Netmask";
-
- internal net.connman.Peer dbus_proxy;
-
- public ObjectPath object_path { get; private set; }
-
- public PeerState state { get { return dbus_proxy.state; } }
- public string name { owned get { return dbus_proxy.name; } }
- public string? ipv4_address {
- owned get {
- if (dbus_proxy.ipv4[IPV4_ADDRESS_KEY] == null)
- return null;
- return dbus_proxy.ipv4[IPV4_ADDRESS_KEY].dup_string ();
- }
- }
- public string? ipv4_netmask {
- owned get {
- if (dbus_proxy.ipv4[IPV4_NETMASK_KEY] == null)
- return null;
- return dbus_proxy.ipv4[IPV4_NETMASK_KEY].dup_string ();
- }
- }
-
- public signal void removed ();
-
- internal static async Peer new_async (ObjectPath path) throws DBusError, IOError {
- var peer = new Peer();
- peer.dbus_proxy = yield Bus.get_proxy (BusType.SYSTEM,
- Manager.SERVICE_NAME, path);
- peer.object_path = path;
- peer.dbus_proxy.property_changed.connect (peer.on_property_changed);
- // we are calling the deprecated get_properties_sync method because
- // of a possible race condition where a property_changed signal is
- // sent before the signal handler is connected.
- var properties = yield peer.dbus_proxy.get_properties ();
- properties.foreach ((k, v) => peer.on_property_changed (k, v));
- return peer;
- }
-
- public async void connect_peer() throws DBusError, IOError {
- yield dbus_proxy.connect ();
- }
-
- public async void disconnect_peer() throws DBusError, IOError {
- yield dbus_proxy.disconnect ();
- }
-
- void on_property_changed(string name, Variant? value) {
- ((DBusProxy)dbus_proxy).set_cached_property (name, value);
- switch (name) {
- case "State":
- notify_property ("state");
- break;
- case "Name":
- notify_property ("name");
- break;
- case "IPv4":
- notify_property ("ipv4");
- break;
- default:
- critical ("Unknown dbus property '%s'", name);
- break;
- }
- }
- }
-
- [DBus (use_string_marshalling = true)]
- public enum PeerState {
- [DBus (value = "idle")]
- IDLE,
- [DBus (value = "failure")]
- FAILURE,
- [DBus (value = "association")]
- ASSOCIATION,
- [DBus (value = "configuration")]
- CONFIGURATION,
- [DBus (value = "ready")]
- READY,
- [DBus (value = "disconnect")]
- DISCONNECT;
- }
-}
-
-namespace net.connman {
- [DBus (name = "net.connman.Peer")]
- public interface Peer : Object {
- // Docs say get_properties is deprecated, but it is needed to avoid race condition
- public abstract async HashTable get_properties () throws DBusError, IOError;
- public abstract async void connect () throws DBusError, IOError;
- public abstract async void disconnect () throws DBusError, IOError;
-
- public signal void property_changed (string name, Variant? value);
-
- public abstract Connman.PeerState state { get; }
- public abstract string name { owned get; }
- [DBus (name = "IPv4")]
- public abstract HashTable ipv4 { owned get; }
- }
-}
diff --git a/lib/connman/Service.vala b/lib/connman/Service.vala
deleted file mode 100644
index de8e94f..0000000
--- a/lib/connman/Service.vala
+++ /dev/null
@@ -1,731 +0,0 @@
-/*
- * connman -- DBus bindings for ConnMan
- *
- * Copyright (C) 2014-2015 David Lechner
- *
- * 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, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY throws IOError; 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 .
- */
-
-/*
- * Service.vala:
- */
-
-namespace Connman {
- public class Service : Object {
- const string IPV4_METHOD_KEY = "Method";
- const string IPV4_ADDRESS_KEY = "Address";
- const string IPV4_NETMASK_KEY = "Netmask";
- const string IPV4_GATEWAY_KEY = "Gateway";
- const string IPV6_METHOD_KEY = "Method";
- const string IPV6_ADDRESS_KEY = "Address";
- const string IPV6_PREFIX_LENGTH_KEY = "PrefixLength";
- const string IPV6_GATEWAY_KEY = "Gateway";
- const string IPV6_PRIVACY_KEY = "Privacy";
- const string PROXY_METHOD_KEY = "Method";
- const string PROXY_URL_KEY = "URL";
- const string PROXY_SERVERS_KEY = "Servers";
- const string PROXY_EXCLUDES_KEY = "Excludes";
- const string PROVIDER_HOST_KEY = "Host";
- const string PROVIDER_DOMAIN_KEY = "Domain";
- const string PROVIDER_NAME_KEY = "Name";
- const string PROVIDER_TYPE_KEY = "Type";
- const string ETHERNET_METHOD_KEY = "Method";
- const string ETHERNET_INTERFACE_KEY = "Interface";
- const string ETHERNET_ADDRESS_KEY = "Address";
- const string ETHERNET_MTU_KEY = "MTU";
-
- internal net.connman.Service dbus_proxy;
-
- public ObjectPath object_path { get; private set; }
- public ServiceState state { get { return dbus_proxy.state; } }
- public string? error { owned get { return dbus_proxy.error; } }
- public string? name { owned get { return dbus_proxy.name; } }
- public string service_type { owned get { return dbus_proxy.type_; } }
- public GenericArray security {
- owned get {
- var array = new GenericArray ();
- foreach (var item in dbus_proxy.security)
- array.add (item);
- return (owned)array;
- }
- }
- public uint8 strength { get { return dbus_proxy.strength; } }
- public bool favorite { get { return dbus_proxy.favorite; } }
- public bool immutable { get { return dbus_proxy.immutable; } }
- public bool auto_connect {
- get { return dbus_proxy.auto_connect; }
- set {
- if (value == auto_connect)
- return;
- try {
- dbus_proxy.set_property_sync ("AutoConnect", value);
- } catch (Error err) {
- critical ("%s", err.message);
- }
- }
- }
- public bool roaming { get { return dbus_proxy.roaming; } }
- public string[] nameservers {
- owned get { return dbus_proxy.nameservers; }
- }
- public string[] nameservers_configuration {
- owned get { return dbus_proxy.nameservers_configuration; }
- set {
- try {
- dbus_proxy.set_property_sync ("Nameservers.Configuration", value);
- } catch (Error err) {
- critical("%s", err.message);
- }
- }
- }
- public string[] timeservers {
- owned get { return dbus_proxy.timeservers; }
- }
- public string[] timeservers_configuration {
- owned get { return dbus_proxy.timeservers_configuration; }
- set {
- try {
- dbus_proxy.set_property_sync ("Timeservers.Configuration", value);
- } catch (Error err) {
- critical("%s", err.message);
- }
- }
- }
- public string[] domains { owned get { return dbus_proxy.domains; } }
- public string[] domains_configuration {
- owned get { return dbus_proxy.domains_configuration; }
- set {
- try {
- dbus_proxy.set_property_sync ("Domains.Configuration", value);
- } catch (Error err) {
- critical("%s", err.message);
- }
- }
- }
-
- public IPv4Info ipv4 {
- owned get {
- var config = dbus_proxy.ipv4;
- var info = new IPv4Info ();
- if (config[IPV4_METHOD_KEY] != null) {
- try {
- info.method = IPv4Method.from_string (
- config[IPV4_METHOD_KEY].get_string ());
- } catch (DBusError err) {
- critical ("%s", err.message);
- }
- }
- if (config[IPV4_ADDRESS_KEY] != null)
- info.address = config[IPV4_ADDRESS_KEY].dup_string ();
- if (config[IPV4_NETMASK_KEY] != null)
- info.netmask = config[IPV4_NETMASK_KEY].dup_string ();
- if (config[IPV4_GATEWAY_KEY] != null)
- info.gateway = config[IPV4_GATEWAY_KEY].dup_string ();
- return info;
- }
- }
-
- public IPv4Info ipv4_configuration {
- owned get {
- var config = dbus_proxy.ipv4_configuration;
- var info = new IPv4Info ();
- if (config[IPV4_METHOD_KEY] != null) {
- try {
- info.method = IPv4Method.from_string (
- config[IPV4_METHOD_KEY].get_string ());
- } catch (DBusError err) {
- critical ("%s", err.message);
- }
- }
- if (config[IPV4_ADDRESS_KEY] != null)
- info.address = config[IPV4_ADDRESS_KEY].dup_string ();
- if (config[IPV4_NETMASK_KEY] != null)
- info.netmask = config[IPV4_NETMASK_KEY].dup_string ();
- if (config[IPV4_GATEWAY_KEY] != null)
- info.gateway = config[IPV4_GATEWAY_KEY].dup_string ();
- return info;
- }
- set {
- try {
- var config = new HashTable (null, null);
- if (value.method != null)
- config[IPV4_METHOD_KEY] = new Variant.string (value.method.to_string ());
- if (value.address != null)
- config[IPV4_ADDRESS_KEY] = new Variant.string (value.address);
- if (value.netmask != null)
- config[IPV4_NETMASK_KEY] = new Variant.string (value.netmask);
- if (value.gateway != null)
- config[IPV4_GATEWAY_KEY] = new Variant.string (value.gateway);
- dbus_proxy.set_property_sync ("IPv4.Configuration", config);
- } catch (Error err) {
- critical("%s", err.message);
- }
- }
- }
-
- public IPv6Info ipv6 {
- owned get {
- var config = dbus_proxy.ipv6;
- var info = new IPv6Info ();
- if (config[IPV6_METHOD_KEY] != null) {
- try {
- info.method = IPv6Method.from_string (
- config[IPV6_METHOD_KEY].get_string ());
- } catch (DBusError err) {
- critical ("%s", err.message);
- }
- }
- if (config[IPV6_ADDRESS_KEY] != null)
- info.address = config[IPV6_ADDRESS_KEY].dup_string ();
- if (config[IPV6_PREFIX_LENGTH_KEY] != null)
- info.prefix_length = config[IPV6_PREFIX_LENGTH_KEY].dup_string ();
- if (config[IPV6_GATEWAY_KEY] != null)
- info.gateway = config[IPV6_GATEWAY_KEY].dup_string ();
- if (config[IPV6_PRIVACY_KEY] != null) {
- try {
- info.privacy = IPv6Privacy.from_string (
- config[IPV6_PRIVACY_KEY].get_string ());
- } catch (DBusError err) {
- critical ("%s", err.message);
- }
- }
- return info;
- }
- }
-
- public IPv6Info ipv6_configuration {
- owned get {
- var config = dbus_proxy.ipv6_configuration;
- var info = new IPv6Info ();
- if (config[IPV6_METHOD_KEY] != null) {
- try {
- info.method = IPv6Method.from_string (
- config[IPV6_METHOD_KEY].get_string ());
- } catch (DBusError err) {
- critical ("%s", err.message);
- }
- }
- if (config[IPV6_ADDRESS_KEY] != null)
- info.address = config[IPV6_ADDRESS_KEY].dup_string ();
- if (config[IPV6_PREFIX_LENGTH_KEY] != null)
- info.prefix_length = config[IPV6_PREFIX_LENGTH_KEY].dup_string ();
- if (config[IPV6_GATEWAY_KEY] != null)
- info.gateway = config[IPV6_GATEWAY_KEY].dup_string ();
- if (config[IPV6_PRIVACY_KEY] != null) {
- try {
- info.privacy = IPv6Privacy.from_string (
- config[IPV6_PRIVACY_KEY].get_string ());
- } catch (DBusError err) {
- critical ("%s", err.message);
- }
- }
- return info;
- }
- set {
- try {
- var config = new HashTable (null, null);
- if (value.method != null)
- config[IPV6_METHOD_KEY] = new Variant.string (value.method.to_string ());
- if (value.address != null)
- config[IPV6_ADDRESS_KEY] = new Variant.string (value.address);
- if (value.prefix_length != null)
- config[IPV6_PREFIX_LENGTH_KEY] = new Variant.string (value.prefix_length);
- if (value.gateway != null)
- config[IPV6_GATEWAY_KEY] = new Variant.string (value.gateway);
- if (value.privacy != null)
- config[IPV6_PRIVACY_KEY] = new Variant.string (value.privacy.to_string ());
- dbus_proxy.set_property_sync ("IPv6.Configuration", config);
- } catch (Error err) {
- critical("%s", err.message);
- }
- }
- }
-
- public ProxyInfo proxy {
- owned get {
- var config = dbus_proxy.proxy;
- var info = new ProxyInfo ();
- if (config[PROXY_METHOD_KEY] != null) {
- try {
- info.method = ProxyMethod.from_string (
- config[PROXY_METHOD_KEY].get_string ());
- } catch (DBusError err) {
- critical ("%s", err.message);
- }
- }
- if (config[PROXY_URL_KEY] != null)
- info.url = config[PROXY_URL_KEY].dup_string ();
- if (config[PROXY_SERVERS_KEY] != null)
- info.servers = config[PROXY_SERVERS_KEY].dup_strv ();
- if (config[PROXY_EXCLUDES_KEY] != null)
- info.excludes = config[PROXY_EXCLUDES_KEY].dup_strv ();
- return info;
- }
- }
-
- public ProxyInfo proxy_configuration {
- owned get {
- var config = dbus_proxy.proxy_configuration;
- var info = new ProxyInfo ();
- if (config[PROXY_METHOD_KEY] != null) {
- try {
- info.method = ProxyMethod.from_string (
- config[PROXY_METHOD_KEY].get_string ());
- } catch (DBusError err) {
- critical ("%s", err.message);
- }
- }
- if (config[PROXY_URL_KEY] != null)
- info.url = config[PROXY_URL_KEY].dup_string ();
- if (config[PROXY_SERVERS_KEY] != null)
- info.servers = config[PROXY_SERVERS_KEY].dup_strv ();
- if (config[PROXY_EXCLUDES_KEY] != null)
- info.excludes = config[PROXY_EXCLUDES_KEY].dup_strv ();
- return info;
- }
- set {
- try {
- var config = new HashTable (null, null);
- if (value.method != null)
- config[PROXY_METHOD_KEY] = new Variant.string (value.method.to_string ());
- if (value.url != null)
- config[PROXY_URL_KEY] = new Variant.string (value.url);
- if (value.servers != null)
- config[PROXY_SERVERS_KEY] = new Variant.strv (value.servers);
- if (value.excludes != null)
- config[PROXY_EXCLUDES_KEY] = new Variant.strv (value.excludes);
- dbus_proxy.set_property_sync ("Proxy.Configuration", config);
- } catch (Error err) {
- critical("%s", err.message);
- }
- }
- }
-
- public ProviderInfo provider {
- owned get {
- var config = dbus_proxy.provider;
- var info = new ProviderInfo ();
- if (config[PROVIDER_HOST_KEY] != null)
- info.host = config[PROVIDER_HOST_KEY].dup_string ();
- if (config[PROVIDER_DOMAIN_KEY] != null)
- info.domain = config[PROVIDER_DOMAIN_KEY].dup_string ();
- if (config[PROVIDER_NAME_KEY] != null)
- info.name = config[PROVIDER_NAME_KEY].dup_string ();
- if (config[PROVIDER_TYPE_KEY] != null)
- info.type = config[PROVIDER_TYPE_KEY].dup_string ();
- return info;
- }
- }
-
- public EthernetInfo ethernet {
- owned get {
- var config = dbus_proxy.ethernet;
- var info = new EthernetInfo ();
- if (config[ETHERNET_METHOD_KEY] != null) {
- try {
- info.method = EthernetMethod.from_string (
- config[ETHERNET_METHOD_KEY].get_string ());
- } catch (DBusError err) {
- critical ("%s", err.message);
- }
- }
- if (config[ETHERNET_INTERFACE_KEY] != null)
- info.interface = config[ETHERNET_INTERFACE_KEY].dup_string ();
- if (config[ETHERNET_ADDRESS_KEY] != null)
- info.address = config[ETHERNET_ADDRESS_KEY].dup_string ();
- if (config[ETHERNET_MTU_KEY] != null)
- info.mtu = config[ETHERNET_MTU_KEY].get_uint16 ();
- return info;
- }
- }
-
- public bool mdns { get { return dbus_proxy.mdns; } }
- public bool mdns_configuration {
- get { return dbus_proxy.mdns_configuration; }
- set {
- if (value == mdns_configuration)
- return;
- try {
- dbus_proxy.set_property_sync ("mDNS.Configuration", value);
- } catch (Error err) {
- critical ("%s", err.message);
- }
- }
- }
-
- public signal void removed ();
-
- internal static async Service new_async (ObjectPath path) throws DBusError, IOError {
- var service = new Service ();
- service.dbus_proxy = yield Bus.get_proxy (BusType.SYSTEM,
- Manager.SERVICE_NAME, path);
- service.object_path = path;
- weak Service weak_service = service;
- service.dbus_proxy.property_changed.connect (weak_service.on_property_changed);
- // we are calling the deprecated get_properties_sync method because
- // of a possible race condition where a property_changed signal is
- // sent before the signal handler is connected.
- var properties = yield service.dbus_proxy.get_properties ();
- properties.foreach ((k, v) => service.on_property_changed (k, v));
- return service;
- }
-
- public async void connect_service (bool long_timeout = false) throws DBusError, IOError {
- if (long_timeout)
- try {
- yield ((DBusProxy)dbus_proxy).call ("Connect", null,
- DBusCallFlags.NONE, 300000);
- } catch (IOError ioerr) {
- throw ioerr;
- } catch (Error err) {
- // This should only happen if we were using cancellable
- // but we are not. Just catching it here to prevent compiler
- // warning.
- critical ("%s", err.message);
- }
- else
- yield dbus_proxy.connect ();
- }
-
- public async void disconnect_service () throws DBusError, IOError {
- yield dbus_proxy.disconnect ();
- }
-
- public async void remove() throws DBusError, IOError {
- yield dbus_proxy.remove();
- }
-
- public async void move_before(Service service) throws DBusError, IOError {
- yield dbus_proxy.move_before(service.object_path);
- }
-
- public async void move_after(Service service) throws DBusError, IOError {
- yield dbus_proxy.move_after(service.object_path);
- }
-
- public async void reset_counters() throws DBusError, IOError {
- yield dbus_proxy.reset_counters();
- }
-
- internal void on_property_changed (string name, Variant? value) {
- ((DBusProxy)dbus_proxy).set_cached_property(name, value);
- switch (name) {
- case "State":
- notify_property("state");
- break;
- case "Error":
- notify_property("error");
- break;
- case "Name":
- notify_property("name");
- break;
- case "Type":
- notify_property("service-type");
- break;
- case "Security":
- notify_property("security");
- break;
- case "Strength":
- notify_property("strength");
- break;
- case "Favorite":
- notify_property("favorite");
- break;
- case "Immutable":
- notify_property("immutable");
- break;
- case "AutoConnect":
- notify_property("auto-connect");
- break;
- case "Roaming":
- notify_property("roaming");
- break;
- case "Nameservers":
- notify_property("nameservers");
- break;
- case "Nameservers.Configuration":
- notify_property("nameservers-configuration");
- break;
- case "Timeservers":
- notify_property("timeservers");
- break;
- case "Timeservers.Configuration":
- notify_property("timeservers-configuration");
- break;
- case "Domains":
- notify_property("domains");
- break;
- case "Domains.Configuration":
- notify_property("domains-configuration");
- break;
- case "IPv4":
- notify_property ("ipv4");
- break;
- case "IPv4.Configuration":
- notify_property("ipv4-configuration");
- break;
- case "IPv6":
- notify_property ("ipv6");
- break;
- case "IPv6.Configuration":
- notify_property("ipv6-configuration");
- break;
- case "Proxy":
- notify_property ("proxy");
- break;
- case "Proxy.Configuration":
- notify_property("proxy-configuration");
- break;
- case "Provider":
- notify_property ("provider");
- break;
- case "Ethernet":
- notify_property ("ethernet");
- break;
- case "mDNS":
- notify_property ("mdns");
- break;
- case "mDNS.Configuration":
- notify_property ("mdns-configuration");
- break;
- default:
- critical ("Unknown dbus property '%s'", name);
- break;
- }
- }
- }
-
- [DBus (use_string_marshalling = true)]
- public enum ServiceState {
- [DBus (value = "idle")]
- IDLE,
- [DBus (value = "failure")]
- FAILURE,
- [DBus (value = "association")]
- ASSOCIATION,
- [DBus (value = "configuration")]
- CONFIGURATION,
- [DBus (value = "ready")]
- READY,
- [DBus (value = "disconnect")]
- DISCONNECT,
- [DBus (value = "online")]
- ONLINE;
- }
-
- [DBus (use_string_marshalling = true)]
- public enum ServiceSecurity {
- [DBus (value = "none")]
- NONE,
- [DBus (value = "wep")]
- WEP,
- [DBus (value = "psk")]
- PSK,
- [DBus (value = "ieee8021x")]
- IEEE8021X,
- [DBus (value = "wps")]
- WPS;
- }
-
- [DBus (use_string_marshalling = true)]
- public enum IPv4Method {
- [DBus (value = "dhcp")]
- DHCP,
- [DBus (value = "manual")]
- MANUAL,
- [DBus (value = "off")]
- OFF;
-
- // hacks to expose methods created by DBus use_string_marshalling
- [CCode (cname = "connman_ipv4_method_to_string (self)")]
- extern const string to_string_hack;
- [CCode (cname = "connman_ipv4_method_to_string_wrapper")]
- public string to_string () {
- return to_string_hack;
- }
- public static extern IPv4Method from_string (string method) throws DBusError;
- }
-
- [DBus (use_string_marshalling = true)]
- public enum IPv6Method {
- [DBus (value = "dhcp")]
- DHCP,
- [DBus (value = "manual")]
- MANUAL,
- [DBus (value = "6to4")]
- V6TOV4,
- [DBus (value = "off")]
- OFF;
-
- // hacks to expose methods created by DBus use_string_marshalling
- [CCode (cname = "connman_ipv6_method_to_string (self)")]
- extern const string to_string_hack;
- [CCode (cname = "connman_ipv6_method_to_string_wrapper")]
- public string to_string () {
- return to_string_hack;
- }
- public static extern IPv6Method from_string (string method) throws DBusError;
- }
-
- [DBus (use_string_marshalling = true)]
- public enum IPv6Privacy {
- [DBus (value = "disabled")]
- DISABLED,
- [DBus (value = "enabled")]
- ENABLED,
- [DBus (value = "preferred")]
- PREFERRED;
-
- // hacks to expose methods created by DBus use_string_marshalling
- [CCode (cname = "connman_ipv6_privacy_to_string (self)")]
- extern const string to_string_hack;
- [CCode (cname = "connman_ipv6_privacy_to_string_wrapper")]
- public string to_string () {
- return to_string_hack;
- }
- public static extern IPv6Privacy from_string (string method) throws DBusError;
- }
-
- [DBus (use_string_marshalling = true)]
- public enum ProxyMethod {
- [DBus (value = "direct")]
- DIRECT,
- [DBus (value = "auto")]
- AUTO,
- [DBus (value = "manual")]
- MANUAL;
-
- // hacks to expose methods created by DBus use_string_marshalling
- [CCode (cname = "connman_proxy_method_to_string (self)")]
- extern const string to_string_hack;
- [CCode (cname = "connman_proxy_method_to_string_wrapper")]
- public string to_string () {
- return to_string_hack;
- }
- public static extern ProxyMethod from_string (string method) throws DBusError;
- }
-
- [DBus (use_string_marshalling = true)]
- public enum EthernetMethod {
- [DBus (value = "auto")]
- AUTO,
- [DBus (value = "manual")]
- MANUAL;
-
- // hacks to expose methods created by DBus use_string_marshalling
- [CCode (cname = "connman_ethernet_method_to_string (self)")]
- extern const string to_string_hack;
- [CCode (cname = "connman_ethernet_method_to_string_wrapper")]
- public string to_string () {
- return to_string_hack;
- }
- public static extern EthernetMethod from_string (string method) throws DBusError;
- }
-
- [Compact]
- public class IPv4Info {
- public IPv4Method? method;
- public string? address;
- public string? netmask;
- public string? gateway;
- }
-
- [Compact]
- public class IPv6Info {
- public IPv6Method? method;
- public string? address;
- public string? prefix_length;
- public string? gateway;
- public IPv6Privacy? privacy;
- }
-
- [Compact]
- public class ProxyInfo {
- public ProxyMethod? method;
- public string? url;
- public string[]? servers;
- public string[]? excludes;
- }
-
- [Compact]
- public class ProviderInfo {
- public string? host;
- public string? domain;
- public string? name;
- public string? type;
- }
-
- [Compact]
- public class EthernetInfo {
- public EthernetMethod? method;
- public string? interface;
- public string? address;
- public uint16? mtu;
- }
-}
-
-namespace net.connman {
- [DBus (name = "net.connman.Service")]
- public interface Service : Object {
- // Docs say get_properties is deprecated, but it is needed to avoid race condition
- public abstract async HashTable get_properties() throws DBusError, IOError;
- public abstract async void set_property(string name, Variant? value) throws DBusError, IOError;
- [DBus (name = "SetProperty")]
- public abstract void set_property_sync(string name, Variant? value) throws DBusError, IOError;
- public abstract async void clear_property(string name) throws DBusError, IOError;
- public abstract async void connect() throws DBusError, IOError;
- public abstract async void disconnect() throws DBusError, IOError;
- public abstract async void remove() throws DBusError, IOError;
- public abstract async void move_before(ObjectPath service) throws DBusError, IOError;
- public abstract async void move_after(ObjectPath service) throws DBusError, IOError;
- public abstract async void reset_counters() throws DBusError, IOError;
-
- public signal void property_changed(string name, Variant? value);
-
- public abstract Connman.ServiceState state { get; }
- public abstract string? error { owned get; }
- public abstract string? name { owned get; }
- public abstract string type_ { owned get; }
- public abstract Connman.ServiceSecurity[] security { owned get; }
- public abstract uint8 strength { get; }
- public abstract bool favorite { get; }
- public abstract bool immutable { get; }
- public abstract bool auto_connect { get; }
- public abstract bool roaming { get; }
- public abstract string[] nameservers { owned get; }
- [DBus (name = "Nameservers.Configuration")]
- public abstract string[] nameservers_configuration { owned get; }
- public abstract string[] timeservers { owned get; }
- [DBus (name = "Timeservers.Configuration")]
- public abstract string[] timeservers_configuration { owned get; }
- public abstract string[] domains { owned get; }
- [DBus (name = "Domains.Configuration")]
- public abstract string[] domains_configuration { owned get; }
- [DBus (name = "IPv4")]
- public abstract HashTable ipv4 { owned get; }
- [DBus (name = "IPv4.Configuration")]
- public abstract HashTable ipv4_configuration { owned get; }
- [DBus (name = "IPv6")]
- public abstract HashTable ipv6 { owned get; }
- [DBus (name = "IPv6.Configuration")]
- public abstract HashTable ipv6_configuration { owned get; }
- public abstract HashTable proxy { owned get; }
- [DBus (name = "Proxy.Configuration")]
- public abstract HashTable proxy_configuration { owned get; }
- public abstract HashTable provider { owned get; }
- public abstract HashTable ethernet { owned get; }
- public abstract bool mdns { owned get; }
- public abstract bool mdns_configuration { owned get; }
- }
-}
diff --git a/lib/connman/Technology.vala b/lib/connman/Technology.vala
deleted file mode 100644
index b260bbd..0000000
--- a/lib/connman/Technology.vala
+++ /dev/null
@@ -1,156 +0,0 @@
-/*
- * connman -- DBus bindings for ConnMan
- *
- * Copyright (C) 2014-2015 David Lechner
- *
- * 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, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY throws IOError; 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 .
- */
-
-/*
- * Technology.vala:
- */
-
-namespace Connman {
- public class Technology : Object {
- internal net.connman.Technology dbus_proxy;
-
- public ObjectPath object_path { get; private set; }
-
- public bool powered {
- get { return dbus_proxy.powered; }
- set {
- if (value == powered)
- return;
- try {
- dbus_proxy.set_property_sync ("Powered", value);
- } catch (Error err) {
- critical ("%s", err.message);
- }
- }
- }
- public bool connected { get { return dbus_proxy.connected; } }
- public string name { owned get { return dbus_proxy.name; } }
- public string technology_type { owned get { return dbus_proxy.type_; } }
- public bool tethering {
- get { return dbus_proxy.tethering; }
- set {
- if (value == tethering)
- return;
- try {
- dbus_proxy.set_property_sync ("Tethering", value);
- } catch (Error err) {
- critical ("%s", err.message);
- }
- }
- }
- public string tethering_identifier {
- owned get { return dbus_proxy.tethering_identifier; }
- set {
- if (value == tethering_identifier)
- return;
- try {
- dbus_proxy.set_property_sync ("TetheringIdentifier", value);
- } catch (Error err) {
- critical ("%s", err.message);
- }
- }
- }
- public string tethering_passphrase {
- owned get { return dbus_proxy.tethering_passphrase; }
- set {
- if (value == tethering_passphrase)
- return;
- try {
- dbus_proxy.set_property_sync ("TetheringPassphrase", value);
- } catch (Error err) {
- critical ("%s", err.message);
- }
- }
- }
-
- public signal void removed ();
-
- internal static async Technology new_async (ObjectPath path) throws DBusError, IOError {
- var technology = new Technology ();
- technology.dbus_proxy = yield Bus.get_proxy (BusType.SYSTEM,
- Manager.SERVICE_NAME, path);
- technology.object_path = path;
- technology.dbus_proxy.property_changed.connect (technology.on_property_changed);
- // we are calling the deprecated get_properties_sync method because
- // of a possible race condition where a property_changed signal is
- // sent before the signal handler is connected.
- var properties = yield technology.dbus_proxy.get_properties ();
- properties.foreach ((k, v) => technology.on_property_changed (k, v));
- return technology;
- }
-
- public async void scan() throws DBusError, IOError {
- yield dbus_proxy.scan();
- }
-
- void on_property_changed(string name, Variant? value) {
- ((DBusProxy)dbus_proxy).set_cached_property(name, value);
- switch (name) {
- case "Powered":
- notify_property("powered");
- break;
- case "Connected":
- notify_property("connected");
- break;
- case "Name":
- notify_property("name");
- break;
- case "Type":
- notify_property("technology-type");
- break;
- case "Tethering":
- notify_property("tethering");
- break;
- case "TetheringIdentifier":
- notify_property("tethering-identifier");
- break;
- case "TetheringPassphrase":
- notify_property("tethering-passphrase");
- break;
- default:
- critical ("Unknown dbus property '%s'", name);
- break;
- }
- }
- }
-}
-
-namespace net.connman {
- [DBus (name = "net.connman.Technology")]
- public interface Technology : Object {
- // Docs say get_properties is deprecated, but it is needed to avoid race condition
- public abstract async HashTable get_properties () throws DBusError, IOError;
- [DBus (name = "GetProperties")]
- public abstract HashTable get_properties_sync () throws DBusError, IOError;
- public abstract async void set_property (string name, Variant? value) throws DBusError, IOError;
- [DBus (name = "SetProperty")]
- public abstract void set_property_sync (string name, Variant? value) throws DBusError, IOError;
- public abstract async void scan () throws DBusError, IOError;
-
- public signal void property_changed (string name, Variant? value);
-
- public abstract bool powered { get; }
- public abstract bool connected { get; }
- public abstract string name { owned get; }
- public abstract string type_ { owned get; }
- public abstract bool tethering { get; }
- public abstract string tethering_identifier { owned get; }
- public abstract string tethering_passphrase { owned get; }
- }
-}
diff --git a/lib/dbus/Properties.vala b/lib/dbus/Properties.vala
deleted file mode 100644
index 6b0bee2..0000000
--- a/lib/dbus/Properties.vala
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * dbus -- vala bindings for d-bus standard interfaces
- *
- * Copyright (C) 2014 David Lechner
- *
- * 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, either version 3 of the License, or
- * (at your option) any later version.
- *
- * 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 .
- */
-
-namespace org.freedesktop.DBus {
- [DBus (name = "org.freedesktop.DBus.Properties")]
- public interface Properties : DBusProxy {
- public abstract async Variant? get (string interface_name, string property_name) throws DBusError, IOError;
- public abstract async void set (string interface_name, string property_name, Variant? value) throws DBusError, IOError;
- public abstract async HashTable get_all (string interface_name) throws DBusError, IOError;
-
- public abstract signal void properties_changed (string interface_name, HashTable changed_properties, string[] invalidated_properties);
- }
-}
\ No newline at end of file
diff --git a/lib/systemd/Logind.vala b/lib/systemd/Logind.vala
deleted file mode 100644
index 49a47d2..0000000
--- a/lib/systemd/Logind.vala
+++ /dev/null
@@ -1,275 +0,0 @@
-/*
- * systemd -- vala bindings for systemd d-bus
- *
- * Copyright (C) 2014-2015 David Lechner
- *
- * 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, either version 3 of the License, or
- * (at your option) any later version.
- *
- * 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 .
- */
-
-namespace Systemd.Logind {
- [DBus (use_string_marshalling = true)]
- public enum SessionToKill {
- [DBus (value = "leader")]
- LEADER,
- [DBus (value = "all")]
- ALL;
- }
-
- [DBus (use_string_marshalling = true)]
- public enum CanResponse {
- [DBus (value = "na")]
- NOT_APPLICABLE,
- [DBus (value = "yes")]
- YES,
- [DBus (value = "no")]
- NO,
- [DBus (value = "challenge")]
- CHALLENGE;
- }
-
- [DBus (use_string_marshalling = true)]
- public enum InhibitMode {
- [DBus (value = "block")]
- BLOCK,
- [DBus (value = "delay")]
- DELAY;
- }
-
- public class Manager : Object {
- static HashTable object_map;
-
- static construct {
- object_map = new HashTable (str_hash, str_equal);
- }
-
- ObjectPath path;
- org.freedesktop.login1.Manager manager;
- org.freedesktop.DBus.Properties properties;
-
- public uint32 auto_vt_count { get { return manager.auto_vt_count; } }
- public string[] kill_only_users { owned get { return manager.kill_only_users; } }
- public string[] kill_exclude_users { owned get { return manager.kill_exclude_users; } }
- public bool kill_user_processes { get { return manager.kill_user_processes; } }
- public bool idle_hint { get { return manager.idle_hint; } }
- public uint64 idle_since_hint { get { return manager.idle_since_hint; } }
- public uint64 idle_since_hint_monotonic { get { return manager.idle_since_hint_monotonic; } }
- public string block_inhibited { owned get { return manager.block_inhibited; } }
- public string delay_inhibited { owned get { return manager.delay_inhibited; } }
- public uint64 inhibit_delay_max_usec { get { return manager.inhibit_delay_max_usec; } }
- public string handle_power_key { owned get { return manager.handle_power_key; } }
- public string handle_suspend_key { owned get { return manager.handle_suspend_key; } }
- public string handle_hibernate_key { owned get { return manager.handle_hibernate_key; } }
- public string handle_lid_switch { owned get { return manager.handle_lid_switch; } }
- public string idle_action { owned get { return manager.idle_action; } }
- public uint64 idle_action_usec { get { return manager.idle_action_usec; } }
- public bool preparing_for_shutdown { get { return manager.preparing_for_shutdown; } }
- public bool preparing_for_sleep { get { return manager.preparing_for_sleep; } }
-
- public static async Manager get_system_manager () throws IOError {
- return yield Manager.get_instance_for_path (
- (ObjectPath)org.freedesktop.login1.Manager.OBJECT_PATH);
- }
-
- static async Manager get_instance_for_path (ObjectPath path) throws IOError {
- if (object_map != null && object_map.contains (path)) {
- return object_map[path];
- }
- return yield new_async (path);
- }
-
- static async Manager new_async (ObjectPath path) throws IOError {
- var instance = new Manager ();
- instance.path = path;
- instance.manager = yield Bus.get_proxy (BusType.SYSTEM,
- org.freedesktop.login1.SERVICE_NAME, path);
- instance.properties = yield Bus.get_proxy (BusType.SYSTEM,
- org.freedesktop.login1.SERVICE_NAME, path);
- object_map[path] = instance;
- weak Manager weak_instance = instance;
- //instance.manager.session_new.connect ((id, path) => weak_instance.on_session_new.begin (id, path));
- //instance.manager.session_removed.connect ((id, path) => weak_instance.on_session_removed.begin (id, path));
- //instance.manager.user_new.connect ((id, path) => weak_instance.on_user_new.begin (id, path));
- //instance.manager.user_removed.connect ((id, path) => weak_instance.on_user_removed.begin (id, path));
- //instance.manager.seat_new.connect ((id, path) => weak_instance.on_seat_new.begin (id, path));
- //instance.manager.seat_removed.connect ((id, path) => weak_instance.on_seat_removed.begin (id, path));
- instance.manager.prepare_for_shutdown.connect ((before) => weak_instance.on_prepare_for_shutdown (before));
- instance.manager.prepare_for_sleep.connect ((before) => weak_instance.on_prepare_for_sleep (before));
- instance.properties.properties_changed.connect (weak_instance.on_properties_changed);
- return instance;
- }
-
- ~Manager () {
- object_map.remove (path);
- }
-
- //public async ObjectPath get_session (string id) throws IOError;
- //public async ObjectPath get_session_by_pid (uint process_id) throws IOError;
- //public async ObjectPath get_user (uint32 user_id) throws IOError;
- //public async ObjectPath get_user_by_pid (uint pid) throws IOError;
- //public async ObjectPath get_seat (string seat_id) throws IOError;
- //public async SessionInfo[] list_sessions () throws IOError;
- //public async UserInfo[] list_users () throws IOError;
- //public async SeatInfo[] list_seats () throws IOError;
- //public async SeatInfo[] list_inhibitors () throws IOError;
- public async void activate_session (string session_id) throws DBusError, IOError {
- yield manager.activate_session (session_id);
- }
- public async void activate_session_on_seat (string session_id, string seat_id) throws DBusError, IOError {
- yield manager.activate_session_on_seat (session_id, seat_id);
- }
- public async void lock_session (string session_id) throws DBusError, IOError {
- yield manager.lock_session (session_id);
- }
- public async void unlock_session (string session_id) throws DBusError, IOError {
- yield manager.unlock_session (session_id);
- }
- public async void lock_sessions () throws DBusError, IOError {
- yield manager.lock_sessions ();
- }
- public async void unlock_sessions () throws DBusError, IOError {
- yield manager.unlock_sessions ();
- }
- public async void kill_session (string session_id, SessionToKill session, int32 @signal = Posix.Signal.TERM) throws DBusError, IOError {
- yield manager.kill_session (session_id, session, @signal);
- }
- public async void kill_user (uint32 user_id, int32 @signal = Posix.Signal.TERM) throws DBusError, IOError {
- yield manager.kill_user (user_id, @signal);
- }
- public async void terminate_session (string session_id) throws DBusError, IOError {
- yield manager.terminate_session (session_id);
- }
- public async void terminate_user (uint32 user_id) throws DBusError, IOError {
- yield manager.terminate_user (user_id);
- }
- public async void terminate_seat (string seat_id) throws DBusError, IOError {
- yield manager.terminate_seat (seat_id);
- }
- public async void set_user_linger (uint32 user_id, bool enable, bool interactive = false) throws DBusError, IOError {
- yield manager.set_user_linger (user_id, enable, interactive);
- }
- public async void attach_Device (string seat_id, string sysfs_path, bool interactive = false) throws DBusError, IOError {
- yield manager.attach_Device (seat_id, sysfs_path, interactive);
- }
- public async void flush_devices (bool interactive = false) throws DBusError, IOError {
- yield manager.flush_devices (interactive);
- }
- public async void power_off (bool interactive = false) throws DBusError, IOError {
- yield manager.power_off (interactive);
- }
- public async void reboot (bool interactive = false) throws DBusError, IOError {
- yield manager.reboot (interactive);
- }
- public async void suspend (bool interactive = false) throws DBusError, IOError {
- yield manager.suspend (interactive);
- }
- public async void hibernate (bool interactive = false) throws DBusError, IOError {
- yield manager.hibernate (interactive);
- }
- public async void hybrid_sleep (bool interactive = false) throws DBusError, IOError {
- yield manager.hybrid_sleep (interactive);
- }
- public async CanResponse can_power_off () throws DBusError, IOError {
- return yield manager.can_power_off ();
- }
- public async CanResponse can_reboot () throws DBusError, IOError {
- return yield manager.can_reboot ();
- }
- public async CanResponse can_suspend () throws DBusError, IOError {
- return yield manager.can_suspend ();
- }
- public async CanResponse can_hybrid_sleep () throws DBusError, IOError {
- return yield manager.can_hybrid_sleep ();
- }
- // FIXME: this fails to build in stretch
- // logind-interfaces.c: In function 'org_freedesktop_login1_manager_proxy_inhibit_async':
- // logind-interfaces.c:3185:2: error: '_fd_list' undeclared (first use in this function)
-#if 0
- public async UnixInputStream inhibit (string who, string what, string why, InhibitMode mode) throws DBusError, IOError {
- return yield manager.inhibit (who, what, why, mode);
- }
-#endif
-/*
- public signal void session_new (string session_id, Session session);
- async void on_session_new (string session_id, ObjectPath path) {
- var session = yield Session.get_instance_for_path (path);
- session_new (session_id, session);
- }
- public signal void session_removed (string session_id, Session session);
- async void on_session_removed (string session_id, ObjectPath path) {
- var session = yield Session.get_instance_for_path (path);
- session_removed (session_id, session);
- }
- public signal void user_new (uint32 user_id, User user);
- async void on_user_new (uint32 user_id, ObjectPath path) {
- var user = yield User.get_instance_for_path (path);
- user_new (user_id, user);
- }
- public signal void user_removed (uint32 user_id, User user);
- async void on_user_removed (uint32 user_id, ObjectPath path) {
- var user = yield User.get_instance_for_path (path);
- user_removed (user_id, user);
- }
- public signal void seat_new (string seat_id, Seat seat);
- async void on_seat_new (string seat_id, ObjectPath path) {
- var seat = yield Seat.get_instance_for_path (path);
- seat_new (seat_id, seat);
- }
- public signal void seat_removed (string seat_id, Seat seat);
- async void on_seat_removed (string seat_id, ObjectPath path) {
- var seat = yield Seat.get_instance_for_path (path);
- seat_removed (seat_id, seat);
- }
-*/
- public signal void prepare_for_shutdown (bool before_shutdown);
- void on_prepare_for_shutdown (bool before_shutdown) {
- (before_shutdown);
- }
- public signal void prepare_for_sleep (bool before_shutdown);
- void on_prepare_for_sleep (bool before_shutdown) {
- (before_shutdown);
- }
-
- void on_properties_changed (string iface, HashTable changed_properties, string[] invalidated_properties)
- {
- changed_properties.foreach ((k, v) => {
- notify_dbus_property (k);
- });
- foreach (var property in invalidated_properties) {
- notify_dbus_property (property);
- }
- }
-
- void notify_dbus_property (string property) {
- switch (property) {
- // Most properties are constants
- case "IdleHint":
- notify_property ("idle-hint");
- break;
- case "IdleSinceHint":
- notify_property ("idle-since-hint");
- break;
- case "IdleSinceHintMonotonic":
- notify_property ("idle-since-hint-monotonic");
- break;
- case "BlockInhibited":
- notify_property ("block-inhibited");
- break;
- case "DelayInhibited":
- notify_property ("delay-inhibited");
- break;
- }
- }
- }
-}
\ No newline at end of file
diff --git a/lib/systemd/Systemd.vala b/lib/systemd/Systemd.vala
deleted file mode 100644
index ffd9061..0000000
--- a/lib/systemd/Systemd.vala
+++ /dev/null
@@ -1,902 +0,0 @@
-/*
- * systemd -- vala bindings for systemd d-bus
- *
- * Copyright (C) 2014-2015 David Lechner
- *
- * 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, either version 3 of the License, or
- * (at your option) any later version.
- *
- * 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 .
- */
-
-namespace Systemd {
- [DBus (use_string_marshalling = true)]
- public enum UnitMode {
- [DBus (value = "replace")]
- REPLACE,
- [DBus (value = "fail")]
- FAIL,
- [DBus (value = "isolate")]
- ISOLATE,
- [DBus (value = "ignore-dependencies")]
- IGNORE_DEPENENCIES,
- [DBus (value = "ignore-requirements")]
- IGNORE_REQUIREMENTS;
-
- public static extern UnitMode from_string (string value) throws DBusError;
- }
-
- [DBus (use_string_marshalling = true)]
- public enum UnitActiveState {
- [DBus (value = "active")]
- ACTIVE,
- [DBus (value = "reloading")]
- RELOADING,
- [DBus (value = "inactive")]
- INACTIVE,
- [DBus (value = "failed")]
- FAILED,
- [DBus (value = "activating")]
- ACTIVATING,
- [DBus (value = "deactivating")]
- DEACTIVATING;
-
- public static extern UnitActiveState from_string (string value) throws DBusError;
- }
-
- [DBus (use_string_marshalling = true)]
- public enum UnitFileState {
- [DBus (value = "enabled")]
- ENABLED,
- [DBus (value = "enabled-runtime")]
- ENABLED_RUNTIME,
- [DBus (value = "linked")]
- LINKED,
- [DBus (value = "linked-runtime")]
- LINKED_RUNTIME,
- [DBus (value = "masked")]
- MASKED,
- [DBus (value = "masked-runtime")]
- MASKED_RUNTIME,
- [DBus (value = "static")]
- STATIC,
- [DBus (value = "disabled")]
- DISABLED,
- [DBus (value = "invalid")]
- INVALID;
-
- public static extern UnitFileState from_string (string value) throws DBusError;
- }
-
- [DBus (use_string_marshalling = true)]
- public enum JobResult {
- [DBus (value = "done")]
- DONE,
- [DBus (value = "canceled")]
- CANCELED,
- [DBus (value = "timeout")]
- TIMEOUT,
- [DBus (value = "failed")]
- FAILED,
- [DBus (value = "dependency")]
- DEPENDENCY,
- [DBus (value = "skipped")]
- SKIPPED;
-
- public static extern JobResult from_string (string value) throws DBusError;
- }
-
- [DBus (use_string_marshalling = true)]
- public enum Who {
- [DBus (value = "main")]
- MAIN,
- [DBus (value = "control")]
- CONTROL,
- [DBus (value = "all")]
- ALL;
-
- public static extern Who from_string (string value) throws DBusError;
- }
-
- [DBus (use_string_marshalling = true)]
- public enum UnitLinkChangeType {
- [DBus (value = "symlink")]
- SYMLINK,
- [DBus (value = "unlink")]
- UNLINK;
-
- public static extern UnitLinkChangeType from_string (string value) throws DBusError;
- }
-
- public struct UnitFileInfo {
- string name;
- UnitFileState state;
- }
-
- public struct UnitLinkChangeInfo {
- UnitLinkChangeType change_type;
- string symlink_name;
- string destination_name;
- }
-
- public class UnitInfo {
- org.freedesktop.systemd1.Manager.UnitInfo info;
-
- public string id { get { return info.id; } }
- public string description { get { return info.description; } }
- public string load_state { get { return info.load_state; } }
- public string active_state { get { return info.active_state; } }
- public string sub_state { get { return info.sub_state; } }
- public string following { get { return info.following; } }
- public Unit unit { get; private set; }
- public uint32 job_id { get { return info.job_id; } }
- public string job_type { get { return info.job_type; } }
- public Job job { get; private set; }
-
- public static async UnitInfo new_async (org.freedesktop.systemd1.Manager.UnitInfo info) throws IOError {
- var instance = new UnitInfo ();
- instance.info = info;
- instance._unit = yield Unit.get_instance_for_path (info.unit_path);
- instance._job = yield Job.get_instance_for_path (info.job_path);
- return instance;
- }
- }
-
- public class JobInfo {
- org.freedesktop.systemd1.Manager.JobInfo info;
-
- public uint32 id { get { return info.id; } }
- public string name { get { return info.name; } }
- public string type_ { get { return info.type; } }
- public string state { get { return info.state; } }
- public Job job { get; private set; }
- public Unit unit { get; private set; }
-
- internal static async JobInfo new_async (org.freedesktop.systemd1.Manager.JobInfo info) throws IOError {
- var instance = new JobInfo ();
- instance.info = info;
- instance._job = yield Job.get_instance_for_path (info.job_path);
- instance._unit = yield Unit.get_instance_for_path (info.unit_path);
- return instance;
- }
- }
-
- public class Manager : Object {
- static HashTable object_map;
-
- static construct {
- object_map = new HashTable (str_hash, str_equal);
- }
-
- ObjectPath path;
- org.freedesktop.systemd1.Manager manager;
- org.freedesktop.DBus.Properties properties;
-
- public static async Manager get_system_manager () throws IOError {
- return yield Manager.get_instance_for_path (
- new ObjectPath (org.freedesktop.systemd1.Manager.OBJECT_PATH));
- }
-
- static async Manager get_instance_for_path (ObjectPath path) throws IOError {
- if (object_map != null && object_map.contains (path)) {
- return object_map[path];
- }
- return yield new_async (path);
- }
-
- static async Manager new_async (ObjectPath path) throws IOError {
- var instance = new Manager ();
- instance.path = path;
- instance.manager = yield Bus.get_proxy (BusType.SYSTEM,
- org.freedesktop.systemd1.SERVICE_NAME, path);
- instance.properties = yield Bus.get_proxy (BusType.SYSTEM,
- org.freedesktop.systemd1.SERVICE_NAME, path);
- object_map[path] = instance;
- weak Manager weak_instance = instance;
- instance.manager.unit_new.connect ((id, path) => weak_instance.on_unit_new.begin (id, path));
- instance.manager.unit_removed.connect ((id, path) => weak_instance.on_unit_removed.begin (id, path));
- instance.manager.job_new.connect ((id, path, unit) => weak_instance.on_job_new.begin (id, path, unit));
- instance.manager.job_removed.connect ((id, path, unit, result) => weak_instance.on_job_removed.begin (id, path, unit, result));
- instance.properties.properties_changed.connect (weak_instance.on_properties_changed);
- return instance;
- }
-
- ~Manager () {
- object_map.remove (path);
- }
-
- public string[] environment { owned get { return manager.environment; } }
-
- /**
- * Get the unit object path for a unit name.
- * @param name The unit name
- * @return A Unit object.
- * @throws IOError Unit has not been loaded yet or DBus error
- */
- public async Unit get_unit (string name) throws DBusError, IOError {
- var path = yield manager.get_unit (name);
- return yield Unit.get_instance_for_path (path);
- }
-
- public async Unit get_unit_by_pid (uint32 pid) throws DBusError, IOError {
- var path = yield manager.get_unit_by_pid (pid);
- return yield Unit.get_instance_for_path (path);
- }
-
- public async Unit load_unit (string name) throws DBusError, IOError {
- var path = yield manager.load_unit (name);
- return yield Unit.get_instance_for_path (path);
- }
-
- public async Job start_unit (string name, UnitMode mode = UnitMode.REPLACE) throws DBusError, IOError {
- var path = yield manager.start_unit (name, mode);
- return yield Job.get_instance_for_path (path);
- }
-
- public async Job start_unit_replace (string old_unit, string new_unit, UnitMode mode = UnitMode.REPLACE) throws DBusError, IOError {
- var path = yield manager.start_unit_replace (old_unit, new_unit, mode);
- return yield Job.get_instance_for_path (path);
- }
-
- public async Job stop_unit (string name, UnitMode mode = UnitMode.REPLACE) throws DBusError, IOError {
- var path = yield manager.stop_unit (name, mode);
- return yield Job.get_instance_for_path (path);
- }
-
- public async Job reload_unit (string name, UnitMode mode = UnitMode.REPLACE) throws DBusError, IOError {
- var path = yield manager.reload_unit (name, mode);
- return yield Job.get_instance_for_path (path);
- }
-
- public async Job restart_unit (string name, UnitMode mode = UnitMode.REPLACE) throws DBusError, IOError{
- var path = yield manager.restart_unit (name, mode);
- return yield Job.get_instance_for_path (path);
- }
-
- public async Job try_restart_unit (string name, UnitMode mode = UnitMode.REPLACE) throws DBusError, IOError{
- var path = yield manager.try_restart_unit (name, mode);
- return yield Job.get_instance_for_path (path);
- }
-
- public async Job reload_or_restart_unit (string name, UnitMode mode = UnitMode.REPLACE) throws DBusError, IOError{
- var path = yield manager.reload_or_restart_unit (name, mode);
- return yield Job.get_instance_for_path (path);
- }
-
- public async Job reload_or_try_restart_unit (string name, UnitMode mode = UnitMode.REPLACE) throws DBusError, IOError{
- var path = yield manager.reload_or_try_restart_unit (name, mode);
- return yield Job.get_instance_for_path (path);
- }
-
- public async void kill_unit (string name, Who who, int32 @signal = Posix.Signal.KILL) throws DBusError, IOError {
- yield manager.kill_unit (name, who, @signal);
- }
-
- public async Job get_job (uint32 id) throws DBusError, IOError {
- var path = yield manager.get_job (id);
- return yield Job.get_instance_for_path (path);
- }
-
- public async void clear_jobs () throws DBusError, IOError {
- yield manager.clear_jobs ();
- }
-
- public async void reset_failed_unit (string name) throws DBusError, IOError {
- yield manager.reset_failed_unit (name);
- }
-
- public async UnitInfo[] list_units () throws DBusError, IOError {
- var units = yield manager.list_units ();
- var result = new UnitInfo[units.length];
- var i = 0;
- foreach (var info in units) {
- result[i++] = yield UnitInfo.new_async (info);
- }
- return result;
- }
-
- public async JobInfo[] list_jobs () throws DBusError, IOError {
- var jobs = yield manager.list_jobs ();
- var result = new JobInfo[jobs.length];
- var i = 0;
- foreach (var job in jobs) {
- result[i++] = yield JobInfo.new_async (job);
- }
- return result;
- }
-
- public async void subscribe () throws DBusError, IOError {
- yield manager.subscribe ();
- }
-
- public async void unsubscribe () throws DBusError, IOError {
- yield manager.unsubscribe ();
- }
-
- public async Unit create_snapshot (string name, bool cleanup = true) throws DBusError, IOError {
- var path = yield manager.create_snapshot (name, cleanup);
- return yield Unit.get_instance_for_path (path);
- }
-
- public async void remove_snapshot (string name) throws DBusError, IOError {
- yield manager.remove_snapshot (name);
- }
-
- public async void reload () throws DBusError, IOError {
- yield manager.reload ();
- }
- public async void reexecute () throws DBusError, IOError {
- yield manager.reexecute ();
- }
- public async void exit () throws DBusError, IOError {
- yield manager.exit ();
- }
-
- public async void set_environment (string[] names) throws DBusError, IOError {
- yield manager.set_environment (names);
- }
- public async void unset_environment (string[] names) throws DBusError, IOError {
- yield manager.unset_environment (names);
- }
-
- public async void unset_and_set_environment (string[] unset, string[] @set) throws DBusError, IOError {
- yield manager.unset_and_set_environment (unset, @set);
- }
-
- public async UnitFileInfo[] list_unit_files () throws DBusError, IOError {
- var info = yield manager.list_unit_files ();
- var result = new UnitFileInfo[info.length];
- for (int i = 0; i < info.length; i++) {
- result[i].name = info[i].name;
- try {
- result[i].state = UnitFileState.from_string (info[i].state);
- } catch (DBusError err) {
- critical (err.message);
- }
- }
- return result;
- }
-
- public async UnitFileState get_unit_file_state (string file) throws DBusError, IOError {
- return yield manager.get_unit_file_state (file);
- }
-
- /**
- * Enables one or more units in the system (by creating symlinks to them
- * in /etc or /run).
- *
- * @param files List of unit files to enable (either just file names or
- * full absolute paths if the unit files are residing outside the usual
- * unit search paths).
- * @param runtime Whether the unit shall be enabled for runtime only
- * (true, /run), or persistently (false, /etc).
- * @param force Whether symlinks pointing to other units shall be
- * replaced if necessary.
- * @param carries_install_info Signals whether the unit files contained
- * any enablement information (i.e. an [Install]) section.
- * @return The changes list.
- */
- public async UnitLinkChangeInfo[] enable_unit_files (string[] files, bool runtime = false, bool force = false, out bool carries_install_info) throws DBusError, IOError {
- var info = yield manager.enable_unit_files (files, runtime, force, out carries_install_info);
- return marshal_unit_link_change_info (info);
- }
-
- public async UnitLinkChangeInfo[] disable_unit_files (string[] files, bool runtime = false) throws DBusError, IOError {
- var info = yield manager.disable_unit_files (files, runtime);
- return marshal_unit_link_change_info (info);
- }
-
- public async UnitLinkChangeInfo[] reenable_unit_files (string[] files, bool runtime = false, bool force = false, out bool carries_install_info) throws DBusError, IOError {
- var info = yield manager.reenable_unit_files (files, runtime, force, out carries_install_info);
- return marshal_unit_link_change_info (info);
- }
-
- public async UnitLinkChangeInfo[] link_unit_files (string[] files, bool runtime = false) throws DBusError, IOError {
- var info = yield manager.link_unit_files (files, runtime);
- return marshal_unit_link_change_info (info);
- }
-
- public async UnitLinkChangeInfo[] preset_unit_files (string[] files, bool runtime = false, bool force = false, out bool carries_install_info) throws DBusError, IOError {
- var info = yield manager.preset_unit_files (files, runtime, force, out carries_install_info);
- return marshal_unit_link_change_info (info);
- }
-
- public async UnitLinkChangeInfo[] mask_unit_files (string[] files, bool runtime = false) throws DBusError, IOError {
- var info = yield manager.mask_unit_files (files, runtime);
- return marshal_unit_link_change_info (info);
- }
-
- public async UnitLinkChangeInfo[] unmask_unit_files (string[] files, bool runtime = false) throws DBusError, IOError {
- var info = yield manager.unmask_unit_files (files, runtime);
- return marshal_unit_link_change_info (info);
- }
-
- public async UnitLinkChangeInfo[] set_default_target (string[] files) throws DBusError, IOError {
- var info = yield manager.set_default_target (files);
- return marshal_unit_link_change_info (info);
- }
-
- public async string get_default_target () throws DBusError, IOError {
- return yield manager.get_default_target ();
- }
-
-// public async void set_unit_properties (string name, bool runtime, UnitProperty[] properties) throws DBusError, IOError {
-// yield manager.set_unit_properties (name, runtime, properties);
-// }
-
-// public async Unit start_transiend_unit (string name, string mode, UnitProperty[] properties, UnitPropertyGroup[] aux) throws DBusError, IOError {
-// var path = yield manager.start_transiend_unit (name, mode, properties, aux);
-// return yield Unit.get_instance_from_path (path);
-// }
-
- public signal void unit_new (string id);
- async void on_unit_new (string id, ObjectPath path) {
- unit_new (id);
- }
-
- public signal void unit_removed (string id);
- async void on_unit_removed (string id, ObjectPath path) {
- unit_removed (id);
- }
-
- public signal void job_new (uint32 id, Job job, string unit);
- async void on_job_new (uint32 id, ObjectPath path, string unit) {
- try {
- var job = yield Job.get_instance_for_path (path);
- job_new (id, job, unit);
- } catch (IOError err) {
- critical (err.message);
- }
- }
- public signal void job_removed (uint32 id, string unit, JobResult result);
- async void on_job_removed (uint32 id, ObjectPath path, string unit, JobResult result) {
- job_removed (id, unit, result);
- }
-
- UnitLinkChangeInfo[] marshal_unit_link_change_info (org.freedesktop.systemd1.Manager.UnitLinkChangeInfo[] info) {
- var result = new UnitLinkChangeInfo[info.length];
- for (int i = 0; i < info.length; i++) {
- try {
- result[i].change_type = UnitLinkChangeType.from_string (info[i].change_type);
- } catch (DBusError err) {
- critical (err.message);
- }
- result[i].symlink_name = info[i].symlink_name;
- result[i].destination_name = info[i].destination_name;
- i++;
- }
- return result;
- }
-
- void on_properties_changed (string iface, HashTable changed_properties, string[] invalidated_properties)
- {
- //foreach (var property in invalidated_properties)
- // TODO: no properties in this class yet
- }
- }
-/*
- [Compact]
- public class JobLink {
- org.freedesktop.systemd1.Unit.JobLink job_link;
-
- public uint32 id { get { return id; } }
- public Job job { get; private set; }
-
- public static async JobLink new_async (org.freedesktop.systemd1.Unit.JobLink job_link) throws DBusError, IOError {
- var instance = new JobLink ();
- instance.job_link = job_link;
- instance._job = yield Job.get_instance_for_path (job_link.path);
- return instance;
- }
- }
-*/
- public class Unit : Object {
- static HashTable object_map;
-
- static construct {
- object_map = new HashTable (str_hash, str_equal);
- }
-
- ObjectPath path;
- org.freedesktop.systemd1.Unit unit;
- org.freedesktop.DBus.Properties properties;
-
- public string id { owned get { return unit.id; } }
- public string[] names { owned get { return unit.names; } }
- public string following { owned get { return unit.following; } }
- public string[] requires { owned get { return unit.requires; } }
- public string[] requires_overridable { owned get { return unit.requires_overridable; } }
- public string[] requisite { owned get { return unit.requisite; } }
- public string[] requisite_overridable { owned get { return unit.requisite_overridable; } }
- public string[] wants { owned get { return unit.wants; } }
- public string[] required_by { owned get { return unit.required_by; } }
- public string[] required_by_overridable { owned get { return unit.required_by_overridable; } }
- public string[] wanted_by { owned get { return unit.wanted_by; } }
- public string[] conflicts { owned get { return unit.conflicts; } }
- public string[] conflicted_by { owned get { return unit.conflicted_by; } }
- public string[] before { owned get { return unit.before; } }
- public string[] after { owned get { return unit.after; } }
- public string[] on_failure { owned get { return unit.on_failure; } }
- public string description { owned get { return unit.description; } }
- public string load_state { owned get { return unit.load_state; } }
- public UnitActiveState active_state { get { return unit.active_state; } }
- public string sub_state { owned get { return unit.sub_state; } }
- public string fragment_path { owned get { return unit.fragment_path; } }
- public UnitFileState unit_file_state { get { return unit.unit_file_state; } }
- public uint64 inactive_exit_timestamp { get { return unit.inactive_exit_timestamp; } }
- public uint64 active_enter_timestamp { get { return unit.active_enter_timestamp; } }
- public uint64 active_exit_timestamp { get { return unit.active_exit_timestamp; } }
- public uint64 inactive_enter_timestamp { get { return unit.inactive_enter_timestamp; } }
- public bool can_start { get { return unit.can_start; } }
- public bool can_stop { get { return unit.can_stop; } }
- public bool can_reload { get { return unit.can_reload; } }
- //public JobLink job { owned get { return new JobLink (unit.job); } }
- public bool recursive_stop { get { return unit.recursive_stop; } }
- public bool stop_when_unneeded { get { return unit.stop_when_unneeded; } }
- public bool refuse_manual_start { get { return unit.refuse_manual_start; } }
- public bool refuse_manual_stop { get { return unit.refuse_manual_stop; } }
- public bool default_dependencies { get { return unit.default_dependencies; } }
- public string default_control_group { owned get { return unit.default_control_group; } }
- public string[] control_groups { owned get { return unit.control_groups; } }
- public bool need_daemon_reload { get { return unit.need_daemon_reload; } }
- public uint64 job_timeout_usec { get { return unit.job_timeout_usec; } }
-
- internal static async Unit get_instance_for_path (ObjectPath path) throws IOError {
- if (object_map != null && object_map.contains (path)) {
- return object_map[path];
- }
- return yield new_async (path);
- }
-
- static async Unit new_async (ObjectPath path) throws IOError {
- var instance = new Unit ();
- instance.path = path;
- instance.unit = yield Bus.get_proxy (BusType.SYSTEM,
- org.freedesktop.systemd1.SERVICE_NAME, path);
- instance.properties = yield Bus.get_proxy (BusType.SYSTEM,
- org.freedesktop.systemd1.SERVICE_NAME, path);
- object_map[path] = instance;
- instance.properties.properties_changed.connect (instance.on_properties_changed);
- return instance;
- }
-
- ~Unit () {
- object_map.remove (path);
- }
-
- public async Job start (UnitMode mode = UnitMode.REPLACE) throws DBusError, IOError {
- var path = yield unit.start (mode);
- return yield Job.get_instance_for_path (path);
- }
- public async Job stop (UnitMode mode = UnitMode.REPLACE) throws DBusError, IOError {
- var path = yield unit.stop (mode);
- return yield Job.get_instance_for_path (path);
- }
- public async Job reload (UnitMode mode = UnitMode.REPLACE) throws DBusError, IOError {
- var path = yield unit.reload (mode);
- return yield Job.get_instance_for_path (path);
- }
- public async Job restart (UnitMode mode = UnitMode.REPLACE) throws DBusError, IOError {
- var path = yield unit.restart (mode);
- return yield Job.get_instance_for_path (path);
- }
- public async Job try_restart (UnitMode mode = UnitMode.REPLACE) throws DBusError, IOError {
- var path = yield unit.try_restart (mode);
- return yield Job.get_instance_for_path (path);
- }
- public async Job reload_or_restart (UnitMode mode = UnitMode.REPLACE) throws DBusError, IOError {
- var path = yield unit.reload_or_restart (mode);
- return yield Job.get_instance_for_path (path);
- }
- public async Job reload_or_try_restart (UnitMode mode = UnitMode.REPLACE) throws DBusError, IOError {
- var path = yield unit.reload_or_try_restart (mode);
- return yield Job.get_instance_for_path (path);
- }
-
- public async void reset_failed () throws DBusError, IOError {
- yield unit.reset_failed ();
- }
-
- void on_properties_changed (string iface, HashTable changed_properties, string[] invalidated_properties)
- {
- changed_properties.foreach ((k, v) => {
- notify_dbus_property (k);
- });
- foreach (var property in invalidated_properties) {
- notify_dbus_property (property);
- }
- }
-
- void notify_dbus_property (string property) {
- switch (property) {
- case "Id":
- notify_property ("id");
- break;
- case "Names":
- notify_property ("names");
- break;
- case "Following":
- notify_property ("following");
- break;
- case "Requires":
- notify_property ("requires");
- break;
- case "RequiresOverridable":
- notify_property ("requires-overridable");
- break;
- case "Requisite":
- notify_property ("requisite");
- break;
- case "RequisiteOverridable":
- notify_property ("requisite-overridable");
- break;
- case "Wants":
- notify_property ("wants");
- break;
- case "BindsTo":
- notify_property ("binds-to");
- break;
- case "PartOf":
- notify_property ("part-of");
- break;
- case "RequiredBy":
- notify_property ("required-by");
- break;
- case "RequiredByOverridable":
- notify_property ("required-by-overridable");
- break;
- case "WantedBy":
- notify_property ("wanted-by");
- break;
- case "BoundBy":
- notify_property ("bound-by");
- break;
- case "ConsistsOf":
- notify_property ("consists-of");
- break;
- case "Conflicts":
- notify_property ("conflicts");
- break;
- case "ConflictedBy":
- notify_property ("conflicted-by");
- break;
- case "Before":
- notify_property ("before");
- break;
- case "After":
- notify_property ("after");
- break;
- case "OnFailure":
- notify_property ("on-failure");
- break;
- case "Triggers":
- notify_property ("triggers");
- break;
- case "TriggeredBy":
- notify_property ("triggered-by");
- break;
- case "PropagatesReloadTo":
- notify_property ("propagates-reload-to");
- break;
- case "ReloadPropagatedFrom":
- notify_property ("reload-propagated-from");
- break;
- case "RequiresMountsFor":
- notify_property ("requires-mounts-for");
- break;
- case "Description":
- notify_property ("description");
- break;
- case "SourcePath":
- notify_property ("source-path");
- break;
- case "DropInPaths":
- notify_property ("drop-in-paths");
- break;
- case "Documentation":
- notify_property ("documentation");
- break;
- case "LoadState":
- notify_property ("load-state");
- break;
- case "ActiveState":
- notify_property ("active-state");
- break;
- case "SubState":
- notify_property ("sub-state");
- break;
- case "FragmentPath":
- notify_property ("fragment-path");
- break;
- case "UnitFileState":
- notify_property ("unit-file-state");
- break;
- case "InactiveExitTimestamp":
- notify_property ("inactive-exit-timestamp");
- break;
- // case "InactiveExitTimestampMonotonic":
- // notify_property ("inactive-exit-timestamp-monotonic");
- // break;
- case "ActiveEnterTimestamp":
- notify_property ("active-enter-timestamp");
- break;
- // case "ActiveEnterTimestampMonotonic":
- // notify_property ("active-enter-timestamp-monotonic");
- // break;
- case "ActiveExitTimestamp":
- notify_property ("active-exit-timestamp");
- break;
- // case "ActiveExitTimestampMonotonic":
- // notify_property ("active-exit-timestamp-monotonic");
- // break;
- case "InactiveEnterTimestamp":
- notify_property ("inactive-enter-timestamp");
- break;
- // case "InactiveEnterTimestampMonotonic":
- // notify_property ("inactive-enter-timestamp-monotonic");
- // break;
- case "CanStart":
- notify_property ("can-start");
- break;
- case "CanStop":
- notify_property ("can-stop");
- break;
- case "CanReload":
- notify_property ("can-reload");
- break;
- case "CanIsolate":
- notify_property ("can-isolate");
- break;
- // case "Job":
- // notify_property ("job");
- // break;
- case "StopWhenUnneeded":
- notify_property ("stop-when-unneeded");
- break;
- case "RefuseManualStart":
- notify_property ("refuse-manual-start");
- break;
- case "RefuseManualStop":
- notify_property ("refuse-manual-stop");
- break;
- case "AllowIsolate":
- notify_property ("allow-isolate");
- break;
- case "DefaultDependencies":
- notify_property ("default-dependencies");
- break;
- case "OnFailureIsolate":
- notify_property ("on-failure-isolate");
- break;
- case "IgnoreOnIsolate":
- notify_property ("ignore-on-isolate");
- break;
- case "IgnoreOnSnapshot":
- notify_property ("ignore-on-snapshot");
- break;
- case "NeedDaemonReload":
- notify_property ("need-daemon-reload");
- break;
- case "JobTimeoutUSec":
- notify_property ("job-timeout-usec");
- break;
- // case "ConditionTimestamp":
- // notify_property ("condition-timestamp");
- // break;
- // case "ConditionTimestampMonotonic":
- // notify_property ("condition-timestamp-monotonic");
- // break;
- // case "ConditionResult":
- // notify_property ("condition-result");
- // break;
- // case "Conditions":
- // notify_property ("conditions");
- // break;
- // case "LoadError":
- // notify_property ("load-error");
- // break;
- // case "Transient":
- // notify_property ("transient");
- // break;
- }
- }
- }
-
-/*
- [Compact]
- public class UnitLink {
- org.freedesktop.systemd1.Job.UnitLink unit_link;
-
- public uint32 id { get { return id; } }
- public Unit unit { get; private set; }
-
- public static async UnitLink new_async (org.freedesktop.systemd1.Job.UnitLink unit_link) throws IOError {
- var instance = new UnitLink ();
- instance.unit_link = unit_link;
- instance._unit = yield Unit.get_instance_for_path (unit_link.path);
- return instance;
- }
- }
-*/
- public class Job : Object {
- static HashTable object_map;
-
- static construct {
- object_map = new HashTable (str_hash, str_equal);
- }
-
- ObjectPath path;
- org.freedesktop.systemd1.Job job;
- org.freedesktop.DBus.Properties properties;
-
- public uint32 id { get { return job.id; } }
- public string state { owned get { return job.state; } }
- public string job_type { owned get { return job.job_type; } }
- //public UnitLink unit { owned get { return new UnitLink (job.unit); } }
-
- internal static async Job get_instance_for_path (ObjectPath path) throws IOError {
- if (object_map != null && object_map.contains (path)) {
- return object_map[path];
- }
- return yield new_async (path);
- }
-
- static async Job new_async (ObjectPath path) throws IOError {
- var instance = new Job ();
- instance.path = path;
- instance.job = yield Bus.get_proxy (BusType.SYSTEM,
- org.freedesktop.systemd1.SERVICE_NAME, path);
- instance.properties = yield Bus.get_proxy (BusType.SYSTEM,
- org.freedesktop.systemd1.SERVICE_NAME, path);
- object_map[path] = instance;
- instance.properties.properties_changed.connect (instance.on_properties_changed);
- return instance;
- }
-
- ~Job () {
- object_map.remove (path);
- }
-
- public async void cancel () throws DBusError, IOError {
- yield job.cancel ();
- }
-
- void on_properties_changed (string iface, HashTable changed_properties, string[] invalidated_properties)
- {
- changed_properties.foreach ((k, v) => {
- notify_dbus_property (k);
- });
- foreach (var property in invalidated_properties) {
- notify_dbus_property (property);
- }
- }
-
- void notify_dbus_property (string property) {
- switch (property) {
- case "Id":
- notify_property ("id");
- break;
- // case "Unit":
- // notify_property ("unit");
- // break;
- case "JobType":
- notify_property ("job-type");
- break;
- case "State":
- notify_property ("state");
- break;
- }
- }
- }
-}
\ No newline at end of file
diff --git a/lib/systemd/logind-interfaces.vala b/lib/systemd/logind-interfaces.vala
deleted file mode 100644
index f01180c..0000000
--- a/lib/systemd/logind-interfaces.vala
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * systemd -- vala bindings for systemd d-bus
- *
- * Copyright (C) 2014 David Lechner
- *
- * 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, either version 3 of the License, or
- * (at your option) any later version.
- *
- * 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 .
- */
-
-namespace org.freedesktop.login1 {
- public const string SERVICE_NAME = "org.freedesktop.login1";
-
- [DBus (name = "org.freedesktop.login1.Manager")]
- public interface Manager : DBusProxy {
- public const string OBJECT_PATH = "/org/freedesktop/login1";
-
- public struct SessionInfo {
- string id;
- uint32 user_id;
- string user_name;
- string seat_id;
- ObjectPath session;
- }
-
- public struct UserInfo {
- uint32 id;
- string name;
- ObjectPath user;
- }
-
- public struct SeatInfo {
- string id;
- ObjectPath seat;
- }
-
- public struct InhibitorInfo {
- string what;
- string who;
- string why;
- string mode;
- uint32 user_id;
- uint32 process_id;
- }
-
- public abstract async ObjectPath get_session (string id) throws DBusError, IOError;
- public abstract async ObjectPath get_session_by_pid (uint process_id) throws DBusError, IOError;
- public abstract async ObjectPath get_user (uint32 user_id) throws DBusError, IOError;
- public abstract async ObjectPath get_user_by_pid (uint pid) throws DBusError, IOError;
- public abstract async ObjectPath get_seat (string seat_id) throws DBusError, IOError;
- public abstract async SessionInfo[] list_sessions () throws DBusError, IOError;
- public abstract async UserInfo[] list_users () throws DBusError, IOError;
- public abstract async SeatInfo[] list_seats () throws DBusError, IOError;
- public abstract async SeatInfo[] list_inhibitors () throws DBusError, IOError;
- public abstract async void activate_session (string session_id) throws DBusError, IOError;
- public abstract async void activate_session_on_seat (string session_id, string seat_id) throws DBusError, IOError;
- public abstract async void lock_session (string session_id) throws DBusError, IOError;
- public abstract async void unlock_session (string session_id) throws DBusError, IOError;
- public abstract async void lock_sessions () throws DBusError, IOError;
- public abstract async void unlock_sessions () throws DBusError, IOError;
- public abstract async void kill_session (string session_id, Systemd.Logind.SessionToKill session, int32 @signal) throws DBusError, IOError;
- public abstract async void kill_user (uint32 user_id, int32 @signal) throws DBusError, IOError;
- public abstract async void terminate_session (string session_id) throws DBusError, IOError;
- public abstract async void terminate_user (uint32 user_id) throws DBusError, IOError;
- public abstract async void terminate_seat (string seat_id) throws DBusError, IOError;
- public abstract async void set_user_linger (uint32 user_id, bool enable, bool interactive) throws DBusError, IOError;
- public abstract async void attach_Device (string seat_id, string sysfs_path, bool interactive) throws DBusError, IOError;
- public abstract async void flush_devices (bool interactive) throws DBusError, IOError;
- public abstract async void power_off (bool interactive) throws DBusError, IOError;
- public abstract async void reboot (bool interactive) throws DBusError, IOError;
- public abstract async void suspend (bool interactive) throws DBusError, IOError;
- public abstract async void hibernate (bool interactive) throws DBusError, IOError;
- public abstract async void hybrid_sleep (bool interactive) throws DBusError, IOError;
- public abstract async Systemd.Logind.CanResponse can_power_off () throws DBusError, IOError;
- public abstract async Systemd.Logind.CanResponse can_reboot () throws DBusError, IOError;
- public abstract async Systemd.Logind.CanResponse can_suspend () throws DBusError, IOError;
- public abstract async Systemd.Logind.CanResponse can_hybrid_sleep () throws DBusError, IOError;
- // FIXME: This does not build on stretch
- // logind-interfaces.c: In function 'org_freedesktop_login1_manager_proxy_inhibit_async':
- // logind-interfaces.c:3185:2: error: '_fd_list' undeclared (first use in this function)
-#if 0
- public abstract async UnixInputStream inhibit (string who, string what, string why, Systemd.Logind.InhibitMode mode) throws DBusError, IOError;
-#endif
-
- public abstract signal void session_new (string session_id, ObjectPath session);
- public abstract signal void session_removed (string session_id, ObjectPath session);
- public abstract signal void user_new (uint32 user_id, ObjectPath user);
- public abstract signal void user_removed (uint32 user_id, ObjectPath user);
- public abstract signal void seat_new (string seat_id, ObjectPath seat);
- public abstract signal void seat_removed (string seat_id, ObjectPath seat);
- public abstract signal void prepare_for_shutdown (bool before_shutdown);
- public abstract signal void prepare_for_sleep (bool before_shutdown);
-
- [DBus (name = "NAutoVTs")]
- public abstract uint32 auto_vt_count { get; }
- public abstract string[] kill_only_users { owned get; }
- public abstract string[] kill_exclude_users { owned get; }
- public abstract bool kill_user_processes { get; }
- public abstract bool idle_hint { get; }
- public abstract uint64 idle_since_hint { get; }
- public abstract uint64 idle_since_hint_monotonic { get; }
- public abstract string block_inhibited { owned get; }
- public abstract string delay_inhibited { owned get; }
- public abstract uint64 inhibit_delay_max_usec { get; }
- public abstract string handle_power_key { owned get; }
- public abstract string handle_suspend_key { owned get; }
- public abstract string handle_hibernate_key { owned get; }
- public abstract string handle_lid_switch { owned get; }
- public abstract string idle_action { owned get; }
- public abstract uint64 idle_action_usec { get; }
- public abstract bool preparing_for_shutdown { get; }
- public abstract bool preparing_for_sleep { get; }
- }
-}
diff --git a/lib/systemd/systemd-interfaces.vala b/lib/systemd/systemd-interfaces.vala
deleted file mode 100644
index 5d904e3..0000000
--- a/lib/systemd/systemd-interfaces.vala
+++ /dev/null
@@ -1,257 +0,0 @@
-/*
- * systemd -- vala bindings for systemd d-bus
- *
- * Copyright (C) 2014 David Lechner
- *
- * This file *was* part of systemd
- *
- * Copyright 2010 Lennart Poettering
- *
- * 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, either version 3 of the License, or
- * (at your option) any later version.
- *
- * 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 .
- */
-
-namespace org.freedesktop.systemd1 {
- public const string SERVICE_NAME = "org.freedesktop.systemd1";
-
- [DBus (name = "org.freedesktop.systemd1.Manager")]
- public interface Manager : DBusProxy {
- public const string OBJECT_PATH = "/org/freedesktop/systemd1";
-
- public struct UnitInfo {
- string id;
- string description;
- string load_state;
- string active_state;
- string sub_state;
- string following;
- ObjectPath unit_path;
- uint32 job_id;
- string job_type;
- ObjectPath job_path;
- }
-
- public struct UnitFileInfo {
- string name;
- string state;
- }
-
- public struct UnitLinkChangeInfo {
- string change_type;
- string symlink_name;
- string destination_name;
- }
-
- public struct UnitProperty {
- string name;
- Variant value;
- }
-
- public struct UnitPropertyGroup {
- string name;
- UnitProperty[] properties;
- }
-
- public struct JobInfo {
- uint32 id;
- string name;
- string type;
- string state;
- ObjectPath job_path;
- ObjectPath unit_path;
- }
-
- public abstract string version { owned get; }
- public abstract string features { owned get; }
- public abstract string tainted { owned get; }
- public abstract uint64 firmware_timestamp { get; }
- public abstract uint64 firmware_timestamp_monotonic { get; }
- public abstract uint64 loader_timestamp { get; }
- public abstract uint64 loader_timestamp_monotonic { get; }
- public abstract uint64 kernel_timestamp { get; }
- public abstract uint64 kernel_timestamp_monotonic { get; }
- [DBus (name = "InitRDTimestamp")]
- public abstract uint64 init_rd_timestamp { get; }
- [DBus (name = "InitRDTimestampMonotonic")]
- public abstract uint64 init_rd_timestamp_monotonic { get; }
- public abstract uint64 userspace_timestamp { get; }
- public abstract uint64 userspace_timestamp_monotonic { get; }
- public abstract uint64 finish_timestamp { get; }
- public abstract uint64 finish_timestamp_monotonic { get; }
- public abstract uint64 generators_start_timestamp { get; }
- public abstract uint64 generators_start_timestamp_monotonic { get; }
- public abstract uint64 generators_finish_timestamp { get; }
- public abstract uint64 generators_finish_timestamp_monotonic { get; }
- public abstract uint64 units_load_start_timestamp { get; }
- public abstract uint64 units_load_start_timestamp_monotonic { get; }
- public abstract uint64 units_load_finish_timestamp { get; }
- public abstract uint64 units_load_finish_timestamp_monotonic { get; }
- public abstract uint64 security_start_timestamp { get; }
- public abstract uint64 security_start_timestamp_monotonic { get; }
- public abstract uint64 security_finish_timestamp { get; }
- public abstract uint64 security_finish_timestamp_monotonic { get; }
- public abstract string log_level { owned get; }
- public abstract string log_target { owned get; }
- [DBus (name = "NNames")]
- public abstract uint32 names_count { get; }
- [DBus (name = "NJobs")]
- public abstract uint32 jobs_count { get; }
- [DBus (name = "NInstalledJobs")]
- public abstract uint32 installed_jobs_count { get; }
- [DBus (name = "NFailedJobs")]
- public abstract uint32 failed_jobs_count { get; }
- public abstract double progress { get; }
- public abstract string[] environment { owned get; }
- public abstract bool confirm_spawn { get; }
- public abstract bool show_status { get; }
- public abstract string[] unit_path { owned get; }
- public abstract string default_standard_output { owned get; }
- public abstract string default_standard_error { owned get; }
- [DBus (name = "RuntimeWatchdogUSec")]
- public abstract uint64 runtime_watchdog_usec { get; }
- [DBus (name = "ShutdownWatchdogUSec")]
- public abstract uint64 shutdown_watchdog_usec { get; }
- public abstract string virtualization { owned get; }
- public abstract string architecture { owned get; }
-
- public abstract async ObjectPath get_unit (string name) throws DBusError, IOError;
- public abstract async ObjectPath get_unit_by_pid (uint32 pid) throws DBusError, IOError;
- public abstract async ObjectPath load_unit (string name) throws DBusError, IOError;
- public abstract async ObjectPath start_unit (string name, Systemd.UnitMode mode) throws DBusError, IOError;
- public abstract async ObjectPath start_unit_replace (string old_unit, string new_unit, Systemd.UnitMode mode) throws DBusError, IOError;
- public abstract async ObjectPath stop_unit (string name, Systemd.UnitMode mode) throws DBusError, IOError;
- public abstract async ObjectPath reload_unit (string name, Systemd.UnitMode mode) throws DBusError, IOError;
- public abstract async ObjectPath restart_unit (string name, Systemd.UnitMode mode) throws DBusError, IOError;
- public abstract async ObjectPath try_restart_unit (string name, Systemd.UnitMode mode) throws DBusError, IOError;
- public abstract async ObjectPath reload_or_restart_unit (string name, Systemd.UnitMode mode) throws DBusError, IOError;
- public abstract async ObjectPath reload_or_try_restart_unit (string name, Systemd.UnitMode mode) throws DBusError, IOError;
- public abstract async void kill_unit (string name, Systemd.Who who, int32 @signal) throws DBusError, IOError;
- public abstract async void reset_failed_unit (string name) throws DBusError, IOError;
- public abstract async ObjectPath get_job (uint32 id) throws DBusError, IOError;
- public abstract async void cancel_job (uint32 id) throws DBusError, IOError;
- public abstract async void clear_jobs () throws DBusError, IOError;
- public abstract async void reset_failed () throws DBusError, IOError;
- public abstract async UnitInfo[] list_units () throws DBusError, IOError;
- public abstract async JobInfo[] list_jobs () throws DBusError, IOError;
- public abstract async void subscribe () throws DBusError, IOError;
- public abstract async void unsubscribe () throws DBusError, IOError;
- public abstract async ObjectPath create_snapshot (string name, bool cleanup) throws DBusError, IOError;
- public abstract async void remove_snapshot (string name) throws DBusError, IOError;
- public abstract async void reload () throws DBusError, IOError;
- public abstract async void reexecute () throws DBusError, IOError;
- public abstract async void exit () throws DBusError, IOError;
- public abstract async void reboot () throws DBusError, IOError;
- public abstract async void power_off () throws DBusError, IOError;
- public abstract async void halt () throws DBusError, IOError;
- [DBus (name = "KExec")]
- public abstract async void kexec () throws DBusError, IOError;
- public abstract async void switch_root (string new_root, string init) throws DBusError, IOError;
- public abstract async void set_environment (string[] names) throws DBusError, IOError;
- public abstract async void unset_environment (string[] names) throws DBusError, IOError;
- public abstract async void unset_and_set_environment (string[] unset, string[] @set) throws DBusError, IOError;
- public abstract async UnitFileInfo[] list_unit_files () throws DBusError, IOError;
- public abstract async Systemd.UnitFileState get_unit_file_state (string file) throws DBusError, IOError;
- public abstract async UnitLinkChangeInfo[] enable_unit_files (string[] files, bool runtime, bool force, out bool carries_install_info) throws DBusError, IOError;
- public abstract async UnitLinkChangeInfo[] disable_unit_files (string[] files, bool runtime) throws DBusError, IOError;
- public abstract async UnitLinkChangeInfo[] reenable_unit_files (string[] files, bool runtime, bool force, out bool carries_install_info) throws DBusError, IOError;
- public abstract async UnitLinkChangeInfo[] link_unit_files (string[] files, bool runtime) throws DBusError, IOError;
- public abstract async UnitLinkChangeInfo[] preset_unit_files (string[] files, bool runtime, bool force, out bool carries_install_info) throws DBusError, IOError;
- public abstract async UnitLinkChangeInfo[] mask_unit_files (string[] files, bool runtime) throws DBusError, IOError;
- public abstract async UnitLinkChangeInfo[] unmask_unit_files (string[] files, bool runtime) throws DBusError, IOError;
- public abstract async UnitLinkChangeInfo[] set_default_target (string[] files) throws DBusError, IOError;
- public abstract async string get_default_target () throws DBusError, IOError;
- public abstract async void set_unit_properties (string name, bool runtime, UnitProperty[] properties) throws DBusError, IOError;
- public abstract async ObjectPath start_transiend_unit (string name, string mode, UnitProperty[] properties, UnitPropertyGroup[] aux) throws DBusError, IOError;
-
- public abstract signal void unit_new (string id, ObjectPath path);
- public abstract signal void unit_removed (string id, ObjectPath path);
- public abstract signal void job_new (uint32 id, ObjectPath path, string unit);
- public abstract signal void job_removed (uint32 id, ObjectPath path, string unit, Systemd.JobResult res);
- public abstract signal void startup_finished (uint64 firmware, uint64 loader, uint64 kernel, uint64 initrd, uint64 userspace, uint64 total);
- public abstract signal void unit_files_changed ();
- public abstract signal void reloading (bool active);
- }
-
- [DBus (name = "org.freedesktop.systemd1.Unit")]
- public interface Unit : DBusProxy {
- public struct JobLink {
- uint32 id;
- ObjectPath path;
- }
-
- public abstract string id { owned get; }
- public abstract string[] names { owned get; }
- public abstract string following { owned get; }
- public abstract string[] requires { owned get; }
- public abstract string[] requires_overridable { owned get; }
- public abstract string[] requisite { owned get; }
- public abstract string[] requisite_overridable { owned get; }
- public abstract string[] wants { owned get; }
- public abstract string[] required_by { owned get; }
- public abstract string[] required_by_overridable { owned get; }
- public abstract string[] wanted_by { owned get; }
- public abstract string[] conflicts { owned get; }
- public abstract string[] conflicted_by { owned get; }
- public abstract string[] before { owned get; }
- public abstract string[] after { owned get; }
- public abstract string[] on_failure { owned get; }
- public abstract string description { owned get; }
- public abstract string load_state { owned get; }
- public abstract Systemd.UnitActiveState active_state { owned get; }
- public abstract string sub_state { owned get; }
- public abstract string fragment_path { owned get; }
- public abstract Systemd.UnitFileState unit_file_state { get; }
- public abstract uint64 inactive_exit_timestamp { owned get; }
- public abstract uint64 active_enter_timestamp { owned get; }
- public abstract uint64 active_exit_timestamp { owned get; }
- public abstract uint64 inactive_enter_timestamp { owned get; }
- public abstract bool can_start { get; }
- public abstract bool can_stop { get; }
- public abstract bool can_reload { get; }
- public abstract JobLink job { owned get; }
- public abstract bool recursive_stop { get; }
- public abstract bool stop_when_unneeded { get; }
- public abstract bool refuse_manual_start { get; }
- public abstract bool refuse_manual_stop { get; }
- public abstract bool default_dependencies { get; }
- public abstract string default_control_group { owned get; }
- public abstract string[] control_groups { owned get; }
- public abstract bool need_daemon_reload { get; }
- public abstract uint64 job_timeout_usec { get; }
-
- public abstract async ObjectPath start (Systemd.UnitMode mode) throws DBusError, IOError;
- public abstract async ObjectPath stop (Systemd.UnitMode mode) throws DBusError, IOError;
- public abstract async ObjectPath reload (Systemd.UnitMode mode) throws DBusError, IOError;
- public abstract async ObjectPath restart (Systemd.UnitMode mode) throws DBusError, IOError;
- public abstract async ObjectPath try_restart (Systemd.UnitMode mode) throws DBusError, IOError;
- public abstract async ObjectPath reload_or_restart (Systemd.UnitMode mode) throws DBusError, IOError;
- public abstract async ObjectPath reload_or_try_restart (Systemd.UnitMode mode) throws DBusError, IOError;
-
- public abstract async void reset_failed () throws DBusError, IOError;
- }
-
- [DBus (name = "org.freedesktop.systemd1.Job")]
- public interface Job : DBusProxy {
- public struct UnitLink {
- string id;
- ObjectPath path;
- }
-
- public abstract uint32 id { get; }
- public abstract string state { owned get; }
- public abstract string job_type { owned get; }
- public abstract UnitLink unit { owned get; }
-
- public abstract async void cancel () throws DBusError, IOError;
- }
-}
diff --git a/release.sh b/release.sh
deleted file mode 100755
index c7b2a07..0000000
--- a/release.sh
+++ /dev/null
@@ -1,24 +0,0 @@
-#!/bin/bash
-#
-# Maintainer script for publishing releases.
-
-set -e
-
-source=$(dpkg-parsechangelog -S Source)
-version=$(dpkg-parsechangelog -S Version)
-distribution=$(dpkg-parsechangelog -S Distribution)
-codename=$(debian-distro-info --codename --${distribution})
-
-OS=debian DIST=${codename} ARCH=armhf pbuilder-ev3dev build
-OS=debian DIST=${codename} ARCH=armel PBUILDER_OPTIONS="--binary-arch" pbuilder-ev3dev build
-OS=raspbian DIST=${codename} ARCH=armhf pbuilder-ev3dev build
-
-debsign ~/pbuilder-ev3dev/debian/${codename}-armhf/${source}_${version}_armhf.changes
-debsign ~/pbuilder-ev3dev/debian/${codename}-armel/${source}_${version}_armel.changes
-debsign ~/pbuilder-ev3dev/raspbian/${codename}-armhf/${source}_${version}_armhf.changes
-
-dput ev3dev-debian ~/pbuilder-ev3dev/debian/${codename}-armhf/${source}_${version}_armhf.changes
-dput ev3dev-debian ~/pbuilder-ev3dev/debian/${codename}-armel/${source}_${version}_armel.changes
-dput ev3dev-raspbian ~/pbuilder-ev3dev/raspbian/${codename}-armhf/${source}_${version}_armhf.changes
-
-gbp buildpackage --git-tag-only
diff --git a/setup.cmake b/setup.cmake
deleted file mode 100644
index 905b32a..0000000
--- a/setup.cmake
+++ /dev/null
@@ -1,8 +0,0 @@
-# Create the build directory and initalize it
-
-file (MAKE_DIRECTORY build)
-
-execute_process (
- COMMAND ${CMAKE_COMMAND} -DCMAKE_BUILD_TYPE=string:Debug -DBRICKMAN_TEST=bool:Yes ..
- WORKING_DIRECTORY build
-)
diff --git a/src/GlobalManager.vala b/src/GlobalManager.vala
deleted file mode 100644
index 4c0c6a4..0000000
--- a/src/GlobalManager.vala
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * brickman -- Brick Manager for LEGO MINDSTORMS EV3/ev3dev
- *
- * Copyright 2015 David Lechner
- *
- * 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; either version 2 of the License, or
- * (at your option) any later version.
- *
- * 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, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
- * MA 02110-1301, USA.
- */
-
-/* FileBrowserController.vala - File Browser controller */
-
-using Linux.Input;
-
-namespace BrickManager {
-
- /**
- * Program-defined LED states.
- *
- * Brickman uses the LEDs on the EV3 to provide feedback to the user using
- * these states.
- */
- public enum LedState {
- /**
- * Indicates that brickman is running normally (ready for input).
- */
- NORMAL,
-
- /**
- * Indicates that brickman is busy and will not respond to input.
- */
- BUSY,
-
- /**
- * Indicates that user program is running.
- */
- USER
- }
-
- /**
- * Object for hosting global instances of various managers used in brickman
- */
- public class GlobalManager : Object {
- bool have_ev3_leds = false;
- Ev3devKit.Devices.Led ev3_left_green_led;
- Ev3devKit.Devices.Led ev3_right_green_led;
- Ev3devKit.Devices.Led ev3_left_red_led;
- Ev3devKit.Devices.Led ev3_right_red_led;
-
- /**
- * Gets the device manager for interacting with hardware devices.
- */
- public Ev3devKit.Devices.DeviceManager device_manager { get; private set; }
-
- public GlobalManager () {
- device_manager = new Ev3devKit.Devices.DeviceManager ();
- if (Ev3devKit.Devices.Cpu.get_model ().has_prefix ("LEGO MINDSTORMS EV3")) {
- try {
- ev3_left_green_led = device_manager.get_led (
- Ev3devKit.Devices.Led.EV3_LEFT, "green");
- ev3_right_green_led = device_manager.get_led (
- Ev3devKit.Devices.Led.EV3_RIGHT, "green");
- ev3_left_red_led = device_manager.get_led (
- Ev3devKit.Devices.Led.EV3_LEFT, "red");
- ev3_right_red_led = device_manager.get_led (
- Ev3devKit.Devices.Led.EV3_RIGHT, "red");
- have_ev3_leds = true;
- } catch (Error err) {
- warning ("%s", err.message);
- }
- }
- }
-
- public void set_leds (LedState state) {
- if (!have_ev3_leds)
- return;
- try {
- switch (state) {
- case LedState.NORMAL:
- ev3_left_green_led.set_trigger ("default-on");
- ev3_right_green_led.set_trigger ("default-on");
- ev3_left_red_led.set_trigger ("none");
- ev3_left_red_led.set_brightness (0);
- ev3_right_red_led.set_trigger ("none");
- ev3_right_red_led.set_brightness (0);
- break;
- case LedState.BUSY:
- ev3_left_green_led.set_trigger ("none");
- ev3_left_green_led.set_brightness (0);
- ev3_right_green_led.set_trigger ("none");
- ev3_right_green_led.set_brightness (0);
- ev3_left_red_led.set_trigger ("default-on");
- ev3_right_red_led.set_trigger ("default-on");
- break;
- case LedState.USER:
- ev3_left_green_led.set_trigger ("default-on");
- ev3_right_green_led.set_trigger ("default-on");
- ev3_left_red_led.set_trigger ("default-on");
- ev3_right_red_led.set_trigger ("default-on");
- break;
- }
- } catch (Error err) {
- critical ("%s", err.message);
- }
- }
- }
-}
diff --git a/src/Version.vala.in b/src/Version.vala.in
deleted file mode 100644
index f98f9af..0000000
--- a/src/Version.vala.in
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * brickman -- Brick Manager for LEGO Mindstorms EV3/ev3dev
- *
- * Copyright 2014-2015 David Lechner
- *
- * 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; either version 2 of the License, or
- * (at your option) any later version.
- *
- * 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, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
- * MA 02110-1301, USA.
- */
-
-/* Version.vala - Version info from CMakeLists.txt (automatically generated) */
-
-namespace BrickManager {
- const string EXEC_NAME = "@EXEC_NAME@";
- const string RELEASE_NAME = "@RELEASE_NAME@";
- const string VERSION = "@PROJECT_VERSION@";
- const string DATA_DIR = "@PROJECT_NAME@";
-}
diff --git a/src/controller/AboutController.vala b/src/controller/AboutController.vala
deleted file mode 100644
index afecb98..0000000
--- a/src/controller/AboutController.vala
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * brickman -- Brick Manager for LEGO MINDSTORMS EV3/ev3dev
- *
- * Copyright 2014-2015 David Lechner
- *
- * 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; either version 2 of the License, or
- * (at your option) any later version.
- *
- * 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, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
- * MA 02110-1301, USA.
- */
-
-/* AboutController.vala - Controller for about window */
-
-using Ev3devKit.Devices;
-using Ev3devKit.Ui;
-
-namespace BrickManager {
- public class AboutController : Object, IBrickManagerModule {
- AboutWindow about_window;
-
- public string display_name { get { return "About"; } }
-
- public void show_main_window () {
- if (about_window == null) {
- create_about_window ();
- }
- about_window.show ();
- }
-
- void create_about_window () {
- about_window = new AboutWindow (display_name);
- var utsname = Posix.UTSName ();
- if (Posix.uname (ref utsname) == 0) {
- about_window.kernel_version = utsname.release;
- } else {
- warning ("Failed to get kernel version.");
- }
- about_window.model_name = Cpu.get_model ();
- about_window.revision = Cpu.get_revision ();
- about_window.serial_number = Cpu.get_serial_number ();
- }
- }
-}
diff --git a/src/controller/BatteryController.vala b/src/controller/BatteryController.vala
deleted file mode 100644
index af3ecb6..0000000
--- a/src/controller/BatteryController.vala
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * brickman -- Brick Manager for LEGO MINDSTORMS EV3/ev3dev
- *
- * Copyright 2014-2015 David Lechner
- *
- * 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; either version 2 of the License, or
- * (at your option) any later version.
- *
- * 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, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
- * MA 02110-1301, USA.
- */
-
-/* BatteryController.vala - Controller for monitoring battery */
-
-using Ev3devKit.Devices;
-using Ev3devKit.Ui;
-
-namespace BrickManager {
- public class BatteryController : Object, IBrickManagerModule {
- BatteryInfoWindow battery_window;
- internal BatteryStatusBarItem battery_status_bar_item;
- PowerSupply? system_power_supply;
-
- public string display_name { get { return "Battery"; } }
-
- public void show_main_window () {
- if (battery_window == null) {
- create_battery_window ();
- }
- battery_window.show ();
- }
-
- public BatteryController () {
- battery_status_bar_item = new BatteryStatusBarItem ();
- system_power_supply = global_manager.device_manager.get_system_power_supply ();
- if (system_power_supply == null) {
- battery_status_bar_item.visible = false;
- warning ("Could not get system power supply.");
- } else {
- update_battery_info ();
- Timeout.add_seconds (5, update_battery_info);
- }
- }
-
- void create_battery_window () {
- battery_window = new BatteryInfoWindow (display_name);
- if (system_power_supply == null) {
- battery_window.available = false;
- } else {
- battery_window.technology = system_power_supply.technology.to_string ();
- update_battery_info ();
- }
- }
-
- bool update_battery_info () {
- if (system_power_supply == null) {
- return false;
- }
-
- var voltage = system_power_supply.voltage;
- battery_status_bar_item.voltage = voltage;
-
- if (battery_window != null) {
- battery_window.has_voltage = system_power_supply.has_voltage;
- battery_window.voltage = voltage;
- battery_window.has_current = system_power_supply.has_current;
- battery_window.current = system_power_supply.current * 1000;
- battery_window.has_power = system_power_supply.has_power;
- battery_window.power = system_power_supply.power;
- }
-
- return true;
- }
- }
-}
diff --git a/src/controller/BluetoothController.vala b/src/controller/BluetoothController.vala
deleted file mode 100644
index 6a793f6..0000000
--- a/src/controller/BluetoothController.vala
+++ /dev/null
@@ -1,349 +0,0 @@
-/*
- * brickman -- Brick Manager for LEGO MINDSTORMS EV3/ev3dev
- *
- * Copyright 2014-2015 David Lechner
- *
- * 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; either version 2 of the License, or
- * (at your option) any later version.
- *
- * 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, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
- * MA 02110-1301, USA.
- */
-
-/* BluetoothController.vala - Controller for Bluetooth (BlueZ) */
-
-using Bluez5;
-using Ev3devKit.Ui;
-
-namespace BrickManager {
- public class BluetoothController : Object, IBrickManagerModule {
- BluetoothWindow main_window;
- internal BluetoothStatusBarItem status_bar_item;
- Manager manager;
- Bluez5Agent? agent;
- ObjectPath agent_object_path;
- string? built_in_adapter_address;
- List adapter_list;
- Adapter? selected_adapter;
- Binding? selected_adapter_visible_binding;
- Binding? selected_adapter_scanning_binding;
- uint connection_count = 0;
-
- public string display_name { get { return "Bluetooth"; } }
-
- public bool connected { get { return connection_count > 0; } }
-
- public signal void show_network_requested (string mac_address);
-
- internal uint adapter_count { get; set; default = 0; }
-
- public void show_main_window () {
- main_window.show ();
- }
-
- public BluetoothController () {
- adapter_list = new List ();
- main_window = new BluetoothWindow (display_name) {
- loading = true,
- available = false
- };
- main_window.scan_selected.connect (on_scan_selected);
- main_window.closed.connect (() => {
- if (selected_adapter != null && selected_adapter.discovering)
- selected_adapter.stop_discovery.begin ();
- });
-
- status_bar_item = new BluetoothStatusBarItem ();
- bind_property ("connected", status_bar_item, "connected");
-
- /* Use udev to find the address of the built-in Bluetooth adapter */
- var udev_client = new GUdev.Client (null);
- var udev_devices = udev_client.query_by_subsystem ("bluetooth");
- if (udev_devices != null) {
- foreach (var udev_device in udev_devices) {
- var parent = udev_device.get_parent ();
- if (parent != null && parent.get_name () == "ttyS2") {
- // FIXME: there is no such sysfs attr
- var address = udev_device.get_sysfs_attr ("address");
- if (address != null) {
- built_in_adapter_address = address.up ();
- break;
- }
- }
- }
- }
-
- try {
- agent = new Bluez5Agent ();
- var bus = Bus.get_sync (BusType.SYSTEM);
- agent_object_path = new ObjectPath ("/org/ev3dev/brickman/bluez5_agent");
- bus.register_object (agent_object_path, agent);
- } catch (IOError err) {
- critical ("%s", err.message);
- }
-
- Bus.watch_name (BusType.SYSTEM, Manager.SERVICE_NAME,
- BusNameWatcherFlags.AUTO_START, () => {
- // Called when the bluez service is registered.
- init_async.begin ((obj, res) => {
- try {
- init_async.end (res);
- main_window.loading = false;
- } catch (Error err) {
- critical ("%s", err.message);
- }
- });
- }, () => {
- // Called when the bluez service is disappears (shutdown or crashed).
- main_window.loading = true;
- var devices = manager.get_devices ();
- foreach (var device in devices) {
- var menu_item = main_window.find_menu_item (device);
- main_window.remove_menu_item (menu_item);
- }
- set_selected_adapter (null);
- manager = null;
- });
- }
-
- public void bind_powered (Object obj, string property) {
- obj.bind_property (property, main_window, "powered",
- BindingFlags.SYNC_CREATE | BindingFlags.BIDIRECTIONAL);
- obj.bind_property (property, status_bar_item, "visible",
- BindingFlags.SYNC_CREATE | BindingFlags.BIDIRECTIONAL);
- }
-
- async void init_async () throws Error {
- manager = yield Manager.new_async ();
- manager.adapter_added.connect (on_adapter_added);
- manager.adapter_removed.connect (on_adapter_removed);
- manager.device_added.connect (on_device_added);
- manager.device_removed.connect (on_device_removed);
- foreach (var adapter in manager.get_adapters ())
- on_adapter_added (adapter);
- foreach (var device in manager.get_devices ())
- on_device_added (device);
- try {
- yield manager.agent_manager.register_agent (agent_object_path,
- AgentManagerCapability.KEYBOARD_DISPLAY);
- yield manager.agent_manager.request_default_agent (agent_object_path);
- } catch (BlueZError err) {
- critical ("%s", err.message);
- }
- }
-
- void set_selected_adapter (Adapter? new_adapter) {
- if (selected_adapter != null) {
- if (selected_adapter.discovering)
- selected_adapter.stop_discovery.begin ();
- selected_adapter_visible_binding.unbind ();
- selected_adapter_visible_binding = null;
- selected_adapter_scanning_binding.unbind ();
- selected_adapter_scanning_binding = null;
- }
- selected_adapter = new_adapter;
- if (selected_adapter != null) {
- selected_adapter_visible_binding = selected_adapter.bind_property (
- "discoverable", main_window, "bt-visible",
- BindingFlags.SYNC_CREATE | BindingFlags.BIDIRECTIONAL);
- selected_adapter_scanning_binding = selected_adapter.bind_property (
- "discovering", main_window, "scanning", BindingFlags.SYNC_CREATE);
- }
- main_window.available = selected_adapter != null;
- }
-
- void on_scan_selected () {
- if (selected_adapter == null) {
- critical ("No adapter is selected.");
- return;
- }
-
- if (selected_adapter.discovering) {
- selected_adapter.stop_discovery.begin ((obj, res) => {
- try {
- selected_adapter.stop_discovery.end (res);
- } catch (Error err) {
- critical ("%s", err.message);
- }
- });
- } else {
- selected_adapter.start_discovery.begin ((obj, res) => {
- try {
- selected_adapter.start_discovery.end (res);
- } catch (Error err) {
- critical ("%s", err.message);
- }
- });
- }
- }
-
- void on_adapter_added (Adapter adapter) {
- adapter_list.append (adapter);
- adapter_count++;
- // make the new adapter the selected adapter unless it is the built-in adapter.
- if (selected_adapter == null
- || selected_adapter.address == built_in_adapter_address)
- set_selected_adapter (adapter);
- }
-
- void on_adapter_removed (Adapter adapter) {
- // if the selected adapter is removed, replace it with the first adapter
- // that is not the built-in adapter.
- adapter_list.remove (adapter);
- adapter.unref (); // List.remove () does not unref automatically
- adapter_count--;
- if (selected_adapter == adapter) {
- set_selected_adapter (null);
- foreach (var a in adapter_list) {
- if (a.address != built_in_adapter_address) {
- set_selected_adapter (a);
- break;
- }
- }
- // If the built-in adapter is the only adapter available, then use it.
- if (selected_adapter == null && adapter_list != null) {
- set_selected_adapter (adapter_list.data);
- }
- }
- }
-
- void on_device_added (Device device) {
- var menu_item = new BluetoothDeviceMenuItem ();
- device.bind_property ("alias", menu_item, "name",
- BindingFlags.SYNC_CREATE);
- device.bind_property ("connected", menu_item, "connected",
- BindingFlags.SYNC_CREATE);
- device.adapter.bind_property ("alias", menu_item, "adapter",
- BindingFlags.SYNC_CREATE);
- bind_property ("adapter-count", menu_item, "show-adapter",
- BindingFlags.SYNC_CREATE, transform_adapter_count_to_show_adapter);
- menu_item.represented_object = device;
- menu_item.button.pressed.connect (() => {
- var device_window = new BluetoothDeviceWindow () {
- loading = false
- };
- weak BluetoothDeviceWindow weak_device_window = device_window;
- device.bind_property ("alias", device_window, "title",
- BindingFlags.SYNC_CREATE);
- device.bind_property ("address", device_window, "address",
- BindingFlags.SYNC_CREATE);
- device.bind_property ("paired", device_window, "paired",
- BindingFlags.SYNC_CREATE);
- device.bind_property ("connected", device_window, "connected",
- BindingFlags.SYNC_CREATE);
- device.bind_property ("uuids", device_window, "has_network",
- BindingFlags.SYNC_CREATE, transform_uuids_to_has_network);
- device_window.connect_selected.connect (() => {
- if (!device.paired)
- pair_device.begin (device);
- else if (device.connected)
- disconnect_device.begin (device);
- else
- connect_device.begin (device);
- });
- device_window.remove_selected.connect (() =>
- remove_device.begin (device));
- device_window.network_selected.connect (() =>
- show_network_requested (device.alias));
- var handler_id = manager.device_removed.connect (() =>
- weak_device_window.close ());
- device_window.weak_ref (() =>
- SignalHandler.disconnect (manager, handler_id));
- device_window.show ();
- });
- main_window.add_menu_item (menu_item);
-
- // Bluez DBus API does not have a global "connected" property so we
- // have to keep track of all of the connections ourselves in order
- // to make the Bluetooth status bar icon work.
- weak Device weak_device = device;
- device.notify["connected"].connect (() => {
- if (weak_device.connected)
- connection_count++;
- else
- connection_count--;
- notify_property ("connected");
- });
- if (device.connected) {
- connection_count++;
- notify_property ("connected");
- }
- }
-
- void on_device_removed (Device device) {
- var menu_item = main_window.find_menu_item (device);
- main_window.remove_menu_item (menu_item);
-
- if (device.connected) {
- connection_count--;
- notify_property ("connected");
- }
- }
-
- // TODO: some kind of "spinner" to indicate that we are busy would be
- // nice for the next 4 methods
-
- async void remove_device (Device device) {
- try {
- yield device.adapter.remove_device (device);
- } catch (Error err) {
- var dialog = new MessageDialog ("Error", err.message);
- dialog.show ();
- }
- }
-
- async void pair_device (Device device) {
- try {
- yield device.pair ();
- device.trusted = true;
- } catch (Error err) {
- var dialog = new MessageDialog ("Error", err.message);
- dialog.show ();
- }
- }
-
- async void disconnect_device (Device device) {
- try {
- yield device.disconnect_device ();
- } catch (Error err) {
- var dialog = new MessageDialog ("Error", err.message);
- dialog.show ();
- }
- }
-
- async void connect_device (Device device) {
- try {
- yield device.connect_device ();
- } catch (Error err) {
- var dialog = new MessageDialog ("Error", err.message);
- dialog.show ();
- }
- }
-
- bool transform_adapter_count_to_show_adapter (Binding binding, Value source, ref Value target) {
- target = adapter_count > 1;
- return true;
- }
-
- bool transform_uuids_to_has_network (Binding binding, Value source, ref Value target) {
- target = false;
- var uuids = (string[])source;
- foreach (var uuid in uuids) {
- if (uuid == Bluez5.Uuid.NAP || uuid == Bluez5.Uuid.GN || uuid == Bluez5.Uuid.PANU) {
- target = true;
- break;
- }
- }
- return true;
- }
- }
-}
\ No newline at end of file
diff --git a/src/controller/DeviceBrowserController.vala b/src/controller/DeviceBrowserController.vala
deleted file mode 100644
index 3907fbb..0000000
--- a/src/controller/DeviceBrowserController.vala
+++ /dev/null
@@ -1,451 +0,0 @@
-/*
- * brickman -- Brick Manager for LEGO MINDSTORMS EV3/ev3dev
- *
- * Copyright 2015 David Lechner
- *
- * 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; either version 2 of the License, or
- * (at your option) any later version.
- *
- * 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, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
- * MA 02110-1301, USA.
- */
-
-/* DeviceBrowserController.vala - Controller for Browsing Devices (sensors, motors, etc.) */
-
-using Ev3devKit.Devices;
-using Ev3devKit.Ui;
-
-namespace BrickManager {
- public class DeviceBrowserController : Object, IBrickManagerModule {
- const int WATCH_MS = 500;
-
- DeviceManager manager;
- DeviceBrowserWindow device_browser_window;
- PortBrowserWindow? port_browser_window;
- SensorBrowserWindow? sensor_browser_window;
- MotorBrowserWindow? motor_browser_window;
-
- public string display_name { get { return "Device Browser"; } }
-
- public void show_main_window () {
- if (device_browser_window == null) {
- create_device_browser_window ();
- }
- device_browser_window.show ();
- }
-
- void create_device_browser_window () {
- manager = global_manager.device_manager;
- device_browser_window = new DeviceBrowserWindow (display_name);
- device_browser_window.ports_menu_item_selected.connect (
- on_ports_menu_item_selected);
- device_browser_window.sensors_menu_item_selected.connect (
- on_sensors_menu_item_selected);
- device_browser_window.motors_menu_item_selected.connect (
- on_motors_menu_item_selected);
- }
-
- void on_ports_menu_item_selected () {
- port_browser_window = new PortBrowserWindow ();
- var port_added_handler_id = manager.port_added.connect (on_port_added);
- manager.get_ports ().foreach (on_port_added);
- // connect_after ensures that this signal handler is called after
- // the others that are added in on_port_added (). This is important
- // so that we don't set port_browser_window = null before all of
- // the other signal handlers have run.
- port_browser_window.closed.connect_after (() => {
- manager.disconnect (port_added_handler_id);
- port_browser_window = null;
- });
- port_browser_window.show ();
- }
-
- void on_port_added (Port port) {
- var menu_item = new Ev3devKit.Ui.MenuItem.with_right_arrow (port.address);
- var button_pressed_handler_id = menu_item.button.pressed.connect (() => {
- var window = new PortInfoWindow (port.address, port.device_name,
- port.driver_name);
- port.bind_property ("mode", window, "mode", BindingFlags.SYNC_CREATE);
- port.bind_property ("status", window, "status", BindingFlags.SYNC_CREATE);
- port.bind_property ("status", window, "can-set-device", BindingFlags.SYNC_CREATE,
- transform_port_status_to_can_set_device);
- var set_device_button_pressed_handler_id = window.set_device_button_pressed.connect (() => {
- // TODO: when we add support for more types of drivers here, we will
- // need to add some logic here to lookup status.
- var device_dialog = new SelectFromListDialog (manager.get_nxt_analog_sensor_driver_names ());
- var item_selected_handler_id = device_dialog.item_selected.connect ((item) => {
- try {
- port.set_device (item);
- } catch (Error err) {
- var error_dialog = new MessageDialog ("Error", err.message);
- error_dialog.show ();
- }
- });
- var notify_connected_handler_id = port.notify["connected"].connect (() => {
- device_dialog.close ();
- });
- ulong dialog_closed_handler_id = 0;
- dialog_closed_handler_id = device_dialog.closed.connect (() => {
- device_dialog.disconnect (item_selected_handler_id);
- port.disconnect (notify_connected_handler_id);
- device_dialog.disconnect (dialog_closed_handler_id);
- });
- device_dialog.show ();
- });
- var set_mode_button_pressed_handler_id = window.set_mode_button_pressed.connect (() => {
- var mode_dialog = new SelectFromListDialog (port.modes);
- var item_selected_handler_id = mode_dialog.item_selected.connect ((item) => {
- try {
- port.set_mode (item);
- } catch (Error err) {
- var error_dialog = new MessageDialog ("Error", err.message);
- error_dialog.show ();
- }
- });
- var notify_connected_handler_id = port.notify["connected"].connect (() => {
- mode_dialog.close ();
- });
- ulong dialog_closed_handler_id = 0;
- dialog_closed_handler_id = mode_dialog.closed.connect (() => {
- mode_dialog.disconnect (item_selected_handler_id);
- port.disconnect (notify_connected_handler_id);
- mode_dialog.disconnect (dialog_closed_handler_id);
- });
- mode_dialog.show ();
- });
- var notify_connected_handler_id = port.notify["connected"].connect (() => {
- var dialog = new MessageDialog ("Port Removed",
- "Port %s was disconnected.".printf (port.address));
- dialog.show ();
- window.close ();
- });
- ulong window_closed_handler_id = 0;
- window_closed_handler_id = window.closed.connect (() => {
- window.disconnect (set_device_button_pressed_handler_id);
- window.disconnect (set_mode_button_pressed_handler_id);
- port.disconnect (notify_connected_handler_id);
- window.disconnect (window_closed_handler_id);
- });
- window.show ();
- });
- // TODO: figure out how to sort menu items
- port_browser_window.menu.add_menu_item (menu_item);
- ulong notify_connected_handler_id = 0;
- ulong window_closed_handler_id = 0;
- notify_connected_handler_id = port.notify["connected"].connect (() => {
- port_browser_window.menu.remove_menu_item (menu_item);
- menu_item.button.disconnect (button_pressed_handler_id);
- port.disconnect (notify_connected_handler_id);
- port_browser_window.disconnect (window_closed_handler_id);
- });
- window_closed_handler_id = port_browser_window.closed.connect (() => {
- menu_item.button.disconnect (button_pressed_handler_id);
- port.disconnect (notify_connected_handler_id);
- port_browser_window.disconnect (window_closed_handler_id);
- });
- }
-
- bool transform_port_status_to_can_set_device (Binding binding,
- Value source_value, ref Value target_value)
- {
- // Currently only support setting device for nxt-analog-sensor devices
- target_value.set_boolean (source_value.get_string () == "nxt-analog");
- return true;
- }
-
-
-
- void on_sensors_menu_item_selected () {
- sensor_browser_window = new SensorBrowserWindow ();
- var sensor_added_handler_id = manager.sensor_added.connect (on_sensor_added);
- manager.get_sensors ().foreach (on_sensor_added);
- // connect_after ensures that this signal handler is called after
- // the others that are added in on_sensor_added (). This is important
- // so that we don't set sensor_browser_window = null before all of
- // the other signal handlers have run.
- sensor_browser_window.closed.connect_after (() => {
- manager.disconnect (sensor_added_handler_id);
- sensor_browser_window = null;
- });
- sensor_browser_window.show ();
- }
-
- void on_sensor_added (Sensor sensor) {
- var menu_item = new Ev3devKit.Ui.MenuItem.with_right_arrow ("%s at %s".printf (sensor.driver_name,
- sensor.address));
- var button_pressed_handler_id = menu_item.button.pressed.connect (() => {
- var window = new SensorInfoWindow (sensor.driver_name, sensor.device_name,
- sensor.address, sensor.commands != null);
- sensor.bind_property ("mode", window, "mode", BindingFlags.SYNC_CREATE);
- var watch_values_handler_id = window.watch_values_selected.connect (() => {
- // TODO: Do we want to support showing more than one value?
- var value_dialog = new SensorValueDialog ();
- var value_timeout_id = Timeout.add (WATCH_MS, () => {
- try {
- value_dialog.value_text = "%.*f".printf (sensor.decimals,
- sensor.get_float_value (0));
- if (sensor.units != null)
- value_dialog.value_text += " %s".printf (sensor.units);
- } catch (Error err) {
- value_dialog.close ();
- var error_dialog = new MessageDialog ("Error", err.message);
- error_dialog.show ();
- // this Timeout is removed by the value_dialog.closed handler
- // so we just fall through and return CONTINUE here instead
- // of returning REMOVE.
- }
- return Source.CONTINUE;
- });
- var notify_connected_handler_id = sensor.notify["connected"].connect (() => {
- value_dialog.close ();
- });
- ulong dialog_closed_handler_id = 0;
- dialog_closed_handler_id = value_dialog.closed.connect (() => {
- Source.remove (value_timeout_id);
- sensor.disconnect (notify_connected_handler_id);
- value_dialog.disconnect (dialog_closed_handler_id);
- });
- value_dialog.show ();
- });
- var set_mode_selected_handler_id = window.set_mode_selected.connect (() => {
- var mode_dialog = new SelectFromListDialog (sensor.modes);
- var item_selected_handler_id = mode_dialog.item_selected.connect ((item) => {
- try {
- sensor.set_mode (item);
- } catch (Error err) {
- var error_dialog = new MessageDialog ("Error", err.message);
- error_dialog.show ();
- }
- });
- var notify_connected_handler_id = sensor.notify["connected"].connect (() => {
- mode_dialog.close ();
- });
- ulong dialog_closed_handler_id = 0;
- dialog_closed_handler_id = mode_dialog.closed.connect (() => {
- mode_dialog.disconnect (item_selected_handler_id);
- sensor.disconnect (notify_connected_handler_id);
- mode_dialog.disconnect (dialog_closed_handler_id);
- });
- mode_dialog.show ();
- });
- var send_command_selected_handler_id = window.send_command_selected.connect (() => {
- var command_dialog = new SelectFromListDialog (sensor.commands);
- var item_selected_handler_id = command_dialog.item_selected.connect ((item) => {
- try {
- sensor.send_command (item);
- } catch (Error err) {
- var error_dialog = new MessageDialog ("Error", err.message);
- error_dialog.show ();
- }
- });
- var notify_connected_handler_id = sensor.notify["connected"].connect (() => {
- command_dialog.close ();
- });
- ulong dialog_closed_handler_id = 0;
- dialog_closed_handler_id = command_dialog.closed.connect (() => {
- command_dialog.disconnect (item_selected_handler_id);
- sensor.disconnect (notify_connected_handler_id);
- command_dialog.disconnect (dialog_closed_handler_id);
- });
- command_dialog.show ();
- });
- ulong notify_connected_handler_id = 0;
- ulong window_closed_handler_id = 0;
- notify_connected_handler_id = sensor.notify["connected"].connect (() => {
- var dialog = new MessageDialog ("Sensor Removed",
- "Sensor %s at %s was disconnected.".printf (sensor.driver_name,
- sensor.address));
- dialog.show ();
- window.close ();
- });
- window_closed_handler_id = window.closed.connect (() => {
- window.disconnect (watch_values_handler_id);
- window.disconnect (set_mode_selected_handler_id);
- window.disconnect (send_command_selected_handler_id);
- sensor.disconnect (notify_connected_handler_id);
- window.disconnect (window_closed_handler_id);
- });
- window.show ();
- });
- // TODO: figure out how to sort menu items
- sensor_browser_window.menu.add_menu_item (menu_item);
- ulong notify_connected_handler_id = 0;
- ulong window_closed_handler_id = 0;
- notify_connected_handler_id = sensor.notify["connected"].connect (() => {
- sensor_browser_window.menu.remove_menu_item (menu_item);
- menu_item.button.disconnect (button_pressed_handler_id);
- sensor.disconnect (notify_connected_handler_id);
- sensor_browser_window.disconnect (window_closed_handler_id);
- });
- window_closed_handler_id = sensor_browser_window.closed.connect (() => {
- menu_item.button.disconnect (button_pressed_handler_id);
- sensor.disconnect (notify_connected_handler_id);
- sensor_browser_window.disconnect (window_closed_handler_id);
- });
- }
-
- void on_motors_menu_item_selected () {
- motor_browser_window = new MotorBrowserWindow ();
- var tacho_motor_added_handler_id = manager.tacho_motor_added.connect (on_tacho_motor_added);
- manager.get_tacho_motors ().foreach (on_tacho_motor_added);
- var dc_motor_added_handler_id = manager.dc_motor_added.connect (on_dc_motor_added);
- manager.get_dc_motors ().foreach (on_dc_motor_added);
- var servo_motor_added_handler_id = manager.servo_motor_added.connect (on_servo_motor_added);
- manager.get_servo_motors ().foreach (on_servo_motor_added);
- // connect_after ensures that this signal handler is called after
- // the others that are added in on_tacho_motor_added(). This is important
- // so that we don't set motor_browser_window = null before all of
- // the other signal handlers have run.
- motor_browser_window.closed.connect_after (() => {
- manager.disconnect (tacho_motor_added_handler_id);
- manager.disconnect (dc_motor_added_handler_id);
- manager.disconnect (servo_motor_added_handler_id);
- motor_browser_window = null;
- });
- motor_browser_window.show ();
- }
-
- void on_tacho_motor_added (TachoMotor motor) {
- var menu_item = new Ev3devKit.Ui.MenuItem.with_right_arrow ("%s at %s".printf (motor.driver_name,
- motor.address));
- var button_pressed_handler_id = menu_item.button.pressed.connect (() => {
- var window = new MotorInfoWindow (motor.driver_name, "tacho-motor",
- motor.device_name, motor.address, true);
- var watch_values_handler_id = window.watch_values_selected.connect (() => {
- // TODO: Do we want to also show speed?
- var value_dialog = new MotorValueDialog ();
- var value_timeout_id = Timeout.add (WATCH_MS, () => {
- // TODO: Convert to degrees
- value_dialog.value_text = "%d".printf (motor.position);
- return Source.CONTINUE;
- });
- var notify_connected_handler_id = motor.notify["connected"].connect (() => {
- value_dialog.close ();
- });
- ulong dialog_closed_handler_id = 0;
- dialog_closed_handler_id = value_dialog.closed.connect (() => {
- Source.remove (value_timeout_id);
- motor.disconnect (notify_connected_handler_id);
- value_dialog.disconnect (dialog_closed_handler_id);
- });
- value_dialog.show ();
- });
- ulong notify_connected_handler_id = 0;
- ulong window_closed_handler_id = 0;
- notify_connected_handler_id = motor.notify["connected"].connect (() => {
- var dialog = new MessageDialog ("Motor Removed",
- "Motor %s at %s was disconnected.".printf (motor.driver_name,
- motor.address));
- dialog.show ();
- window.close ();
- });
- window_closed_handler_id = window.closed.connect (() => {
- window.disconnect (watch_values_handler_id);
- motor.disconnect (notify_connected_handler_id);
- window.disconnect (window_closed_handler_id);
- });
- window.show ();
- });
- // TODO: figure out how to sort menu items
- motor_browser_window.menu.add_menu_item (menu_item);
- ulong notify_connected_handler_id = 0;
- ulong window_closed_handler_id = 0;
- notify_connected_handler_id = motor.notify["connected"].connect (() => {
- motor_browser_window.menu.remove_menu_item (menu_item);
- menu_item.button.disconnect (button_pressed_handler_id);
- motor.disconnect (notify_connected_handler_id);
- motor_browser_window.disconnect (window_closed_handler_id);
- });
- window_closed_handler_id = motor_browser_window.closed.connect (() => {
- menu_item.button.disconnect (button_pressed_handler_id);
- motor.disconnect (notify_connected_handler_id);
- motor_browser_window.disconnect (window_closed_handler_id);
- });
- }
-
- void on_dc_motor_added (DcMotor motor) {
- var menu_item = new Ev3devKit.Ui.MenuItem.with_right_arrow ("%s at %s".printf (motor.driver_name,
- motor.address));
- var button_pressed_handler_id = menu_item.button.pressed.connect (() => {
- var window = new MotorInfoWindow (motor.driver_name, "dc-motor",
- motor.device_name, motor.address, false);
- ulong notify_connected_handler_id = 0;
- ulong window_closed_handler_id = 0;
- notify_connected_handler_id = motor.notify["connected"].connect (() => {
- var dialog = new MessageDialog ("Motor Removed",
- "Motor %s at %s was disconnected.".printf (motor.driver_name,
- motor.address));
- dialog.show ();
- window.close ();
- });
- window_closed_handler_id = window.closed.connect (() => {
- motor.disconnect (notify_connected_handler_id);
- window.disconnect (window_closed_handler_id);
- });
- window.show ();
- });
- // TODO: figure out how to sort menu items
- motor_browser_window.menu.add_menu_item (menu_item);
- ulong notify_connected_handler_id = 0;
- ulong window_closed_handler_id = 0;
- notify_connected_handler_id = motor.notify["connected"].connect (() => {
- motor_browser_window.menu.remove_menu_item (menu_item);
- menu_item.button.disconnect (button_pressed_handler_id);
- motor.disconnect (notify_connected_handler_id);
- motor_browser_window.disconnect (window_closed_handler_id);
- });
- window_closed_handler_id = motor_browser_window.closed.connect (() => {
- menu_item.button.disconnect (button_pressed_handler_id);
- motor.disconnect (notify_connected_handler_id);
- motor_browser_window.disconnect (window_closed_handler_id);
- });
- }
-
- void on_servo_motor_added (ServoMotor motor) {
- var menu_item = new Ev3devKit.Ui.MenuItem.with_right_arrow ("%s at %s".printf (motor.driver_name,
- motor.address));
- var button_pressed_handler_id = menu_item.button.pressed.connect (() => {
- var window = new MotorInfoWindow (motor.driver_name, "servo-motor",
- motor.device_name, motor.address, false);
- ulong notify_connected_handler_id = 0;
- ulong window_closed_handler_id = 0;
- notify_connected_handler_id = motor.notify["connected"].connect (() => {
- var dialog = new MessageDialog ("Motor Removed",
- "Motor %s at %s was disconnected.".printf (motor.driver_name,
- motor.address));
- dialog.show ();
- window.close ();
- });
- window_closed_handler_id = window.closed.connect (() => {
- motor.disconnect (notify_connected_handler_id);
- window.disconnect (window_closed_handler_id);
- });
- window.show ();
- });
- // TODO: figure out how to sort menu items
- motor_browser_window.menu.add_menu_item (menu_item);
- ulong notify_connected_handler_id = 0;
- ulong window_closed_handler_id = 0;
- notify_connected_handler_id = motor.notify["connected"].connect (() => {
- motor_browser_window.menu.remove_menu_item (menu_item);
- menu_item.button.disconnect (button_pressed_handler_id);
- motor.disconnect (notify_connected_handler_id);
- motor_browser_window.disconnect (window_closed_handler_id);
- });
- window_closed_handler_id = motor_browser_window.closed.connect (() => {
- menu_item.button.disconnect (button_pressed_handler_id);
- motor.disconnect (notify_connected_handler_id);
- motor_browser_window.disconnect (window_closed_handler_id);
- });
- }
- }
-}
\ No newline at end of file
diff --git a/src/controller/FileBrowserController.vala b/src/controller/FileBrowserController.vala
deleted file mode 100644
index 5fe0094..0000000
--- a/src/controller/FileBrowserController.vala
+++ /dev/null
@@ -1,221 +0,0 @@
-/*
- * brickman -- Brick Manager for LEGO MINDSTORMS EV3/ev3dev
- *
- * Copyright 2015 David Lechner
- *
- * 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; either version 2 of the License, or
- * (at your option) any later version.
- *
- * 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, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
- * MA 02110-1301, USA.
- */
-
-/* FileBrowserController.vala - File Browser controller */
-
-using Ev3devKit;
-using Ev3devKit.Ui;
-
-namespace BrickManager {
- public class FileBrowserController : Object, IBrickManagerModule {
- const string PARENT_DIRECTORY_TEXT = "../";
- const string INITIAL_DIRECTORY = "/home/robot";
- const string USER_NAME = "robot";
- const string file_attrs = FileAttribute.OWNER_USER
- + "," + FileAttribute.STANDARD_IS_HIDDEN
- + "," + FileAttribute.STANDARD_TYPE
- + "," + FileAttribute.UNIX_UID
- + "," + FileAttribute.UNIX_GID
- + "," + FileAttribute.UNIX_MODE;
-
- FileBrowserWindow file_browser_window;
- FileMonitor? monitor;
- File initial_directory;
-
- public string display_name { get { return "File Browser"; } }
-
- public void show_main_window () {
- if (file_browser_window == null) {
- create_main_window ();
- }
- file_browser_window.show ();
- }
-
- void create_main_window () {
- file_browser_window = new FileBrowserWindow (display_name) {
- sort_files_func = sort_files
- };
- file_browser_window.file_selected.connect ((file) => {
- try {
- var file_info = file.query_info (file_attrs,
- FileQueryInfoFlags.NOFOLLOW_SYMLINKS);
- var mode = file_info.get_attribute_uint32 (FileAttribute.UNIX_MODE);
- if (file_info.get_file_type () == FileType.DIRECTORY) {
- // if the selected file is a directory, then we
- // open that directory.
- set_directory.begin (file, (obj, res) => {
- try {
- set_directory.end (res);
- } catch (Error err) {
- var dialog = new MessageDialog ("Error", err.message);
- dialog.show ();
- }
- });
- } else if ((mode & Posix.S_IXUSR) == Posix.S_IXUSR) {
- // If the selected file is executable then we run the
- // file via brickrun as USER_NAME. brickrun takes
- // care of switching consoles, stopping motors, etc.
- try {
- string[] args = {
- "/usr/bin/sudo",
- "--login",
- "--non-interactive",
- "--user",
- USER_NAME,
- "--",
- "/usr/bin/brickrun",
- "--directory",
- file.get_parent().get_path (),
- "--",
- file.get_path ()
- };
- var subproc = new Subprocess.newv (args, SubprocessFlags.STDERR_PIPE);
- try {
- var err_log_filename = file.get_path () + ".err.log";
- var err_log = File.new_for_path (err_log_filename);
- var err_log_out = err_log.replace (null, false, FileCreateFlags.REPLACE_DESTINATION);
- err_log_out.splice_async.begin (subproc.get_stderr_pipe (),
- OutputStreamSpliceFlags.CLOSE_TARGET, Priority.DEFAULT, null, (obj, res) => {
- try {
- var size = err_log_out.splice_async.end (res);
- if (size == 0) {
- // delete the file if there was nothing logged.
- err_log.delete ();
- } else {
- // change the owner to match the executable,
- // otherwise it is owned by root and can't be deleted
- var uid = file_info.get_attribute_uint32 (FileAttribute.UNIX_UID);
- var gid = file_info.get_attribute_uint32 (FileAttribute.UNIX_GID);
- Posix.chown (err_log_filename, uid, gid);
- }
- } catch (Error err) {
- warning ("Error writing log file: %s", err.message);
- }
- });
- } catch (Error err) {
- warning ("Failed to create error log: %s", err.message);
- }
- } catch (SpawnError err) {
- var dialog = new MessageDialog ("Error", err.message);
- dialog.show ();
- }
- } else {
- var dialog = new MessageDialog (file.get_basename (),
- "This file is not a directory or an executable.");
- dialog.show ();
- }
- } catch (Error err) {
- var dialog = new MessageDialog ("Error", err.message);
- dialog.show ();
- }
- });
- initial_directory = File.new_for_path (INITIAL_DIRECTORY);
- file_browser_window.file_selected (initial_directory);
- }
-
- async void set_directory (File directory) throws Error {
- file_browser_window.loading = true;
- file_browser_window.clear_files ();
- if (monitor != null)
- monitor.cancel ();
- monitor = directory.monitor_directory (FileMonitorFlags.NONE);
- monitor.changed.connect ((src, dest, event) => {
- message ("src: %s, dest %s, event: %s",
- src == null ? "" : src.get_basename(),
- dest == null ? "" : dest.get_basename(),
- event.to_string());
- switch (event) {
- case FileMonitorEvent.CREATED:
- case FileMonitorEvent.ATTRIBUTE_CHANGED:
- try {
- var file_info = src.query_info (file_attrs,
- FileQueryInfoFlags.NOFOLLOW_SYMLINKS);
-
- // don't show hidden files
- if (file_info.get_is_hidden ())
- break;
-
- var file_name = src.get_basename ();
- var mode = file_info.get_attribute_uint32 (FileAttribute.UNIX_MODE);
- if (file_info.get_file_type () == FileType.DIRECTORY) {
- // add '/' to the end of directories
- file_name += "/";
- } else if ((mode & Posix.S_IXUSR) == Posix.S_IXUSR) {
- // add '*' to the end of executable files
- file_name += "*";
- }
-
- file_browser_window.add_file (file_name, src);
- } catch (Error err) {
- // If file was deleted immediately after creation, no need
- // to show error message.
- if (err is IOError.NOT_FOUND)
- break;
- critical ("%s", err.message);
- }
- break;
- case FileMonitorEvent.DELETED:
- file_browser_window.remove_file (src);
- break;
- }
- });
- file_browser_window.current_directory = directory.get_path ();
- // Limit the browser to children of the initial directory.
- // Browsing the entire file system as root is probably a bad idea.
- if (!directory.equal (initial_directory)) {
- var parent = directory.get_parent ();
- if (parent != null)
- file_browser_window.add_file (PARENT_DIRECTORY_TEXT, parent);
- }
- var enumerator = yield directory.enumerate_children_async ("",
- FileQueryInfoFlags.NOFOLLOW_SYMLINKS);
- FileInfo info;
- // TODO: use next_files_async () instead?
- while ((info = enumerator.next_file ()) != null) {
- monitor.changed (enumerator.get_child (info), null,
- FileMonitorEvent.CREATED);
- }
- file_browser_window.loading = false;
- }
-
- static int sort_files (Ui.MenuItem a, Ui.MenuItem b) {
- var a_text = a.label.text;
- var b_text = b.label.text;
-
- // parent directory text goes first
- if (a_text == PARENT_DIRECTORY_TEXT)
- return -1;
- if (b_text == PARENT_DIRECTORY_TEXT)
- return 1;
-
- // then directories
- var a_last_char = a_text[a_text.length -1];
- var b_last_char = b_text[b_text.length -1];
- if (a_last_char == '/' && b_last_char != '/')
- return -1;
- if (a_last_char != '/' && b_last_char == '/')
- return 1;
-
- // then everything else
- return strcmp (a_text, b_text);
- }
- }
-}
diff --git a/src/controller/IBrickManagerModule.vala b/src/controller/IBrickManagerModule.vala
deleted file mode 100644
index c07dc9c..0000000
--- a/src/controller/IBrickManagerModule.vala
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * brickman -- Brick Manager for LEGO MINDSTORMS EV3/ev3dev
- *
- * Copyright 2014-2015 David Lechner
- *
- * 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; either version 2 of the License, or
- * (at your option) any later version.
- *
- * 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, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
- * MA 02110-1301, USA.
- */
-
-/* IBrickManagerModule.vala - Interface for controller objects that is used for displaying them on the main menu */
-
-using Ev3devKit.Ui;
-
-namespace BrickManager {
- public interface IBrickManagerModule : Object {
- public abstract string display_name { get; }
- public abstract void show_main_window ();
- }
-}
\ No newline at end of file
diff --git a/src/controller/NetworkController.vala b/src/controller/NetworkController.vala
deleted file mode 100644
index 31d12cb..0000000
--- a/src/controller/NetworkController.vala
+++ /dev/null
@@ -1,935 +0,0 @@
-/*
- * brickman -- Brick Manager for LEGO MINDSTORMS EV3/ev3dev
- *
- * Copyright 2014-2015 David Lechner
- *
- * 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; either version 2 of the License, or
- * (at your option) any later version.
- *
- * 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, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
- * MA 02110-1301, USA.
- */
-
-/* NetworkController.vala - Controller for network connections (ConnMan) */
-
-using Connman;
-using Ev3devKit.Ui;
-
-namespace BrickManager {
- public class NetworkController : Object, IBrickManagerModule {
- const string[] TETHERING_TECHNOLOGIES = { "bluetooth", "gadget" };
- const string NET_SUBSYSTEM = "net";
- const string TETHER_DEVICE_NAME = "tether";
-
- HashTable technology_map;
- HashTable service_map;
- HashTable wifi_service_map;
- NetworkStatusWindow status_window;
- NetworkConnectionsWindow connections_window;
- WifiWindow wifi_window;
- TetheringWindow? tethering_window;
- TetheringInfoWindow? tethering_info_window;
- internal NetworkStatusBarItem network_status_bar_item;
- internal WifiStatusBarItem wifi_status_bar_item;
- Binding? status_bar_item_binding;
- bool status_bar_item_binding_is_tether;
- ConnmanAgent agent;
- ObjectPath agent_object_path;
- Manager? manager;
- Technology? wifi_technology;
- GUdev.Client udev_client;
- BluetoothController bluetooth_controller;
-
- public class WifiController : Object, IBrickManagerModule {
- weak WifiWindow wifi_window;
-
- public string display_name { get { return wifi_window.title; } }
-
- public WifiController (WifiWindow wifi_window) {
- this.wifi_window = wifi_window;
- }
-
- public void show_main_window () {
- wifi_window.show ();
- }
- }
-
- public WifiController wifi_controller;
-
- public string display_name { get { return "Wireless and Networks"; } }
-
- public bool has_tether { get; set; }
- public string tether_address { get; set; }
- public string tether_netmask { get; set; }
- public string tether_interface { get; set; }
- public string tether_mac { get; set; }
-
- public NetworkController () {
- technology_map = new HashTable (null, null);
- service_map = new HashTable (null, null);
- wifi_service_map = new HashTable (null, null);
- status_window = new NetworkStatusWindow (display_name) {
- loading = true
- };
- connections_window = new NetworkConnectionsWindow () {
- loading = true
- };
- status_window.network_connections_selected.connect (() =>
- connections_window.show ());
- connections_window.connection_selected.connect (
- on_connections_window_connection_selected);
- network_status_bar_item = new NetworkStatusBarItem ();
- wifi_status_bar_item = new WifiStatusBarItem ();
-
- wifi_window = new WifiWindow () {
- loading = true,
- available = false
- };
- wifi_window.connection_selected.connect (on_wifi_connection_selected);
- wifi_controller = new WifiController (wifi_window);
-
- status_window.tethering_selected.connect (() => {
- tethering_window = new TetheringWindow ();
- foreach (var tech in manager.get_technologies ()) {
- add_tethering_technology (tech);
- }
- tethering_window.tethering_info_selected.connect (() => {
- tethering_info_window = new TetheringInfoWindow ();
- bind_property ("has-tether", tethering_info_window, "available",
- BindingFlags.SYNC_CREATE);
- bind_property ("tether-address", tethering_info_window, "ipv4-address",
- BindingFlags.SYNC_CREATE);
- bind_property ("tether-netmask", tethering_info_window, "ipv4-netmask",
- BindingFlags.SYNC_CREATE);
- bind_property ("tether-interface", tethering_info_window, "enet-iface",
- BindingFlags.SYNC_CREATE);
- bind_property ("tether-mac", tethering_info_window, "enet-mac",
- BindingFlags.SYNC_CREATE);
- tethering_info_window.show ();
- });
- tethering_window.closed.connect (() => tethering_window = null);
- tethering_window.show ();
- });
-
- try {
- agent = new ConnmanAgent ();
- var bus = Bus.get_sync (BusType.SYSTEM);
- agent_object_path = new ObjectPath ("/org/ev3dev/brickman/connman_agent");
- bus.register_object (agent_object_path, agent);
- } catch (IOError err) {
- critical ("%s", err.message);
- }
-
- Bus.watch_name (BusType.SYSTEM, Manager.SERVICE_NAME,
- BusNameWatcherFlags.AUTO_START, () => {
- init_async.begin ((obj, res) => {
- try {
- init_async.end (res);
- status_window.loading = false;
- connections_window.loading = false;
- wifi_window.loading = false;
- } catch (Error err) {
- critical ("%s", err.message);
- }
- });
- }, () => {
- status_window.loading = true;
- connections_window.loading = true;
- wifi_window.loading = true;
- var service_keys = service_map.get_keys ();
- foreach (var key in service_keys) {
- key.removed ();
- }
- var technology_keys = technology_map.get_keys ();
- foreach (var key in technology_keys) {
- key.removed ();
- }
- manager = null;
- });
-
- // ConnMan does not have a way to get tethering info via DBus, so
- // we have to get it ourselves. ConnMan creates a bridge device
- // named "tether", so we use udev to watch for it.
- udev_client = new GUdev.Client ({ NET_SUBSYSTEM });
- udev_client.uevent.connect (on_udev_event);
- var tether_device = udev_client.query_by_subsystem_and_name (NET_SUBSYSTEM, TETHER_DEVICE_NAME);
- if (tether_device != null)
- on_udev_event ("add", tether_device);
- }
-
- public void show_main_window () {
- status_window.show ();
- }
-
- public void add_controller (IBrickManagerModule controller) {
- status_window.add_technology_controller (controller);
- if (controller is BluetoothController) {
- bluetooth_controller = (BluetoothController)controller;
- if (manager != null) {
- var bt_tech = manager.get_technology_by_type ("bluetooth");
- if (bt_tech != null)
- bind_bluetooth_technology (bt_tech);
- }
- bluetooth_controller.show_network_requested.connect ((name) => {
- var service = manager.get_service_by_name_and_type (name, "bluetooth");
- if (service == null) {
- critical ("Could not find ConnMan service '%s'", name);
- return;
- }
- on_connections_window_connection_selected (service);
- });
- }
- }
-
- async void init_async () throws DBusError, IOError {
- manager = yield Manager.new_async ();
- manager.bind_property ("state", status_window, "state",
- BindingFlags.SYNC_CREATE, transform_manager_state_to_string);
- manager.bind_property ("offline-mode", status_window, "offline-mode",
- BindingFlags.SYNC_CREATE | BindingFlags.BIDIRECTIONAL);
- agent.manager = manager;
- yield manager.register_agent (agent_object_path);
- manager.technology_added.connect (on_technology_added);
- foreach (var technology in manager.get_technologies ())
- on_technology_added (technology);
- manager.services_changed.connect (on_services_changed);
- on_services_changed (manager.get_services ());
- }
-
- void on_technology_added (Technology technology) {
- // gadget is not powered by default, but we want it to always be powered.
- if (technology.technology_type == "gadget" && !technology.powered) {
- technology.powered = true;
- }
-
- if (technology.technology_type == "wifi") {
- technology.bind_property ("powered", wifi_status_bar_item,
- "visible", BindingFlags.SYNC_CREATE);
- technology.bind_property ("connected", wifi_status_bar_item,
- "connected", BindingFlags.SYNC_CREATE);
- wifi_technology = technology;
- technology.removed.connect (() => {
- wifi_technology = null;
- });
- }
-
- if (technology.technology_type == "bluetooth")
- bind_bluetooth_technology (technology);
- if (technology.technology_type == "wifi")
- bind_wifi_technology (technology);
-
- add_tethering_technology (technology);
- }
-
- void on_services_changed (List changed) {
- unbind_status_bar ();
-
- foreach (var service in changed) {
- NetworkConnectionMenuItem menu_item;
- if (service_map.contains (service)) {
- menu_item = service_map[service];
- connections_window.menu.remove_menu_item (menu_item);
- } else {
- var icon_file = service.service_type.replace ("gadget", "usb") + "12x12.png";
- icon_file = Path.build_filename (Ev3devKit.DATA_DIR, icon_file);
- menu_item = new NetworkConnectionMenuItem (icon_file);
- menu_item.represented_object = service;
- service.bind_property ("state", menu_item, "connected",
- BindingFlags.SYNC_CREATE, transform_service_state_to_connected_bool);
- service.bind_property ("name", menu_item, "connection-name",
- BindingFlags.SYNC_CREATE);
- // menu_item has reference to service, so using weak ref
- // to break reference cycle.
- weak NetworkConnectionMenuItem weak_menu_item = menu_item;
- weak Service weak_service = service;
- service.removed.connect (() => {
- connections_window.menu.remove_menu_item (weak_menu_item);
- service_map.remove (weak_service);
- });
- service_map[service] = menu_item;
- }
- connections_window.menu.add_menu_item (menu_item);
-
- if (service.service_type == "wifi") {
- WifiMenuItem wifi_menu_item;
- if (wifi_service_map.contains (service)) {
- wifi_menu_item = wifi_service_map[service];
- wifi_window.remove_menu_item (wifi_menu_item);
- } else {
- wifi_menu_item = new WifiMenuItem ();
- wifi_menu_item.represented_object = service;
- service.bind_property ("state", wifi_menu_item, "connected",
- BindingFlags.SYNC_CREATE, transform_service_state_to_connected_bool);
- service.bind_property ("name", wifi_menu_item, "connection-name",
- BindingFlags.SYNC_CREATE);
- service.bind_property ("security", wifi_menu_item, "security",
- BindingFlags.SYNC_CREATE, transform_service_security_array_to_enum);
- service.bind_property ("strength", wifi_menu_item, "signal-strength",
- BindingFlags.SYNC_CREATE);
- // wifi_menu_item has reference to service, so using
- // weak ref to break reference cycle
- weak WifiMenuItem weak_wifi_menu_item = wifi_menu_item;
- weak Service weak_service = service;
- service.removed.connect (() => {
- wifi_window.remove_menu_item (weak_wifi_menu_item);
- wifi_service_map.remove (weak_service);
- });
- wifi_service_map[service] = wifi_menu_item;
- }
- wifi_window.add_menu_item (wifi_menu_item);
- }
-
- // Show the IP address of the primary service in the status bar
- // The list is ordered, so the first one is the one we want
- if (status_bar_item_binding == null) {
- status_bar_item_binding = service.bind_property (
- "ipv4", network_status_bar_item, "text",
- BindingFlags.SYNC_CREATE, transform_service_ipv4_to_address_string);
- }
- }
-
- // If there were no connected services, then we will display the
- // tether bridge address in the status bar if there is one.
- if (status_bar_item_binding == null && has_tether) {
- bind_tether_address_to_status_bar ();
- }
- }
-
- void unbind_status_bar () {
- if (status_bar_item_binding != null) {
- status_bar_item_binding.unbind ();
- status_bar_item_binding = null;
- status_bar_item_binding_is_tether = false;
- network_status_bar_item.text = "";
- }
- }
-
- void bind_bluetooth_technology (Technology technology) {
- if (bluetooth_controller == null)
- return;
- bluetooth_controller.bind_powered (technology, "powered");
- }
-
- void bind_wifi_technology (Technology technology) {
- wifi_window.available = true;
- technology.bind_property ("powered", wifi_window, "powered",
- BindingFlags.SYNC_CREATE | BindingFlags.BIDIRECTIONAL);
- var handler_id = wifi_window.scan_selected.connect (() => {
- wifi_window.scanning = true;
- technology.scan.begin ((obj, res) => {
- try {
- technology.scan.end (res);
- } catch (Error err) {
- var dialog = new MessageDialog ("Error", err.message);
- dialog.show ();
- }
- wifi_window.scanning = false;
- });
- });
- technology.removed.connect (() => {
- wifi_window.available = false;
- wifi_window.disconnect (handler_id);
- });
- }
-
- void bind_tether_address_to_status_bar () {
- status_bar_item_binding = bind_property ("tether-address",
- network_status_bar_item, "text", BindingFlags.SYNC_CREATE);
- status_bar_item_binding_is_tether = true;
- }
-
- void on_connections_window_connection_selected (Object user_data) {
- var service = (Service)user_data;
- var title = service.name ?? "";
- var connection_window = new NetworkConnectionWindow (title);
- service.bind_property ("auto-connect", connection_window, "auto-connect",
- BindingFlags.SYNC_CREATE | BindingFlags.BIDIRECTIONAL);
- service.bind_property ("state", connection_window, "state",
- BindingFlags.SYNC_CREATE , transform_service_state_to_string);
- service.bind_property ("state", connection_window, "is-connect-busy",
- BindingFlags.SYNC_CREATE , transform_service_state_to_busy_bool);
- service.bind_property ("state", connection_window, "is-connected",
- BindingFlags.SYNC_CREATE , transform_service_state_to_connected_bool);
- weak NetworkConnectionWindow weak_connection_window = connection_window;
- connection_window.connect_requested.connect ((disconnect) =>
- on_properties_window_connect_requested.begin (weak_connection_window, service, disconnect));
-
- connection_window.ipv4_button_pressed.connect (() => {
- var ipv4_window = new NetworkConnectionIpv4Window (title);
- service.bind_property ("ipv4", ipv4_window, "method",
- BindingFlags.SYNC_CREATE, transform_service_ipv4_to_method_string);
- service.bind_property ("ipv4", ipv4_window, "address",
- BindingFlags.SYNC_CREATE, transform_service_ipv4_to_address_string);
- service.bind_property ("ipv4", ipv4_window, "netmask",
- BindingFlags.SYNC_CREATE, transform_service_ipv4_to_netmask_string);
- service.bind_property ("ipv4", ipv4_window, "gateway",
- BindingFlags.SYNC_CREATE, transform_service_ipv4_to_gateway_string);
- service.bind_property ("ipv4-configuration", ipv4_window, "config-address",
- BindingFlags.SYNC_CREATE, transform_service_ipv4_to_address_string);
- service.bind_property ("ipv4-configuration", ipv4_window, "config-netmask",
- BindingFlags.SYNC_CREATE, transform_service_ipv4_to_netmask_string);
- service.bind_property ("ipv4-configuration", ipv4_window, "config-gateway",
- BindingFlags.SYNC_CREATE, transform_service_ipv4_to_gateway_string);
- ipv4_window.change_requested.connect ((method, address, netmask, gateway, addresses) => {
- try {
- service.ipv4_configuration = new IPv4Info () {
- method = IPv4Method.from_string (method),
- address = address,
- netmask = netmask,
- gateway = gateway
- };
- service.nameservers_configuration = addresses;
- } catch (DBusError err) {
- critical ("Failed to convert method '%s' to IPv4Info", method);
- }
- });
-
- weak Window weak_ipv4_window = ipv4_window;
- var handler_id = service.removed.connect (() => {
- weak_ipv4_window.close ();
- });
- ipv4_window.closed.connect (() => {
- service.disconnect (handler_id);
- });
-
- ipv4_window.show ();
- });
-
- connection_window.dns_button_pressed.connect (() => {
- var dns_window = new NetworkConnectionDnsWindow (title);
- service.bind_property ("nameservers", dns_window, "addresses",
- BindingFlags.SYNC_CREATE);
- dns_window.change_requested.connect ((addresses) =>
- service.nameservers_configuration = addresses);
-
- weak Window weak_dns_window = dns_window;
- var handler_id = service.removed.connect (() => {
- weak_dns_window.close ();
- });
- dns_window.closed.connect (() => {
- service.disconnect (handler_id);
- });
-
- dns_window.show ();
- });
-
- connection_window.enet_button_pressed.connect (() => {
- var enet_window = new NetworkConnectionEnetWindow (title);
- service.bind_property ("ethernet", enet_window, "method",
- BindingFlags.SYNC_CREATE, transform_service_ethernet_to_method_string);
- service.bind_property ("ethernet", enet_window, "interface",
- BindingFlags.SYNC_CREATE, transform_service_ethernet_to_interface_string);
- service.bind_property ("ethernet", enet_window, "address",
- BindingFlags.SYNC_CREATE, transform_service_ethernet_to_address_string);
- service.bind_property ("ethernet", enet_window, "mtu",
- BindingFlags.SYNC_CREATE, transform_service_ethernet_to_mtu_int);
-
- weak Window weak_enet_window = enet_window;
- var handler_id = service.removed.connect (() => {
- weak_enet_window.close ();
- });
- enet_window.closed.connect (() => {
- service.disconnect (handler_id);
- });
-
- enet_window.show ();
- });
-
- var handler_id = service.removed.connect (() => {
- weak_connection_window.close ();
- var dialog = new MessageDialog ("Network",
- "%s is no longer available.".printf (service.name));
- dialog.show ();
- });
- connection_window.closed.connect (() => {
- service.disconnect (handler_id);
- });
-
- connection_window.show ();
- }
-
- void on_wifi_connection_selected (Object represented_object) {
- var service = (Service)represented_object;
- var info_window = new WifiNetworkWindow (service.name);
- service.bind_property ("state", info_window, "status",
- BindingFlags.SYNC_CREATE, transform_service_state_to_string);
- service.bind_property ("state", info_window, "action",
- BindingFlags.SYNC_CREATE, transform_service_state_to_wifi_action);
- service.bind_property ("favorite", info_window, "can-forget",
- BindingFlags.SYNC_CREATE);
-
- info_window.status_selected.connect (() => {
- var wifi_network_status_window = new WifiNetworkStatusWindow (service.name);
- service.bind_property ("state", wifi_network_status_window, "status",
- BindingFlags.SYNC_CREATE, transform_service_state_to_string);
- service.bind_property ("strength", wifi_network_status_window, "signal-strength",
- BindingFlags.SYNC_CREATE);
- service.bind_property ("security", wifi_network_status_window, "security",
- BindingFlags.SYNC_CREATE, transform_service_security_array_to_string);
- service.bind_property ("ipv4", wifi_network_status_window, "address",
- BindingFlags.SYNC_CREATE, transform_service_ipv4_to_address_string);
-
- wifi_network_status_window.show ();
- });
- info_window.action_selected.connect (() => handle_wifi_action (service));
- info_window.forget_selected.connect (() => {
- service.remove.begin ((obj, res) => {
- try {
- service.remove.end (res);
- } catch (Error err) {
- var dialog = new MessageDialog ("Error", err.message);
- dialog.show ();
- }
- });
- });
- info_window.network_connection_selected.connect (() =>
- on_connections_window_connection_selected (service));
-
- weak Window weak_info_window = info_window;
- var handler_id = service.removed.connect (() => {
- var dialog = new MessageDialog ("Wi-Fi",
- "%s is no longer available.".printf (service.name));
- dialog.show ();
- weak_info_window.close ();
- });
- info_window.closed.connect (() => {
- service.disconnect (handler_id);
- });
-
- info_window.show ();
- }
-
- void handle_wifi_action (Service service) {
- switch (service.state) {
- case ServiceState.IDLE:
- service.connect_service.begin (true, (obj, res) => {
- try {
- service.connect_service.end (res);
- } catch (Error err) {
- var dialog = new MessageDialog ("Error", err.message);
- dialog.show ();
- }
- });
- break;
- case ServiceState.FAILURE:
- service.remove.begin ((obj, res) => {
- try {
- service.remove.end (res);
- } catch (Error err) {
- var dialog = new MessageDialog ("Error", err.message);
- dialog.show ();
- }
- });
- break;
- case ServiceState.ASSOCIATION:
- case ServiceState.CONFIGURATION:
- case ServiceState.READY:
- case ServiceState.DISCONNECT:
- case ServiceState.ONLINE:
- service.disconnect_service.begin ((obj, res) => {
- try {
- service.disconnect_service.end (res);
- } catch (Error err) {
- var dialog = new MessageDialog ("Error", err.message);
- dialog.show ();
- }
- });
- break;
- }
- }
-
- async void on_properties_window_connect_requested (
- NetworkConnectionWindow connection_window, Service service, bool disconnect)
- {
- if (disconnect) {
- try {
- connection_window.is_connect_busy = true;
- yield service.disconnect_service ();
- } catch (Error err) {
- var dialog = new MessageDialog ("Error", err.message);
- dialog.show ();
- connection_window.is_connect_busy = false;
- }
- } else {
- try {
- connection_window.is_connect_busy = true;
- // Do long timeout for WiFi since we have to wait for password entry
- yield service.connect_service (service.service_type == "wifi");
- } catch (Error err) {
- var dialog = new MessageDialog ("Error", err.message);
- dialog.show ();
- connection_window.is_connect_busy = false;
- }
- }
- }
-
- void add_tethering_technology (Technology technology) {
- if (tethering_window == null)
- return;
- if (technology.technology_type in TETHERING_TECHNOLOGIES) {
- var menu_item = tethering_window.add_menu_item (technology.name);
- technology.bind_property ("tethering", menu_item.checkbox, "checked",
- BindingFlags.SYNC_CREATE | BindingFlags.BIDIRECTIONAL);
- var handler_id = technology.removed.connect (() =>
- tethering_window.remove_menu_item (menu_item));
- tethering_window.closed.connect (() =>
- technology.disconnect (handler_id));
- }
- }
-
- /**
- * Handle add/remove of "tether" network bridge device.
- *
- * Some info (MAC address) is available via sysfs, but we have to use
- * getifaddrs to get the IP address info.
- */
- void on_udev_event (string action, GUdev.Device device) {
- if (device.get_name () != TETHER_DEVICE_NAME)
- return;
- switch (action) {
- case "add":
- case "change":
- Linux.Network.IfAddrs if_addrs;
- unowned Linux.Network.IfAddrs current;
- if (Linux.Network.getifaddrs (out if_addrs) == 0) {
- current = if_addrs;
- while (current != null) {
- if (current.ifa_name == TETHER_DEVICE_NAME && current.ifa_addr != null) {
- // Get the IPv4 address/netmask
- if (current.ifa_addr.sa_family == Posix.AF_INET) {
- has_tether = true;
- // the first 2 bytes of sa_data are the port, so we are skipping them.
- tether_address = "%d.%d.%d.%d".printf (
- current.ifa_addr.sa_data[2],
- current.ifa_addr.sa_data[3],
- current.ifa_addr.sa_data[4],
- current.ifa_addr.sa_data[5]);
- if (current.ifa_netmask != null && current.ifa_netmask.sa_family == Posix.AF_INET) {
- tether_netmask = "%d.%d.%d.%d".printf (
- current.ifa_netmask.sa_data[2],
- current.ifa_netmask.sa_data[3],
- current.ifa_netmask.sa_data[4],
- current.ifa_netmask.sa_data[5]);
- } else {
- tether_netmask = "";
- }
- tether_interface = device.get_name ();
- tether_mac = device.get_sysfs_attr ("address");
- if (status_bar_item_binding == null) {
- bind_tether_address_to_status_bar ();
- }
- break;
- }
- }
- current = current.ifa_next;
- }
- } else {
- critical ("getifaddrs failed.");
- }
- break;
- case "remove":
- has_tether = false;
- if (status_bar_item_binding_is_tether)
- unbind_status_bar ();
- break;
- }
- }
-
- bool transform_manager_state_to_string (Binding binding,
- Value source_value, ref Value target_value)
- {
- switch (source_value.get_enum ()) {
- case ManagerState.OFFLINE:
- target_value.set_string ("Offline");
- break;
- case ManagerState.IDLE:
- target_value.set_string ("No connections");
- break;
- case ManagerState.READY:
- target_value.set_string ("Connected");
- break;
- case ManagerState.ONLINE:
- target_value.set_string ("Online");
- break;
- default:
- return false;
- }
- return true;
- }
-
- bool transform_service_state_to_string (Binding binding,
- Value source_value, ref Value target_value)
- {
- switch (source_value.get_enum ()) {
- case ServiceState.IDLE:
- target_value.set_string ("Disconnected");
- break;
- case ServiceState.FAILURE:
- target_value.set_string ("Failed");
- break;
- case ServiceState.ASSOCIATION:
- target_value.set_string ("Associating");
- break;
- case ServiceState.CONFIGURATION:
- target_value.set_string ("Configuring");
- break;
- case ServiceState.READY:
- target_value.set_string ("Connected");
- break;
- case ServiceState.DISCONNECT:
- target_value.set_string ("Disconnecting");
- break;
- case ServiceState.ONLINE:
- target_value.set_string ("Online");
- break;
- default:
- return false;
- }
- return true;
- }
-
- bool transform_service_state_to_busy_bool (Binding binding,
- Value source_value, ref Value target_value)
- {
- switch (source_value.get_enum ()) {
- case ServiceState.IDLE:
- case ServiceState.FAILURE:
- case ServiceState.READY:
- case ServiceState.ONLINE:
- target_value.set_boolean (false);
- break;
- case ServiceState.ASSOCIATION:
- case ServiceState.CONFIGURATION:
- case ServiceState.DISCONNECT:
- target_value.set_boolean (true);
- break;
- default:
- return false;
- }
- return true;
- }
-
- bool transform_service_state_to_connected_bool (Binding binding,
- Value source_value, ref Value target_value)
- {
- switch (source_value.get_enum ()) {
- case ServiceState.READY:
- case ServiceState.ONLINE:
- case ServiceState.DISCONNECT:
- target_value.set_boolean (true);
- break;
- case ServiceState.IDLE:
- case ServiceState.FAILURE:
- case ServiceState.ASSOCIATION:
- case ServiceState.CONFIGURATION:
- target_value.set_boolean (false);
- break;
- default:
- return false;
- }
- return true;
- }
-
- bool transform_service_state_to_wifi_action (Binding binding,
- Value source_value, ref Value target_value)
- {
- switch (source_value.get_enum ()) {
- case ServiceState.IDLE:
- target_value.set_string ("Connect");
- break;
- case ServiceState.FAILURE:
- target_value.set_string ("Reset");
- break;
- case ServiceState.READY:
- case ServiceState.ONLINE:
- case ServiceState.DISCONNECT:
- target_value.set_string ("Disconnect");
- break;
- case ServiceState.ASSOCIATION:
- case ServiceState.CONFIGURATION:
- target_value.set_string ("Cancel");
- break;
- default:
- return false;
- }
- return true;
- }
-
- bool transform_service_security_array_to_string (Binding binding,
- Value source_value, ref Value target_value)
- {
- var array = (GenericArray)source_value.get_boxed ();
- if (array.length == 0) {
- target_value.set_string ("N/A");
- return true;
- }
- var builder = new StringBuilder ();
- var error = false;
- array.foreach ((item) => {
- switch (item) {
- case ServiceSecurity.NONE:
- builder.append ("None");
- break;
- case ServiceSecurity.WEP:
- builder.append ("WEP");
- break;
- case ServiceSecurity.PSK:
- builder.append ("WPA/2 PSK");
- break;
- case ServiceSecurity.IEEE8021X:
- builder.append ("EAP");
- break;
- case ServiceSecurity.WPS:
- builder.append ("WPS");
- break;
- default:
- error = true;
- return;
- }
- builder.append (", ");
- });
- if (error)
- return false;
- builder.truncate (builder.len - 2);
- target_value.set_string (builder.str);
- return true;
- }
-
- bool transform_service_security_array_to_enum (Binding binding,
- Value source_value, ref Value target_value)
- {
- var array = (GenericArray)source_value.get_boxed ();
- var has_none = false;
- var has_secured = false;
- var has_wps = false;
- array.foreach ((item) => {
- switch (item) {
- case ServiceSecurity.NONE:
- has_none = true;
- break;
- case ServiceSecurity.WEP:
- case ServiceSecurity.PSK:
- case ServiceSecurity.IEEE8021X:
- has_secured = true;
- break;
- case ServiceSecurity.WPS:
- has_wps = true;
- break;
- }
- });
- // Not sure if it is possible to get more than one of these values
- // true at the same time or not, but in case it is, the order matters
- if (has_wps)
- target_value.set_enum (WifiSecurity.WPS);
- else if (has_secured)
- target_value.set_enum (WifiSecurity.SECURED);
- else if (has_none)
- target_value.set_enum (WifiSecurity.OPEN);
- else
- return false;
- return true;
- }
-
- bool transform_service_ipv4_to_method_string (Binding binding,
- Value source_value, ref Value target_value)
- {
- unowned IPv4Info info = (IPv4Info)source_value.get_pointer ();
- if (info.method == null) {
- target_value.set_string ("");
- return true;
- }
- switch (info.method) {
- case IPv4Method.DHCP:
- target_value.set_string ("DHCP");
- break;
- case IPv4Method.MANUAL:
- target_value.set_string ("Manual");
- break;
- case IPv4Method.OFF:
- target_value.set_string ("Off");
- break;
- default:
- return false;
- }
- return true;
- }
-
- bool transform_service_ipv4_to_address_string (Binding binding,
- Value source_value, ref Value target_value)
- {
- unowned IPv4Info info = (IPv4Info)source_value.get_pointer ();
- target_value.set_string (info.address ?? "");
- return true;
- }
-
- bool transform_service_ipv4_to_netmask_string (Binding binding,
- Value source_value, ref Value target_value)
- {
- unowned IPv4Info info = (IPv4Info)source_value.get_pointer ();
- target_value.set_string (info.netmask ?? "");
- return true;
- }
-
- bool transform_service_ipv4_to_gateway_string (Binding binding,
- Value source_value, ref Value target_value)
- {
- unowned IPv4Info info = (IPv4Info)source_value.get_pointer ();
- target_value.set_string (info.gateway ?? "");
- return true;
- }
-
- bool transform_service_ethernet_to_method_string (Binding binding,
- Value source_value, ref Value target_value)
- {
- unowned EthernetInfo info = (EthernetInfo)source_value.get_pointer ();
- if (info.method == null) {
- target_value.set_string ("");
- return true;
- }
- switch (info.method) {
- case EthernetMethod.AUTO:
- target_value.set_string ("Automatic");
- break;
- case EthernetMethod.MANUAL:
- target_value.set_string ("Manual");
- break;
- default:
- return false;
- }
- return true;
- }
-
- bool transform_service_ethernet_to_interface_string (Binding binding,
- Value source_value, ref Value target_value)
- {
- unowned EthernetInfo info = (EthernetInfo)source_value.get_pointer ();
- target_value.set_string (info.interface ?? "");
- return true;
- }
-
- bool transform_service_ethernet_to_address_string (Binding binding,
- Value source_value, ref Value target_value)
- {
- unowned EthernetInfo info = (EthernetInfo)source_value.get_pointer ();
- target_value.set_string (info.address ?? "");
- return true;
- }
-
- bool transform_service_ethernet_to_mtu_int (Binding binding,
- Value source_value, ref Value target_value)
- {
- unowned EthernetInfo info = (EthernetInfo)source_value.get_pointer ();
- target_value.set_int (info.mtu ?? 0);
- return true;
- }
- }
-}
diff --git a/src/controller/OpenRobertaController.vala b/src/controller/OpenRobertaController.vala
deleted file mode 100644
index 3d16de9..0000000
--- a/src/controller/OpenRobertaController.vala
+++ /dev/null
@@ -1,211 +0,0 @@
-/*
- * brickman -- Brick Manager for LEGO MINDSTORMS EV3/ev3dev
- *
- * Copyright 2015 Stefan Sauer
- * Copyright 2015 David Lechner
- *
- * 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; either version 2 of the License, or
- * (at your option) any later version.
- *
- * 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, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
- * MA 02110-1301, USA.
- */
-
-/* OpenRobertaController.vala - Controller for openroberta lab service */
-
-using Ev3devKit;
-using Ev3devKit.Ui;
-
-namespace BrickManager {
- // TODO: move to lib/openroberta/Manager.vala
- [DBus (name = "org.openroberta.lab")]
- interface OpenRobertaLab : Object {
- [DBus (name = "status")]
- public signal void status (string message);
-
- [DBus (name = "connect")]
- public abstract string connect (string address) throws DBusError, IOError;
- [DBus (name = "disconnect")]
- public abstract void disconnect () throws DBusError, IOError;
- }
-
- public class OpenRobertaController : Object, IBrickManagerModule {
- const string SERVICE_NAME = "org.openroberta.lab";
- const string CONFIG = "/etc/openroberta.conf";
- const int OPEN_ROBERTA_TTY_NUM = 2;
-
- OpenRobertaWindow open_roberta_window;
- internal OpenRobertaStatusBarItem status_bar_item;
- OpenRobertaLab service;
- KeyFile config;
- bool executing_user_code;
-
- public bool available { get; set; }
-
- public string display_name { get { return "Open Roberta Lab"; } }
-
- public OpenRobertaController () {
- status_bar_item = new OpenRobertaStatusBarItem ();
- config = new KeyFile ();
-
- bind_property ("available", status_bar_item, "visible",
- BindingFlags.SYNC_CREATE);
-
- Bus.watch_name (BusType.SYSTEM, SERVICE_NAME,
- BusNameWatcherFlags.NONE, () => {
- connect_async.begin ((obj, res) => {
- try {
- connect_async.end (res);
- if (open_roberta_window != null) {
- open_roberta_window.loading = false;
- }
- available = true;
- } catch (IOError err) {
- warning ("%s", err.message);
- }
- });
- }, () => {
- status_bar_item.connected = false;
- if (open_roberta_window != null) {
- open_roberta_window.connected = false;
- }
- available = false;
- service = null;
- // if the service dies (while running code), definitely
- // switch back to brickman
- // FIXME: This should only be called if the current tty is the OpenRoberta tty
- // FIXME: need to figure out how console switching is going to work with GRX3
- // chvt (ConsoleApp.get_tty_num ());
- });
- }
-
- public void show_main_window () {
- if (open_roberta_window == null) {
- init_main_window ();
- }
- open_roberta_window.show ();
- }
-
- void init_main_window () {
- open_roberta_window = new OpenRobertaWindow (display_name) {
- loading = !available
- };
-
- bind_property ("available", open_roberta_window, "available",
- BindingFlags.SYNC_CREATE);
-
- try {
- config.load_from_file (CONFIG, KeyFileFlags.KEEP_COMMENTS);
- open_roberta_window.custom_server_address =
- config.get_string ("Common", "CustomServer");
- open_roberta_window.selected_server =
- config.get_string ("Common", "SelectedServer");
- } catch (FileError err) {
- warning ("FileError: %s", err.message);
- } catch (KeyFileError err) {
- warning ("KeyFileError: %s", err.message);
- }
-
- open_roberta_window.connect_selected.connect (on_server_connect);
- open_roberta_window.disconnect_selected.connect (on_server_disconnect);
- open_roberta_window.notify["custom-server-address"].connect (
- on_custom_server_changed);
- }
-
- async void connect_async () throws IOError {
- service = yield Bus.get_proxy (BusType.SYSTEM, SERVICE_NAME,
- "/org/openroberta/Lab1");
- service.status.connect (on_status_changed);
- //TODO: DBus service does not provide the initial state of "status".
- //on_status_changed (service.status);
- }
-
- void on_status_changed (string message) {
- debug ("service status: '%s'", message);
- // connected: we've started the communication with the server
- // registered: we're online
- // disconnected: the communication with the server is stopped or has
- // been terminated
- // executing: we're online and a program is running
- string[] online = { "registered", "executing" };
- if (message in online) {
- status_bar_item.connected = true;
- open_roberta_window.connected = true;
- if (message == "registered") {
- if (executing_user_code) {
- // FIXME: need to figure out how console switching is going to work with GRX3
- // var tty_num = ConsoleApp.get_tty_num ();
- // debug ("program done, switching to tty%d", tty_num);
- // executing_user_code = false;
- // chvt (tty_num);
- } else {
- debug ("connection established, closing the dialog");
- OpenRobertaWindow.close_pairing_code_dialog ();
- // remember selected server
- config.set_string ("Common", "SelectedServer",
- open_roberta_window.selected_server);
- try {
- config.save_to_file (CONFIG);
- } catch (FileError err) {
- warning ("FileError: %s", err.message);
- }
- }
- }
- if (message == "executing") {
- debug ("program starts, switching to tty%d", OPEN_ROBERTA_TTY_NUM);
- executing_user_code = true;
- chvt (OPEN_ROBERTA_TTY_NUM);
- }
- } else {
- status_bar_item.connected = false;
- open_roberta_window.connected = false;
- if (message == "disconnected") {
- debug ("connection failed, closing the dialog");
- OpenRobertaWindow.close_pairing_code_dialog ();
- }
- }
- }
-
- void on_custom_server_changed () {
- config.set_string ("Common", "CustomServer",
- open_roberta_window.custom_server_address);
- try {
- config.save_to_file (CONFIG);
- } catch (FileError err) {
- warning ("FileError: %s", err.message);
- }
- }
-
- void on_server_connect (string address) {
- try {
- open_roberta_window.selected_server = address;
- var code = service.connect ("http://" + address);
- OpenRobertaWindow.show_pairing_code_dialog (code);
- } catch (Error err) {
- warning ("%s", err.message);
- }
- }
-
- void on_server_disconnect () {
- try {
- service.disconnect ();
- } catch (Error err) {
- warning ("%s", err.message);
- }
- }
-
- void chvt (int num) {
- // TODO: might be better to do this with ioctl
- Posix.system ("/bin/chvt %d".printf (num));
- }
- }
-}
diff --git a/src/dbus/Bluez5Agent.vala b/src/dbus/Bluez5Agent.vala
deleted file mode 100644
index 239ea91..0000000
--- a/src/dbus/Bluez5Agent.vala
+++ /dev/null
@@ -1,288 +0,0 @@
-/*
- * brickman -- Brick Manager for LEGO MINDSTORMS EV3/ev3dev
- *
- * Copyright 2014-2015 David Lechner
- *
- * 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; either version 2 of the License, or
- * (at your option) any later version.
- *
- * 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, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
- * MA 02110-1301, USA.
- */
-
-/* Bluez5Agent.vala - BlueZ 5 Agent implementation */
-
-using Ev3devKit.Ui;
-using Bluez5;
-
-namespace BrickManager {
- [DBus (name = "org.bluez.Agent1")]
- public class Bluez5Agent : Object {
- MessageDialog? display_passkey_dialog;
-
- signal void canceled ();
-
- public Bluez5Agent () {
- }
-
- public void release () throws DBusError, IOError {
- //debug ("Released.");
- }
-
- public async string request_pin_code (ObjectPath device_path) throws DBusError, IOError, BlueZError {
- var result = ConfirmationDialogResult.CANCELED;
- var device = Device.get_for_object_path (device_path);
- var dialog = new Dialog ();
- weak Dialog weak_dialog = dialog;
- var canceled_handler_id = canceled.connect(() => {
- dialog.close ();
- });
- dialog.closed.connect (() => {
- SignalHandler.disconnect (this, canceled_handler_id);
- request_pin_code.callback ();
- });
- var dialog_vbox = new Box.vertical () {
- spacing = 3
- };
- dialog.add (dialog_vbox);
- var title_label = new Label (device.alias) {
- vertical_align = WidgetAlign.START,
- padding = 3,
- border_bottom = 1
- };
- dialog_vbox.add (title_label);
- var message_label = new Label ("Enter PIN:");
- dialog_vbox.add (message_label);
- // TODO: may need to allow alpha and symbol chars.
- var text_entry = new TextEntry ("1234 ") {
- valid_chars = TextEntry.NUMERIC + " ",
- use_on_screen_keyboard = false,
- horizontal_align = WidgetAlign.CENTER
- };
- dialog_vbox.add (text_entry);
- dialog_vbox.add (new Spacer ());
- var button_vbox = new Box.vertical ();
- dialog_vbox.add (button_vbox);
- var button_hbox = new Box.horizontal () {
- horizontal_align = WidgetAlign.CENTER,
- margin_top = -6,
- margin_bottom = 3
- };
- button_vbox.add (button_hbox);
- var reject_button = new Button.with_label ("Reject");
- reject_button.pressed.connect (() => {
- result = ConfirmationDialogResult.REJECTED;
- weak_dialog.close ();
- });
- button_hbox.add (reject_button);
- var accept_button = new Button.with_label ("Accept");
- accept_button.pressed.connect (() => {
- result = ConfirmationDialogResult.ACCEPTED;
- weak_dialog.close ();
- });
- button_hbox.add (accept_button);
- text_entry.next_focus_widget_down = accept_button;
- dialog.show ();
- yield;
- if (result == ConfirmationDialogResult.REJECTED)
- throw new BlueZError.REJECTED ("Rejected.");
- if (result == ConfirmationDialogResult.CANCELED)
- throw new BlueZError.CANCELED ("Canceled.");
- return text_entry.text.replace (" ", "");
- }
-
- public void display_pin_code (ObjectPath device_path, string pincode) throws DBusError, IOError {
- var device = Device.get_for_object_path (device_path);
- var dialog = new MessageDialog (device.alias,
- "PIN code is:\n%s".printf (pincode));
- weak Dialog weak_dialog = dialog;
- var canceled_handler_id = canceled.connect(() => {
- dialog.close ();
- });
- ulong closed_handler_id = 0;
- closed_handler_id = dialog.closed.connect (() => {
- SignalHandler.disconnect (this, canceled_handler_id);
- SignalHandler.disconnect (weak_dialog, closed_handler_id);
- });
- dialog.show ();
- }
-
- public async uint32 request_passkey (ObjectPath device_path) throws DBusError, IOError, BlueZError {
- var result = ConfirmationDialogResult.CANCELED;
- var device = Device.get_for_object_path (device_path);
- var dialog = new Dialog ();
- weak Dialog weak_dialog = dialog;
- var canceled_handler_id = canceled.connect(() => {
- dialog.close ();
- });
- dialog.closed.connect (() => {
- SignalHandler.disconnect (this, canceled_handler_id);
- request_passkey.callback ();
- });
- var dialog_vbox = new Box.vertical () {
- spacing = 6
- };
- dialog.add (dialog_vbox);
- var title_label = new Label (device.alias) {
- vertical_align = WidgetAlign.START,
- padding = 3,
- border_bottom = 1
- };
- dialog_vbox.add (title_label);
- var message_label = new Label ("Enter passkey");
- dialog_vbox.add (message_label);
- var text_entry = new TextEntry ("000000") {
- valid_chars = TextEntry.NUMERIC,
- use_on_screen_keyboard = false,
- horizontal_align = WidgetAlign.CENTER
- };
- dialog_vbox.add (text_entry);
- dialog_vbox.add (new Spacer ());
- var button_vbox = new Box.vertical ();
- dialog_vbox.add (button_vbox);
- var button_hbox = new Box.horizontal () {
- horizontal_align = WidgetAlign.CENTER,
- margin_top = -6,
- margin_bottom = 3
- };
- button_vbox.add (button_hbox);
- var reject_button = new Button.with_label ("Reject");
- reject_button.pressed.connect (() => {
- result = ConfirmationDialogResult.REJECTED;
- weak_dialog.close ();
- });
- button_hbox.add (reject_button);
- var accept_button = new Button.with_label ("Accept");
- accept_button.pressed.connect (() => {
- result = ConfirmationDialogResult.ACCEPTED;
- weak_dialog.close ();
- });
- button_hbox.add (accept_button);
- text_entry.next_focus_widget_down = accept_button;
- dialog.show ();
- yield;
- if (result == ConfirmationDialogResult.REJECTED)
- throw new BlueZError.REJECTED ("Rejected.");
- if (result == ConfirmationDialogResult.CANCELED)
- throw new BlueZError.CANCELED ("Canceled.");
- return (uint32)int.parse (text_entry.text);
- }
-
- public void display_passkey (ObjectPath device_path, uint32 passkey, uint16 entered) throws DBusError, IOError {
- // TODO: Do we want/need to do something with the `entered` parameter?
- var device = Device.get_for_object_path (device_path);
- // This particular function can be called multiple times while the
- // dialog is still displayed, so, if this happens, we remove the old
- // dialog and display a new one.
- if (display_passkey_dialog != null)
- display_passkey_dialog.close ();
- display_passkey_dialog = new MessageDialog (device.alias,
- "Passkey is: \n%s".printf ("%06u".printf (passkey)));
- weak Dialog weak_dialog = display_passkey_dialog;
- var canceled_handler_id = canceled.connect(() => {
- display_passkey_dialog.close ();
- });
- ulong closed_handler_id = 0;
- closed_handler_id = display_passkey_dialog.closed.connect (() => {
- SignalHandler.disconnect (this, canceled_handler_id);
- SignalHandler.disconnect (weak_dialog, closed_handler_id);
- // have to call as function to prevent reference cycle.
- dispose_display_passkey_dialog ();
- });
- display_passkey_dialog.show ();
- }
-
- void dispose_display_passkey_dialog () {
- display_passkey_dialog = null;
- }
-
- public async void request_confirmation (ObjectPath device_path, uint32 passkey) throws DBusError, IOError, BlueZError {
- var device = Device.get_for_object_path (device_path);
- yield display_confirmation_dialog (device.alias,
- "Confirm passkey\n%s".printf ("%06u".printf (passkey)));
- }
-
- public async void request_authorization (ObjectPath device_path) throws DBusError, IOError, BlueZError {
- var device = Device.get_for_object_path (device_path);
- yield display_confirmation_dialog (device.alias,
- "Authorize\nthis device?");
- }
-
- public async void authorize_service (ObjectPath device_path, string uuid) throws DBusError, IOError, BlueZError {
- var device = Device.get_for_object_path (device_path);
- yield display_confirmation_dialog (device.alias,
- "Authorize service\n%s?".printf (Bluez5.Uuid.to_short_profile (uuid)));
- }
-
- async void display_confirmation_dialog (string title, string message) throws DBusError, IOError, BlueZError {
- var result = ConfirmationDialogResult.CANCELED;
- var dialog = new Dialog ();
- weak Dialog weak_dialog = dialog;
- var canceled_handler_id = canceled.connect(() => {
- dialog.close ();
- });
- dialog.closed.connect (() => {
- SignalHandler.disconnect (this, canceled_handler_id);
- display_confirmation_dialog.callback ();
- });
- var dialog_vbox = new Box.vertical () {
- spacing = 3
- };
- dialog.add (dialog_vbox);
- var title_label = new Label (title) {
- vertical_align = WidgetAlign.START,
- padding = 3,
- border_bottom = 1
- };
- dialog_vbox.add (title_label);
- var message_label = new Label (message);
- dialog_vbox.add (message_label);
- dialog_vbox.add (new Spacer ());
- var button_vbox = new Box.vertical ();
- dialog_vbox.add (button_vbox);
- var button_hbox = new Box.horizontal () {
- horizontal_align = WidgetAlign.CENTER,
- margin = 3
- };
- button_vbox.add (button_hbox);
- var reject_button = new Button.with_label ("Reject");
- reject_button.pressed.connect (() => {
- result = ConfirmationDialogResult.REJECTED;
- weak_dialog.close ();
- });
- button_hbox.add (reject_button);
- var accept_button = new Button.with_label ("Accept");
- accept_button.pressed.connect (() => {
- result = ConfirmationDialogResult.ACCEPTED;
- weak_dialog.close ();
- });
- button_hbox.add (accept_button);
- dialog.show ();
- accept_button.focus ();
- yield;
- if (result == ConfirmationDialogResult.REJECTED)
- throw new BlueZError.REJECTED ("Rejected.");
- if (result == ConfirmationDialogResult.CANCELED)
- throw new BlueZError.CANCELED ("Canceled.");
- }
-
- public void cancel () throws DBusError, IOError {
- canceled ();
- }
-
- enum ConfirmationDialogResult {
- ACCEPTED,
- REJECTED,
- CANCELED
- }
- }
-}
\ No newline at end of file
diff --git a/src/dbus/ConnmanAgent.vala b/src/dbus/ConnmanAgent.vala
deleted file mode 100644
index b53702d..0000000
--- a/src/dbus/ConnmanAgent.vala
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
- * brickman -- Brick Manager for LEGO MINDSTORMS EV3/ev3dev
- *
- * Copyright 2014-2015 David Lechner
- *
- * 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; either version 2 of the License, or
- * (at your option) any later version.
- *
- * 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, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
- * MA 02110-1301, USA.
- */
-
-/* ConnmanAgent.vala - ConnMan Agent implementation */
-
-using Ev3devKit.Ui;
-using Connman;
-
-namespace BrickManager {
- [DBus (name = "net.connman.Agent")]
- public class ConnmanAgent : Object {
- const string NAME_KEY = "Name";
- const string SSID_KEY = "SSID";
- const string IDENTITY_KEY = "Identity";
- const string PASSPHRASE_KEY = "Passphrase";
- const string PREVIOUS_PASSPHRASE_KEY = "PreviousPassphrase";
- const string WPS_KEY = "WPS";
- const string USERNAME_KEY = "Username";
- const string PASSWORD_KEY = "Password";
- const string TYPE_KEY = "Type";
- const string REQUIREMENT_KEY = "Requirement";
- const string ALTERNATES_KEY = "Alternates";
- const string VALUE_KEY = "Value";
-
- [DBus (visible = false)]
- public Manager? manager { get; set; }
-
- signal void canceled ();
-
- public ConnmanAgent () {
- }
-
- public async void release () throws DBusError, IOError {
- //debug ("Released.");
- }
-
- public async void report_error (ObjectPath service_path, string err) throws DBusError, IOError, ConnmanAgentError {
- var dialog = new MessageDialog ("Error", err);
- dialog.show ();
- // TODO: get user feedback for retry
- //throw new ConnmanAgentError.RETRY ("User requested retry.");
- }
-
- public async void report_peer_error (ObjectPath peer_path, string err) throws DBusError, IOError, ConnmanAgentError {
- var dialog = new MessageDialog ("Error", err);
- dialog.show ();
- // TODO: get user feedback for retry
- //throw new ConnmanAgentError.RETRY ("User requested retry.");
- }
-
- public async void request_browser (ObjectPath service_path, string url) throws DBusError, IOError, ConnmanAgentError {
- throw new ConnmanAgentError.CANCELED ("Web browser not implemented.");
- }
-
- public async HashTable request_input (ObjectPath service_path, HashTable fields) throws DBusError, IOError, ConnmanAgentError {
- var service = manager.get_service (service_path);
- var required_field_names = new SList ();
- string? previous_passphrase = null;
- fields.foreach ((k, v) => {
- //debug ("%s %s", k, v.print (true));
- var requirement = v.lookup_value (REQUIREMENT_KEY, VariantType.STRING);
- if (requirement != null && requirement.get_string () == "mandatory") {
- required_field_names.prepend (k);
- }
- if (k == PREVIOUS_PASSPHRASE_KEY) {
- var previous_passphrase_value = v.lookup_value (VALUE_KEY, VariantType.STRING);
- if (previous_passphrase_value != null) {
- previous_passphrase = previous_passphrase_value.dup_string ();
- }
- }
- });
- var result = new HashTable (null, null);
- required_field_names.reverse ();
- foreach (var required_field_name in required_field_names) {
- var dialog = new ConnmanAgentInputDialog (
- "Please enter %s for %s.".printf (field_to_string (required_field_name),
- service.name),
- previous_passphrase ?? "");
- bool dialog_canceled = true;
- weak ConnmanAgentInputDialog weak_dialog = dialog;
- dialog.responded.connect ((accepted) => {
- dialog_canceled = !accepted;
- result[required_field_name] = weak_dialog.text_value;
- request_input.callback ();
- });
- var handler_id = canceled.connect (() => {
- dialog.responded (false);
- dialog.close ();
- var message_dialog = new MessageDialog ("Info", "Request was canceled.");
- message_dialog.show ();
- });
- dialog.show ();
- yield;
- SignalHandler.disconnect (this, handler_id);
- if (dialog_canceled) {
- throw new ConnmanAgentError.CANCELED ("Canceled by the user.");
- }
- }
- return result;
- }
-
- public async HashTable request_peer_authorization (ObjectPath peer_path, HashTable fields) throws DBusError, IOError, ConnmanAgentError {
- //var peer = Peer.from_path_sync (peer_path);
- throw new ConnmanAgentError.CANCELED ("Not implemented.");
- }
-
- public async void cancel () throws DBusError, IOError {
- canceled ();
- }
-
- string field_to_string (string field) {
- switch (field) {
- case NAME_KEY:
- case SSID_KEY:
- return "SSID";
- case IDENTITY_KEY:
- case USERNAME_KEY:
- return "username";
- case PASSPHRASE_KEY:
- return "passphrase";
- case WPS_KEY:
- return "WPS PIN";
- case PASSWORD_KEY:
- return "password";
- default:
- critical ("Unexpected field '%s'", field);
- return "???";
- }
- }
- }
-
- [DBus (name = "net.connman.Agent.Error")]
- public errordomain ConnmanAgentError {
- CANCELED,
- LAUNCH_BROWSER,
- REJECTED,
- RETRY
- }
-}
\ No newline at end of file
diff --git a/src/main.vala b/src/main.vala
deleted file mode 100644
index 736d78e..0000000
--- a/src/main.vala
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- * brickman -- Brick Manager for LEGO MINDSTORMS EV3/ev3dev
- *
- * Copyright 2014-2015 David Lechner
- *
- * 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; either version 2 of the License, or
- * (at your option) any later version.
- *
- * 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, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
- * MA 02110-1301, USA.
- */
-
-/* main.vala - main function */
-
-using Ev3devKit;
-using Ev3devKit.Ui;
-using Linux.VirtualTerminal;
-using Posix;
-
-namespace BrickManager {
- const string SPLASH_PNG = "splash.png";
-
- // The global_manager is shared by all of the controller objects
- GlobalManager global_manager;
-
- public static int main (string[] args) {
- try {
- var app = new ConsoleApp ();
-
- // Get something up on the screen ASAP.
- var splash_path = Path.build_filename (DATA_DIR, SPLASH_PNG);
- foreach (var dir in Environment.get_system_data_dirs ()) {
- var new_path = Path.build_filename (dir, splash_path);
- if (FileUtils.test (new_path, FileTest.EXISTS)) {
- splash_path = new_path;
- break;
- }
- }
- if (!Grx.get_screen_context ().load_from_png (splash_path)) {
- warning ("%s", "Could not load splash image.");
- }
-
- var activate_id = app.activate.connect (() => {
- app.hold ();
-
- global_manager = new GlobalManager ();
-
- Screen.get_active_screen ().status_bar.visible = true;
-
- var home_window = new HomeWindow ();
- var file_browser_controller = new FileBrowserController ();
- home_window.add_controller (file_browser_controller);
- var device_browser_controller = new DeviceBrowserController ();
- home_window.add_controller (device_browser_controller);
- var network_controller = new NetworkController ();
- home_window.add_controller (network_controller);
- var bluetooth_controller = new BluetoothController ();
- network_controller.add_controller (bluetooth_controller);
- network_controller.add_controller (network_controller.wifi_controller);
- var battery_controller = new BatteryController ();
- home_window.add_controller (battery_controller);
- var open_roberta_controller = new OpenRobertaController ();
- home_window.add_controller (open_roberta_controller);
- var about_controller = new AboutController ();
- home_window.add_controller (about_controller);
-
- Screen.get_active_screen ().status_bar.add_left (network_controller.network_status_bar_item);
-
- Screen.get_active_screen ().status_bar.add_right (battery_controller.battery_status_bar_item);
- Screen.get_active_screen ().status_bar.add_right (network_controller.wifi_status_bar_item);
- Screen.get_active_screen ().status_bar.add_right (bluetooth_controller.status_bar_item);
- Screen.get_active_screen ().status_bar.add_right (open_roberta_controller.status_bar_item);
-
- Systemd.Logind.Manager logind_manager = null;
- Systemd.Logind.Manager.get_system_manager.begin ((obj, res) => {
- try {
- logind_manager = Systemd.Logind.Manager.get_system_manager.end (res);
- home_window.shutdown_dialog.power_off_button_pressed.connect (() => {
- logind_manager.power_off.begin (false, (obj, res) => {
- try {
- logind_manager.power_off.end (res);
- global_manager.set_leds (LedState.BUSY);
- app.quit ();
- } catch (Error err) {
- var dialog = new MessageDialog ("Error", err.message);
- dialog.show ();
- }
- });
- });
- home_window.shutdown_dialog.reboot_button_pressed.connect (() => {
- logind_manager.reboot.begin (false, (obj, res) => {
- try {
- logind_manager.reboot.end (res);
- global_manager.set_leds (LedState.BUSY);
- app.quit ();
- } catch (Error err) {
- var dialog = new MessageDialog ("Error", err.message);
- dialog.show ();
- }
- });
- });
- } catch (IOError err) {
- var dialog = new MessageDialog ("Error", err.message);
- dialog.show ();
- }
- });
- home_window.show ();
- global_manager.set_leds (LedState.NORMAL);
- });
-
- // FIXME: Need to hook into input events here to get long back press
-
- app.run ();
- app.disconnect (activate_id);
-
- return 0;
- } catch (GLib.Error err) {
- critical ("%s", err.message);
- Process.exit (err.code);
- }
- }
-}
diff --git a/src/view/AboutWindow.vala b/src/view/AboutWindow.vala
deleted file mode 100644
index 7db9c73..0000000
--- a/src/view/AboutWindow.vala
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * brickman -- Brick Manager for LEGO MINDSTORMS EV3/ev3dev
- *
- * Copyright (C) 2014-2015 David Lechner
- *
- * 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, either version 3 of the License, or
- * (at your option) any later version.
- *
- * 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 .
- */
-
-/*
- * AboutWindow.vala - displays information about this program and the EV3 itself
- */
-
-using Ev3devKit.Ui;
-
-namespace BrickManager {
- public class AboutWindow : BrickManagerWindow {
- Label kernel_label;
- Label model_label;
- Label revision_label;
- Label serial_number_label;
-
- public string kernel_version {
- get { return kernel_label.text; }
- set { kernel_label.text = value; }
- }
-
- public string model_name {
- get { return model_label.text; }
- set { model_label.text = value; }
- }
-
- public string revision {
- get { return revision_label.text; }
- set { revision_label.text = value; }
- }
-
- public string serial_number {
- get { return serial_number_label.text; }
- set { serial_number_label.text = value; }
- }
-
- public AboutWindow (string display_name) {
- title = display_name;
- var scroll = new Scroll.vertical ();
- content_vbox.add (scroll);
-
- var scroll_vbox = new Box.vertical ();
- scroll.add (scroll_vbox);
-
- scroll_vbox.add (new Label ("%s v%s".printf (EXEC_NAME, VERSION)));
- scroll_vbox.add (new Label ("The ev3dev Brick Manager"));
- scroll_vbox.add (new Label ("(C) 2014-2015 ev3dev.org"));
- scroll_vbox.add (new Label ("System Info") {
- border_bottom = 1,
- padding_bottom = 3,
- margin_top = 6
- });
-
- scroll_vbox.add (new Label ("Kernel:") {
- margin_top = 6
- });
- kernel_label = new Label ("???");
- scroll_vbox.add (kernel_label);
-
- scroll_vbox.add (new Label ("Model:") {
- margin_top = 6
- });
- model_label = new Label ("???");
- scroll_vbox.add (model_label);
-
- scroll_vbox.add (new Label ("Revision:") {
- margin_top = 6
- });
- revision_label = new Label ("???");
- scroll_vbox.add (revision_label);
-
- scroll_vbox.add (new Label ("Serial Number:") {
- margin_top = 6
- });
- serial_number_label = new Label ("???");
- scroll_vbox.add (serial_number_label);
- }
- }
-}
diff --git a/src/view/BatteryInfoWindow.vala b/src/view/BatteryInfoWindow.vala
deleted file mode 100644
index ce99411..0000000
--- a/src/view/BatteryInfoWindow.vala
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * brickman -- Brick Manager for LEGO MINDSTORMS EV3/ev3dev
- *
- * Copyright (C) 2014-2015 David Lechner
- *
- * 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, either version 3 of the License, or
- * (at your option) any later version.
- *
- * 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 .
- */
-
-/*
- * BatteryInfoWindow.vala - displays information about the battery
- */
-
-using Ev3devKit.Ui;
-
-namespace BrickManager {
- public class BatteryInfoWindow : BrickManagerWindow {
- const string UNKNOWN_VALUE = "???";
-
- Grid info_grid;
- Label tech_label;
- Label tech_value_label;
- Label voltage_label;
- Label voltage_value_label;
- Label current_label;
- Label current_value_label;
- Label power_label;
- Label power_value_label;
-
- public string technology {
- get { return tech_value_label.text; }
- set { tech_value_label.text = value; }
- }
-
- public bool has_voltage {
- get { return voltage_label.visible; }
- set {
- voltage_label.visible = value;
- voltage_value_label.visible = value;
- }
- }
-
- double _voltage;
- public double voltage {
- get { return _voltage; }
- set {
- _voltage = value;
- voltage_value_label.text = "%.2fV".printf (value);
- }
- }
-
- public bool has_current {
- get { return current_label.visible; }
- set {
- current_label.visible = value;
- current_value_label.visible = value;
- }
- }
-
- double _current;
- public double current {
- get { return _current; }
- set {
- _current = value;
- current_value_label.text = "%.0fmA".printf (value);
- }
- }
-
- public bool has_power {
- get { return power_label.visible; }
- set {
- power_label.visible = value;
- power_value_label.visible = value;
- }
- }
-
- double _power;
- public double power {
- get { return _power; }
- set {
- _power = value;
- power_value_label.text = "%.2fW".printf (value);
- }
- }
-
- public BatteryInfoWindow (string display_name) {
- title = display_name;
- info_grid = new Grid (4, 2);
- content_vbox.add (info_grid);
- tech_label = new Label ("Type:") {
- horizontal_align = WidgetAlign.END,
- padding = 2
- };
- tech_value_label = new Label (UNKNOWN_VALUE) {
- horizontal_align = WidgetAlign.START,
- padding = 2
- };
- voltage_label = new Label ("Voltage:") {
- horizontal_align = WidgetAlign.END,
- padding = 2
- };
- voltage_value_label = new Label (UNKNOWN_VALUE) {
- horizontal_align = WidgetAlign.START,
- padding = 2
- };
- current_label = new Label ("Current:") {
- horizontal_align = WidgetAlign.END,
- padding = 2
- };
- current_value_label = new Label (UNKNOWN_VALUE) {
- horizontal_align = WidgetAlign.START,
- padding = 2
- };
- power_label = new Label ("Power:") {
- horizontal_align = WidgetAlign.END,
- padding = 2
- };
- power_value_label = new Label (UNKNOWN_VALUE) {
- horizontal_align = WidgetAlign.START,
- padding = 2
- };
- info_grid.add (tech_label);
- info_grid.add (tech_value_label);
- info_grid.add (voltage_label);
- info_grid.add (voltage_value_label);
- info_grid.add (current_label);
- info_grid.add (current_value_label);
- info_grid.add (power_label);
- info_grid.add (power_value_label);
- content_vbox.add (new Spacer ());
- }
- }
-}
diff --git a/src/view/BatteryStatusBarItem.vala b/src/view/BatteryStatusBarItem.vala
deleted file mode 100644
index e5c28be..0000000
--- a/src/view/BatteryStatusBarItem.vala
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * brickman -- Brick Manager for LEGO MINDSTORMS EV3/ev3dev
- *
- * Copyright (C) 2014-2015 David Lechner
- *
- * 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, either version 3 of the License, or
- * (at your option) any later version.
- *
- * 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 .
- */
-
-/*
- * BatteryStatusBarItem.vala:
- *
- * Indicates battery status
- */
-
-using Ev3devKit.Ui;
-using Grx;
-
-namespace BrickManager {
- public class BatteryStatusBarItem : StatusBarItem {
- const ushort END_WIDTH = 2;
- const ushort END_OFFSET = 2;
- const ushort PADDING = 1;
- const ushort TOP = 3;
- static Font font;
-
- static construct {
- try {
- font = Font.load ("fixed sans", 4);
- } catch (GLib.Error err) {
- critical ("%s", err.message);
- }
- }
-
- string _text = "???";
- TextOptions text_options;
-
- double _voltage;
- public double voltage {
- get { return _voltage; }
- set {
- if (_voltage == value)
- return;
- _voltage = value;
- if (voltage >= 10)
- _text = "%.1f".printf (value);
- else
- _text = "%.2f".printf (value);
- redraw ();
- }
- }
-
- public BatteryStatusBarItem () {
- text_options = new TextOptions (BatteryStatusBarItem.font, Color.NONE, Color.NONE);
- }
-
- public override int draw (int x, StatusBar.Align align) {
- var color = status_bar.screen.fg_color;
- text_options.fg_color = color;
- var main_width = text_options.font.get_text_width (_text) + PADDING * 2 + 2;
- var total_width = main_width + END_WIDTH;
- if (align == StatusBar.Align.RIGHT)
- x -= total_width - 1;
- draw_box (x, TOP, x + main_width - 1, HEIGHT - TOP, color);
- draw_filled_box (x + main_width, TOP + END_OFFSET,
- x + main_width + END_WIDTH - 1, HEIGHT - TOP - END_OFFSET,
- color);
- draw_text (_text, x + PADDING, TOP + 1 + PADDING, text_options);
- return total_width;
- }
- }
-}
diff --git a/src/view/BluetoothDeviceMenuItem.vala b/src/view/BluetoothDeviceMenuItem.vala
deleted file mode 100644
index 4ef217d..0000000
--- a/src/view/BluetoothDeviceMenuItem.vala
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * brickman -- Brick Manager for LEGO MINDSTORMS EV3/ev3dev
- *
- * Copyright (C) 2014-2015 David Lechner
- *
- * 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, either version 3 of the License, or
- * (at your option) any later version.
- *
- * 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 .
- */
-
-/*
- * BluetoothDeviceMenuItem.vala: Custom MenuItem for showing bluetooth device status.
- */
-
-using Ev3devKit;
-using Ev3devKit.Ui;
-
-namespace BrickManager {
- public class BluetoothDeviceMenuItem : Ui.MenuItem {
- const string PERCENT = "%";
-
- Label adapter_label;
- CheckButton connected_checkbox;
-
- public string name {
- get { return label.text; }
- set { label.text = value; }
- }
-
- public string adapter {
- owned get { return adapter_label.text[1:adapter_label.text.length - 1]; }
- set { adapter_label.text = "(%s)".printf (value); }
- }
-
- public bool show_adapter {
- get { return adapter_label.visible; }
- set { adapter_label.visible = value; }
- }
-
- public bool connected {
- get { return connected_checkbox.checked; }
- set { connected_checkbox.checked = value; }
- }
-
- public BluetoothDeviceMenuItem () {
- base.with_button (new Button () { margin_top = 1 }, new Label ());
- var hbox = new Box.horizontal ();
- button.add (hbox);
- hbox.add (label);
- adapter_label = new Label ("(???)") {
- visible = false
- };
- hbox.add (adapter_label);
- hbox.add (new Spacer ());
- connected_checkbox = new CheckButton.checkbox () {
- can_focus = false
- };
- hbox.add (connected_checkbox);
- }
- }
-}
diff --git a/src/view/BluetoothDeviceWindow.vala b/src/view/BluetoothDeviceWindow.vala
deleted file mode 100644
index c3b9ecd..0000000
--- a/src/view/BluetoothDeviceWindow.vala
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * brickman -- Brick Manager for LEGO MINDSTORMS EV3/ev3dev
- *
- * Copyright (C) 2014-2015 David Lechner
- *
- * 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, either version 3 of the License, or
- * (at your option) any later version.
- *
- * 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 .
- */
-
-/*
- * BluetoothDeviceWindow.vala:
- */
-
-using Ev3devKit.Ui;
-
-namespace BrickManager {
- public class BluetoothDeviceWindow : BrickManagerWindow {
- Label address_label;
- Button network_button;
- Button connect_button;
- Button remove_button;
-
- public string address {
- get { return address_label.text; }
- set { address_label.text = value; }
- }
-
- bool _paired;
- public bool paired {
- get { return _paired; }
- set {
- _paired = value;
- update_buttons ();
- }
- }
-
- bool _connected;
- public bool connected {
- get { return _connected; }
- set {
- _connected = value;
- update_buttons ();
- }
- }
-
- bool _has_network;
- public bool has_network {
- get { return _has_network; }
- set {
- _has_network = value;
- update_buttons ();
- }
- }
-
- public signal void network_selected ();
- public signal void connect_selected ();
- public signal void remove_selected ();
-
- public BluetoothDeviceWindow () {
- address_label = new Label ();
- content_vbox.add (address_label);
- content_vbox.add (new Spacer ());
- network_button = new Button.with_label ("Network Connection") {
- visible = false,
- margin_left = 6,
- margin_right = 6
- };
- network_button.pressed.connect (() => network_selected ());
- content_vbox.add (network_button);
- var button_hbox = new Box.horizontal () {
- margin = 6,
- margin_top = 1
- };
- content_vbox.add (button_hbox);
- connect_button = new Button.with_label ("???");
- connect_button.pressed.connect (() => {
- focus_none ();
- connect_selected ();
- });
- button_hbox.add (connect_button);
- remove_button = new Button.with_label ("Remove");
- remove_button.pressed.connect (() => {
- focus_none ();
- remove_selected ();
- });
- button_hbox.add (remove_button);
- }
-
- void update_buttons () {
- ((Label)connect_button.child).text = _paired ?
- (_connected ? "Disconnect" : "Connect") : "Pair";
- network_button.visible = _paired && _has_network;
- }
-
- void focus_none () {
- do_recursive_children ((widget) => {
- widget.has_focus = false;
- return null;
- });
- }
- }
-}
diff --git a/src/view/BluetoothStatusBarItem.vala b/src/view/BluetoothStatusBarItem.vala
deleted file mode 100644
index 5a03407..0000000
--- a/src/view/BluetoothStatusBarItem.vala
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * brickman -- Brick Manager for LEGO MINDSTORMS EV3/ev3dev
- *
- * Copyright (C) 2015 David Lechner
- *
- * 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, either version 3 of the License, or
- * (at your option) any later version.
- *
- * 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 .
- */
-
-/*
- * BluetoothStatusBarItem.vala:
- *
- * Indicates Bluetooth connection status
- */
-
-using Ev3devKit.Ui;
-using Grx;
-
-namespace BrickManager {
- public class BluetoothStatusBarItem : StatusBarItem {
- unowned Context connected_icon;
- unowned Context idle_icon;
-
- public bool connected { get; set; }
-
- public BluetoothStatusBarItem () {
- visible = false;
- string file;
- try {
- file = Path.build_filename (Ev3devKit.DATA_DIR, "bluetooth-connected16x16.png");
- connected_icon = Ev3devKit.Ui.Icon.create_context_from_png (file);
- file = Path.build_filename (Ev3devKit.DATA_DIR, "bluetooth16x16.png");
- idle_icon = Ev3devKit.Ui.Icon.create_context_from_png (file);
- } catch (GLib.Error err) {
- critical ("Error loading icon '%s'.", file);
- }
- notify["connected"].connect (redraw);
- }
-
- public override int draw (int x, StatusBar.Align align) {
- unowned Context icon = connected ? connected_icon : idle_icon;
- if (icon != null) {
- // this icon has 1 pixel width of whitespace on each side
- get_current_context ().bit_blt (x - icon.max_x + 2, 1, icon, 1, 0,
- icon.max_x - 2, icon.max_y, Color.WHITE.to_image_mode ());
- return icon.max_x - 2;
- }
- return -2;
- }
- }
-}
diff --git a/src/view/BluetoothWindow.vala b/src/view/BluetoothWindow.vala
deleted file mode 100644
index 522ad0d..0000000
--- a/src/view/BluetoothWindow.vala
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * brickman -- Brick Manager for LEGO MINDSTORMS EV3/ev3dev
- *
- * Copyright (C) 2014-2015 David Lechner
- *
- * 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, either version 3 of the License, or
- * (at your option) any later version.
- *
- * 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 .
- */
-
-/*
- * BluetoothWindow.vala: Main Bluetooth Menu
- */
-
-using Ev3devKit;
-using Ev3devKit.Ui;
-
-namespace BrickManager {
- public class BluetoothWindow : BrickManagerWindow {
- Ui.Menu powered_menu;
- Ui.Menu unpowered_menu;
- CheckboxMenuItem powered_menu_item;
- CheckboxMenuItem visible_menu_item;
- Ui.MenuItem scan_menu_item;
-
- bool _powered;
- public bool powered {
- get { return _powered; }
- set {
- if (value == _powered)
- return;
- _powered = value;
- powered_menu_item.checkbox.checked = value;
- if (value) {
- content_vbox.remove (unpowered_menu);
- content_vbox.add (powered_menu);
- powered_menu.insert_menu_item (powered_menu_item, visible_menu_item);
- } else {
- content_vbox.remove (powered_menu);
- content_vbox.add (unpowered_menu);
- unpowered_menu.add_menu_item (powered_menu_item);
- }
- }
- }
-
- public bool bt_visible {
- get { return visible_menu_item.checkbox.checked; }
- set { visible_menu_item.checkbox.checked = value; }
- }
-
- bool _scanning;
- public bool scanning {
- get { return _scanning; }
- set {
- _scanning = value;
- scan_menu_item.label.text = value ? "Stop Scan" : "Start Scan";
- }
- }
-
- public signal void scan_selected ();
-
- public BluetoothWindow (string display_name) {
- title = display_name;
- content_vbox.spacing = 0;
- powered_menu_item = new CheckboxMenuItem ("Powered");
- powered_menu_item.button.vertical_align = WidgetAlign.START;
- weak Ui.MenuItem weak_powered_menu_item = powered_menu_item;
- powered_menu_item.button.pressed.connect (() => {
- powered = !powered;
- weak_powered_menu_item.button.focus ();
- });
- content_vbox.add (powered_menu_item.button);
- powered_menu = new Ui.Menu ();
- visible_menu_item = new CheckboxMenuItem ("Visible");
- visible_menu_item.checkbox.notify["checked"].connect (() =>
- notify_property ("bt-visible"));
- powered_menu.add_menu_item (visible_menu_item);
- scan_menu_item = new Ui.MenuItem ("???");
- scan_menu_item.button.pressed.connect (() => scan_selected ());
- powered_menu.add_menu_item (scan_menu_item);
- var devices_label_menu_item = new Ui.MenuItem ("Devices");
- devices_label_menu_item.label.horizontal_align = WidgetAlign.CENTER;
- devices_label_menu_item.button.border_bottom = 1;
- devices_label_menu_item.button.margin_bottom = 2;
- devices_label_menu_item.button.can_focus = false;
- powered_menu.add_menu_item (devices_label_menu_item);
- unpowered_menu = new Ui.Menu ();
- }
-
- public void add_menu_item (Ui.MenuItem menu_item) {
- powered_menu.add_menu_item (menu_item);
- }
-
- public void remove_menu_item (Ui.MenuItem menu_item) {
- powered_menu.remove_menu_item (menu_item);
- }
-
- public Ui.MenuItem? find_menu_item (Object represented_object) {
- return powered_menu.find_menu_item