Based on KDE3 bluez4 version a TDE bluez5 version was created
Signed-off-by: Emanoil Kotsev <deloptes@gmail.com>pull/5/head
@ -0,0 +1,79 @@
|
||||
#################################################
|
||||
#
|
||||
# (C) 2018 Emanoil Kotsev
|
||||
# deloptes (AT) gmail.com
|
||||
#
|
||||
# Improvements and feedback are welcome
|
||||
#
|
||||
# This file is released under GPL >= 2
|
||||
#
|
||||
#################################################
|
||||
|
||||
cmake_minimum_required( VERSION 2.8 )
|
||||
|
||||
|
||||
##### general package setup #####################
|
||||
|
||||
project( tdebluez )
|
||||
set( PACKAGE tdebluez )
|
||||
set( VERSION R14.1.0 )
|
||||
|
||||
|
||||
##### include essential cmake modules ###########
|
||||
|
||||
include( FindPkgConfig )
|
||||
include( CheckIncludeFile )
|
||||
include( CheckTypeSize )
|
||||
include( CheckCSourceCompiles )
|
||||
include( CheckCXXSourceCompiles )
|
||||
include( CheckLibraryExists )
|
||||
|
||||
##### include our cmake modules #################
|
||||
include( TDEMacros )
|
||||
|
||||
##### setup install paths #######################
|
||||
include( TDESetupPaths )
|
||||
tde_setup_paths( )
|
||||
|
||||
if( NOT DBUS_SYS_DIR )
|
||||
set( DBUS_SYS_DIR ${SYSCONF_INSTALL_DIR}/dbus-1/system.d )
|
||||
endif( )
|
||||
|
||||
##### add apidox targets ############
|
||||
add_custom_target(apidox
|
||||
COMMAND "./generate_apidox" "${CMAKE_SOURCE_DIR}" "${CMAKE_BINARY_DIR}" "${HTML_INSTALL_DIR}" "/usr/share/tdebluez/doc/html"
|
||||
WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}/cmake/")
|
||||
|
||||
add_custom_target(install-apidox
|
||||
COMMAND "./install_apidox" "${CMAKE_SOURCE_DIR}" "${CMAKE_BINARY_DIR}" "${HTML_INSTALL_DIR}" "${CMAKE_INSTALL_PREFIX}"
|
||||
WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}/cmake/")
|
||||
|
||||
##### optional stuff ############################
|
||||
option( WITH_ALL_OPTIONS "Enable all optional support" OFF )
|
||||
|
||||
##### user requested modules ####################
|
||||
option( BUILD_ALL "Build all" ON )
|
||||
option( BUILD_LIBTDEBLUEZ "Build libtdebluez" ON )
|
||||
option( BUILD_TDEIOSLAVE "Build tdeioslave" ${BUILD_ALL} )
|
||||
option( BUILD_DOC "Build doc" ${BUILD_ALL} )
|
||||
|
||||
##### configure checks ##########################
|
||||
# if configure checks need be executed
|
||||
include( ConfigureChecks.cmake )
|
||||
|
||||
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${TQT_CXX_FLAGS}" )
|
||||
set( CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--no-undefined" )
|
||||
#-Wl,--whole-archive
|
||||
set( CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Wl,--no-undefined" )
|
||||
|
||||
##### activate dependencies #####################
|
||||
add_subdirectory( src/tdebluez-common )
|
||||
add_subdirectory( src/libtdebluez )
|
||||
add_subdirectory( src/libtdeobex )
|
||||
add_subdirectory( src/tdeioclient )
|
||||
add_subdirectory( src/tdeioslave )
|
||||
add_subdirectory( src/tdebluez )
|
||||
add_subdirectory( src/tdebluezauth )
|
||||
|
||||
tde_conditional_add_subdirectory( BUILD_DOC doc )
|
||||
tde_conditional_add_subdirectory( BUILD_TRANSLATIONS po )
|
@ -0,0 +1,59 @@
|
||||
#################################################
|
||||
#
|
||||
# (C) 2019 Emanoil Kotsev
|
||||
# deloptes (AT) gmail.com
|
||||
#
|
||||
# Improvements and feedback are welcome
|
||||
#
|
||||
# This file is released under GPL >= 2
|
||||
#
|
||||
#################################################
|
||||
|
||||
tde_setup_architecture_flags( )
|
||||
|
||||
include(TestBigEndian)
|
||||
test_big_endian(WORDS_BIGENDIAN)
|
||||
|
||||
##### check for gcc visibility support #########
|
||||
# FIXME
|
||||
# This should check for [T]Qt3 visibility support
|
||||
|
||||
if( WITH_GCC_VISIBILITY )
|
||||
if( NOT UNIX )
|
||||
tde_message_fatal(FATAL_ERROR "\ngcc visibility support was requested, but your system is not *NIX" )
|
||||
endif( NOT UNIX )
|
||||
set( __KDE_HAVE_GCC_VISIBILITY 1 )
|
||||
set( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fvisibility=hidden -fvisibility-inlines-hidden")
|
||||
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=hidden -fvisibility-inlines-hidden")
|
||||
endif( )
|
||||
|
||||
|
||||
###
|
||||
# some if then blocks come here
|
||||
# to handle submodules
|
||||
###
|
||||
|
||||
# check for dbus-1
|
||||
pkg_search_module( DBUS dbus-1 )
|
||||
if( NOT DBUS_FOUND )
|
||||
tde_message_fatal( "dbus-1 is required, but was not found on your system" )
|
||||
endif( )
|
||||
|
||||
|
||||
# check for dbus-1-tqt
|
||||
pkg_search_module( DBUS_TQT dbus-1-tqt )
|
||||
if( NOT DBUS_TQT_FOUND )
|
||||
tde_message_fatal( "dbus-1-tqt is required, but was not found on your system" )
|
||||
endif( )
|
||||
|
||||
# check for msgfmt
|
||||
if( BUILD_TRANSLATIONS AND NOT DEFINED MSGFMT_EXECUTABLE )
|
||||
find_program( MSGFMT_EXECUTABLE msgfmt )
|
||||
if( NOT MSGFMT_EXECUTABLE )
|
||||
tde_message_fatal( "msgfmt program is required, but was not found on your system" )
|
||||
endif( )
|
||||
endif( )
|
||||
|
||||
# required stuff
|
||||
find_package( TQt )
|
||||
find_package( TDE )
|
@ -0,0 +1,323 @@
|
||||
# Doxyfile 1.5.7.1-KDevelop
|
||||
|
||||
#---------------------------------------------------------------------------
|
||||
# Project related configuration options
|
||||
#---------------------------------------------------------------------------
|
||||
DOXYFILE_ENCODING = UTF-8
|
||||
PROJECT_NAME = tdebluez
|
||||
PROJECT_NUMBER = 1
|
||||
OUTPUT_DIRECTORY =
|
||||
CREATE_SUBDIRS = NO
|
||||
OUTPUT_LANGUAGE = English
|
||||
BRIEF_MEMBER_DESC = YES
|
||||
REPEAT_BRIEF = YES
|
||||
ABBREVIATE_BRIEF = "The $name class" \
|
||||
"The $name widget" \
|
||||
"The $name file" \
|
||||
is \
|
||||
provides \
|
||||
specifies \
|
||||
contains \
|
||||
represents \
|
||||
a \
|
||||
an \
|
||||
the
|
||||
ALWAYS_DETAILED_SEC = NO
|
||||
INLINE_INHERITED_MEMB = NO
|
||||
FULL_PATH_NAMES = YES
|
||||
STRIP_FROM_PATH = `pwd`
|
||||
STRIP_FROM_INC_PATH =
|
||||
SHORT_NAMES = NO
|
||||
JAVADOC_AUTOBRIEF = NO
|
||||
TQT_AUTOBRIEF = NO
|
||||
MULTILINE_CPP_IS_BRIEF = NO
|
||||
INHERIT_DOCS = YES
|
||||
SEPARATE_MEMBER_PAGES = NO
|
||||
TAB_SIZE = 8
|
||||
ALIASES =
|
||||
OPTIMIZE_OUTPUT_FOR_C = NO
|
||||
OPTIMIZE_OUTPUT_JAVA = NO
|
||||
OPTIMIZE_FOR_FORTRAN = NO
|
||||
OPTIMIZE_OUTPUT_VHDL = NO
|
||||
EXTENSION_MAPPING =
|
||||
BUILTIN_STL_SUPPORT = NO
|
||||
CPP_CLI_SUPPORT = NO
|
||||
SIP_SUPPORT = NO
|
||||
IDL_PROPERTY_SUPPORT = YES
|
||||
DISTRIBUTE_GROUP_DOC = NO
|
||||
SUBGROUPING = YES
|
||||
TYPEDEF_HIDES_STRUCT = NO
|
||||
SYMBOL_CACHE_SIZE = 0
|
||||
#---------------------------------------------------------------------------
|
||||
# Build related configuration options
|
||||
#---------------------------------------------------------------------------
|
||||
EXTRACT_ALL = NO
|
||||
EXTRACT_PRIVATE = NO
|
||||
EXTRACT_STATIC = NO
|
||||
EXTRACT_LOCAL_CLASSES = YES
|
||||
EXTRACT_LOCAL_METHODS = NO
|
||||
EXTRACT_ANON_NSPACES = NO
|
||||
HIDE_UNDOC_MEMBERS = NO
|
||||
HIDE_UNDOC_CLASSES = NO
|
||||
HIDE_FRIEND_COMPOUNDS = NO
|
||||
HIDE_IN_BODY_DOCS = NO
|
||||
INTERNAL_DOCS = NO
|
||||
CASE_SENSE_NAMES = YES
|
||||
HIDE_SCOPE_NAMES = NO
|
||||
SHOW_INCLUDE_FILES = YES
|
||||
INLINE_INFO = YES
|
||||
SORT_MEMBER_DOCS = YES
|
||||
SORT_BRIEF_DOCS = NO
|
||||
SORT_GROUP_NAMES = NO
|
||||
SORT_BY_SCOPE_NAME = NO
|
||||
GENERATE_TODOLIST = YES
|
||||
GENERATE_TESTLIST = YES
|
||||
GENERATE_BUGLIST = YES
|
||||
GENERATE_DEPRECATEDLIST= YES
|
||||
ENABLED_SECTIONS =
|
||||
MAX_INITIALIZER_LINES = 30
|
||||
SHOW_USED_FILES = YES
|
||||
SHOW_DIRECTORIES = NO
|
||||
SHOW_FILES = YES
|
||||
SHOW_NAMESPACES = YES
|
||||
FILE_VERSION_FILTER =
|
||||
LAYOUT_FILE =
|
||||
#---------------------------------------------------------------------------
|
||||
# configuration options related to warning and progress messages
|
||||
#---------------------------------------------------------------------------
|
||||
QUIET = NO
|
||||
WARNINGS = YES
|
||||
WARN_IF_UNDOCUMENTED = YES
|
||||
WARN_IF_DOC_ERROR = YES
|
||||
WARN_NO_PARAMDOC = NO
|
||||
WARN_FORMAT = "$file:$line: $text"
|
||||
WARN_LOGFILE =
|
||||
#---------------------------------------------------------------------------
|
||||
# configuration options related to the input files
|
||||
#---------------------------------------------------------------------------
|
||||
INPUT = src
|
||||
INPUT_ENCODING = UTF-8
|
||||
FILE_PATTERNS = *.c \
|
||||
*.cc \
|
||||
*.cxx \
|
||||
*.cpp \
|
||||
*.c++ \
|
||||
*.d \
|
||||
*.java \
|
||||
*.ii \
|
||||
*.ixx \
|
||||
*.ipp \
|
||||
*.i++ \
|
||||
*.inl \
|
||||
*.h \
|
||||
*.hh \
|
||||
*.hxx \
|
||||
*.hpp \
|
||||
*.h++ \
|
||||
*.idl \
|
||||
*.odl \
|
||||
*.cs \
|
||||
*.php \
|
||||
*.php3 \
|
||||
*.inc \
|
||||
*.m \
|
||||
*.mm \
|
||||
*.dox \
|
||||
*.py \
|
||||
*.f90 \
|
||||
*.f \
|
||||
*.vhd \
|
||||
*.vhdl \
|
||||
*.C \
|
||||
*.CC \
|
||||
*.C++ \
|
||||
*.II \
|
||||
*.I++ \
|
||||
*.H \
|
||||
*.HH \
|
||||
*.H++ \
|
||||
*.CS \
|
||||
*.PHP \
|
||||
*.PHP3 \
|
||||
*.M \
|
||||
*.MM \
|
||||
*.PY \
|
||||
*.F90 \
|
||||
*.F \
|
||||
*.VHD \
|
||||
*.VHDL \
|
||||
*.C \
|
||||
*.H \
|
||||
*.tlh \
|
||||
*.diff \
|
||||
*.patch \
|
||||
*.moc \
|
||||
*.xpm \
|
||||
*.dox
|
||||
RECURSIVE = yes
|
||||
EXCLUDE =
|
||||
EXCLUDE_SYMLINKS = NO
|
||||
EXCLUDE_PATTERNS =
|
||||
EXCLUDE_SYMBOLS =
|
||||
EXAMPLE_PATH =
|
||||
EXAMPLE_PATTERNS = *
|
||||
EXAMPLE_RECURSIVE = NO
|
||||
IMAGE_PATH =
|
||||
INPUT_FILTER =
|
||||
FILTER_PATTERNS =
|
||||
FILTER_SOURCE_FILES = NO
|
||||
#---------------------------------------------------------------------------
|
||||
# configuration options related to source browsing
|
||||
#---------------------------------------------------------------------------
|
||||
SOURCE_BROWSER = NO
|
||||
INLINE_SOURCES = NO
|
||||
STRIP_CODE_COMMENTS = YES
|
||||
REFERENCED_BY_RELATION = NO
|
||||
REFERENCES_RELATION = NO
|
||||
REFERENCES_LINK_SOURCE = YES
|
||||
USE_HTAGS = NO
|
||||
VERBATIM_HEADERS = YES
|
||||
#---------------------------------------------------------------------------
|
||||
# configuration options related to the alphabetical class index
|
||||
#---------------------------------------------------------------------------
|
||||
ALPHABETICAL_INDEX = NO
|
||||
COLS_IN_ALPHA_INDEX = 5
|
||||
IGNORE_PREFIX =
|
||||
#---------------------------------------------------------------------------
|
||||
# configuration options related to the HTML output
|
||||
#---------------------------------------------------------------------------
|
||||
GENERATE_HTML = YES
|
||||
HTML_OUTPUT = html
|
||||
HTML_FILE_EXTENSION = .html
|
||||
HTML_HEADER =
|
||||
HTML_FOOTER =
|
||||
HTML_STYLESHEET =
|
||||
HTML_ALIGN_MEMBERS = YES
|
||||
HTML_DYNAMIC_SECTIONS = NO
|
||||
GENERATE_DOCSET = NO
|
||||
DOCSET_FEEDNAME = "Doxygen generated docs"
|
||||
DOCSET_BUNDLE_ID = org.doxygen.Project
|
||||
GENERATE_HTMLHELP = NO
|
||||
CHM_FILE =
|
||||
HHC_LOCATION =
|
||||
GENERATE_CHI = NO
|
||||
CHM_INDEX_ENCODING =
|
||||
BINARY_TOC = NO
|
||||
TOC_EXPAND = NO
|
||||
GENERATE_TQHP = NO
|
||||
TQCH_FILE =
|
||||
TQHP_NAMESPACE =
|
||||
TQHP_VIRTUAL_FOLDER = doc
|
||||
TQHP_CUSTOM_FILTER_NAME=
|
||||
TQHP_CUST_FILTER_ATTRS =
|
||||
TQHP_SECT_FILTER_ATTRS =
|
||||
TQHG_LOCATION =
|
||||
DISABLE_INDEX = NO
|
||||
ENUM_VALUES_PER_LINE = 4
|
||||
GENERATE_TREEVIEW = NONE
|
||||
TREEVIEW_WIDTH = 250
|
||||
FORMULA_FONTSIZE = 10
|
||||
#---------------------------------------------------------------------------
|
||||
# configuration options related to the LaTeX output
|
||||
#---------------------------------------------------------------------------
|
||||
GENERATE_LATEX = YES
|
||||
LATEX_OUTPUT = latex
|
||||
LATEX_CMD_NAME = latex
|
||||
MAKEINDEX_CMD_NAME = makeindex
|
||||
COMPACT_LATEX = NO
|
||||
PAPER_TYPE = a4wide
|
||||
EXTRA_PACKAGES =
|
||||
LATEX_HEADER =
|
||||
PDF_HYPERLINKS = YES
|
||||
USE_PDFLATEX = YES
|
||||
LATEX_BATCHMODE = NO
|
||||
LATEX_HIDE_INDICES = NO
|
||||
#---------------------------------------------------------------------------
|
||||
# configuration options related to the RTF output
|
||||
#---------------------------------------------------------------------------
|
||||
GENERATE_RTF = NO
|
||||
RTF_OUTPUT = rtf
|
||||
COMPACT_RTF = NO
|
||||
RTF_HYPERLINKS = NO
|
||||
RTF_STYLESHEET_FILE =
|
||||
RTF_EXTENSIONS_FILE =
|
||||
#---------------------------------------------------------------------------
|
||||
# configuration options related to the man page output
|
||||
#---------------------------------------------------------------------------
|
||||
GENERATE_MAN = NO
|
||||
MAN_OUTPUT = man
|
||||
MAN_EXTENSION = .3
|
||||
MAN_LINKS = NO
|
||||
#---------------------------------------------------------------------------
|
||||
# configuration options related to the XML output
|
||||
#---------------------------------------------------------------------------
|
||||
GENERATE_XML = yes
|
||||
XML_OUTPUT = xml
|
||||
XML_SCHEMA =
|
||||
XML_DTD =
|
||||
XML_PROGRAMLISTING = YES
|
||||
#---------------------------------------------------------------------------
|
||||
# configuration options for the AutoGen Definitions output
|
||||
#---------------------------------------------------------------------------
|
||||
GENERATE_AUTOGEN_DEF = NO
|
||||
#---------------------------------------------------------------------------
|
||||
# configuration options related to the Perl module output
|
||||
#---------------------------------------------------------------------------
|
||||
GENERATE_PERLMOD = NO
|
||||
PERLMOD_LATEX = NO
|
||||
PERLMOD_PRETTY = YES
|
||||
PERLMOD_MAKEVAR_PREFIX =
|
||||
#---------------------------------------------------------------------------
|
||||
# Configuration options related to the preprocessor
|
||||
#---------------------------------------------------------------------------
|
||||
ENABLE_PREPROCESSING = YES
|
||||
MACRO_EXPANSION = NO
|
||||
EXPAND_ONLY_PREDEF = NO
|
||||
SEARCH_INCLUDES = YES
|
||||
INCLUDE_PATH =
|
||||
INCLUDE_FILE_PATTERNS =
|
||||
PREDEFINED =
|
||||
EXPAND_AS_DEFINED =
|
||||
SKIP_FUNCTION_MACROS = YES
|
||||
#---------------------------------------------------------------------------
|
||||
# Configuration::additions related to external references
|
||||
#---------------------------------------------------------------------------
|
||||
TAGFILES =
|
||||
GENERATE_TAGFILE = testgenbt.tag
|
||||
ALLEXTERNALS = NO
|
||||
EXTERNAL_GROUPS = YES
|
||||
PERL_PATH = /usr/bin/perl
|
||||
#---------------------------------------------------------------------------
|
||||
# Configuration options related to the dot tool
|
||||
#---------------------------------------------------------------------------
|
||||
CLASS_DIAGRAMS = YES
|
||||
MSCGEN_PATH =
|
||||
HIDE_UNDOC_RELATIONS = YES
|
||||
HAVE_DOT = NO
|
||||
DOT_FONTNAME = FreeSans
|
||||
DOT_FONTSIZE = 10
|
||||
DOT_FONTPATH =
|
||||
CLASS_GRAPH = YES
|
||||
COLLABORATION_GRAPH = YES
|
||||
GROUP_GRAPHS = YES
|
||||
UML_LOOK = NO
|
||||
TEMPLATE_RELATIONS = NO
|
||||
INCLUDE_GRAPH = YES
|
||||
INCLUDED_BY_GRAPH = YES
|
||||
CALL_GRAPH = NO
|
||||
CALLER_GRAPH = NO
|
||||
GRAPHICAL_HIERARCHY = YES
|
||||
DIRECTORY_GRAPH = YES
|
||||
DOT_IMAGE_FORMAT = png
|
||||
DOT_PATH =
|
||||
DOTFILE_DIRS =
|
||||
DOT_GRAPH_MAX_NODES = 50
|
||||
MAX_DOT_GRAPH_DEPTH = 1000
|
||||
DOT_TRANSPARENT = NO
|
||||
DOT_MULTI_TARGETS = NO
|
||||
GENERATE_LEGEND = YES
|
||||
DOT_CLEANUP = YES
|
||||
#---------------------------------------------------------------------------
|
||||
# Configuration::additions related to the search engine
|
||||
#---------------------------------------------------------------------------
|
||||
SEARCHENGINE = NO
|
@ -1,2 +1,143 @@
|
||||
# tdebluez
|
||||
# Overview
|
||||
|
||||
A set of applications to provide modern Bluetooth functionality to TDE.
|
||||
|
||||
Originally it was introduced around 2008 in SUSE, but it was not included in the main KDE3 set of applications.
|
||||
|
||||
Due to the major API change from Bluez4 to Bluez5 in Linux it was necessary to completely rewrite most of the applications while adding new and removing old parts of the functionality that were obsoleted.
|
||||
|
||||
Lack of devices for testing and differences in hardware standards make testing even more difficult and suggest unexpected behavior and issues. Please test and report back so that we can improve the application and its components.
|
||||
|
||||
|
||||
# Applications and libraries
|
||||
|
||||
## tdebluez
|
||||
This is the main application that provides the main functionality.
|
||||
|
||||
* Requires at least bluez 5.43
|
||||
|
||||
* It provides agent for pairing.
|
||||
|
||||
* Allows to configure bluetooth adapters and devices.
|
||||
|
||||
* User must be member of group netdev for /dev/rfkill access. This is required to make BT adapter switch on/off to work.
|
||||
|
||||
* pulseaudio-module-bluetooth needs to be installed for a2dp to work
|
||||
|
||||
* Tray icon
|
||||
|
||||

|
||||
|
||||
* Adapter (device) configuration
|
||||
|
||||

|
||||
|
||||
* Discovering devices
|
||||
|
||||

|
||||
|
||||
* Device setup wizard
|
||||
|
||||

|
||||
|
||||
* Pairing agent implements [BlueZ D-Bus Agent API](https://git.kernel.org/pub/scm/bluetooth/bluez.git/tree/doc/agent-api.txt) (example pairing with PIN)
|
||||
|
||||

|
||||
|
||||
* Connect services (profiles)
|
||||
|
||||

|
||||
|
||||
|
||||
## libtdebluez
|
||||
Almost complete rewrite for BlueZ 5 D-Bus API.
|
||||
This is the main library providing the core functionality.
|
||||
|
||||
## libtdeobex
|
||||
|
||||
New for BlueZ 5 D-Bus API.
|
||||
|
||||
|
||||
## tdebluezauth
|
||||
This is helper application that can be run stand alone, but it is usually started from tdebluez.
|
||||
It provides agent for authentication utilizing several DBus interfaces.
|
||||
|
||||
## bluez-obexd
|
||||
This can be seen as third party application that can be started as stand alone application or by tdebluez.
|
||||
It provides Obex FTP, OPP, Message Access, PSE.
|
||||
|
||||
* FTP is working per default in ~/Download directory.
|
||||
If you want to change this, open .trinity/share/config/tdebluezrc and add/modify entry
|
||||
downloadDir=Downloads
|
||||
You can use absolute or relative path. Both absolute and relative can be used, but relative paths are assumed to be relative to user $HOME folder. Default $HOME/Downloads.
|
||||
|
||||
## openobex
|
||||
This is third party library providing functionality for SyncML like used in SyncEvolution. Please, note that only v1.5 works. v1.7 is broken.
|
||||
|
||||
# Configuration
|
||||
|
||||
The configuration file is `~/.trinity/share/config/tdebluezrc`
|
||||
|
||||
Here is an example
|
||||
|
||||
```
|
||||
[20:xx:xx:xx:xx:xx]
|
||||
profile=0000110a-0000-1000-8000-00805f9b34fb,0000111f-0000-1000-8000-00805f9b34fb
|
||||
|
||||
[38:xx:xx:xx:xx:xx]
|
||||
profile=0000110a-0000-1000-8000-00805f9b34fb,0000111f-0000-1000-8000-00805f9b34fb
|
||||
|
||||
[3A:xx:xx:xx:xx:xx]
|
||||
profile=0000110b-0000-1000-8000-00805f9b34fb
|
||||
|
||||
[50:xx:xx:xx:xx:xx]
|
||||
profile=0000110b-0000-1000-8000-00805f9b34fb,00001108-0000-1000-8000-00805f9b34fb
|
||||
|
||||
[55:xx:xx:xx:xx:xx]
|
||||
profile=0000110b-0000-1000-8000-00805f9b34fb,0000111e-0000-1000-8000-00805f9b34fb
|
||||
|
||||
|
||||
[General]
|
||||
authAgent=true
|
||||
autoStart=true
|
||||
downloadDir=Downloads
|
||||
obexSrv=true
|
||||
obexSrvExe[$e]=/usr/libexec/bluetooth/obexd
|
||||
|
||||
[Notification Messages]
|
||||
systemtrayquitTDEBluetooth=false
|
||||
```
|
||||
|
||||
# Known issues
|
||||
Please report back your experience, so that we can improve the code.
|
||||
|
||||
* At the moment support for only one adapter was tested.
|
||||
|
||||
* Due to lack of HID devices, the code was tested only with
|
||||
** mobile phones (Android, Sailfish OS)
|
||||
** headset
|
||||
** head phones
|
||||
|
||||
* The ioslaves support only file/directory listing.
|
||||
|
||||
# Improvements
|
||||
## 14.1 TODO List
|
||||
1. fix the Async error while pairing (and connecting) [**done**]
|
||||
* Async error is OK and correct
|
||||
* some profiles are not compatible with other profiles (can not be connected simultaniusly)
|
||||
* Connecting now works with more than one device
|
||||
* it can connect one device at a time
|
||||
* some profiles are allowed to connect only once
|
||||
2. flip the mouse press button on the tray icon [**done**]
|
||||
3. fix the wizard when pairing (test with Android phone and non
|
||||
Android also with Headsets) [**done**]
|
||||
4. add some logic so that sub-processes are killed in case tdebluez crashes
|
||||
|
||||
After the 14.1 release
|
||||
|
||||
5. add obexFTP/OPP support
|
||||
6. add support for multiple adapters
|
||||
7. add autoconnect option
|
||||
8. Port the UUID logic from https://codebrowser.dev/qt5/qtconnectivity/src/bluetooth/qbluetoothuuid.h.html
|
||||
|
||||
|
||||
|
@ -0,0 +1,246 @@
|
||||
# -*- mode: makefile; coding: utf-8 -*-
|
||||
# Copyright © 2003 Christopher L Cheney <ccheney@debian.org>
|
||||
# Copyright © 2019 TDE Team
|
||||
# Description: A class for TDE packages; sets TDE environment variables, etc
|
||||
#
|
||||
# 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, 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., 59 Temple Place, Suite 330, Boston, MA
|
||||
# 02111-1307 USA.
|
||||
|
||||
ifndef _cdbs_bootstrap
|
||||
_cdbs_scripts_path ?= /usr/lib/cdbs
|
||||
_cdbs_rules_path ?= /usr/share/cdbs/1/rules
|
||||
_cdbs_class_path ?= /usr/share/cdbs/1/class
|
||||
endif
|
||||
|
||||
ifndef _cdbs_class_debian-qt-kde
|
||||
_cdbs_class_debian-qt-kde := 1
|
||||
|
||||
# for dh_icons
|
||||
CDBS_BUILD_DEPENDS := $(CDBS_BUILD_DEPENDS), debhelper (>= 5.0.7ubuntu4)
|
||||
|
||||
# Note: This _must_ be included before autotools.mk, or it won't work.
|
||||
common-configure-arch common-configure-indep:: debian/stamp-cvs-make
|
||||
debian/stamp-cvs-make:
|
||||
ifndef _cdbs_class_cmake
|
||||
cp -Rp /usr/share/aclocal/libtool.m4 admin/libtool.m4.in
|
||||
ifneq "$(wildcard /usr/share/libtool/config/ltmain.sh)" ""
|
||||
cp -Rp /usr/share/libtool/config/ltmain.sh admin/ltmain.sh
|
||||
endif
|
||||
ifneq "$(wildcard /usr/share/libtool/build-aux/ltmain.sh)" ""
|
||||
cp -Rp /usr/share/libtool/build-aux/ltmain.sh admin/ltmain.sh
|
||||
endif
|
||||
$(MAKE) -C $(DEB_SRCDIR) -f admin/Makefile.common dist;
|
||||
endif
|
||||
touch debian/stamp-cvs-make
|
||||
|
||||
include $(_cdbs_rules_path)/buildcore.mk$(_cdbs_makefile_suffix)
|
||||
|
||||
ifdef _cdbs_tarball_dir
|
||||
DEB_BUILDDIR = $(_cdbs_tarball_dir)/obj-$(DEB_BUILD_GNU_TYPE)
|
||||
else
|
||||
DEB_BUILDDIR = obj-$(DEB_BUILD_GNU_TYPE)
|
||||
endif
|
||||
|
||||
ifndef _cdbs_class_cmake
|
||||
include $(_cdbs_class_path)/autotools.mk$(_cdbs_makefile_suffix)
|
||||
endif
|
||||
|
||||
ifdef _cdbs_class_cmake
|
||||
ifneq "$(wildcard /usr/bin/ninja)" ""
|
||||
MAKE = ninja -v
|
||||
DEB_MAKE_ENVVARS += DESTDIR=$(DEB_DESTDIR)
|
||||
DEB_MAKE_INSTALL_TARGET = install
|
||||
DEB_CMAKE_NORMAL_ARGS += -GNinja
|
||||
endif
|
||||
endif
|
||||
|
||||
ifndef _cdbs_rules_patchsys_quilt
|
||||
DEB_PATCHDIRS := debian/patches/common debian/patches
|
||||
endif
|
||||
|
||||
export kde_cgidir = \$${libdir}/cgi-bin
|
||||
export kde_confdir = \$${sysconfdir}/trinity
|
||||
export kde_htmldir = \$${datadir}/doc/tde/HTML
|
||||
|
||||
DEB_KDE_ENABLE_FINAL := yes
|
||||
DEB_INSTALL_DOCS_ALL :=
|
||||
|
||||
DEB_DH_MAKESHLIBS_ARGS_ALL := -V
|
||||
DEB_SHLIBDEPS_INCLUDE = $(foreach p,$(PACKAGES_WITH_LIBS),debian/$(p)/usr/lib)
|
||||
|
||||
DEB_AC_AUX_DIR = $(DEB_SRCDIR)/admin
|
||||
DEB_CONFIGURE_INCLUDEDIR = "\$${prefix}/include"
|
||||
DEB_COMPRESS_EXCLUDE = .dcl .docbook -license .tag .sty .el
|
||||
|
||||
# The default gzip compressor has been changed in dpkg >= 1.17.0.
|
||||
deb_default_compress = $(shell LANG=C dpkg-deb --version | head -n1 | \
|
||||
sed -e "s|.*version ||" -e "s| .*||" | \
|
||||
xargs -r dpkg --compare-versions 1.17.0 lt \
|
||||
&& echo xz || echo gzip)
|
||||
ifeq ($(deb_default_compress),gzip)
|
||||
DEB_DH_BUILDDEB_ARGS += -- -Z$(shell dpkg-deb --help | grep -q ":.* xz[,.]" \
|
||||
&& echo xz || echo bzip2)
|
||||
endif
|
||||
|
||||
ifeq (,$(findstring noopt,$(DEB_BUILD_OPTIONS)))
|
||||
cdbs_treat_me_gently_arches := arm m68k alpha ppc64 armel armeb
|
||||
ifeq (,$(filter $(DEB_HOST_ARCH_CPU),$(cdbs_treat_me_gently_arches)))
|
||||
cdbs_kde_enable_final = $(if $(DEB_KDE_ENABLE_FINAL),--enable-final,)
|
||||
else
|
||||
cdbs_kde_enable_final =
|
||||
endif
|
||||
endif
|
||||
|
||||
ifneq (,$(filter nostrip,$(DEB_BUILD_OPTIONS)))
|
||||
cdbs_kde_enable_final =
|
||||
cdbs_kde_enable_debug = --enable-debug=yes
|
||||
else
|
||||
cdbs_kde_enable_debug = --disable-debug
|
||||
endif
|
||||
|
||||
ifneq (,$(filter debug,$(DEB_BUILD_OPTIONS)))
|
||||
cdbs_kde_enable_debug = --enable-debug=full
|
||||
endif
|
||||
|
||||
DEB_BUILD_PARALLEL ?= true
|
||||
|
||||
cdbs_configure_flags += \
|
||||
--with-qt-dir=/usr/share/qt3 \
|
||||
--disable-rpath \
|
||||
--with-xinerama \
|
||||
$(cdbs_kde_enable_final) \
|
||||
$(cdbs_kde_enable_debug)
|
||||
|
||||
|
||||
# This is a convenience target for calling manually.
|
||||
# It's not part of the build process.
|
||||
buildprep: clean apply-patches
|
||||
ifndef _cdbs_class_cmake
|
||||
$(MAKE) -f admin/Makefile.common dist
|
||||
endif
|
||||
debian/rules clean
|
||||
|
||||
.tdepkginfo:
|
||||
echo "# TDE package information" >.tdepkginfo
|
||||
dpkg-parsechangelog | sed -n "s|^Source: |Name: |p" >>.tdepkginfo
|
||||
dpkg-parsechangelog | sed -n "s|^Version: |Version: |p" >>.tdepkginfo
|
||||
date +"DateTime: %m/%d/%Y %H:%M" -u -d "$$(dpkg-parsechangelog | sed -n 's|^Date: ||p')" >>.tdepkginfo
|
||||
|
||||
post-patches:: .tdepkginfo
|
||||
|
||||
common-build-arch:: debian/stamp-man-pages
|
||||
debian/stamp-man-pages:
|
||||
if ! test -d debian/man/out; then mkdir -p debian/man/out; fi
|
||||
for f in $$(find debian/man -name '*.sgml'); do \
|
||||
docbook-to-man $$f > debian/man/out/`basename $$f .sgml`.1; \
|
||||
done
|
||||
for f in $$(find debian/man -name '*.man'); do \
|
||||
soelim -I debian/man $$f \
|
||||
> debian/man/out/`basename $$f .man`.`head -n1 $$f | awk '{print $$NF}'`; \
|
||||
done
|
||||
touch debian/stamp-man-pages
|
||||
|
||||
common-binary-indep::
|
||||
( set -e; \
|
||||
tmpf=`mktemp debian/versions.XXXXXX`; \
|
||||
perl debian/cdbs/versions.pl >$$tmpf; \
|
||||
for p in $(DEB_INDEP_PACKAGES); do \
|
||||
cat $$tmpf >>debian/$$p.substvars; \
|
||||
done; \
|
||||
rm -f $$tmpf )
|
||||
|
||||
common-binary-arch::
|
||||
( set -e; \
|
||||
tmpf=`mktemp debian/versions.XXXXXX`; \
|
||||
perl debian/cdbs/versions.pl >$$tmpf; \
|
||||
for p in $(DEB_ARCH_PACKAGES); do \
|
||||
cat $$tmpf >>debian/$$p.substvars; \
|
||||
done; \
|
||||
rm -f $$tmpf )
|
||||
# update multi-arch path in install files
|
||||
ls -d debian/* | \
|
||||
grep -E "(install|links)$$" | \
|
||||
while read a; do \
|
||||
[ -d $$a ] || [ -f $$a.arch ] || \
|
||||
! grep -q "\$$(DEB_HOST_MULTIARCH)" $$a || \
|
||||
sed -i.arch "s|\$$(DEB_HOST_MULTIARCH)|$(DEB_HOST_MULTIARCH)|g" $$a; \
|
||||
done
|
||||
|
||||
clean::
|
||||
rm -rf debian/man/out
|
||||
-rmdir debian/man
|
||||
rm -f debian/stamp-man-pages
|
||||
rm -rf debian/shlibs-check
|
||||
# revert multi-arch path in install files
|
||||
ls -d debian/* | \
|
||||
grep -E "(install|links)$$" | \
|
||||
while read a; do \
|
||||
[ ! -f $$a.arch ] || \
|
||||
mv $$a.arch $$a; \
|
||||
done
|
||||
|
||||
$(patsubst %,binary-install/%,$(DEB_PACKAGES)) :: binary-install/%:
|
||||
if test -x /usr/bin/dh_icons; then dh_icons -p$(cdbs_curpkg) $(DEB_DH_ICONCACHE_ARGS); fi
|
||||
if test -x /usr/bin/dh_desktop; then dh_desktop -p$(cdbs_curpkg) $(DEB_DH_DESKTOP_ARGS); fi
|
||||
if test -e debian/$(cdbs_curpkg).lintian; then \
|
||||
install -p -D -m644 debian/$(cdbs_curpkg).lintian \
|
||||
debian/$(cdbs_curpkg)/usr/share/lintian/overrides/$(cdbs_curpkg); \
|
||||
fi
|
||||
if test -e debian/$(cdbs_curpkg).presubj; then \
|
||||
install -p -D -m644 debian/$(cdbs_curpkg).presubj \
|
||||
debian/$(cdbs_curpkg)/usr/share/bug/$(cdbs_curpkg)/presubj; \
|
||||
fi
|
||||
|
||||
binary-install/$(DEB_SOURCE_PACKAGE)-doc-html::
|
||||
set -e; \
|
||||
for doc in `cd $(DEB_DESTDIR)/opt/trinity/share/doc/tde/HTML/en; find . -name index.docbook`; do \
|
||||
pkg=$${doc%/index.docbook}; pkg=$${pkg#./}; \
|
||||
echo Building $$pkg HTML docs...; \
|
||||
mkdir -p $(CURDIR)/debian/$(DEB_SOURCE_PACKAGE)-doc-html/opt/trinity/share/doc/tde/HTML/en/$$pkg; \
|
||||
cd $(CURDIR)/debian/$(DEB_SOURCE_PACKAGE)-doc-html/opt/trinity/share/doc/tde/HTML/en/$$pkg; \
|
||||
/opt/trinity/bin/meinproc $(DEB_DESTDIR)/opt/trinity/share/doc/tde/HTML/en/$$pkg/index.docbook; \
|
||||
done
|
||||
for pkg in $(DOC_HTML_PRUNE) ; do \
|
||||
rm -rf debian/$(DEB_SOURCE_PACKAGE)-doc-html/opt/trinity/share/doc/tde/HTML/en/$$pkg; \
|
||||
done
|
||||
|
||||
common-build-indep:: debian/stamp-kde-apidox
|
||||
debian/stamp-kde-apidox:
|
||||
$(if $(DEB_KDE_APIDOX),+$(DEB_MAKE_INVOKE) apidox)
|
||||
touch $@
|
||||
|
||||
common-install-indep:: common-install-kde-apidox
|
||||
common-install-kde-apidox::
|
||||
$(if $(DEB_KDE_APIDOX),+DESTDIR=$(DEB_DESTDIR) $(DEB_MAKE_INVOKE) install-apidox)
|
||||
|
||||
cleanbuilddir::
|
||||
-$(if $(call cdbs_streq,$(DEB_BUILDDIR),$(DEB_SRCDIR)),,rm -rf $(DEB_BUILDDIR))
|
||||
|
||||
clean::
|
||||
ifndef _cdbs_class_cmake
|
||||
if test -n "$(DEB_KDE_CVS_MAKE)" && test -d $(DEB_SRCDIR); then \
|
||||
cd $(DEB_SRCDIR); \
|
||||
find . -name Makefile.in -print | \
|
||||
xargs --no-run-if-empty rm -f; \
|
||||
rm -f Makefile.am acinclude.m4 aclocal.m4 config.h.in \
|
||||
configure configure.files configure.in stamp-h.in \
|
||||
subdirs; \
|
||||
fi
|
||||
endif
|
||||
rm -f .tdepkginfo
|
||||
rm -f debian/stamp-kde-apidox
|
||||
rm -f debian/stamp-cvs-make
|
||||
|
||||
endif
|
@ -0,0 +1,19 @@
|
||||
#!/usr/bin/env perl
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
|
||||
my $version = `dpkg-parsechangelog | awk '/^Version/ {print \$2}'`;
|
||||
my ($version3, $version3_next);
|
||||
my ($version2, $version2_next);
|
||||
|
||||
($version3 = $version) =~ s/^(([^.]+\.){2}[^.+~-]+)[.+~-]?[^-]*-[^-]+$/$1/;
|
||||
($version2 = $version3) =~ s/\.[^.]+$//;
|
||||
|
||||
($version3_next = $version3) =~ s/(?<=\.)(\d+)[a-z]?$/($1+1)/e;
|
||||
($version2_next = $version2) =~ s/(?<=\.)(\d+)$/($1+1)/e;
|
||||
|
||||
print "TDE-Version3=$version3\n";
|
||||
print "TDE-Version2=$version2\n";
|
||||
print "TDE-Next-Version3=$version3_next\n";
|
||||
print "TDE-Next-Version2=$version2_next\n";
|
@ -0,0 +1,12 @@
|
||||
tdebluez (4:14.1.0-0debian10.1.1+eko1) unstable; urgency=low
|
||||
|
||||
* Build for buster.
|
||||
|
||||
-- Emanoil Kotsev <deloptes@gmail.com> Sat, 02 Nov 2019 22:00:00 +0100
|
||||
|
||||
tdebluez (4:14.1.0-0debian9.0.5+eko1) unstable; urgency=low
|
||||
|
||||
* Rework of Dbus interface to Bluez5 for TDE 14.1.
|
||||
|
||||
-- Emanoil Kotsev <deloptes@gmail.com> Sat, 29 Sep 2018 22:00:00 +0100
|
||||
|
@ -0,0 +1 @@
|
||||
9
|
@ -0,0 +1,70 @@
|
||||
Source: tdebluez
|
||||
Section: tde
|
||||
Priority: optional
|
||||
Maintainer: Debian TDE Team <deloptes@gmail.com>
|
||||
Uploaders: ...
|
||||
Build-Depends: cdbs, debhelper (>= 9~), quilt, cmake-trinity, ninja-build, tdelibs14-trinity-dev, libdbus-1-tqt-dev, libdbus-1-3 (>= 1.10.26)
|
||||
Standards-Version: 3.8.0
|
||||
#Vcs-Svn: svn://svn.debian.org/pkg-kde/kde-extras/kdebluetooth/trunk/
|
||||
#Vcs-Browser: http://svn.debian.org/wsvn/pkg-kde/kde-extras/kdebluetooth/trunk/
|
||||
|
||||
Package: tdebluez
|
||||
Section: tde
|
||||
Architecture: any
|
||||
Depends: ${shlibs:Depends}, bluez (>= 5.43), bluez-obexd (>= 5.43), tdelibs14-trinity, libdbus-1-tqt
|
||||
Suggests: pulseaudio-module-bluetooth
|
||||
Description: TDE Bluetooth Framework
|
||||
The TDE Bluetooth Framework is a set of tools built on top of Linux' Bluetooth
|
||||
stack BlueZ5. It provides easy access to the most common Bluetooth profiles and
|
||||
makes data exchange with Bluetooth devices like phones and PDAs as
|
||||
straightforward as possible.
|
||||
.
|
||||
Features:
|
||||
* tdebluez -- a tray applet to handle incoming inquiries and control
|
||||
adapters and devices
|
||||
* tdebluezauth -- authentication agent
|
||||
* tdeioclient -- cli to obex
|
||||
|
||||
Package: libtdebluez
|
||||
Architecture: any
|
||||
Section: libs
|
||||
Replaces: libtdebluez (<< 0.1)
|
||||
Depends: ${shlibs:Depends}, bluez (>= 5.43)
|
||||
Description: Bluetooth library for TDE
|
||||
This package is part of the TDE Bluetooth Framework.
|
||||
It contains a Bluetooth library for TDE.
|
||||
.
|
||||
See the 'tdebluez' package for more informations.
|
||||
|
||||
Package: libtdeobex
|
||||
Architecture: any
|
||||
Section: libs
|
||||
Replaces: libtdeobex (<< 0.1)
|
||||
Depends: ${shlibs:Depends}, bluez (>= 5.43), bluez-obexd (>= 5.43)
|
||||
Description: Obex library for TDE
|
||||
This package is part of the TDE Bluetooth Framework.
|
||||
It contains a Bluetooth library for TDE.
|
||||
.
|
||||
See the 'tdebluez' package for more informations.
|
||||
|
||||
Package: libtdebluez-dev
|
||||
Architecture: any
|
||||
Section: libdevel
|
||||
Depends: libtdebluez (= ${binary:Version})
|
||||
Replaces: libtdebluez-dev (<< 0.1)
|
||||
Description: development files for libtdebluez
|
||||
This package is part of the TDE Bluetooth Framework.
|
||||
It contains the development files for libtdebluez.
|
||||
.
|
||||
See the 'tdebluez' package for more informations.
|
||||
|
||||
Package: libtdeobex-dev
|
||||
Architecture: any
|
||||
Section: libdevel
|
||||
Depends: libtdebluez (= ${binary:Version})
|
||||
Replaces: libtdebluez-dev (<< 0.1)
|
||||
Description: development files for libtdebluez
|
||||
This package is part of the TDE Bluetooth Framework.
|
||||
It contains the development files for libtdebluez.
|
||||
.
|
||||
See the 'tdebluez' package for more informations.
|
@ -0,0 +1,43 @@
|
||||
This package was debianized by Emanoil Kotsev <deloptes@gmail.com>
|
||||
on Fri, 19 Sep 2003 18:47:31 +0200.
|
||||
|
||||
It was downloaded from http://bluetooth.kmobiletools.org
|
||||
|
||||
Ported to TDE by Emanoil Kotsev <deloptes@gmail.com>
|
||||
on Tue, 22 Nov 2016 17:23:21 +0100.
|
||||
|
||||
Upstream Authors:
|
||||
|
||||
Emanoil Kotsev <deloptes@gmail.com>
|
||||
|
||||
Copyright:
|
||||
|
||||
(C) 2018 Emanoil Kotsev <deloptes@gmail.com>
|
||||
|
||||
License:
|
||||
|
||||
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 package; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
On Debian systems, the complete text of the GNU General
|
||||
Public License can be found in `/usr/share/common-licenses/GPL'.
|
||||
|
||||
The documentations provided with kdebluetooth is distributed under
|
||||
the GNU Free Documentation License (FDL). They are considered free with
|
||||
regards to the Debian Free Software Guidelines (DFSG) because they don't
|
||||
contain any unmodifiable parts (invariant sections).
|
||||
|
||||
On Debian systems, the complete text of the GNU Free Documentation
|
||||
License can be found in `/usr/share/common-licenses/GFDL'.
|
||||
|
@ -0,0 +1 @@
|
||||
README.md
|
@ -0,0 +1,2 @@
|
||||
opt/trinity/share/cmake/libtdebluez.cmake
|
||||
opt/trinity/include/tdebluez/*
|
@ -0,0 +1,5 @@
|
||||
opt/trinity/lib/libtdebluez.so.0
|
||||
opt/trinity/lib/libtdebluez.so.0.0.1
|
||||
opt/trinity/lib/libtdebluez.so
|
||||
opt/trinity/lib/libtdebluez.la
|
||||
etc/trinity/dbus-1/system.d/org.trinitydesktop.tdebluez.conf /etc/dbus-1/system.d/
|
@ -0,0 +1,2 @@
|
||||
opt/trinity/share/cmake/libtdeobex.cmake
|
||||
opt/trinity/include/tdeobex/*
|
@ -0,0 +1,4 @@
|
||||
opt/trinity/lib/libtdeobex.la
|
||||
opt/trinity/lib/libtdeobex.so
|
||||
opt/trinity/lib/libtdeobex.so.0
|
||||
opt/trinity/lib/libtdeobex.so.0.0.1
|
@ -0,0 +1,17 @@
|
||||
#!/usr/bin/make -f
|
||||
|
||||
include /usr/share/cdbs/1/rules/debhelper.mk
|
||||
include /usr/share/cdbs/1/class/cmake.mk
|
||||
include debian/cdbs/debian-tde.mk
|
||||
|
||||
DEB_CMAKE_EXTRA_FLAGS := \
|
||||
-DCMAKE_EXPORT_COMPILE_COMMANDS="ON" \
|
||||
-DCMAKE_INSTALL_PREFIX="/opt/trinity" \
|
||||
-DCONFIG_INSTALL_DIR="/etc/trinity" \
|
||||
-DSYSCONF_INSTALL_DIR="/etc/trinity" \
|
||||
-DXDG_MENU_INSTALL_DIR="/etc/xdg/menus" \
|
||||
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
|
||||
-DCMAKE_VERBOSE_MAKEFILE="ON" \
|
||||
-DCMAKE_SKIP_RPATH="OFF" \
|
||||
-DBUILD_ALL="ON" \
|
||||
-DWITH_ALL_OPTIONS="ON"
|
@ -0,0 +1 @@
|
||||
3.0 (quilt)
|
@ -0,0 +1,6 @@
|
||||
# Use xz instead of gzip
|
||||
compression = "xz"
|
||||
compression-level = 9
|
||||
|
||||
# Don't run differences
|
||||
diff-ignore = .*
|
@ -0,0 +1,62 @@
|
||||
#!/usr/bin/python
|
||||
# -*- coding: UTF-8 -*-
|
||||
"""
|
||||
Copyright (C) 2007 Achim Bohnet <allee@kubuntu.org>
|
||||
|
||||
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.
|
||||
"""
|
||||
|
||||
import sys
|
||||
from PyQt4 import QtCore, QtGui
|
||||
import dbus
|
||||
#import dbus.mainloop.tqt3
|
||||
import dbus.mainloop.qt
|
||||
import distutils.spawn
|
||||
|
||||
tdebtcmd = [ 'tdebluetooth' ]
|
||||
quitprogs = [ 'tdebluetooth', 'tdebluemon', 'tdeinputwizard' ] # FIXME: quit tdebluelock too?
|
||||
|
||||
|
||||
app = TQtGui.TQApplication(sys.argv)
|
||||
if app.isSessionRestored():
|
||||
sys.exit(1)
|
||||
|
||||
dbus.mainloop.qt.DBusQtMainLoop(set_as_default=True)
|
||||
bus = dbus.SystemBus()
|
||||
|
||||
try:
|
||||
manager = dbus.Interface(bus.get_object('org.bluez', '/org/bluez'), 'org.bluez.Manager')
|
||||
except:
|
||||
print "Unable to connect to bluez."
|
||||
sys.exit(1)
|
||||
|
||||
if len(manager.ListAdapters()):
|
||||
print "# of devices at startup:", len(manager.ListAdapters())
|
||||
distutils.spawn.spawn(kbtcmd)
|
||||
else:
|
||||
print "No BT device found"
|
||||
|
||||
|
||||
def slotAdapterAdded(device):
|
||||
print "bt dev added:", device, "# of devices:", len(manager.ListAdapters())
|
||||
distutils.spawn.spawn(kbtcmd)
|
||||
|
||||
def slotAdapterRemoved(device):
|
||||
print "bt dev removed:", device, "# num of devices:", len(manager.ListAdapters())
|
||||
if len(manager.ListAdapters()) == 0:
|
||||
for p in quitprogs:
|
||||
print "exiting:", p, " ..."
|
||||
try:
|
||||
distutils.spawn.spawn(['dcop', p, 'MainApplication-Interface', 'quit'])
|
||||
except:
|
||||
pass
|
||||
|
||||
manager.connect_to_signal("AdapterAdded", slotAdapterAdded)
|
||||
manager.connect_to_signal("AdapterRemoved", slotAdapterRemoved)
|
||||
|
||||
print "waiting for bt device (un)plug events ..."
|
||||
app.exec_()
|
||||
#sys.exit(app.exec_())
|
@ -0,0 +1,24 @@
|
||||
opt/trinity/bin/tdebluez
|
||||
opt/trinity/bin/tdebluezauth
|
||||
opt/trinity/bin/tdeioclient
|
||||
opt/trinity/lib/trinity/tdebluez.so
|
||||
opt/trinity/lib/trinity/tdebluez.la
|
||||
opt/trinity/lib/libtdeinit_tdebluez.so
|
||||
opt/trinity/lib/libtdeinit_tdebluez.la
|
||||
opt/trinity/lib/trinity/tdeio_bluetooth.so
|
||||
opt/trinity/lib/trinity/tdeio_bluetooth.la
|
||||
opt/trinity/lib/trinity/tdeio_obex.so
|
||||
opt/trinity/lib/trinity/tdeio_obex.la
|
||||
opt/trinity/share/apps/tdebluez/icons/*
|
||||
opt/trinity/share/doc/tde/HTML/*
|
||||
opt/trinity/share/apps/tdebluez/eventsrc
|
||||
opt/trinity/share/apps/tdebluez/tde-settings-network-bluetooth.directory
|
||||
opt/trinity/share/applications/tde/tdebluez.desktop
|
||||
opt/trinity/share/applications/tde/tdebluezauth.desktop
|
||||
opt/trinity/share/autostart/tdebluez.autostart.desktop
|
||||
opt/trinity/share/mimelnk/bluetooth/*
|
||||
opt/trinity/share/services/bluetooth.protocol
|
||||
opt/trinity/share/services/obexftp.protocol
|
||||
opt/trinity/share/services/obexopp.protocol
|
||||
opt/trinity/share/apps/konqsidebartng/virtual_folders/services/bluetooth_sidebarentry.desktop
|
||||
opt/trinity/share/apps/konqsidebartng/virtual_folders/services/obex_sidebarentry.desktop
|
@ -0,0 +1,32 @@
|
||||
#!/bin/sh
|
||||
exit 0
|
||||
# Remove a no-longer used conffile
|
||||
rm_conffile ()
|
||||
{
|
||||
PKGNAME="$1"
|
||||
CONFFILE="$2"
|
||||
|
||||
if [ -e "$CONFFILE" ]; then
|
||||
md5sum="`md5sum \"$CONFFILE\" | sed -e \"s/ .*//\"`"
|
||||
old_md5sum="`dpkg-query -W -f='${Conffiles}' $PKGNAME | sed -n -e \"\\\\' $CONFFILE'{s/ obsolete$//;s/.* //p}\"`"
|
||||
if [ "$md5sum" != "$old_md5sum" ]; then
|
||||
echo "Obsolete conffile $CONFFILE has been modified by you."
|
||||
echo "Saving as $CONFFILE.dpkg-bak ..."
|
||||
mv -f "$CONFFILE" "$CONFFILE".dpkg-bak
|
||||
else
|
||||
echo "Removing obsolete conffile $CONFFILE ..."
|
||||
rm -f "$CONFFILE"
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
# Last version that might have the obsolete conffile.
|
||||
LASTVERSION="0.1"
|
||||
case "$1" in install | upgrade)
|
||||
echo "FIXME: tdebluez.preinstall Last version that might have the obsolete conffile"
|
||||
# if dpkg --compare-versions "$2" le "$LASTVERSION"; then
|
||||
# rm_conffile tdebluetooth /etc/kde3/obexrc
|
||||
# fi
|
||||
esac
|
||||
|
||||
#DEBHELPER#
|
@ -0,0 +1,9 @@
|
||||
# See uscan(1) for format
|
||||
|
||||
# Compulsory line, this is a version 3 file
|
||||
version=3
|
||||
|
||||
# Uncomment to find new files on sourceforge, for debscripts >= 2.9
|
||||
#opts=uversionmangle=s/_/-/,dversionmangle=s/~/-/ \
|
||||
# http://cryptomilch.de/~dgollub/kdebluetooth/kdebluetooth-(.*)\.tar\.bz2 debian svn-upgrade
|
||||
# http://sf.net/kde-bluetooth/kdebluetooth-(.*)\.tar\.gz debian svn-upgrade
|
@ -0,0 +1,17 @@
|
||||
#################################################
|
||||
#
|
||||
# (C) 2018 Emanoil Kotsev
|
||||
# deloptes (AT) gmail.com
|
||||
#
|
||||
# Improvements and feedback are welcome
|
||||
#
|
||||
# This file is released under GPL >= 2
|
||||
#
|
||||
#################################################
|
||||
|
||||
#KDE_LANG = en
|
||||
#KDE_DOCS = AUTO
|
||||
#SUBDIRS = $(AUTODIRS)
|
||||
|
||||
tde_auto_add_subdirectories()
|
||||
|
@ -0,0 +1,16 @@
|
||||
#################################################
|
||||
#
|
||||
# (C) 2018 Emanoil Kotsev
|
||||
# deloptes (AT) gmail.com
|
||||
#
|
||||
# Improvements and feedback are welcome
|
||||
#
|
||||
# This file is released under GPL >= 2
|
||||
#
|
||||
#################################################
|
||||
#KDE_LANG = en
|
||||
#KDE_DOCS = kdebluetooth
|
||||
|
||||
tde_create_handbook( DESTINATION tdebluez )
|
||||
|
||||
#tde_create_handbook( LANG de DESTINATION tdebluez )
|
@ -0,0 +1,10 @@
|
||||
<sect1 id="components.bemused">
|
||||
<title>Bemused Server: Control your media player with your phone</title>
|
||||
<para>
|
||||
The KDE documentation for this component is still being developed. Meanwhile, please visit the <ulink url="http://bemused.sourceforge.net/">Bemused homepage</ulink> for more information.
|
||||
</para>
|
||||
<para>
|
||||
If you have any questions about it or if you want to complain about the missing documentation, send email to <link linkend="credits.ai">Alex Ibrado</link>.
|
||||
</para>
|
||||
</sect1>
|
||||
|
@ -0,0 +1,15 @@
|
||||
<chapter id="components">
|
||||
<title>Components</title>
|
||||
&components.tdebluez;
|
||||
&components.tdeio_bluetooth;
|
||||
&components.tdeio_obex;
|
||||
&components.tdeioclient;
|
||||
<!--&components.kbtobexsrv;-->
|
||||
<!--&components.bemused;-->
|
||||
<!--&components.kbluelock;-->
|
||||
<!--&components.khciconfig;-->
|
||||
&components.handsfree;
|
||||
<!--&components.kbtserialchat;-->
|
||||
<!--&components.irmcsynckonnector;-->
|
||||
<!--&components.othertools;-->
|
||||
</chapter>
|
@ -0,0 +1,85 @@
|
||||
<chapter id="concepts">
|
||||
<title>Concepts</title>
|
||||
|
||||
<sect1 id="concepts.pairing">
|
||||
<title>Bluetooth security: Pairing devices</title>
|
||||
|
||||
<sect2 id="concepts.pairing.whatisit">
|
||||
<title>What is "Pairing"?</title>
|
||||
<para>
|
||||
Very often it is required for a device to authenticate iself when it
|
||||
wants to access a service. In that case the two devices needs to be
|
||||
<phrase>paired</phrase>.
|
||||
When two devices are paired, they can be sure about the identity of the other
|
||||
party. Without pairing, you would have to rely on the address or name of
|
||||
the other device, which can be faked easily.
|
||||
</para>
|
||||
<para>
|
||||
Pairing usually happens one time between two devices. After pairing, connections
|
||||
between the two devices will be <phrase>authenticated</phrase> automatically.
|
||||
</para>
|
||||
<para>
|
||||
Usually <emphasis>the pairing process will be started automatically when it is needed</emphasis>.
|
||||
You do not have to worry about a device not being paired if you want to access its services.
|
||||
If they try to authenticate, but fail, the pairing process will be started automatically.
|
||||
</para>
|
||||
</sect2>
|
||||
|
||||
<sect2 id="concepts.pairing.howdoesitwork">
|
||||
<title>How does it work?</title>
|
||||
|
||||
<para>
|
||||
Devices are paired to be sure about the identity of the other side. But the
|
||||
first step can't be done automatically. <emphasis>You</emphasis> have to make
|
||||
sure that you know who wants to pair with your device. This is done by entering
|
||||
a "PIN" number in both devices. The notion "PIN" is widely used, but misleading.
|
||||
It is not the type of PIN you have to enter to get money from a cash machine.
|
||||
You don't have to remember it. And after (!) the pairing is done you don't have to
|
||||
keep it secret. You only have to make sure that nobody else knows that number
|
||||
until you (or you two) entered this number in each device.
|
||||
</para>
|
||||
<para>
|
||||
To be on the safe side, you should not only keep the PIN secret during the pairing
|
||||
process, but you should also use a random number, which can't be guessed easily.
|
||||
TDE Bluetooth assists you here by creating a 8-digit random number itself if possible.
|
||||
You can also use characters for a pin, but then you might have problems entering
|
||||
it into the pin dialog on a mobile phone.
|
||||
</para>
|
||||
</sect2>
|
||||
|
||||
<sect2 id="concepts.pairing.pinhelper">
|
||||
<title>The PIN helper</title>
|
||||
<para>
|
||||
But where should the pin be entered? As it was noted before, the devices will simply
|
||||
ask you for the PIN when is is needed. For BlueZ, things are a bit more complicated.
|
||||
There are several ways for BlueZ to get the PIN number from the user.
|
||||
</para>
|
||||
<para>
|
||||
TDE Bluetooth makes it simple by offering Authentication Agent that interacts with the
|
||||
bluetooth subsystem and offers dialogs to confirm or fill in PIN.
|
||||
Please see the <link linkend="installation.setup">setup instructions</link> on how to set
|
||||
up the pin helper and what to do if it doesn't work.
|
||||
</para>
|
||||
</sect2>
|
||||
|
||||
<sect2 id="concepts.pairing.bluez">
|
||||
<title>Managing paried devices</title>
|
||||
<para>
|
||||
After you have paired many devices you might ask yourself which devices are paired and which one not. You also may want to remove a pairing.
|
||||
</para>
|
||||
<para>
|
||||
First, no device can ever know for sure with which devices it is paired. When two devices are paired, they share a secret <phrase>link key</phrase>, which was created during the paring process based on the pin number and some other ingredients. Because the other side may decide to delete a link key without notice, haveing a link key for a given device doesn't guarantee that the link key on the other side still exists. If one link key is gone, the pairing does not exist anymore. Of course you can be sure that you are <emphasis>not</emphasis> paired with a device if you don't have a link key for it.
|
||||
</para>
|
||||
<para>
|
||||
So how can link keys be removed? That depends on the device. Most phones or PDAs have a list of "paired" or "trusted" devices, where you can remove single item from somehow.
|
||||
In TDE Bluez you can remove the device by using the "Devices..." and then select and delete the device.
|
||||
</para>
|
||||
<para>
|
||||
There is as special annoyance involved, when you frequently switch between different operating system which both use bluetooth (Linux<->Windows usually): When you pair your phone under Linux and then boot Windows, Windows will know nothing about the link keys managed by Bluez. So it appears as if the computer has dropped the link key and you will have to pair again. Depending on your device it might not even be possible to pair again without removing the "old" link key on the device before.
|
||||
</para>
|
||||
|
||||
</sect2>
|
||||
|
||||
</sect1>
|
||||
|
||||
</chapter>
|
@ -0,0 +1,55 @@
|
||||
<appendix id="credits">
|
||||
<!-- Include credits for the programmers, documentation writers, and
|
||||
contributors here. The license for your software should then be included below
|
||||
the credits with a reference to the appropriate license file included in the KDE
|
||||
distribution. -->
|
||||
<title>Credits and License</title>
|
||||
|
||||
<para>
|
||||
&The.framework;
|
||||
</para>
|
||||
<para>
|
||||
Program copyright 2003,2004,2020 &The.framework; team
|
||||
</para>
|
||||
<para>
|
||||
Team Members:
|
||||
<variablelist>
|
||||
|
||||
<varlistentry id="credits.fs">
|
||||
<term>
|
||||
Fred Schättgen <email>kde.sch@ttgen.net</email>
|
||||
</term>
|
||||
<listitem>
|
||||
|
||||
<itemizedlist>
|
||||
<listitem><para>kbluetoothd</para></listitem>
|
||||
<listitem><para>tdeio_bluetooth</para></listitem>
|
||||
<listitem><para>tdeio_sdp</para></listitem>
|
||||
<listitem><para>kbtserialchat</para></listitem>
|
||||
<listitem><para>kbthandsfree (disabled in 1.0)</para></listitem>
|
||||
<listitem><para>kcm_kbluetoothd</para></listitem>
|
||||
<listitem><para>bemused server</para></listitem>
|
||||
<listitem><para>libkbluetooth</para></listitem>
|
||||
<listitem><para>kioclient</para></listitem>
|
||||
<listitem><para>kbtsearch</para></listitem>
|
||||
</itemizedlist>
|
||||
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
|
||||
</variablelist>
|
||||
</para>
|
||||
<para>
|
||||
Documentation Copyright © 2004 Fred Schättgen <email>kde.sch@ttgen.net</email>
|
||||
</para>
|
||||
<para>
|
||||
Documentation Copyright © 2020 &Emanoil.Kotsev; <email>&Emanoil.Kotsev.mail;</email>
|
||||
</para>
|
||||
|
||||
|
||||
<!-- TRANS:CREDIT_FOR_TRANSLATORS -->
|
||||
|
||||
&underFDL; <!-- FDL: do not remove -->
|
||||
&underGPL; <!-- GPL License -->
|
||||
|
||||
</appendix>
|
@ -0,0 +1,25 @@
|
||||
<chapter id="developers">
|
||||
<title>Developer Information</title>
|
||||
|
||||
<sect1 id="developers.tdebluez">
|
||||
<title>TDEBluetooth</title>
|
||||
<para>This section describes how to utilize tdebluez for your own application or access it from scripts to retrieve cached device names or similar.
|
||||
</para>
|
||||
|
||||
<sect2>
|
||||
<title>The tdebluez library</title>
|
||||
<para>
|
||||
The library provides access to the implementation of the DBus interfaces specified in <ulink url="https://git.kernel.org/pub/scm/bluetooth/bluez.git/tree/doc">the kernel documentation</ulink>.
|
||||
</para>
|
||||
</sect2>
|
||||
|
||||
<sect2>
|
||||
<title>The tdeobex library</title>
|
||||
<para>
|
||||
The library provides access to the implementation of the DBus interfaces specified in the kernel documentation <ulink url="https://git.kernel.org/pub/scm/bluetooth/bluez.git/tree/doc">the kernel documentation</ulink>.
|
||||
</para>
|
||||
</sect2>
|
||||
|
||||
</sect1>
|
||||
</chapter>
|
||||
|
@ -0,0 +1,16 @@
|
||||
<chapter id="download">
|
||||
<title>Getting &the.framework;</title>
|
||||
<sect1 id="download.tarballs">
|
||||
<title>Sources</title>
|
||||
<para>
|
||||
&The.framework; is part of <ulink url="https://www.trinitydesktop.org/">TDE - the Trinity Desktop Environment</ulink>.
|
||||
You can download and compile the the sources yourself, but we recommend using a package for your distribution.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
Or you find the source code in <ulink url="https://mirror.git.trinitydesktop.org/gitea/">the git repository</ulink>.
|
||||
</para>
|
||||
|
||||
</sect1>
|
||||
|
||||
</chapter>
|
@ -0,0 +1,21 @@
|
||||
<chapter id="faq">
|
||||
<title>Questions and Answers</title>
|
||||
<qandaset defaultlabel="qanda">
|
||||
|
||||
<qandaentry>
|
||||
<question>
|
||||
<para>My problem isn't listed in this FAQ. Where else can I get help?</para>
|
||||
</question>
|
||||
<answer>
|
||||
<para>You can ask on
|
||||
<ulink url="https://mirror.git.trinitydesktop.org/gitea/">Gitea</ulink>
|
||||
where you can post your questions and comments or on
|
||||
gmane.comp.desktop.trinity.devel.
|
||||
Please look in the archive first before posting, but don't hesitate to ask
|
||||
us if you didn't find anything helpful.</para>
|
||||
</answer>
|
||||
</qandaentry>
|
||||
|
||||
</qandaset>
|
||||
|
||||
</chapter>
|
@ -0,0 +1,15 @@
|
||||
<sect1 id="components.handsfree">
|
||||
<title>Dial and talk using your computer</title>
|
||||
<para>
|
||||
The handsfree client is an implementation of the Bluetooth handsfree profile.
|
||||
This protocol is similar to the headset profile, but it provides more
|
||||
functions than the older headset profile. Originally, the handsfree profile
|
||||
was designed for use in car handsfree devices, but more and more common
|
||||
Bluetooth headset support the profile today.
|
||||
|
||||
Modern linux provide ofono as modem manager. For the moment it is possible to
|
||||
connect the HFP and use external ofono frontends for managing calls.
|
||||
</para>
|
||||
|
||||
</sect1>
|
||||
|
@ -0,0 +1,164 @@
|
||||
<?xml version="1.0" ?>
|
||||
<!DOCTYPE book PUBLIC "-//KDE//DTD DocBook XML V4.1.2-Based Variant V1.0//EN" "dtd/kdex.dtd" [
|
||||
<!ENTITY The.framework "<application>The TDE Bluetooth framework</application>">
|
||||
<!ENTITY the.framework "<application>the TDE Bluetooth framework</application>">
|
||||
<!ENTITY kde "<acronym>TDE</acronym>">
|
||||
<!ENTITY kappname "&The.framework;">
|
||||
<!ENTITY package "tdebluez">
|
||||
<!ENTITY Fred.Schaettgen "<firstname>Fred</firstname><surname>Schättgen</surname>">
|
||||
<!ENTITY Fred.Schaettgen.mail "<email>kdebluetooth@0xF.de</email>">
|
||||
<!ENTITY Emanoil.Kotsev "<firstname>Emanoil</firstname><surname>Kotsev</surname>">
|
||||
<!ENTITY Emanoil.Kotsev.mail "<email>deloptes@gmail.com</email>">
|
||||
<!ENTITY % addindex "IGNORE">
|
||||
<!ENTITY % English "INCLUDE">
|
||||
|
||||
|
||||
<!ENTITY faq SYSTEM "faq.docbook">
|
||||
<!ENTITY download SYSTEM "download.docbook">
|
||||
<!ENTITY installation SYSTEM "installation.docbook">
|
||||
<!ENTITY introduction SYSTEM "introduction.docbook">
|
||||
<!ENTITY concepts SYSTEM "concepts.docbook">
|
||||
<!ENTITY credits SYSTEM "credits.docbook">
|
||||
<!ENTITY links SYSTEM "links.docbook">
|
||||
<!ENTITY news SYSTEM "news.docbook">
|
||||
<!ENTITY components SYSTEM "components.docbook">
|
||||
<!ENTITY developers SYSTEM "developers.docbook">
|
||||
|
||||
<!ENTITY components.handsfree SYSTEM "handsfree.docbook">
|
||||
<!ENTITY components.tdebluez SYSTEM "tdebluez.docbook">
|
||||
<!ENTITY components.tdeio_obex SYSTEM "tdeio_obex.docbook">
|
||||
<!ENTITY components.tdeio_bluetooth SYSTEM "tdeio_bluetooth.docbook">
|
||||
<!ENTITY components.tdeioclient SYSTEM "tdeioclient.docbook">
|
||||
<!--<!ENTITY components.kbtobexsrv SYSTEM "kbtobexsrv.docbook">-->
|
||||
<!--<!ENTITY components.kbtserialchat SYSTEM "kbtserialchat.docbook">-->
|
||||
<!--<!ENTITY components.tdeio_sdp SYSTEM "tdeio_sdp.docbook">-->
|
||||
<!--<!ENTITY components.bemused SYSTEM "bemused.docbook">-->
|
||||
<!-- khciconfig is currently disabled because it's unmaintained -->
|
||||
<!--<!ENTITY components.khciconfig SYSTEM "khciconfig.docbook">-->
|
||||
<!--<!ENTITY components.kbtobexclient SYSTEM "kbtobexclient.docbook">-->
|
||||
<!--<!ENTITY components.kbluelock SYSTEM "kbluelock.docbook">-->
|
||||
<!--<!ENTITY components.irmcsynckonnector SYSTEM "irmcsynckonnector.docbook">-->
|
||||
<!--<!ENTITY components.othertools SYSTEM "othertools.docbook">-->
|
||||
|
||||
<!-- Do not define any other entities; instead, use the entities
|
||||
from entities/general.entities and $LANG/user.entities. -->
|
||||
]>
|
||||
<!-- kdoctemplate v0.9 January 10 2003
|
||||
Changes to comments to clarify entity usage January 10 2003
|
||||
Minor update to "Credits and Licenses" section on August 24, 2000
|
||||
Removed "Revision history" section on 22 January 2001
|
||||
Changed to Installation/Help menu entities 18 October 2001
|
||||
Other minor cleanup and changes 18 October 2001
|
||||
FPI change and minor changes November 2002 -->
|
||||
|
||||
<book lang="&language;">
|
||||
|
||||
<!-- This header contains all of the meta-information for the document such
|
||||
as Authors, publish date, the abstract, and Keywords -->
|
||||
|
||||
<bookinfo>
|
||||
<title>&The.framework; Handbook</title>
|
||||
|
||||
<authorgroup>
|
||||
|
||||
<author>
|
||||
&Fred.Schaettgen;
|
||||
<affiliation>
|
||||
<address><email>kde.sch@ttgen.net</email></address>
|
||||
</affiliation>
|
||||
</author>
|
||||
|
||||
<author>
|
||||
&Emanoil.Kotsev;
|
||||
<affiliation>
|
||||
<address><email>&Emanoil.Kotsev.mail;</email></address>
|
||||
</affiliation>
|
||||
</author>
|
||||
</authorgroup>
|
||||
|
||||
<!-- TRANS:ROLES_OF_TRANSLATORS -->
|
||||
|
||||
<copyright>
|
||||
<year>2004</year>
|
||||
<holder>&Fred.Schaettgen;</holder>
|
||||
</copyright>
|
||||
|
||||
<copyright>
|
||||
<year>2020</year>
|
||||
<holder>&Emanoil.Kotsev;</holder>
|
||||
</copyright>
|
||||
<!-- Translators: put here the copyright notice of the translation -->
|
||||
<!-- Put here the FDL notice. Read the explanation in fdl-notice.docbook
|
||||
and in the FDL itself on how to use it. -->
|
||||
<legalnotice>&FDLNotice;</legalnotice>
|
||||
|
||||
<!-- Date and version information of the documentation
|
||||
Don't forget to include this last date and this last revision number, we
|
||||
need them for translation coordination !
|
||||
Please respect the format of the date (YYYY-MM-DD) and of the version
|
||||
(V.MM.LL), it could be used by automation scripts.
|
||||
Do NOT change these in the translation. -->
|
||||
|
||||
<date>2020-07-27</date>
|
||||
<releaseinfo>1.0</releaseinfo>
|
||||
|
||||
<!-- Abstract about this handbook -->
|
||||
|
||||
<abstract>
|
||||
<para>
|
||||
This is an overview over the TDE Bluetooth Framework. The framework
|
||||
is a package of several tools and infrastruture for TDE, which are
|
||||
usually used to communicate with bluetooth devices such as mobile phones
|
||||
or PDAs. It is built on top of BlueZ 5, the official Bluetooth stack for Linux.
|
||||
</para>
|
||||
</abstract>
|
||||
|
||||
<!-- This is a set of Keywords for indexing by search engines.
|
||||
Please at least include KDE, the KDE package it is in, the name
|
||||
of your application, and a few relevant keywords. -->
|
||||
|
||||
<keywordset>
|
||||
<keyword>TDE</keyword>
|
||||
<keyword>tdenetwork</keyword>
|
||||
<keyword>tdebluez</keyword>
|
||||
<keyword>Bluetooth</keyword>
|
||||
<keyword>Rfcomm</keyword>
|
||||
<keyword>BlueZ</keyword>
|
||||
<keyword>OBEX</keyword>
|
||||
<keyword>Sync</keyword>
|
||||
</keywordset>
|
||||
|
||||
</bookinfo>
|
||||
|
||||
<!-- The contents of the documentation begin here. Label
|
||||
each chapter so with the id attribute. This is necessary for two reasons: it
|
||||
allows you to easily reference the chapter from other chapters of your
|
||||
document, and if there is no ID, the name of the generated HTML files will vary
|
||||
from time to time making it hard to manage for maintainers and for the SVN
|
||||
system. Any chapter labelled (OPTIONAL) may be left out at the author's
|
||||
discretion. Other chapters should not be left out in order to maintain a
|
||||
consistent documentation style across all KDE apps. -->
|
||||
|
||||
&introduction;
|
||||
|
||||
&news;
|
||||
|
||||
&download;
|
||||
|
||||
&installation;
|
||||
|
||||
&components;
|
||||
|
||||
&concepts;
|
||||
|
||||
&faq;
|
||||
|
||||
&developers;
|
||||
|
||||
&links;
|
||||
|
||||
&credits;
|
||||
|
||||
&documentation.index;
|
||||
|
||||
</book>
|
@ -0,0 +1,77 @@
|
||||
<chapter id="installation">
|
||||
<title>Installation</title>
|
||||
|
||||
<sect1 id="installation.requirements">
|
||||
<title>Requirements</title>
|
||||
<para>
|
||||
Dependencies:
|
||||
</para>
|
||||
<itemizedlist>
|
||||
<listitem><para>
|
||||
TDE >=14.0.9
|
||||
</para></listitem>
|
||||
<listitem><para>
|
||||
Openobex >=1.5
|
||||
</para></listitem>
|
||||
<listitem><para>
|
||||
TQt >=14.0.9
|
||||
</para></listitem>
|
||||
<listitem><para>
|
||||
bluez5 >=5.14
|
||||
</para></listitem>
|
||||
</itemizedlist>
|
||||
<!--<para>For the handsfree client you will also need ofono and pulseaudio.</para>-->
|
||||
</sect1>
|
||||
|
||||
|
||||
<sect1 id="installation.compilation">
|
||||
<title>Compilation and Installation</title>
|
||||
<para>
|
||||
Create build directory and "cd build".
|
||||
</para>
|
||||
<para>
|
||||
Run cmake ..
|
||||
</para>
|
||||
<para>
|
||||
make install
|
||||
</para>
|
||||
</sect1>
|
||||
|
||||
|
||||
<sect1 id="installation.setup">
|
||||
<title>Setup</title>
|
||||
<para>
|
||||
The TDE Bluetooth Framework itself does not need any setup.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
Use hciconfig and sdptool to check low level if needed:
|
||||
</para>
|
||||
<screen>
|
||||
root:~# hciconfig <- Check if adaptor was found and is up
|
||||
hci0: Type: USB
|
||||
BD Address: 00:10:60:A3:8B:DE ACL MTU: 192:8 SCO MTU: 64:8
|
||||
UP RUNNING PSCAN ISCAN AUTH ENCRYPT
|
||||
RX bytes:176023 acl:2046 sco:0 events:1809 errors:0
|
||||
TX bytes:23000 acl:971 sco:0 commands:469 errors:0
|
||||
|
||||
root:~# hcitool inq <- Try to seach for other discoverable devices
|
||||
Intquiring ...
|
||||
00:A0:32:1A:B0:27 clock offset: 0x122b class: 0x000100
|
||||
|
||||
root:~# sdptool browse FF:FF:FF:00:00:00
|
||||
Browsing FF:FF:FF:00:00:00 ...
|
||||
Service Name: SDP Server
|
||||
Service Description: Bluetooth service discovery server
|
||||
Service Provider: BlueZ
|
||||
Service RecHandle: 0x0
|
||||
...
|
||||
root:~#
|
||||
</screen>
|
||||
<para>
|
||||
The first command checks if your bluetooth device is up, the second searches for
|
||||
other devices in range (they must be set to be discoverable). The last command lists the services that are offered by you to other bluetooth devices. If you have tdebluez running already, you will get the full list of active services here, including obex push etc. If that succeeds you should be able to use tdebluez without any further setup.
|
||||
</para>
|
||||
</sect1>
|
||||
|
||||
</chapter>
|
@ -0,0 +1,24 @@
|
||||
<chapter id="introduction">
|
||||
<title>Introduction</title>
|
||||
|
||||
<!-- The introduction chapter contains a brief introduction for the
|
||||
application that explains what it does and where to report
|
||||
problems. Basically a long version of the abstract. Don't include a
|
||||
revision history. (see installation appendix comment) -->
|
||||
|
||||
<para>
|
||||
The TDE Bluetooth Framework is a set of tools built on top of Linux'
|
||||
Bluetooth stack <ulink url="http://www.bluez.org">BlueZ</ulink>. Our goal
|
||||
is to provide easy access to the most common Bluetooth profiles and to make
|
||||
data exchange with Bluetooth enabled phones and PDAs as straightforward as
|
||||
possible.
|
||||
</para>
|
||||
<para>
|
||||
The next chapters will explain how to set up tdebluez as a whole; the
|
||||
following chapters deal with each of the tools, how to use them and how
|
||||
to set up each of them.
|
||||
</para>
|
||||
<para>
|
||||
Have fun :]
|
||||
</para>
|
||||
</chapter>
|
@ -0,0 +1,109 @@
|
||||
<sect1 id="components.irmcsynckonnector">
|
||||
<title>IrMCSync Konnector for Kitchensync</title>
|
||||
<para>
|
||||
This program is a Konnector plugin for kitchensync, it let you sync your device supporting IrMCSync with your local Calendar and/or AddressBook.
|
||||
</para>
|
||||
<para>
|
||||
By now Calendar and AddressBook are supported!
|
||||
</para>
|
||||
<para>
|
||||
I SUGGEST YOU TO MAKE A COPY OF YOUR CALENDAR AND ADDRESSBOOK BEFORE TRYING ANY SYNC.
|
||||
I'm not responsible if your data will be corrupted or destroyed.
|
||||
</para>
|
||||
|
||||
|
||||
<sect2>
|
||||
<title>We need debug infos!</title>
|
||||
<para>
|
||||
PLEASE run kitchensync from a shell or redirect stdout and stderr to a file so if you have problems you can send me the konnector output.To enable the debug features you can launch "kdebugdialog" and set on the kitchensync related options (from 5200) and the generic option.
|
||||
</para>
|
||||
</sect2>
|
||||
|
||||
<sect2>
|
||||
<title>Compilation.</title>
|
||||
<para>
|
||||
The actuall kitchensync from tdepim SVN has more features and work better than the tdepim 3.3.0 version.
|
||||
I'll suggest to use this version. You have to install at least kitchensync (and all his subprojects) from SVN.
|
||||
</para>
|
||||
<para>
|
||||
There's also a tdepim-3.3.0 version that you can find in the irmcsync_tdepim_3_3_branch but it's not mantained anymore. I'll concentrate my work on the SVN one.
|
||||
This version depends on tdepim-3.3.0 and the older or younger versions, so you have to get and install it.
|
||||
If you want to fetch the irmcsync_tdepim_3_3_branch you have to move to
|
||||
kdebluetooth/irmcsync/irmcsynckonnector and type:
|
||||
|
||||
cvs -f -z3 -q update -d -P -r irmcsync_tdepim_3_3_branch
|
||||
</para>
|
||||
|
||||
<para>
|
||||
To enable the compilation of the konnector you have to add the "irmcsync" dir in the SUBDIR variabile of kdebluetooth/Makefile.am
|
||||
</para>
|
||||
</sect2>
|
||||
|
||||
<sect2>
|
||||
<title>Using KitchenSync.</title>
|
||||
<para>
|
||||
In these days (25/03/2004) KitchenSync is very experimental so you can get various problems.
|
||||
</para>
|
||||
<para>
|
||||
After having launched it, you have to choose the konnectors to use.
|
||||
you need at least 2 konnector to make a sync, but you can use only one for tests pourpose.
|
||||
</para>
|
||||
<para>
|
||||
To add a konnector go in <guimenuitem>Settings->Configure Kitchensync</guimenuitem>
|
||||
</para>
|
||||
<para>
|
||||
If you get some errors and the widget is now well painted try resizing the configure window. Then in the Resources Combobox you'll get various chooses, ALL ARE UNUSEFUL AND DISABLED, only "konnector" is the right.
|
||||
</para>
|
||||
<para>
|
||||
For Example you can add the IrMCSync Konnector and a Local Konnector.
|
||||
</para>
|
||||
<para>
|
||||
In the IrMCSync Konnector select your device, and check the Sync Calendar CheckButton or the AddressBook (for now you can't sync both at the same time). In the Local Konnector Select a Calendar File AND a KAddressBook file (you have to choose both and with right filenames or it will not work). I suggest you to create a temp directory in which you put a copy of you original AB and Calendar so you can make some tests.
|
||||
</para>
|
||||
<para>
|
||||
You can find them usually in these dirs:
|
||||
</para>
|
||||
<para>
|
||||
CALENDAR: <filename>$HOME/.kde/share/apps/korganizer/std.ics</filename>
|
||||
</para>
|
||||
<para>
|
||||
ADDRESSBOOK: <filename>$HOME/.kde/share/apps/tdeabc/std.vcf</filename>
|
||||
</para>
|
||||
<para>
|
||||
Then you have to create a profile in <guimenuitem>Settings->Configure Profiles</guimenuitem> and for every profile you can add various parts, every part do a different function:
|
||||
</para>
|
||||
<itemizedlist>
|
||||
<listitem>
|
||||
<para>
|
||||
Synchronize Part : Make the REAL Sync.
|
||||
</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>
|
||||
Konnector Debugger: Let you Debug a Konnector.
|
||||
</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>
|
||||
Konnector Backup : Make the backup of the data.
|
||||
</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>
|
||||
Overview Part : Like the name says.
|
||||
</para>
|
||||
</listitem>
|
||||
</itemizedlist>
|
||||
|
||||
<para>
|
||||
If you want to sync, you have to choose at least the "Synchronize Part".
|
||||
</para>
|
||||
<para>
|
||||
Then, to make the sync, click on the top-left button.
|
||||
</para>
|
||||
<para>
|
||||
You can check the konnector, creating a profile with the Konnector Debugger Part and pressing the Connect Device, then the ReadSyncees button.
|
||||
</para>
|
||||
</sect2>
|
||||
</sect1>
|
||||
|
@ -0,0 +1,10 @@
|
||||
<sect1 id="components.kbluelock">
|
||||
<title>Automatic screen unlocker</title>
|
||||
<para>
|
||||
There is no documentation for this component.
|
||||
</para>
|
||||
<para>
|
||||
If you have any questions about it or if you want to complain about the missing documentation, send a mail to <link linkend="credits.mm">Mattia Merzi</link>.
|
||||
</para>
|
||||
</sect1>
|
||||
|
@ -0,0 +1,49 @@
|
||||
<sect1 id="components.kbtobexsrv">
|
||||
<title>OBEX Push Server: Receive files</title>
|
||||
<para>
|
||||
Most Bluetooth-enabled cell phones or PDAs will let you send
|
||||
files from the mobile to your computer. While it might be more
|
||||
comfortable to use the <link linkend="components.tdeio_obex">OBEX FTP tdeioslave</link>
|
||||
to pull the files from your phone to your computer, not all devices
|
||||
support this. OBEX Object push on the other hand is supported by most
|
||||
Bluetooth devices.
|
||||
</para>
|
||||
|
||||
<sect2>
|
||||
<title>Using the OBEX Push server</title>
|
||||
<para>
|
||||
The OBEX Push server is managed by kbluetoothd and will be automatically
|
||||
started if it is enabled and someone tries to send you some files.
|
||||
Please see the documentation of kbluetoothd for how to
|
||||
<link linkend="components.kbluetoothd.serviceconfig">enable or disable
|
||||
services</link> (The OBEX Push server is listed as <command>kbtobexsrv</command>).
|
||||
</para>
|
||||
<para>
|
||||
When you send a file from your mobile to your computer, the kbluetoothd
|
||||
tray icon will turn blue and shows a small popup. By default (depending
|
||||
on your <link linkend="components.kbluetoothd.confirmation">
|
||||
settings for incoming connections</link>) you will have to accept the
|
||||
connection first, then the main OBEX Push window should pop up
|
||||
and start receiving the files.
|
||||
</para>
|
||||
<para>
|
||||
Incoming files are saved to <filename>/tmp</filename> and will be deleted
|
||||
after you closed the OBEX Push server. To save to files, you have two options:
|
||||
</para>
|
||||
<itemizedlist>
|
||||
<listitem>
|
||||
<para>Click <guibutton>OK</guibutton> to save all received files to
|
||||
a predefined location.</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>
|
||||
Drag one or several files to some other location. This is especially useful
|
||||
if you want to send files by email, since you can drag the files
|
||||
directly into kmail without saving them to temporary location first.
|
||||
</para>
|
||||
</listitem>
|
||||
</itemizedlist>
|
||||
</sect2>
|
||||
|
||||
</sect1>
|
||||
|
@ -0,0 +1,44 @@
|
||||
<sect1 id="components.kbtserialchat">
|
||||
<title>kbtserialchat: A very simple chat tool</title>
|
||||
<para>
|
||||
The kbtserialchat tool is a very simple chat client&server.
|
||||
Its primary purpose is for debugging and to serve as an example on how to
|
||||
write a bluetooth server that is managed by kbluetoothd
|
||||
and how to write a client that can be started with the
|
||||
<link linkend="components.tdeio_sdp">SDP tdeioslave</link>.
|
||||
</para>
|
||||
|
||||
<sect2>
|
||||
<title>Using the chat tool</title>
|
||||
<para>
|
||||
kbtserialchat implements the Serial Port protocol,
|
||||
so when you start it, it will show you all devices which
|
||||
provide the Serial Port profile. This will include other computers
|
||||
where the KDE Bluetooth Framework is installed, but also
|
||||
phones which support this profile.
|
||||
</para>
|
||||
<para>
|
||||
When you are connecting to another kbtserialchat server, then
|
||||
kbtserialchat will pop up on the other system and you
|
||||
can happily send each other stupid text messages.
|
||||
You can also connect to the serial port of Bluetooth phones
|
||||
and send arbitrary AT-commands. To dial a number for instance, type
|
||||
<command>ATD<number>;</command>.
|
||||
</para>
|
||||
<para>
|
||||
While it may not make much sense to connect kbtserialchat to
|
||||
a serial port of a device that uses it to exchange binary
|
||||
data, you can use it not only to connect to serial port services, but
|
||||
to every service that's based on Rfcomm, like the handsfree or headset
|
||||
profile. Since these services are not listed in the dialog on startup,
|
||||
you can use the following trick:
|
||||
Browse the services of a device with tdeio_sdp (using a <ulink url="sdp:/">sdp:/</ulink>-URL).
|
||||
Then instead of simply clicking on the service, right-click on it and
|
||||
then select <guimenuitem>Open with...</guimenuitem>.
|
||||
Enter <command>kbtserialchat</command> in the dialog, press enter - and
|
||||
you're connected.
|
||||
</para>
|
||||
</sect2>
|
||||
|
||||
</sect1>
|
||||
|
@ -0,0 +1,10 @@
|
||||
<sect1 id="components.khciconfig">
|
||||
<title>khciconfig: Explore your Bluetooth configuration</title>
|
||||
<para>
|
||||
There is no documentation for this component.
|
||||
</para>
|
||||
<para>
|
||||
If you have any questions about it or if you want to complain about the missing documentation, send a mail to <link linkend="credits.mm">Mattia Merzi</link>.
|
||||
</para>
|
||||
</sect1>
|
||||
|
@ -0,0 +1,27 @@
|
||||
<appendix id="links">
|
||||
<title>Links</title>
|
||||
|
||||
<para>
|
||||
<variablelist>
|
||||
<title>Other projects and documentation</title>
|
||||
|
||||
<varlistentry>
|
||||
<term><ulink url="http://www.bluez.org">BlueZ</ulink></term>
|
||||
<listitem><para>This is the official Bluetooth Stack for Linux
|
||||
and the base for tdebluez.
|
||||
</para></listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><ulink url="https://git.kernel.org/pub/scm/bluetooth/bluez.git/tree/doc/">Linux BlueZ API</ulink></term>
|
||||
<listitem><para>This is the official Linux API and the base for the dbus implementation.
|
||||
</para>
|
||||
<para>The implementation is done by using dbusxml2qt3 to generate the interfaces.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
|
||||
</variablelist>
|
||||
</para>
|
||||
|
||||
</appendix>
|
@ -0,0 +1,4 @@
|
||||
<chapter id="news">
|
||||
<title>News</title>
|
||||
<para></para>
|
||||
</chapter>
|
@ -0,0 +1,31 @@
|
||||
<sect1 id="components.othertools">
|
||||
<title>Additional Integration- and Command Line Tools</title>
|
||||
<para>
|
||||
This sections lists all the other smaller tools and script that come
|
||||
with tdebluez. Most of them are of limited use alone, but supposed
|
||||
to be called from within scripts or by other programs.
|
||||
</para>
|
||||
|
||||
<sect2 id="components.othertools.tdeioclient">
|
||||
<title>tdeioclient: Access to the TDEIO OBEX framework</title>
|
||||
<para>
|
||||
This is a little utility to access tdeioslaves from the command line.
|
||||
So <command>tdeioclient</command> is actually a general purpose utility.
|
||||
</para>
|
||||
<para>
|
||||
With <command>tdeioclient</command> you can copy, list, delete any
|
||||
file or directory which is accessible by TDE's TDEIO Framework. You can
|
||||
copy a file from a FTP server directly to another server using WebDAV
|
||||
or list a directory via SSH with tdeio_fish. Or - and that's where it
|
||||
becomes interesting for us - you can access files on your mobile phone
|
||||
via tdeio_obex.
|
||||
</para>
|
||||
<para>
|
||||
Please note that tdeioclient - even though it is a command line program - still needs to be
|
||||
run from within KDE, so you won't be able to use it in cronjobs for instance.
|
||||
</para>
|
||||
|
||||
</sect2>
|
||||
|
||||
</sect1>
|
||||
|
@ -0,0 +1,53 @@
|
||||
<sect1 id="components.tdebluez">
|
||||
<title>tdebluez: The Core of the TDE Bluetooth Framework</title>
|
||||
<para>
|
||||
TDEBluetooth is a central piece of the TDE Bluetooth framework. It runs all the time in the system tray usually and starts other services like the OBEX Server or
|
||||
the authentication agent. Its system tray icon tells you about ongoing bluetooth connections and
|
||||
also gives you quick access to the service configuration, recently used services, devices in range
|
||||
and more.
|
||||
</para>
|
||||
<para>
|
||||
Programmers who want to integrate their program with tdebluez, should take a look at the <link linkend="developers.tdebluez">developers section</link> for more information.
|
||||
</para>
|
||||
|
||||
<sect2>
|
||||
<title>Starting tdebluez</title>
|
||||
<para>
|
||||
You can start TDEBluetooth by typing <command>tdebluez</command> on
|
||||
the command line or by starting it from the TDE-Menu (usually System/tdebluez).
|
||||
</para>
|
||||
|
||||
<para>
|
||||
TDEBluetooth displays and icon in the system tray.
|
||||
</para>
|
||||
|
||||
<para>When tdebluez is running until the system is shut down, it will be started again automatically next time you log in. To keep tdebluez from starting up automatically, uncheck the "Auto Start" option in the configuration.</para>
|
||||
<para>
|
||||
</para>
|
||||
</sect2>
|
||||
|
||||
<sect2>
|
||||
<title>What tdebluez does</title>
|
||||
<para>
|
||||
The goal of tdebluez is to provide user interface and interoperability to the Trinity Desktop Envitonment. The user is able to perform bluetooth related operations such as power on/off, discover, pair and connect varios bluetooth devices.
|
||||
</para>
|
||||
</sect2>
|
||||
|
||||
<sect2 id="components.tdebluez.configuration">
|
||||
<title>Configuring tdebluez</title>
|
||||
<para>
|
||||
tdebluez writes its configuration in <filename>~/.trinity/share/config/tdebluezrc</filename>
|
||||
<guimenuitem>Configuration-></guimenuitem>
|
||||
</para>
|
||||
|
||||
<sect3 id="components.tdebluez.profiles">
|
||||
<title>Local Services</title>
|
||||
<para>
|
||||
Services can be enabled and disabled in <guimenuitem>Configuration-></guimenuitem>
|
||||
</para>
|
||||
</sect3>
|
||||
|
||||
</sect2>
|
||||
|
||||
</sect1>
|
||||
|
@ -0,0 +1,41 @@
|
||||
<sect1 id="components.tdeio_bluetooth">
|
||||
<title>Bluetooth-tdeioslaves: Devices and services</title>
|
||||
<para>
|
||||
The bluetooth-tdeioslaves let you handle bluetooth devices and
|
||||
list and use their services with konqueror (or any other file manager that can
|
||||
use TDE's File IO framework).
|
||||
</para>
|
||||
<sect2>
|
||||
<title>Using the Bluetooth tdeioslves</title>
|
||||
<para>To search for devices, simply enter
|
||||
<ulink url="bluetooth:/">bluetooth:/</ulink> with konqueror. You will immediately
|
||||
see an entry for your own system.
|
||||
</para>
|
||||
<para>
|
||||
You can also click the Bluetooth-Icon in the konqueror sidebar in
|
||||
the "Services"-tab, next to the LAN- and Audio-CD-Browser.
|
||||
If you can't see the icon it might help to reset the sidebar
|
||||
with <guimenuitem>config-button -> Add new -> Rollback to system default</guimenuitem>
|
||||
</para>
|
||||
<para>
|
||||
The devices must have been detected and paired, so that the slaves can communicate with them.
|
||||
</para>
|
||||
<para>
|
||||
When you select a device you will get a listing of the services
|
||||
published by the device. If the service is supported by tdebluez,
|
||||
you can click it to launch the appropriate application.
|
||||
Unless you've disabled it, konqueror will pop up the common file-open-dialog.
|
||||
In case the service is not known, you will get an open-with-dialog instead.
|
||||
</para>
|
||||
</sect2>
|
||||
|
||||
<sect2>
|
||||
<title>Current limitations</title>
|
||||
<para>tdeio_bluetooth has no support for nested browse groups currently. This won't
|
||||
be hard to add, but wasn't need so far.</para>
|
||||
<para>
|
||||
You can not connect to services of your own system.
|
||||
</para>
|
||||
</sect2>
|
||||
|
||||
</sect1>
|
@ -0,0 +1,61 @@
|
||||
<sect1 id="components.tdeio_obex">
|
||||
<title>OBEX-tdeioslave: Browse folders over Bluetooth</title>
|
||||
|
||||
<sect2>
|
||||
<title>General</title>
|
||||
<para>The OBEX protocol is designed for use with mobile devices. If you have "beamed" already a vcard from a mobile device to an other mobile device, you have used OBEX. But there are also other applications for the OBEX protocol. Most notably the filesystem browsing protocol. If the mobile device understands this protocol, you can browse, up and download files to your mobiles filesystem storage using this client implementations. Also syncronisation protocols like IrMCSync or SyncML have OBEX bindings and can be accessed using this client, even if there is no usage for syncronisation in konquerror.</para>
|
||||
<para>OBEX protocols can use many different transports. The original transport was IrDA, but there also exsist transport bindings for Bluetooth, serial lines and tcp/ip connections.</para>
|
||||
<para>OBEX supports 2 way authentication. The first, most known way, is authentications of the client by the server. So the server implementation can verify the clients identity. But also the client can verify the servers identity. For authentication a MD5 checksum challenge is used. This enshures that plain passwords are never sent over the transport medium.</para>
|
||||
</sect2>
|
||||
|
||||
<sect2 id="url_format">
|
||||
<title>URL format</title>
|
||||
<para>OBEX resources are accessed using URLs. The protocol part is clearly obex: The path component holds the path on the server. The host part is a bit mor complex.</para>
|
||||
<para>For servers accessible over tcp/ip the host part is as usual. You can use the hostname or ip address of the server host to contact. Also If the server runs on a non standard port (the standard port is 650) you can append the port number as usual.
|
||||
Example:
|
||||
<userinput>OBEX://hostname:port/path</userinput></para>
|
||||
<para>For IrDA or Bluetooth transports you can use the hardware address in the standard notation with octets separated by double colons. Neat, but a bit difficult to remember the hardware address of your Bluetooth device.
|
||||
Example:
|
||||
<userinput>obex://[ef:01:23:45]/path</userinput>
|
||||
or
|
||||
<userinput>obex://[12:34:ef:01:23:45]/path</userinput></para>
|
||||
<para>Therfore it is possible to define hostaliases for use with the OBEX protocol. These aliases are defined in the OBEX KControl module. You can set up a human readable name, discover devices and finally assign a hardware address to that name. Also Devices ober serial transports are accessible via those aliases. For IrDA and Bluetooth there are handy predefined aliases named irda or bluetooth. Both do device discovery and try to connect to the first device it finds.</para>
|
||||
<para>Good luck browsing your neighbor's mobile :))</para>
|
||||
</sect2>
|
||||
|
||||
<sect2>
|
||||
<title>Tips & Tricks</title>
|
||||
<para>
|
||||
Like every other tdeioslave, you can directly open and save files to bluetooth
|
||||
devices with tdeio_obex. So if you write a shopping list for instance, you can
|
||||
simply type it with kedit and save it on your phone.
|
||||
</para>
|
||||
<para>
|
||||
You can make this procedure must faster by adding a bookmark to the
|
||||
bookmark list of the file-save-dialog.
|
||||
</para>
|
||||
</sect2>
|
||||
|
||||
<sect2>
|
||||
<title>Limitations</title>
|
||||
|
||||
<sect3 id="obex_and_tde">
|
||||
<title>OBEX and TDE</title>
|
||||
<para>Since a tdeioclient can't control the number of slave which are accessing the same destination it is often the case that there are multiple slaves running. But OBEX transports, except the tcp/ip transport, support only one transport connection to the device. This leads to tdeioslaves which fail to connect with "Device or resource Busy". OBEX has a partial solution for that problem. If the server supports this, one can transmit packets for multiple connections on one transport connection. But, I have not seen a device which announced this feature. And this would require a separate transport daemon for each destination. So, if I see devices providing this feature, I will start to implement that daemon.</para>
|
||||
<para>There is no special method to rename or move a file on the device. So this is done by copying the data from and to the device. This is slow and will start two tdeioslaves which will have the problem described above.</para>
|
||||
</sect3>
|
||||
|
||||
<sect3 id="devices">
|
||||
<title>Device compatibility</title>
|
||||
<para>Since this client implements an open standard There is a real hope that there are much devices out there that will work well. But there are always exceptions.</para>
|
||||
</sect3>
|
||||
</sect2>
|
||||
</sect1>
|
||||
<!--
|
||||
Local Variables:
|
||||
mode: sgml
|
||||
sgml-omittag: nil
|
||||
sgml-shorttag: t
|
||||
sgml-general-insert-case: lower
|
||||
End:
|
||||
-->
|
@ -0,0 +1,8 @@
|
||||
<sect1 id="components.tdeioclient">
|
||||
<title>OBEX Push Client</title>
|
||||
<sect2>
|
||||
<title>What is this?</title>
|
||||
<para>tdeioclient is a program that let you send files from your PC to any bluetooth device that support the OBEX (Object Exchange) Protocol. This Protocol is supported (probably) by all the older bluetooth cellular phones, palms and of course another PC with a bluetooth device (and possibly tdebluez installed!!!).</para>
|
||||
</sect2>
|
||||
</sect1>
|
||||
|
After Width: | Height: | Size: 42 KiB |
After Width: | Height: | Size: 58 KiB |
After Width: | Height: | Size: 22 KiB |
After Width: | Height: | Size: 36 KiB |
After Width: | Height: | Size: 25 KiB |
After Width: | Height: | Size: 25 KiB |
@ -0,0 +1 @@
|
||||
Emanoil Kotsev <deloptes@gmail.com>
|
@ -0,0 +1,55 @@
|
||||
<?xml version="1.0"?>
|
||||
<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN" "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
|
||||
<node>
|
||||
<!--
|
||||
<interface name="org.freedesktop.DBus.Introspectable">
|
||||
<method name="Introspect">
|
||||
<arg name="xml" type="s" direction="out"/>
|
||||
</method>
|
||||
</interface>
|
||||
-->
|
||||
<interface name="org.bluez.MediaPlayer1">
|
||||
<method name="Play"/>
|
||||
<method name="Pause"/>
|
||||
<method name="Stop"/>
|
||||
<method name="Next"/>
|
||||
<method name="Previous"/>
|
||||
<method name="FastForward"/>
|
||||
<method name="Rewind"/>
|
||||
<property name="Name" type="s" access="read"/>
|
||||
<property name="Type" type="s" access="read"/>
|
||||
<property name="Subtype" type="s" access="read"/>
|
||||
<property name="Position" type="u" access="read"/>
|
||||
<property name="Status" type="s" access="read"/>
|
||||
<property name="Equalizer" type="s" access="readwrite"/>
|
||||
<property name="Repeat" type="s" access="readwrite"/>
|
||||
<property name="Shuffle" type="s" access="readwrite"/>
|
||||
<property name="Scan" type="s" access="readwrite"/>
|
||||
<property name="Track" type="a{sv}" access="read"/>
|
||||
<property name="Device" type="o" access="read"/>
|
||||
<property name="Browsable" type="b" access="read"/>
|
||||
<property name="Searchable" type="b" access="read"/>
|
||||
<property name="Playlist" type="o" access="read"/>
|
||||
</interface>
|
||||
<interface name="org.freedesktop.DBus.Properties">
|
||||
<method name="Get">
|
||||
<arg name="interface" type="s" direction="in"/>
|
||||
<arg name="name" type="s" direction="in"/>
|
||||
<arg name="value" type="v" direction="out"/>
|
||||
</method>
|
||||
<method name="Set">
|
||||
<arg name="interface" type="s" direction="in"/>
|
||||
<arg name="name" type="s" direction="in"/>
|
||||
<arg name="value" type="v" direction="in"/>
|
||||
</method>
|
||||
<method name="GetAll">
|
||||
<arg name="interface" type="s" direction="in"/>
|
||||
<arg name="properties" type="a{sv}" direction="out"/>
|
||||
</method>
|
||||
<signal name="PropertiesChanged">
|
||||
<arg name="interface" type="s"/>
|
||||
<arg name="changed_properties" type="a{sv}"/>
|
||||
<arg name="invalidated_properties" type="as"/>
|
||||
</signal>
|
||||
</interface>
|
||||
</node>
|
@ -0,0 +1,88 @@
|
||||
<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
|
||||
"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
|
||||
<node>
|
||||
<!--
|
||||
<interface name="org.freedesktop.DBus.Introspectable">
|
||||
<method name="Introspect">
|
||||
<arg name="xml" type="s" direction="out" />
|
||||
</method>
|
||||
</interface>
|
||||
-->
|
||||
<interface name="org.bluez.Adapter1">
|
||||
<method name="StartDiscovery"></method>
|
||||
<method name="SetDiscoveryFilter">
|
||||
<arg name="properties" type="a{sv}" direction="in" />
|
||||
</method>
|
||||
<method name="StopDiscovery"></method>
|
||||
<method name="RemoveDevice">
|
||||
<arg name="device" type="o" direction="in" />
|
||||
</method>
|
||||
<property name="Address" type="s" access="read"></property>
|
||||
<property name="Name" type="s" access="read"></property>
|
||||
<property name="Alias" type="s" access="readwrite"></property>
|
||||
<property name="Class" type="u" access="read"></property>
|
||||
<property name="Powered" type="b" access="readwrite"></property>
|
||||
<property name="Discoverable" type="b" access="readwrite"></property>
|
||||
<property name="DiscoverableTimeout" type="u" access="readwrite"></property>
|
||||
<property name="Pairable" type="b" access="readwrite"></property>
|
||||
<property name="PairableTimeout" type="u" access="readwrite"></property>
|
||||
<property name="Discovering" type="b" access="read"></property>
|
||||
<property name="UUIDs" type="as" access="read"></property>
|
||||
<property name="Modalias" type="s" access="read"></property>
|
||||
</interface>
|
||||
<interface name="org.freedesktop.DBus.Properties">
|
||||
<method name="Get">
|
||||
<arg name="interface" type="s" direction="in" />
|
||||
<arg name="name" type="s" direction="in" />
|
||||
<arg name="value" type="v" direction="out" />
|
||||
</method>
|
||||
<method name="Set">
|
||||
<arg name="interface" type="s" direction="in" />
|
||||
<arg name="name" type="s" direction="in" />
|
||||
<arg name="value" type="v" direction="in" />
|
||||
</method>
|
||||
<method name="GetAll">
|
||||
<arg name="interface" type="s" direction="in" />
|
||||
<arg name="properties" type="a{sv}" direction="out" />
|
||||
</method>
|
||||
<signal name="PropertiesChanged">
|
||||
<arg name="interface" type="s" />
|
||||
<arg name="changed_properties" type="a{sv}" />
|
||||
<arg name="invalidated_properties" type="as" />
|
||||
</signal>
|
||||
</interface>
|
||||
<interface name="org.bluez.GattManager1">
|
||||
<method name="RegisterApplication">
|
||||
<arg name="application" type="o" direction="in" />
|
||||
<arg name="options" type="a{sv}" direction="in" />
|
||||
</method>
|
||||
<method name="UnregisterApplication">
|
||||
<arg name="application" type="o" direction="in" />
|
||||
</method>
|
||||
</interface>
|
||||
<interface name="org.bluez.Media1">
|
||||
<method name="RegisterEndpoint">
|
||||
<arg name="endpoint" type="o" direction="in" />
|
||||
<arg name="properties" type="a{sv}" direction="in" />
|
||||
</method>
|
||||
<method name="UnregisterEndpoint">
|
||||
<arg name="endpoint" type="o" direction="in" />
|
||||
</method>
|
||||
<method name="RegisterPlayer">
|
||||
<arg name="player" type="o" direction="in" />
|
||||
<arg name="properties" type="a{sv}" direction="in" />
|
||||
</method>
|
||||
<method name="UnregisterPlayer">
|
||||
<arg name="player" type="o" direction="in" />
|
||||
</method>
|
||||
</interface>
|
||||
<interface name="org.bluez.NetworkServer1">
|
||||
<method name="Register">
|
||||
<arg name="uuid" type="s" direction="in" />
|
||||
<arg name="bridge" type="s" direction="in" />
|
||||
</method>
|
||||
<method name="Unregister">
|
||||
<arg name="uuid" type="s" direction="in" />
|
||||
</method>
|
||||
</interface>
|
||||
</node>
|
@ -0,0 +1,112 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<node>
|
||||
<!--
|
||||
<interface name="org.freedesktop.DBus.Introspectable">
|
||||
<method name="Introspect">
|
||||
<arg name="xml" type="s" direction="out" />
|
||||
</method>
|
||||
</interface>
|
||||
-->
|
||||
<interface name="org.bluez.Device1">
|
||||
<method name="Disconnect">
|
||||
<annotation name="org.freedesktop.DBus.GLib.Async"/>
|
||||
</method>
|
||||
<method name="Connect">
|
||||
<annotation name="org.freedesktop.DBus.GLib.Async"/>
|
||||
</method>
|
||||
<method name="ConnectProfile">
|
||||
<annotation name="org.freedesktop.DBus.GLib.Async"/>
|
||||
<arg name="UUID" type="s" direction="in" />
|
||||
</method>
|
||||
<method name="DisconnectProfile">
|
||||
<annotation name="org.freedesktop.DBus.GLib.Async"/>
|
||||
<arg name="UUID" type="s" direction="in" />
|
||||
</method>
|
||||
<method name="Pair">
|
||||
<annotation name="org.freedesktop.DBus.GLib.Async"/>
|
||||
</method>
|
||||
<method name="CancelPairing">
|
||||
<annotation name="org.freedesktop.DBus.GLib.Async"/>
|
||||
</method>
|
||||
<property name="Address" type="s" access="read"></property>
|
||||
<property name="Name" type="s" access="read"></property>
|
||||
<property name="Alias" type="s" access="readwrite"></property>
|
||||
<property name="Class" type="u" access="read"></property>
|
||||
<property name="Appearance" type="q" access="read"></property>
|
||||
<property name="Icon" type="s" access="read"></property>
|
||||
<property name="Paired" type="b" access="read"></property>
|
||||
<property name="Trusted" type="b" access="readwrite"></property>
|
||||
<property name="Blocked" type="b" access="readwrite"></property>
|
||||
<property name="LegacyPairing" type="b" access="read"></property>
|
||||
<property name="RSSI" type="n" access="read"></property>
|
||||
<property name="Connected" type="b" access="read"></property>
|
||||
<property name="UUIDs" type="as" access="read"></property>
|
||||
<property name="Modalias" type="s" access="read"></property>
|
||||
<property name="Adapter" type="o" access="read"></property>
|
||||
<property name="ManufacturerData" type="a{qv}" access="read"></property>
|
||||
<property name="ServiceData" type="a{sv}" access="read"></property>
|
||||
<property name="TxPower" type="n" access="read"></property>
|
||||
<property name="ServicesResolved" type="b" access="read"></property>
|
||||
</interface>
|
||||
<interface name="org.freedesktop.DBus.Properties">
|
||||
<method name="Get">
|
||||
<arg name="interface" type="s" direction="in" />
|
||||
<arg name="name" type="s" direction="in" />
|
||||
<arg name="value" type="v" direction="out" />
|
||||
</method>
|
||||
<method name="Set">
|
||||
<arg name="interface" type="s" direction="in" />
|
||||
<arg name="name" type="s" direction="in" />
|
||||
<arg name="value" type="v" direction="in" />
|
||||
</method>
|
||||
<method name="GetAll">
|
||||
<arg name="interface" type="s" direction="in" />
|
||||
<arg name="properties" type="a{sv}" direction="out" />
|
||||
</method>
|
||||
<signal name="PropertiesChanged">
|
||||
<arg name="interface" type="s" />
|
||||
<arg name="changed_properties" type="a{sv}" />
|
||||
<arg name="invalidated_properties" type="as" />
|
||||
</signal>
|
||||
</interface>
|
||||
<interface name="org.bluez.MediaControl1">
|
||||
<method name="Play">
|
||||
<annotation name="org.freedesktop.DBus.Deprecated"
|
||||
value="true" />
|
||||
</method>
|
||||
<method name="Pause">
|
||||
<annotation name="org.freedesktop.DBus.Deprecated"
|
||||
value="true" />
|
||||
</method>
|
||||
<method name="Stop">
|
||||
<annotation name="org.freedesktop.DBus.Deprecated"
|
||||
value="true" />
|
||||
</method>
|
||||
<method name="Next">
|
||||
<annotation name="org.freedesktop.DBus.Deprecated"
|
||||
value="true" />
|
||||
</method>
|
||||
<method name="Previous">
|
||||
<annotation name="org.freedesktop.DBus.Deprecated"
|
||||
value="true" />
|
||||
</method>
|
||||
<method name="VolumeUp">
|
||||
<annotation name="org.freedesktop.DBus.Deprecated"
|
||||
value="true" />
|
||||
</method>
|
||||
<method name="VolumeDown">
|
||||
<annotation name="org.freedesktop.DBus.Deprecated"
|
||||
value="true" />
|
||||
</method>
|
||||
<method name="FastForward">
|
||||
<annotation name="org.freedesktop.DBus.Deprecated"
|
||||
value="true" />
|
||||
</method>
|
||||
<method name="Rewind">
|
||||
<annotation name="org.freedesktop.DBus.Deprecated"
|
||||
value="true" />
|
||||
</method>
|
||||
<property name="Connected" type="b" access="read"></property>
|
||||
<property name="Player" type="o" access="read"></property>
|
||||
</interface>
|
||||
</node>
|
@ -0,0 +1,43 @@
|
||||
<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
|
||||
"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
|
||||
<node>
|
||||
<!--
|
||||
<interface name="org.freedesktop.DBus.Introspectable">
|
||||
<method name="Introspect">
|
||||
<arg name="xml" type="s" direction="out" />
|
||||
</method>
|
||||
</interface>
|
||||
-->
|
||||
<interface name="org.bluez.AgentManager1">
|
||||
<method name="RegisterAgent">
|
||||
<arg name="agent" type="o" direction="in" />
|
||||
<arg name="capability" type="s" direction="in" />
|
||||
</method>
|
||||
<method name="UnregisterAgent">
|
||||
<arg name="agent" type="o" direction="in" />
|
||||
</method>
|
||||
<method name="RequestDefaultAgent">
|
||||
<arg name="agent" type="o" direction="in" />
|
||||
</method>
|
||||
</interface>
|
||||
<interface name="org.bluez.ProfileManager1">
|
||||
<method name="RegisterProfile">
|
||||
<arg name="profile" type="o" direction="in" />
|
||||
<arg name="UUID" type="s" direction="in" />
|
||||
<arg name="options" type="a{sv}" direction="in" />
|
||||
</method>
|
||||
<method name="UnregisterProfile">
|
||||
<arg name="profile" type="o" direction="in" />
|
||||
</method>
|
||||
</interface>
|
||||
<interface name="org.bluez.HealthManager1">
|
||||
<method name="CreateApplication">
|
||||
<arg name="config" type="a{sv}" direction="in" />
|
||||
<arg name="application" type="o" direction="out" />
|
||||
</method>
|
||||
<method name="DestroyApplication">
|
||||
<arg name="application" type="o" direction="in" />
|
||||
</method>
|
||||
</interface>
|
||||
<node name="hci0" />
|
||||
</node>
|
@ -0,0 +1,23 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!-- https://github.com/r10r/bluez/blob/master/doc/obex-agent-api.txt -->
|
||||
<node name="/org/trinitydesktop/tdeobex">
|
||||
<!-- <interface name="org.freedesktop.DBus.Introspectable">
|
||||
<method name="Introspect">
|
||||
<arg name="xml" type="s" direction="out"/>
|
||||
</method>
|
||||
</interface>
|
||||
-->
|
||||
<interface name="org.bluez.obex.Agent1">
|
||||
<method name="Release">
|
||||
<annotation name="org.freedesktop.DBus.GLib.Async"/>
|
||||
</method>
|
||||
<method name="AuthorizePush">
|
||||
<annotation name="org.freedesktop.DBus.GLib.Async"/>
|
||||
<arg name="transfer" direction="in" type="o"/>
|
||||
<arg name="filepath" direction="out" type="s"/>
|
||||
</method>
|
||||
<method name="Cancel">
|
||||
<annotation name="org.freedesktop.DBus.GLib.Async"/>
|
||||
</method>
|
||||
</interface>
|
||||
</node>
|
@ -0,0 +1,201 @@
|
||||
<?xml version="1.0"?>
|
||||
<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN" "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
|
||||
<!-- https://git.kernel.org/pub/scm/bluetooth/bluez.git/tree/doc/obex-api.txt -->
|
||||
<node name="/org/bluez/obex">
|
||||
<!--
|
||||
<interface name="org.freedesktop.DBus.Introspectable">
|
||||
<method name="Introspect">
|
||||
<arg name="xml" type="s" direction="out"/>
|
||||
</method>
|
||||
</interface>
|
||||
-->
|
||||
<interface name="org.bluez.obex.AgentManager1">
|
||||
<method name="RegisterAgent">
|
||||
<arg name="agent" type="o" direction="in" />
|
||||
</method>
|
||||
<method name="UnregisterAgent">
|
||||
<arg name="agent" type="o" direction="in" />
|
||||
</method>
|
||||
</interface>
|
||||
|
||||
<!-- https://git.merproject.org/jpoutiai/kf5bluezqt/blob/master/bluez-qt/src/interfaces/org.bluez.obex.Client1.xml -->
|
||||
<interface name="org.bluez.obex.Client1">
|
||||
<method name="CreateSession">
|
||||
<arg name="destination" type="s" direction="in" />
|
||||
<arg name="args" type="a{sv}" direction="in" />
|
||||
<arg name="session" type="o" direction="out" />
|
||||
</method>
|
||||
<method name="RemoveSession">
|
||||
<arg name="session" type="o" direction="in" />
|
||||
</method>
|
||||
</interface>
|
||||
<!-- https://git.merproject.org/jpoutiai/kf5bluezqt/blob/master/bluez-qt/src/interfaces/org.bluez.obex.FileTransfer1.xml -->
|
||||
<interface name="org.bluez.obex.FileTransfer1">
|
||||
<method name="ChangeFolder">
|
||||
<arg name="folder" type="s" direction="in" />
|
||||
</method>
|
||||
<method name="CreateFolder">
|
||||
<arg name="folder" type="s" direction="in" />
|
||||
</method>
|
||||
<method name="ListFolder">
|
||||
<arg name="folderinfo" type="aa{sv}" direction="out" />
|
||||
</method>
|
||||
<method name="GetFile">
|
||||
<arg name="targetfile" type="s" direction="in" />
|
||||
<arg name="sourcefile" type="s" direction="in" />
|
||||
<arg name="transfer" type="o" direction="out" />
|
||||
<arg name="properties" type="a{sv}" direction="out" />
|
||||
</method>
|
||||
<method name="PutFile">
|
||||
<arg name="sourcefile" type="s" direction="in" />
|
||||
<arg name="targetfile" type="s" direction="in" />
|
||||
<arg name="transfer" type="o" direction="out" />
|
||||
<arg name="properties" type="a{sv}" direction="out" />
|
||||
</method>
|
||||
<method name="CopyFile">
|
||||
<arg name="sourcefile" type="s" direction="in" />
|
||||
<arg name="targetfile" type="s" direction="in" />
|
||||
</method>
|
||||
<method name="MoveFile">
|
||||
<arg name="sourcefile" type="s" direction="in" />
|
||||
<arg name="targetfile" type="s" direction="in" />
|
||||
</method>
|
||||
<method name="Delete">
|
||||
<arg name="file" type="s" direction="in" />
|
||||
</method>
|
||||
</interface>
|
||||
<!-- https://git.merproject.org/jpoutiai/kf5bluezqt/blob/master/bluez-qt/src/interfaces/org.bluez.obex.ObjectPush1.xml -->
|
||||
<interface name="org.bluez.obex.ObjectPush1">
|
||||
<method name="SendFile">
|
||||
<arg name="sourcefile" type="s" direction="in" />
|
||||
<arg name="transfer" type="o" direction="out" />
|
||||
<arg name="properties" type="a{sv}" direction="out" />
|
||||
</method>
|
||||
<method name="PullBusinessCard">
|
||||
<arg name="targetfile" type="s" direction="in" />
|
||||
<arg name="transfer" type="o" direction="out" />
|
||||
<arg name="properties" type="a{sv}" direction="out" />
|
||||
</method>
|
||||
<method name="ExchangeBusinessCards">
|
||||
<arg name="clientfile" type="s" direction="in" />
|
||||
<arg name="targetfile" type="s" direction="in" />
|
||||
<arg name="transfer" type="o" direction="out" />
|
||||
<arg name="properties" type="a{sv}" direction="out" />
|
||||
</method>
|
||||
</interface>
|
||||
<!-- https://git.merproject.org/jpoutiai/kf5bluezqt/blob/master/bluez-qt/src/interfaces/org.bluez.obex.Session1.xml -->
|
||||
<interface name="org.bluez.obex.Session1">
|
||||
<method name="GetCapabilities">
|
||||
<arg name="capabilities" type="s" direction="out" />
|
||||
</method>
|
||||
|
||||
<property name="Source" type="s" access="read" />
|
||||
<property name="Destination" type="s" access="read" />
|
||||
<property name="Channel" type="b" access="read" />
|
||||
<property name="Target" type="s" access="read" />
|
||||
<property name="Root" type="s" access="read" />
|
||||
|
||||
</interface>
|
||||
|
||||
<!-- https://git.merproject.org/jpoutiai/kf5bluezqt/blob/master/bluez-qt/src/interfaces/org.bluez.obex.Transfer1.xml -->
|
||||
<interface name="org.bluez.obex.Transfer1">
|
||||
<method name="Cancel" />
|
||||
<method name="Suspend" />
|
||||
<method name="Resume" />
|
||||
|
||||
<property name="Status" type="s" access="read" />
|
||||
<property name="Session" type="o" access="read" />
|
||||
<property name="Name" type="s" access="read" />
|
||||
<property name="Type" type="s" access="read" />
|
||||
<property name="Time" type="t" access="read" />
|
||||
<property name="Size" type="t" access="read" />
|
||||
<property name="Transferred" type="t" access="read" />
|
||||
<property name="Filename" type="s" access="read" />
|
||||
|
||||
</interface>
|
||||
|
||||
<!-- https://git.kernel.org/pub/scm/bluetooth/bluez.git/tree/doc/obex-api.txt -->
|
||||
<interface name="org.bluez.obex.Synchronization1">
|
||||
<method name="SetLocation">
|
||||
<arg name="location" type="s" direction="in" />
|
||||
</method>
|
||||
<method name="GetPhonebook">
|
||||
<arg name="phonebook" type="o" direction="out" />
|
||||
<arg name="sourcefile" type="s" direction="in" />
|
||||
<arg name="targetfile" type="s" direction="in" />
|
||||
</method>
|
||||
<method name="PutPhonebook">
|
||||
<arg name="sourcefile" type="s" direction="in" />
|
||||
</method>
|
||||
</interface>
|
||||
|
||||
<!-- TODO -->
|
||||
<!-- https://git.kernel.org/pub/scm/bluetooth/bluez.git/tree/doc/obex-api.txt -->
|
||||
<interface name="org.bluez.obex.PhonebookAccess1">
|
||||
<method name="Select">
|
||||
<arg name="location" type="s" direction="in" />
|
||||
<arg name="phonebook" type="s" direction="in" />
|
||||
</method>
|
||||
<method name="PullAll">
|
||||
<arg name="path" type="o" direction="out" />
|
||||
<arg name="properties" type="a{sv}" direction="out" />
|
||||
<arg name="targetfile" type="s" direction="in" />
|
||||
<arg name="filters" type="as" direction="in" />
|
||||
</method>
|
||||
<method name="List">
|
||||
<arg name="vcard" type="a{ss}" direction="out" />
|
||||
<arg name="filters" type="as" direction="in" />
|
||||
</method>
|
||||
<method name="Pull">
|
||||
<arg name="transfer" type="o" direction="out" />
|
||||
<arg name="vcards" type="a{sv}" direction="out" />
|
||||
<arg name="vcard" type="s" direction="in" />
|
||||
<arg name="targetfile" type="s" direction="in" />
|
||||
<arg name="filters" type="as" direction="in" />
|
||||
</method>
|
||||
|
||||
<property name="Folder" type="s" access="read" />
|
||||
<property name="DatabaseIdentifier" type="s" access="read" />
|
||||
<property name="PrimaryCounter" type="s" access="read" />
|
||||
<property name="SecondaryCounter" type="s" access="read" />
|
||||
<property name="FixedImageSize" type="s" access="read" />
|
||||
|
||||
</interface>
|
||||
|
||||
<!-- TODO -->
|
||||
<!-- https://git.kernel.org/pub/scm/bluetooth/bluez.git/tree/doc/obex-api.txt -->
|
||||
<!-- <interface name="org.bluez.obex.MessageAccess1"> -->
|
||||
<!-- <method name="SetLocation"> -->
|
||||
<!-- <arg name="location" type="s" direction="in" /> -->
|
||||
<!-- </method> -->
|
||||
<!-- <method name="GetPhonebook"> -->
|
||||
<!-- <arg name="phonebook" type="o" direction="out" /> -->
|
||||
<!-- <arg name="sourcefile" type="s" direction="in" /> -->
|
||||
<!-- <arg name="targetfile" type="s" direction="in" /> -->
|
||||
<!-- </method> -->
|
||||
<!-- <method name="PutPhonebook"> -->
|
||||
<!-- <arg name="sourcefile" type="s" direction="in" /> -->
|
||||
<!-- </method> -->
|
||||
<!-- </interface> -->
|
||||
<interface name="org.freedesktop.DBus.Properties">
|
||||
<method name="Get">
|
||||
<arg name="interface" type="s" direction="in" />
|
||||
<arg name="name" type="s" direction="in" />
|
||||
<arg name="value" type="v" direction="out" />
|
||||
</method>
|
||||
<method name="Set">
|
||||
<arg name="interface" type="s" direction="in" />
|
||||
<arg name="name" type="s" direction="in" />
|
||||
<arg name="value" type="v" direction="in" />
|
||||
</method>
|
||||
<method name="GetAll">
|
||||
<arg name="interface" type="s" direction="in" />
|
||||
<arg name="properties" type="a{sv}" direction="out" />
|
||||
</method>
|
||||
<signal name="PropertiesChanged">
|
||||
<arg name="interface" type="s" />
|
||||
<arg name="changed_properties" type="a{sv}" />
|
||||
<arg name="invalidated_properties" type="as" />
|
||||
</signal>
|
||||
</interface>
|
||||
</node>
|
@ -0,0 +1,24 @@
|
||||
<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
|
||||
"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
|
||||
<node>
|
||||
<!--
|
||||
<interface name="org.freedesktop.DBus.Introspectable">
|
||||
<method name="Introspect">
|
||||
<arg name="xml" type="s" direction="out" />
|
||||
</method>
|
||||
</interface>
|
||||
-->
|
||||
<interface name="org.freedesktop.DBus.ObjectManager">
|
||||
<method name="GetManagedObjects">
|
||||
<arg name="objects" type="a{oa{sa{sv}}}" direction="out" />
|
||||
</method>
|
||||
<signal name="InterfacesAdded">
|
||||
<arg name="object" type="o" />
|
||||
<arg name="interfaces" type="a{sa{sv}}" />
|
||||
</signal>
|
||||
<signal name="InterfacesRemoved">
|
||||
<arg name="object" type="o" />
|
||||
<arg name="interfaces" type="as" />
|
||||
</signal>
|
||||
</interface>
|
||||
</node>
|
@ -0,0 +1,143 @@
|
||||
<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
|
||||
"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
|
||||
<!-- GDBus 2.40.0 -->
|
||||
<node>
|
||||
<interface name="org.freedesktop.DBus.Properties">
|
||||
<method name="Get">
|
||||
<arg type="s" name="interface_name" direction="in"/>
|
||||
<arg type="s" name="property_name" direction="in"/>
|
||||
<arg type="v" name="value" direction="out"/>
|
||||
</method>
|
||||
<method name="GetAll">
|
||||
<arg type="s" name="interface_name" direction="in"/>
|
||||
<arg type="a{sv}" name="properties" direction="out"/>
|
||||
</method>
|
||||
<method name="Set">
|
||||
<arg type="s" name="interface_name" direction="in"/>
|
||||
<arg type="s" name="property_name" direction="in"/>
|
||||
<arg type="v" name="value" direction="in"/>
|
||||
</method>
|
||||
<signal name="PropertiesChanged">
|
||||
<arg type="s" name="interface_name"/>
|
||||
<arg type="a{sv}" name="changed_properties"/>
|
||||
<arg type="as" name="invalidated_properties"/>
|
||||
</signal>
|
||||
</interface>
|
||||
<interface name="org.freedesktop.DBus.Introspectable">
|
||||
<method name="Introspect">
|
||||
<arg type="s" name="xml_data" direction="out"/>
|
||||
</method>
|
||||
</interface>
|
||||
<interface name="org.freedesktop.DBus.Peer">
|
||||
<method name="Ping"/>
|
||||
<method name="GetMachineId">
|
||||
<arg type="s" name="machine_uuid" direction="out"/>
|
||||
</method>
|
||||
</interface>
|
||||
<interface name="org.mpris.MediaPlayer2">
|
||||
<method name="Raise">
|
||||
</method>
|
||||
<method name="Quit">
|
||||
</method>
|
||||
<property type="b" name="CanQuit" access="read">
|
||||
</property>
|
||||
<property type="b" name="CanRaise" access="read">
|
||||
</property>
|
||||
<property type="b" name="HasTrackList" access="read">
|
||||
</property>
|
||||
<property type="s" name="Identity" access="read">
|
||||
</property>
|
||||
<property type="s" name="DesktopEntry" access="read">
|
||||
</property>
|
||||
<property type="as" name="SupportedUriSchemes" access="read">
|
||||
</property>
|
||||
<property type="as" name="SupportedMimeTypes" access="read">
|
||||
</property>
|
||||
</interface>
|
||||
<interface name="org.mpris.MediaPlayer2.Playlists">
|
||||
<method name="ActivatePlaylist">
|
||||
<arg type="o" name="PlaylistId" direction="in">
|
||||
</arg>
|
||||
</method>
|
||||
<method name="GetPlaylists">
|
||||
<arg type="u" name="Index" direction="in">
|
||||
</arg>
|
||||
<arg type="u" name="MaxCount" direction="in">
|
||||
</arg>
|
||||
<arg type="s" name="Order" direction="in">
|
||||
</arg>
|
||||
<arg type="b" name="ReverseOrder" direction="in">
|
||||
</arg>
|
||||
<arg type="a(oss)" name="arg_4" direction="out">
|
||||
</arg>
|
||||
</method>
|
||||
<property type="u" name="PlaylistCount" access="read">
|
||||
</property>
|
||||
<property type="as" name="Orderings" access="read">
|
||||
</property>
|
||||
<property type="(b(oss))" name="ActivePlaylist" access="read">
|
||||
</property>
|
||||
</interface>
|
||||
<interface name="org.mpris.MediaPlayer2.Player">
|
||||
<method name="Next">
|
||||
</method>
|
||||
<method name="Previous">
|
||||
</method>
|
||||
<method name="Pause">
|
||||
</method>
|
||||
<method name="PlayPause">
|
||||
</method>
|
||||
<method name="Stop">
|
||||
</method>
|
||||
<method name="Play">
|
||||
</method>
|
||||
<method name="Seek">
|
||||
<arg type="x" name="Offset" direction="in">
|
||||
</arg>
|
||||
</method>
|
||||
<method name="SetPosition">
|
||||
<arg type="o" name="TrackId" direction="in">
|
||||
</arg>
|
||||
<arg type="x" name="Position" direction="in">
|
||||
</arg>
|
||||
</method>
|
||||
<method name="OpenUri">
|
||||
<arg type="s" name="Uri" direction="in">
|
||||
</arg>
|
||||
</method>
|
||||
<signal name="Seeked">
|
||||
<arg type="x" name="Position">
|
||||
</arg>
|
||||
</signal>
|
||||
<property type="s" name="PlaybackStatus" access="read">
|
||||
</property>
|
||||
<property type="s" name="LoopStatus" access="readwrite">
|
||||
</property>
|
||||
<property type="d" name="Rate" access="readwrite">
|
||||
</property>
|
||||
<property type="b" name="Shuffle" access="readwrite">
|
||||
</property>
|
||||
<property type="a{sv}" name="Metadata" access="read">
|
||||
</property>
|
||||
<property type="d" name="Volume" access="readwrite">
|
||||
</property>
|
||||
<property type="x" name="Position" access="read">
|
||||
</property>
|
||||
<property type="d" name="MinimumRate" access="read">
|
||||
</property>
|
||||
<property type="d" name="MaximumRate" access="read">
|
||||
</property>
|
||||
<property type="b" name="CanGoNext" access="read">
|
||||
</property>
|
||||
<property type="b" name="CanGoPrevious" access="read">
|
||||
</property>
|
||||
<property type="b" name="CanPlay" access="read">
|
||||
</property>
|
||||
<property type="b" name="CanPause" access="read">
|
||||
</property>
|
||||
<property type="b" name="CanSeek" access="read">
|
||||
</property>
|
||||
<property type="b" name="CanControl" access="read">
|
||||
</property>
|
||||
</interface>
|
||||
</node>
|
@ -0,0 +1,51 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<node name="/org/trinitydesktop/tdebluez">
|
||||
<!-- The Introspectable Interface gets autogenerated
|
||||
<interface name="org.freedesktop.DBus.Introspectable">
|
||||
<method name="Introspect">
|
||||
<arg name="xml" type="s" direction="out"/>
|
||||
</method>
|
||||
</interface>
|
||||
-->
|
||||
<interface name="org.bluez.Agent1">
|
||||
<method name="Release">
|
||||
</method>
|
||||
<method name="RequestPinCode">
|
||||
<annotation name="org.freedesktop.DBus.GLib.Async"/>
|
||||
<arg name="device" direction="in" type="o"/>
|
||||
<arg name="pincode" direction="out" type="s"/>
|
||||
</method>
|
||||
<method name="DisplayPinCode">
|
||||
<annotation name="org.freedesktop.DBus.GLib.Async"/>
|
||||
<arg name="device" direction="in" type="o"/>
|
||||
<arg name="pincode" direction="in" type="s"/>
|
||||
</method>
|
||||
<method name="RequestPasskey">
|
||||
<annotation name="org.freedesktop.DBus.GLib.Async"/>
|
||||
<arg name="device" direction="in" type="o"/>
|
||||
<arg name="passkey" direction="out" type="u"/>
|
||||
</method>
|
||||
<method name="DisplayPasskey">
|
||||
<annotation name="org.freedesktop.DBus.GLib.Async"/>
|
||||
<arg name="device" direction="in" type="o"/>
|
||||
<arg name="passkey" direction="in" type="u"/>
|
||||
<arg name="entered" direction="in" type="q"/>
|
||||
</method>
|
||||
<method name="RequestConfirmation">
|
||||
<annotation name="org.freedesktop.DBus.GLib.Async"/>
|
||||
<arg name="device" direction="in" type="o"/>
|
||||
<arg name="passkey" direction="in" type="u"/>
|
||||
</method>
|
||||
<method name="RequestAuthorization">
|
||||
<annotation name="org.freedesktop.DBus.GLib.Async"/>
|
||||
<arg name="device" direction="in" type="o"/>
|
||||
</method>
|
||||
<method name="AuthorizeService">
|
||||
<annotation name="org.freedesktop.DBus.GLib.Async"/>
|
||||
<arg name="device" direction="in" type="o"/>
|
||||
<arg name="uuid" direction="in" type="s"/>
|
||||
</method>
|
||||
<method name="Cancel">
|
||||
</method>
|
||||
</interface>
|
||||
</node>
|
@ -0,0 +1,96 @@
|
||||
#################################################
|
||||
#
|
||||
# (C) 2018 Emanoil Kotsev
|
||||
# deloptes (AT) gmail.com
|
||||
#
|
||||
# Improvements and feedback are welcome
|
||||
#
|
||||
# This file is released under GPL >= 2
|
||||
#
|
||||
#################################################
|
||||
|
||||
project( libtdebluez )
|
||||
set(LIBRARY_VERSION 0.0.1)
|
||||
|
||||
# include( ConfigureChecks.cmake )
|
||||
foreach( f ${TQT_LIBRARIES} )
|
||||
if( ${f} STREQUAL "tqt-mt" )
|
||||
set(TQUI_LIBRARIES "tqui" CACHE TYPE STRING FORCE)
|
||||
endif()
|
||||
if( ${f} STREQUAL "qt-mt" )
|
||||
set(TQUI_LIBRARIES "qui" CACHE TYPE STRING FORCE)
|
||||
endif()
|
||||
endforeach()
|
||||
|
||||
# import required
|
||||
#tde_import( lib... )
|
||||
|
||||
add_subdirectory( interfaces )
|
||||
|
||||
include_directories(
|
||||
${CMAKE_CURRENT_BINARY_DIR}
|
||||
${CMAKE_BINARY_DIR}
|
||||
${CMAKE_SOURCE_DIR}
|
||||
${TDE_INCLUDE_DIR}
|
||||
${TQT_INCLUDE_DIRS}
|
||||
${DBUS_INCLUDE_DIRS}
|
||||
${DBUS_TQT_INCLUDE_DIRS}
|
||||
)
|
||||
|
||||
link_directories(
|
||||
${TQT_LIBRARY_DIRS}
|
||||
)
|
||||
|
||||
##### headers ###################################
|
||||
# implementations
|
||||
install(
|
||||
FILES adapterImpl.h
|
||||
btuuids.h
|
||||
deviceImpl.h
|
||||
devicemimeconverter.h
|
||||
objectmanagerImpl.h
|
||||
DESTINATION ${INCLUDE_INSTALL_DIR}/tdebluez )
|
||||
|
||||
##### other data ################################
|
||||
# install( FILES xxxxxxxx.kcfg DESTINATION ${KCFG_INSTALL_DIR} )
|
||||
|
||||
##### tdebluetoothwidgets (module) ####################
|
||||
#
|
||||
# add_custom_command( OUTPUT tdebluetoothwidgets.cpp
|
||||
# COMMAND
|
||||
# ${KDE3_MAKETDEWIDGETS_EXECUTABLE}
|
||||
# -o tdebluetoothwidgets.cpp
|
||||
# ${CMAKE_CURRENT_SOURCE_DIR}/tdebluez.widgets
|
||||
# DEPENDS
|
||||
# ${CMAKE_CURRENT_SOURCE_DIR}/tdebluez.widgets )
|
||||
#
|
||||
# set_source_files_properties( tdebluetoothwidgets.cpp PROPERTIES COMPILE_FLAGS "-DQT_PLUGIN" )
|
||||
#
|
||||
# tde_add_kpart( tdebluetoothwidgets
|
||||
# SOURCES tdebluetoothwidgets.cpp
|
||||
# LINK tdebluez-shared
|
||||
# DESTINATION ${PLUGIN_INSTALL_DIR}/plugins/designer
|
||||
# )
|
||||
|
||||
set( target tdebluez )
|
||||
|
||||
set( ${target}_SRCS
|
||||
objectmanagerImpl.cpp
|
||||
adapterImpl.cpp
|
||||
deviceImpl.cpp
|
||||
devicemimeconverter.cpp
|
||||
# agent/introspectableinterface.cpp agent/org_trinitydesktop_tdeblueznode.cpp
|
||||
)
|
||||
|
||||
##### tdebluez (shared) ###########################
|
||||
# set( KDE3_DCOPIDL_EXECUTABLE ${KDE3_DCOPIDLNG_EXECUTABLE} )
|
||||
tde_add_library( ${target} SHARED AUTOMOC
|
||||
SOURCES ${${target}_SRCS}
|
||||
VERSION ${LIBRARY_VERSION}
|
||||
DEPENDS bluezinterfaces-static
|
||||
LINK ${DBUS_TQT_LIBRARIES} tdeparts-shared bluezinterfaces-static ${TQUI_LIBRARIES}
|
||||
DESTINATION ${LIB_INSTALL_DIR}
|
||||
)
|
||||
|
||||
##### install import cmake modules ###############
|
||||
tde_install_export( )
|
@ -0,0 +1,29 @@
|
||||
interfaces
|
||||
source interfaces for autogenerating with dbusxml2qt3
|
||||
libtdebluez/
|
||||
Implementations and other files part of the library
|
||||
|
||||
libtdebluez/
|
||||
|
||||
libtdebluez/interfaces
|
||||
interfaces autogenerated with dbusxml2qt3
|
||||
- autogenerated proxy to objectmanager
|
||||
- adapter
|
||||
adapter1 proxy
|
||||
gattmanager1 proxy
|
||||
media1 proxy
|
||||
neworkserver1 proxy
|
||||
- obexagent
|
||||
autogenerated obex agent - interface and proxy
|
||||
- properties
|
||||
autogenerated dbus properties proxy
|
||||
- device
|
||||
autogenerated device1 proxy
|
||||
autogenerated mediacontrol1 proxy
|
||||
- agent
|
||||
autogenerated agent1 interface and proxy
|
||||
autogenerated introspectable interface
|
||||
autogenerated trinity desktop tdebluez node interface
|
||||
- manager
|
||||
autogenerated proxies to managers
|
||||
|
@ -0,0 +1,144 @@
|
||||
/*
|
||||
*
|
||||
* Adapter Implementation of bluez5 for libtdebluez
|
||||
*
|
||||
* Copyright (C) 2018 Emanoil Kotsev <deloptes@gmail.com>
|
||||
*
|
||||
*
|
||||
* This file is part of libtdebluez.
|
||||
*
|
||||
* libtdebluez 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.
|
||||
*
|
||||
* libtdebluez 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 kbluetooth; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/rfkill.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include <tqfile.h>
|
||||
#include <tqregexp.h>
|
||||
#include <tqdir.h>
|
||||
|
||||
#include <tqdbusproxy.h>
|
||||
#include <tqmessagebox.h>
|
||||
|
||||
#include "adapterImpl.h"
|
||||
|
||||
namespace TDEBluetooth
|
||||
{
|
||||
|
||||
AdapterImpl::AdapterImpl(const TQString& service, const TQString& path, TQObject* parent, const char* name) :
|
||||
Adapter1Proxy(service, path, parent, name) /*,properties(service,path,parent,name)*/
|
||||
{
|
||||
}
|
||||
|
||||
AdapterImpl::~AdapterImpl()
|
||||
{
|
||||
}
|
||||
|
||||
void AdapterImpl::powerOn(bool state)
|
||||
{
|
||||
// https://www.kernel.org/doc/Documentation/rfkill.txt
|
||||
// http://jwhsmith.net/2015/02/manipulating-rfkill-using-devices-programmatically/
|
||||
// https://cpp.hotexamples.com/examples/-/-/rfkill_alloc/cpp-rfkill_alloc-function-examples.html
|
||||
// https://github.com/systemd/systemd/blob/main/src/rfkill/rfkill.c
|
||||
|
||||
TQString device = getPath();
|
||||
device = device.replace(TQRegExp("^/.*/"), "");
|
||||
int hcidx = -1;
|
||||
TQDir d("/sys/class/rfkill");
|
||||
d.setFilter(TQDir::Dirs);
|
||||
for (int i = 0; i < d.count(); i++)
|
||||
{
|
||||
// expected is rfkill<n>
|
||||
TQFile f("/sys/class/rfkill/" + d[i] + "/name");
|
||||
TQString content;
|
||||
if (f.exists() && f.open(IO_ReadOnly))
|
||||
{
|
||||
TQTextStream stream(&f);
|
||||
content = stream.readLine();
|
||||
f.close();
|
||||
}
|
||||
else
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if (content.startsWith(device))
|
||||
{
|
||||
TQFile f("/sys/class/rfkill/" + d[i] + "/index");
|
||||
if (f.exists() && f.open(IO_ReadOnly))
|
||||
{
|
||||
TQTextStream stream(&f);
|
||||
hcidx = stream.readLine().toUInt();
|
||||
f.close();
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (hcidx < 0)
|
||||
{
|
||||
// error handling
|
||||
tqDebug("Index for the device %s not found", device.local8Bit().data());
|
||||
return;
|
||||
}
|
||||
|
||||
struct rfkill_event event = { 0 };
|
||||
|
||||
TQFile file("/dev/rfkill");
|
||||
if (!file.open(IO_ReadWrite))
|
||||
{
|
||||
tqDebug("Failed to open %s", file.name().utf8().data());
|
||||
return;
|
||||
}
|
||||
|
||||
event.idx = hcidx;
|
||||
event.op = RFKILL_OP_CHANGE;
|
||||
if (state)
|
||||
event.soft = 0;
|
||||
else
|
||||
event.soft = 1;
|
||||
|
||||
tqDebug("Bluetooth device %s switches: idx(%i), soft(%d).", device.local8Bit().data(), event.idx, event.soft);
|
||||
|
||||
if (write(file.handle(), &event, sizeof(event)) < 0)
|
||||
tqDebug("Failed to write to %s", file.name().utf8().data());
|
||||
file.close();
|
||||
}
|
||||
|
||||
TQString AdapterImpl::getPath()
|
||||
{
|
||||
return TQString(m_baseProxy->path());
|
||||
}
|
||||
|
||||
void AdapterImpl::slotSetAlias(const TQString& alias)
|
||||
{
|
||||
TQT_DBusError error;
|
||||
setAlias(alias, error);
|
||||
if (error.isValid())
|
||||
tqDebug("AdapterImpl::slotSetAlias(%s) failed: %s", alias.utf8().data(), error.message().utf8().data());
|
||||
}
|
||||
|
||||
void AdapterImpl::slotSetTimeout(int timeout)
|
||||
{
|
||||
TQT_DBusError error;
|
||||
setDiscoverableTimeout(timeout, error);
|
||||
if (error.isValid())
|
||||
tqDebug("AdapterImpl::slotSetTimeout(%i) failed: %s", timeout, error.message().utf8().data());
|
||||
}
|
||||
|
||||
} // namespace TDEBluetooth
|
||||
|
||||
#include "adapterImpl.moc"
|
||||
// End of File
|
@ -0,0 +1,59 @@
|
||||
/*
|
||||
*
|
||||
* Adapter Implementation of bluez5 for libtdebluez
|
||||
*
|
||||
* Copyright (C) 2018 Emanoil Kotsev <deloptes@gmail.com>
|
||||
*
|
||||
*
|
||||
* This file is part of libtdebluez.
|
||||
*
|
||||
* libtdebluez 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.
|
||||
*
|
||||
* libtdebluez 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 kbluetooth; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
*/
|
||||
|
||||
#if !defined(ADAPTERIMPL_H_INCLUDED)
|
||||
#define ADAPTERIMPL_H_INCLUDED
|
||||
|
||||
#include "interfaces/adapter1Proxy.h"
|
||||
|
||||
using namespace org::bluez;
|
||||
|
||||
namespace TDEBluetooth
|
||||
{
|
||||
|
||||
class AdapterImpl: public Adapter1Proxy
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
AdapterImpl(const TQString& service, const TQString& path, TQObject* parent = 0, const char* name = 0);
|
||||
|
||||
virtual ~AdapterImpl();
|
||||
void powerOn(bool state);
|
||||
TQString getPath();
|
||||
|
||||
public slots:
|
||||
void slotSetAlias(const TQString& alias);
|
||||
void slotSetTimeout(int timeout);
|
||||
|
||||
};
|
||||
// class AdapterImpl
|
||||
|
||||
};
|
||||
// namespace TDEBluetooth
|
||||
|
||||
#endif //ADAPTERIMPL_H_INCLUDED
|
||||
|
||||
// End of File
|
@ -0,0 +1,148 @@
|
||||
/*
|
||||
*
|
||||
* List of BT UUIDs and resolver for libtdebluez
|
||||
*
|
||||
* Copyright (C) 2018 Emanoil Kotsev <deloptes@gmail.com>
|
||||
*
|
||||
*
|
||||
* This file is part of libtdebluez.
|
||||
*
|
||||
* libtdebluez 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.
|
||||
*
|
||||
* libtdebluez 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 kbluetooth; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* This was taken from bluez/lib/uuid.h 2018-07-22
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#include <map>
|
||||
#include <string>
|
||||
|
||||
#ifndef BTUUIDS_H_
|
||||
#define BTUUIDS_H_
|
||||
|
||||
static const std::map<std::string, std::string> my_map =
|
||||
{
|
||||
{ "00001203-0000-1000-8000-00805f9b34fb", "Generic Audio" },
|
||||
{ "00001108-0000-1000-8000-00805f9b34fb", "Headset" },
|
||||
{ "00001112-0000-1000-8000-00805f9b34fb", "Headset AG" },
|
||||
|
||||
{ "0000111e-0000-1000-8000-00805f9b34fb", "Handsfree" },
|
||||
{ "0000111f-0000-1000-8000-00805f9b34fb", "Handsfree AG" },
|
||||
|
||||
{ "0000110d-0000-1000-8000-00805f9b34fb", "Advanced Audio" },
|
||||
|
||||
{ "0000110a-0000-1000-8000-00805f9b34fb", "A2DP Source" }, //Advanced Audio Distribution Profile
|
||||
{ "0000110b-0000-1000-8000-00805f9b34fb", "A2DP Sink" },
|
||||
|
||||
{ "0000110e-0000-1000-8000-00805f9b34fb", "A/V Remote Ctrl" }, //Audio/Video Remote Control Profile
|
||||
{ "0000110c-0000-1000-8000-00805f9b34fb", "A/V Remote Ctrl Tgt" },
|
||||
|
||||
{ "00001115-0000-1000-8000-00805f9b34fb", "PANU" },
|
||||
{ "00001116-0000-1000-8000-00805f9b34fb", "NAP" },
|
||||
{ "00001117-0000-1000-8000-00805f9b34fb", "GN" },
|
||||
{ "0000000f-0000-1000-8000-00805f9b34fb", "BNEP Service" }, //Bluetooth Network Encapsulation Protocol
|
||||
|
||||
{ "00002a50-0000-1000-8000-00805f9b34fb", "PNPID" },
|
||||
{ "0000180a-0000-1000-8000-00805f9b34fb", "Device Information" },
|
||||
|
||||
{ "00001801-0000-1000-8000-00805f9b34fb", "GATT" }, //Generic Access Profile (Generic Attributes)
|
||||
{ "00001802-0000-1000-8000-00805f9b34fb", "Immediate Alert" },
|
||||
{ "00001803-0000-1000-8000-00805f9b34fb", "Link Loss" },
|
||||
{ "00001804-0000-1000-8000-00805f9b34fb", "TX Power" },
|
||||
|
||||
{ "0000112d-0000-1000-8000-00805f9b34fb", "SAP" },
|
||||
|
||||
{ "0000180d-0000-1000-8000-00805f9b34fb", "Heart Rate" },
|
||||
{ "00002a37-0000-1000-8000-00805f9b34fb", "Heart Rate Measurement" },
|
||||
{ "00002a38-0000-1000-8000-00805f9b34fb", "Body Sensor Location" },
|
||||
{ "00002a39-0000-1000-8000-00805f9b34fb", "Heart Rate Control Point" },
|
||||
|
||||
{ "00001809-0000-1000-8000-00805f9b34fb", "Health Thermometer" },
|
||||
{ "00002a1c-0000-1000-8000-00805f9b34fb", "Temp Measurement" },
|
||||
{ "00002a1d-0000-1000-8000-00805f9b34fb", "Temp Type" },
|
||||
{ "00002a1e-0000-1000-8000-00805f9b34fb", "Immediate Temp" },
|
||||
{ "00002a21-0000-1000-8000-00805f9b34fb", "Measurement Interval" },
|
||||
|
||||
{ "00001816-0000-1000-8000-00805f9b34fb", "Cycling SC" },
|
||||
{ "00002a5b-0000-1000-8000-00805f9b34fb", "CSC Measurement" },
|
||||
{ "00002a5c-0000-1000-8000-00805f9b34fb", "CSC Feature" },
|
||||
{ "00002a5d-0000-1000-8000-00805f9b34fb", "Sensor Location" },
|
||||
{ "00002a55-0000-1000-8000-00805f9b34fb", "SC Control Point" },
|
||||
|
||||
{ "00000003-0000-1000-8000-00805f9b34fb", "RFCOMM" },
|
||||
|
||||
{ "00001400-0000-1000-8000-00805f9b34fb", "HDP" },
|
||||
{ "00001401-0000-1000-8000-00805f9b34fb", "HDP Source" },
|
||||
{ "00001402-0000-1000-8000-00805f9b34fb", "HDP Sink" },
|
||||
|
||||
{ "00001124-0000-1000-8000-00805f9b34fb", "HID" },
|
||||
|
||||
{ "00001103-0000-1000-8000-00805f9b34fb", "DUN Gateway" }, //Dial-up Networking Profile
|
||||
|
||||
{ "00001800-0000-1000-8000-00805f9b34fb", "GAP" }, //Generic Access Profile
|
||||
{ "00001200-0000-1000-8000-00805f9b34fb", "PNP" },
|
||||
|
||||
{ "00001101-0000-1000-8000-00805f9b34fb", "SPP" }, //Serial Port Profile
|
||||
|
||||
{ "00001104-0000-1000-8000-00805f9b34fb", "OBEX Sync" },
|
||||
{ "00001105-0000-1000-8000-00805f9b34fb", "OBEX OPP" },
|
||||
{ "00001106-0000-1000-8000-00805f9b34fb", "OBEX FTP" },
|
||||
{ "f9ec7bc4-953c-11d2-984e-525400dc9e09", "OBEX DIR" },
|
||||
{ "0000112e-0000-1000-8000-00805f9b34fb", "OBEX PCE" },
|
||||
{ "0000112f-0000-1000-8000-00805f9b34fb", "OBEX PSE" },
|
||||
{ "00001130-0000-1000-8000-00805f9b34fb", "OBEX PBAP" },
|
||||
{ "00001132-0000-1000-8000-00805f9b34fb", "OBEX Msg Access Srv" },
|
||||
{ "00001133-0000-1000-8000-00805f9b34fb", "OBEX Msg Notif. Srv" },
|
||||
{ "00001134-0000-1000-8000-00805f9b34fb", "OBEX MAP" },
|
||||
// taken from
|
||||
// https://www.vistax64.com/threads/bluetooth-peripheral-device-cannot-be-found.62944/
|
||||
// https://together.jolla.com/question/64565/accessing-bluetooth-profiles/
|
||||
// http://www.sensi.org/~ak/tmp/n95.txt
|
||||
{ "00005005-0000-1000-8000-0002ee000001", "Nokia PC Suite" },
|
||||
{ "00005601-0000-1000-8000-0002ee000001", "Nokia SyncML Server" },
|
||||
{ "00000001-0000-1000-8000-0002ee000001", "SyncML Server" },
|
||||
{ "00000002-0000-1000-8000-0002ee000002", "OBEX Syncevolution" },
|
||||
{ "00000004-0000-1000-8000-0002ee000002", "SyncML DM Client" }
|
||||
|
||||
};
|
||||
|
||||
/*!
|
||||
* This function resolves UUID to human readable service name.
|
||||
* \return string service name
|
||||
* \retval the service name
|
||||
*/
|
||||
|
||||
static const TQString resolveUUID(const TQString &uuid)
|
||||
{
|
||||
|
||||
TQString name;
|
||||
|
||||
for (auto i = my_map.begin(); i != my_map.end(); ++i)
|
||||
{
|
||||
if (i->first == uuid.latin1())
|
||||
{
|
||||
name = TQString(i->second.c_str());
|
||||
break;
|
||||
}
|
||||
}
|
||||
// name = i18n("Unknown");
|
||||
return (!name.isEmpty()) ? name : uuid;
|
||||
}
|
||||
|
||||
#endif // BTUUIDS_H_
|
@ -0,0 +1,49 @@
|
||||
/*
|
||||
*
|
||||
* Device Implementation of bluez5 for libtdebluez
|
||||
*
|
||||
* Copyright (C) 2018 Emanoil Kotsev <deloptes@gmail.com>
|
||||
*
|
||||
*
|
||||
* This file is part of libtdebluez.
|
||||
*
|
||||
* libtdebluez 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.
|
||||
*
|
||||
* libtdebluez 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 kbluetooth; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
*/
|
||||
|
||||
#include "deviceImpl.h"
|
||||
|
||||
namespace TDEBluetooth
|
||||
{
|
||||
|
||||
DeviceImpl::DeviceImpl(const TQString& service, const TQString& path, TQObject* parent, const char* name) : org::bluez::Device1Proxy(service, path, parent, name)
|
||||
{
|
||||
m_path = path;
|
||||
}
|
||||
|
||||
DeviceImpl::~DeviceImpl()
|
||||
{
|
||||
}
|
||||
|
||||
const TQString DeviceImpl::getPath()
|
||||
{
|
||||
return m_path;
|
||||
}
|
||||
|
||||
};
|
||||
// namespace TDEBluetooth
|
||||
|
||||
#include "deviceImpl.moc"
|
||||
// End of File
|
@ -0,0 +1,62 @@
|
||||
/*
|
||||
*
|
||||
* Device Implementation of bluez5 for libtdebluez
|
||||
*
|
||||
* Copyright (C) 2018 Emanoil Kotsev <deloptes@gmail.com>
|
||||
*
|
||||
*
|
||||
* This file is part of libtdebluez.
|
||||
*
|
||||
* libtdebluez 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.
|
||||
*
|
||||
* libtdebluez 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 kbluetooth; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
*/
|
||||
|
||||
#if !defined(DEVICEIMPL_H_INCLUDED)
|
||||
#define DEVICEIMPL_H_INCLUDED
|
||||
|
||||
// QT - Header
|
||||
#include <tqtimer.h>
|
||||
|
||||
// debug
|
||||
#include <kdebug.h>
|
||||
|
||||
#include "interfaces/device1Proxy.h"
|
||||
#include "interfaces/propertiesProxy.h"
|
||||
|
||||
namespace TDEBluetooth
|
||||
{
|
||||
|
||||
class DeviceImpl: public org::bluez::Device1Proxy
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
DeviceImpl(const TQString& service, const TQString& path, TQObject* parent = 0, const char* name = 0);
|
||||
|
||||
virtual ~DeviceImpl();
|
||||
const TQString getPath();
|
||||
|
||||
private:
|
||||
TQString m_path;
|
||||
|
||||
};
|
||||
// class DeviceImpl
|
||||
|
||||
};
|
||||
// namespace TDEBluetooth
|
||||
|
||||
#endif //DEVICEIMPL_H_INCLUDED
|
||||
|
||||
// End of File
|
@ -0,0 +1,147 @@
|
||||
/*
|
||||
*
|
||||
* Device Mime Converter for libtdebluez
|
||||
*
|
||||
* Copyright (C) 2003 by Fred Schaettgen
|
||||
* Copyright (C) 2018 Emanoil Kotsev <deloptes@gmail.com>
|
||||
*
|
||||
*
|
||||
* This file is part of libtdebluez.
|
||||
*
|
||||
* libtdebluez 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.
|
||||
*
|
||||
* libtdebluez 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 kbluetooth; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
*/
|
||||
|
||||
#include <kmimetype.h>
|
||||
|
||||
#include "devicemimeconverter.h"
|
||||
|
||||
namespace TDEBluetooth
|
||||
{
|
||||
|
||||
DeviceMimeConverter::DeviceMimeConverter()
|
||||
{
|
||||
getIconName("bluetooth/unknown-device-class");
|
||||
getIconName("bluetooth/misc-device-class");
|
||||
getIconName("bluetooth/computer-device-class");
|
||||
getIconName("bluetooth/phone-device-class");
|
||||
getIconName("bluetooth/lan-device-class");
|
||||
getIconName("bluetooth/av-device-class");
|
||||
getIconName("bluetooth/peripheral-device-class");
|
||||
getIconName("bluetooth/mouse-device-class");
|
||||
getIconName("bluetooth/keyboard-device-class");
|
||||
getIconName("bluetooth/imaging-device-class");
|
||||
}
|
||||
|
||||
void DeviceMimeConverter::getIconName(TQString mime)
|
||||
{
|
||||
TQString iconName = KMimeType::mimeType(mime)->icon(TQString::null, false);
|
||||
mimeTypeToIconMap[mime] = iconName;
|
||||
}
|
||||
|
||||
DeviceMimeConverter* DeviceMimeConverter::getInstance()
|
||||
{
|
||||
static DeviceMimeConverter instance;
|
||||
return &instance;
|
||||
}
|
||||
|
||||
TQString DeviceMimeConverter::classToIconName(int n)
|
||||
{
|
||||
return DeviceMimeConverter::mimeTypeToIcon(DeviceMimeConverter::classToMimeType(n));
|
||||
}
|
||||
|
||||
/*
|
||||
* device classes
|
||||
*
|
||||
AUDIO_VIDEO (Value: 0x00000400)
|
||||
COMPUTER (Value: 0x00000100)
|
||||
HEALTH (Value: 0x00000900)
|
||||
IMAGING (Value: 0x00000600)
|
||||
MISC (Value: 0x00000000)
|
||||
NETWORKING (Value: 0x00000300)
|
||||
PERIPHERAL (Value: 0x00000500)
|
||||
PHONE (Value: 0x00000200)
|
||||
TOY (Value: 0x00000800)
|
||||
UNCATEGORIZED (Value: 0x00001f00)
|
||||
WEARABLE (Value: 0x00000700)
|
||||
*/
|
||||
|
||||
TQString DeviceMimeConverter::classToMimeType(int n)
|
||||
{
|
||||
TQString mimeType;
|
||||
int major = ((n & 0x001F00) >> 8);
|
||||
int minor = ((n >> 2) & 0x30);
|
||||
switch (major)
|
||||
{
|
||||
case 0x00:
|
||||
mimeType = "bluetooth/misc-device-class";
|
||||
break;
|
||||
case 0x01:
|
||||
mimeType = "bluetooth/computer-device-class";
|
||||
break;
|
||||
case 0x02:
|
||||
mimeType = "bluetooth/phone-device-class";
|
||||
break;
|
||||
case 0x03:
|
||||
mimeType = "bluetooth/lan-device-class";
|
||||
break;
|
||||
case 0x04:
|
||||
mimeType = "bluetooth/av-device-class";
|
||||
break;
|
||||
case 0x05:
|
||||
switch (minor)
|
||||
{
|
||||
case 0x10:
|
||||
mimeType = "bluetooth/keyboard-device-class";
|
||||
break;
|
||||
case 0x20:
|
||||
mimeType = "bluetooth/mouse-device-class";
|
||||
break;
|
||||
default:
|
||||
mimeType = "bluetooth/peripheral-device-class";
|
||||
}
|
||||
break;
|
||||
case 0x06:
|
||||
mimeType = "bluetooth/imaging-device-class";
|
||||
break;
|
||||
case 0x07:
|
||||
mimeType = "bluetooth/wearable-device-class";
|
||||
break;
|
||||
case 0x08:
|
||||
mimeType = "bluetooth/toy-device-class";
|
||||
break;
|
||||
case 0x09:
|
||||
mimeType = "bluetooth/health-device-class";
|
||||
break;
|
||||
default:
|
||||
mimeType = "bluetooth/unknown-device-class";
|
||||
}
|
||||
return mimeType;
|
||||
}
|
||||
|
||||
TQString DeviceMimeConverter::mimeTypeToIcon(TQString mime)
|
||||
{
|
||||
DeviceMimeConverter* c = DeviceMimeConverter::getInstance();
|
||||
if (c->mimeTypeToIconMap.find(mime) != c->mimeTypeToIconMap.end())
|
||||
{
|
||||
return c->mimeTypeToIconMap[mime];
|
||||
}
|
||||
else
|
||||
{
|
||||
return c->mimeTypeToIconMap["bluetooth/unknown-device-class"];
|
||||
}
|
||||
}
|
||||
|
||||
} // TDEBluetooth
|
@ -0,0 +1,53 @@
|
||||
/*
|
||||
*
|
||||
* Device Mime Converter for libtdebluez
|
||||
*
|
||||
* Copyright (C) 2003 by Fred Schaettgen
|
||||
* Copyright (C) 2018 Emanoil Kotsev <deloptes@gmail.com>
|
||||
*
|
||||
*
|
||||
* This file is part of libtdebluez.
|
||||
*
|
||||
* libtdebluez 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.
|
||||
*
|
||||
* libtdebluez 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 kbluetooth; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef DEVICEMIMECONVERTER_H
|
||||
#define DEVICEMIMECONVERTER_H
|
||||
|
||||
#include <map>
|
||||
|
||||
namespace TDEBluetooth
|
||||
{
|
||||
/**
|
||||
@author Fred Schaettgen
|
||||
*/
|
||||
class DeviceMimeConverter
|
||||
{
|
||||
public:
|
||||
static TQString classToMimeType(int deviceClass);
|
||||
static TQString mimeTypeToIcon(TQString mimeType);
|
||||
static TQString classToIconName(int deviceClass);
|
||||
protected:
|
||||
DeviceMimeConverter();
|
||||
static DeviceMimeConverter *getInstance();
|
||||
private:
|
||||
std::map<TQString, TQString> mimeTypeToIconMap;
|
||||
void getIconName(TQString mimetype);
|
||||
};
|
||||
|
||||
} // TDEBluetooth
|
||||
|
||||
#endif
|
@ -0,0 +1,607 @@
|
||||
/*
|
||||
*
|
||||
* Object Manager implementation of bluez5
|
||||
*
|
||||
* Copyright (C) 2018 Emanoil Kotsev <deloptes@gmail.com>
|
||||
*
|
||||
*
|
||||
* This file is part of libtdebluez.
|
||||
*
|
||||
* libtdebluez 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.
|
||||
*
|
||||
* libtdebluez 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 kbluetooth; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
*/
|
||||
|
||||
#include <tqstringlist.h>
|
||||
|
||||
#include <tqdbusmessage.h>
|
||||
#include <tqdbusobjectpath.h>
|
||||
#include <tqdbusdatamap.h>
|
||||
#include <tqdbusdata.h>
|
||||
#include <tqdbusdatalist.h>
|
||||
#include <tqdbusvariant.h>
|
||||
|
||||
#include "objectmanagerImpl.h"
|
||||
#include "btuuids.h"
|
||||
|
||||
namespace TDEBluetooth
|
||||
{
|
||||
|
||||
ObjectManagerImpl::ObjectManagerImpl(const TQString& service, const TQString& path, TQObject* parent, const char* name) :
|
||||
ObjectManagerProxy(service, path, parent, name)
|
||||
{
|
||||
agentManager = 0;
|
||||
profileManager = 0;
|
||||
healthManager = 0;
|
||||
agentRegisteredStatus = false;
|
||||
agentIsDefaultAgent = false;
|
||||
// init connection to dbus
|
||||
initDBUS();
|
||||
}
|
||||
|
||||
ObjectManagerImpl::~ObjectManagerImpl()
|
||||
{
|
||||
// close D-Bus connection
|
||||
close();
|
||||
|
||||
if(agentManager)
|
||||
delete agentManager;
|
||||
if(profileManager)
|
||||
delete profileManager;
|
||||
if(healthManager)
|
||||
delete healthManager;
|
||||
}
|
||||
|
||||
/*!
|
||||
* This function try a reconnect to D-Bus.
|
||||
* \return boolean with the result of the operation
|
||||
* \retval true if successful reconnected to D-Bus
|
||||
* \retval false if unsuccessful
|
||||
*/
|
||||
bool ObjectManagerImpl::reconnect()
|
||||
{
|
||||
// close D-Bus connection
|
||||
close();
|
||||
// init D-Bus conntection
|
||||
return (initDBUS());
|
||||
}
|
||||
|
||||
/*!
|
||||
* This function return information about connection status to the DBUS daemon.
|
||||
* \return boolean with the state of the connection to D-Bus
|
||||
* \retval true if connected
|
||||
* \retval false if disconnected
|
||||
*/
|
||||
bool ObjectManagerImpl::isConnectedToDBUS()
|
||||
{
|
||||
return dBusConn.isConnected();
|
||||
}
|
||||
|
||||
/*!
|
||||
* This function returns pointer to connection of the DBUS.
|
||||
* \return TQT_DBusConnection* of the connection to D-Bus
|
||||
* \retval TQT_DBusConnection*
|
||||
*/
|
||||
TQT_DBusConnection* ObjectManagerImpl::getConnection()
|
||||
{
|
||||
return &dBusConn;
|
||||
}
|
||||
|
||||
/*!
|
||||
* This function close the connection to manager over the D-Bus daemon.
|
||||
* \return boolean with the result of the operation
|
||||
* \retval true if successful closed the connection
|
||||
* \retval false if any problems
|
||||
*/
|
||||
bool ObjectManagerImpl::close()
|
||||
{
|
||||
disconnect(this, SIGNAL(InterfacesAdded(const TQT_DBusObjectPath&, const TQT_DBusDataMap< TQString >&)),
|
||||
this, SLOT(slotInterfacesAdded(const TQT_DBusObjectPath&, const TQT_DBusDataMap< TQString >& )));
|
||||
disconnect(this, SIGNAL(InterfacesRemoved(const TQT_DBusObjectPath& , const TQStringList& )),
|
||||
this, SLOT(slotInterfacesRemoved(const TQT_DBusObjectPath& , const TQStringList& )));
|
||||
|
||||
for (PropertiesMap::iterator it = adapters.begin(); it != adapters.end();
|
||||
++it)
|
||||
{
|
||||
org::freedesktop::DBus::PropertiesProxy *p;
|
||||
p = it.data();
|
||||
if (p != NULL)
|
||||
delete p;
|
||||
}
|
||||
for (PropertiesMap::iterator it = devices.begin(); it != devices.end();
|
||||
++it)
|
||||
{
|
||||
org::freedesktop::DBus::PropertiesProxy *p;
|
||||
p = it.data();
|
||||
if (p != NULL)
|
||||
delete p;
|
||||
}
|
||||
adapters.clear();
|
||||
devices.clear();
|
||||
|
||||
dBusConn.closeConnection(DBUS_CONN_NAME);
|
||||
return true;
|
||||
}
|
||||
|
||||
/*!
|
||||
* This function initializes the connection to the D-Bus daemon.
|
||||
* \return pointer to AgentManager1Proxy
|
||||
*/
|
||||
AgentManager1Proxy * ObjectManagerImpl::getAgentManager()
|
||||
{
|
||||
return agentManager;
|
||||
}
|
||||
|
||||
/*!
|
||||
* This function initializes the connection to the D-Bus daemon.
|
||||
* \return pointer to ProfileManager1Proxy
|
||||
*/
|
||||
ProfileManager1Proxy * ObjectManagerImpl::getProfileManager()
|
||||
{
|
||||
return profileManager;
|
||||
}
|
||||
|
||||
/*!
|
||||
* This function initializes the connection to the D-Bus daemon.
|
||||
* \return pointer to HealthManager1Proxy
|
||||
*/
|
||||
HealthManager1Proxy * ObjectManagerImpl::getHealthManager()
|
||||
{
|
||||
return healthManager;
|
||||
}
|
||||
|
||||
/*!
|
||||
* This function returns a list of objectpaths
|
||||
* \return TQValueList<TQString>
|
||||
* \retval TQValueList<TQString>
|
||||
*/
|
||||
ObjectManagerImpl::AdapterList ObjectManagerImpl::getAdapters()
|
||||
{
|
||||
return adapters.keys();
|
||||
}
|
||||
|
||||
/*!
|
||||
* This function returns a list of objectpaths
|
||||
* \return TQValueList<TQString>
|
||||
* \retval TQValueList<TQString>
|
||||
*/
|
||||
ObjectManagerImpl::DeviceList ObjectManagerImpl::getDevices()
|
||||
{
|
||||
return devices.keys();
|
||||
}
|
||||
|
||||
ObjectManagerImpl::ConnectionList ObjectManagerImpl::listConnections(const TQString &adapter)
|
||||
{
|
||||
ConnectionList list;
|
||||
return list;
|
||||
}
|
||||
|
||||
bool ObjectManagerImpl::registerAgent()
|
||||
{
|
||||
if (!agentRegisteredStatus)
|
||||
{
|
||||
TQT_DBusError error;
|
||||
agentManager->RegisterAgent(
|
||||
TQT_DBusObjectPath(TQCString(DBUS_AUTH_SERVICE_PATH)), DEVICE_PIN_CAPABILITY, error);
|
||||
if (error.isValid())
|
||||
{
|
||||
tqDebug("Could not register agent: %s", error.message().local8Bit().data());
|
||||
return false;
|
||||
}
|
||||
agentRegisteredStatus = true;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool ObjectManagerImpl::unregisterAgent()
|
||||
{
|
||||
kdDebug() << k_funcinfo << endl;
|
||||
if (agentRegisteredStatus)
|
||||
{
|
||||
TQT_DBusError error;
|
||||
getAgentManager()->UnregisterAgent(
|
||||
TQT_DBusObjectPath(TQCString(DBUS_AUTH_SERVICE_PATH)), error);
|
||||
if (error.isValid())
|
||||
{
|
||||
tqDebug("Could not unregister agent");
|
||||
return false;
|
||||
}
|
||||
agentRegisteredStatus = false;
|
||||
agentIsDefaultAgent = false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool ObjectManagerImpl::requestDefaultAgent()
|
||||
{
|
||||
TQT_DBusError error;
|
||||
agentManager->RequestDefaultAgent(
|
||||
TQT_DBusObjectPath(TQCString(DBUS_AUTH_SERVICE_PATH)), error);
|
||||
if (error.isValid())
|
||||
{
|
||||
tqDebug("Could not request default agent: %s", error.message().local8Bit().data());
|
||||
return false;
|
||||
}
|
||||
agentIsDefaultAgent = true;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool ObjectManagerImpl::isAgentRegistered()
|
||||
{
|
||||
return agentRegisteredStatus;
|
||||
}
|
||||
|
||||
bool ObjectManagerImpl::isAgentDefaultAgent()
|
||||
{
|
||||
return agentIsDefaultAgent;
|
||||
}
|
||||
|
||||
/*!
|
||||
* This function initializes the connection to the D-Bus daemon.
|
||||
* \return boolean with the result of the operation
|
||||
* \retval true if successful initialized D-Bus connection
|
||||
* \retval false if unsuccessful
|
||||
*/
|
||||
bool ObjectManagerImpl::initDBUS()
|
||||
{
|
||||
dBusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus, DBUS_CONN_NAME);
|
||||
if (!dBusConn.isConnected())
|
||||
{
|
||||
tqDebug("Failed to open connection to system message bus: %s", dBusConn.lastError().message().local8Bit().data());
|
||||
TQTimer::singleShot(4000, this, TQT_SLOT(reconnect()));
|
||||
return false;
|
||||
}
|
||||
setConnection(dBusConn);
|
||||
|
||||
TQT_DBusDataMap<TQT_DBusObjectPath> objects;
|
||||
TQT_DBusError error;
|
||||
if (!GetManagedObjects(objects, error))
|
||||
{
|
||||
tqDebug("GetManagedObjects(objects,error) FAILED:\n%s\n", error.message().latin1());
|
||||
return false;
|
||||
}
|
||||
|
||||
TQT_DBusDataMap<TQT_DBusObjectPath>::const_iterator it = objects.begin();
|
||||
for (it; it != objects.end(); ++it)
|
||||
{
|
||||
bool ok = false;
|
||||
slotInterfacesAdded(it.key(), it.data().toStringKeyMap(&ok));
|
||||
if (!ok)
|
||||
tqWarning("Failed to convert dbus data to string map: %s", it.key().latin1());
|
||||
}
|
||||
|
||||
connect(this, SIGNAL(InterfacesAdded(const TQT_DBusObjectPath&, const TQT_DBusDataMap< TQString >&)),
|
||||
this, SLOT(slotInterfacesAdded(const TQT_DBusObjectPath&, const TQT_DBusDataMap< TQString >& )));
|
||||
connect(this, SIGNAL(InterfacesRemoved(const TQT_DBusObjectPath& , const TQStringList& )),
|
||||
this, SLOT(slotInterfacesRemoved(const TQT_DBusObjectPath& , const TQStringList& )));
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void ObjectManagerImpl::adapterPropertiesChanged(TQString path, const TQMap<
|
||||
TQString, TQT_DBusVariant>& changed_properties)
|
||||
{
|
||||
TQMap<TQString, TQT_DBusVariant>::const_iterator it;
|
||||
for (it = changed_properties.begin(); it != changed_properties.end(); ++it)
|
||||
{
|
||||
bool ok = false;
|
||||
if (it.key() == "Powered")
|
||||
emit adapterPowerOnChanged(path, it.data().value.toBool(&ok));
|
||||
else if (it.key() == "Class")
|
||||
emit adapterClassChanged(path, it.data().value.toUInt32(&ok));
|
||||
else if (it.key() == "Name")
|
||||
emit adapterNameChanged(path, it.data().value.toString(&ok));
|
||||
else if (it.key() == "Alias")
|
||||
emit adapterAliasChanged(path, it.data().value.toString(&ok));
|
||||
else if (it.key() == "DiscoverableTimeout")
|
||||
emit adapterDiscoverableTimeoutChanged(path, it.data().value.toUInt32(&ok));
|
||||
else if (it.key() == "Discoverable")
|
||||
emit adapterDiscoverableChanged(path, it.data().value.toBool(&ok));
|
||||
else if (it.key() == "Discovering")
|
||||
emit adapterDiscoveringChanged(path, it.data().value.toBool(&ok));
|
||||
else
|
||||
continue;
|
||||
if (!ok)
|
||||
tqDebug("ObjectManagerImpl::adapterPropertiesChanged conversion failed");
|
||||
}
|
||||
}
|
||||
|
||||
void ObjectManagerImpl::devicePropertiesChanged(TQString path, const TQMap<TQString, TQT_DBusVariant>& changed_properties)
|
||||
{
|
||||
// https://github.com/r10r/bluez/blob/master/doc/device-api.txt
|
||||
TQMap<TQString, TQT_DBusVariant>::const_iterator it;
|
||||
for (it = changed_properties.begin(); it != changed_properties.end(); ++it)
|
||||
{
|
||||
bool ok = false;
|
||||
if (it.key() == "Address")
|
||||
emit deviceAddressChanged(path, it.data().value.toString(&ok));
|
||||
else if (it.key() == "Class")
|
||||
emit deviceClassChanged(path, it.data().value.toUInt32(&ok));
|
||||
else if (it.key() == "Name")
|
||||
emit deviceNameChanged(path, it.data().value.toString(&ok));
|
||||
else if (it.key() == "Alias")
|
||||
emit deviceAliasChanged(path, it.data().value.toString(&ok));
|
||||
// https://www.bluetooth.com/specifications/gatt/viewer?attributeXmlFile=org.bluetooth.characteristic.gap.appearance.xml
|
||||
else if (it.key() == "Appearance")
|
||||
emit deviceAppearanceChanged(path, it.data().value.toUInt16(&ok));
|
||||
else if (it.key() == "Icon")
|
||||
emit deviceIconChanged(path, it.data().value.toString(&ok));
|
||||
else if (it.key() == "Paired")
|
||||
emit devicePairedChanged(path, it.data().value.toBool(&ok));
|
||||
else if (it.key() == "Trusted")
|
||||
emit deviceTrustedChanged(path, it.data().value.toBool(&ok));
|
||||
else if (it.key() == "Blocked")
|
||||
emit deviceBlockedChanged(path, it.data().value.toBool(&ok));
|
||||
else if (it.key() == "LegacyPairing")
|
||||
emit deviceLegacyPairingChanged(path, it.data().value.toBool(&ok));
|
||||
else if (it.key() == "RSSI")
|
||||
emit deviceRSSIChanged(path, it.data().value.toInt16(&ok)); //INT16
|
||||
else if (it.key() == "Connected")
|
||||
emit deviceConnectedChanged(path, it.data().value.toBool(&ok));
|
||||
else if (it.key() == "UUIDs")
|
||||
{
|
||||
TQT_DBusDataList vl = TQT_DBusDataList(it.data().value.toTQValueList(&ok));
|
||||
emit deviceUUIDsChanged(path, vl.toStringList(&ok));
|
||||
}
|
||||
else if (it.key() == "Adapter")
|
||||
emit deviceAdapterChanged(path, it.data().value.toObjectPath(&ok));
|
||||
else if (it.key() == "ManufacturerData")
|
||||
emit deviceManufacturerDataChanged(path, it.data().value.toUInt16KeyMap(&ok)); //a{qv}
|
||||
else if (it.key() == "ServiceData")
|
||||
emit deviceServiceDataChanged(path, it.data().value.toStringKeyMap(&ok)); //a{sv}
|
||||
else if (it.key() == "TxPower")
|
||||
emit deviceTxPowerChanged(path, it.data().value.toInt16(&ok)); //INT16
|
||||
else if (it.key() == "ServicesResolved")
|
||||
emit deviceServicesResolvedChanged(path, it.data().value.toBool(&ok));
|
||||
else
|
||||
continue;
|
||||
if (!ok)
|
||||
tqDebug("ObjectManagerImpl::devicePropertiesChanged conversion failed");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void ObjectManagerImpl::mediaControlPropertiesChanged(TQString path, const TQMap<TQString, TQT_DBusVariant>& changed_properties)
|
||||
{
|
||||
TQMap<TQString, TQT_DBusVariant>::const_iterator it;
|
||||
for (it = changed_properties.begin(); it != changed_properties.end(); ++it)
|
||||
{
|
||||
bool ok = false;
|
||||
if (it.key() == "Connected")
|
||||
emit mediaControlConnectedChanged(path, it.data().value.toBool(&ok));
|
||||
else if (it.key() == "Player")
|
||||
emit mediaControlPlayerChanged(path, it.data().value.toObjectPath(&ok));
|
||||
else
|
||||
continue;
|
||||
if (!ok)
|
||||
tqDebug("ObjectManagerImpl::mediaControlPropertiesChanged conversion failed");
|
||||
}
|
||||
}
|
||||
|
||||
void ObjectManagerImpl::slotInterfacesAdded(const TQT_DBusObjectPath& object, const TQT_DBusDataMap<TQString>& interfaces)
|
||||
{
|
||||
TQT_DBusDataMap<TQString>::const_iterator it1 = interfaces.begin();
|
||||
for (it1; it1 != interfaces.end(); it1++)
|
||||
{
|
||||
TQString interface = it1.key();
|
||||
if (interface == "org.bluez.AgentManager1")
|
||||
{
|
||||
agentManager = new AgentManager1Proxy("org.bluez", object/*, this, "AgentManager1"*/);
|
||||
if (agentManager)
|
||||
agentManager->setConnection(dBusConn);
|
||||
}
|
||||
else if (interface == "org.bluez.ProfileManager1")
|
||||
{
|
||||
profileManager = new ProfileManager1Proxy("org.bluez", object/*, this, "ProfileManager1"*/);
|
||||
if (profileManager)
|
||||
profileManager->setConnection(dBusConn);
|
||||
}
|
||||
else if (interface == "org.bluez.HealthManager1")
|
||||
{
|
||||
healthManager = new HealthManager1Proxy("org.bluez", object/*, this, "HealthManager1"*/);
|
||||
if (healthManager)
|
||||
healthManager->setConnection(dBusConn);
|
||||
}
|
||||
else if (interface == "org.bluez.Adapter1")
|
||||
{
|
||||
org::freedesktop::DBus::PropertiesProxy *properties;
|
||||
properties = new org::freedesktop::DBus::PropertiesProxy("org.bluez", object);
|
||||
properties->setConnection(dBusConn);
|
||||
connect(properties, SIGNAL(PropertiesChanged ( const TQString&, const TQMap< TQString, TQT_DBusVariant >&, const TQStringList& )), this, SLOT(slotPropertiesChanged ( const TQString& , const TQMap< TQString, TQT_DBusVariant >&, const TQStringList& )));
|
||||
adapters.insert(TQString(object), properties);
|
||||
//notify others
|
||||
emit adapterAdded(TQString(object));
|
||||
}
|
||||
else if (interface == "org.bluez.GattManager1")
|
||||
{
|
||||
kdDebug() << "Interface not implemented: org.bluez.GattManager1" << endl;
|
||||
// TODO: Implement GattManager1
|
||||
}
|
||||
else if (interface == "org.bluez.Media1")
|
||||
{
|
||||
kdDebug() << "Interface not implemented: org.bluez.Media1" << endl;
|
||||
// TODO: Implement Media1
|
||||
}
|
||||
else if (interface == "org.bluez.NetworkServer1")
|
||||
{
|
||||
kdDebug() << "Interface not implemented: org.bluez.NetworkServer1" << endl;
|
||||
// TODO: Implement NetworkServer1
|
||||
}
|
||||
else if (interface == "org.bluez.Device1")
|
||||
{
|
||||
org::freedesktop::DBus::PropertiesProxy *properties;
|
||||
properties = new org::freedesktop::DBus::PropertiesProxy("org.bluez", object);
|
||||
properties->setConnection(dBusConn);
|
||||
connect(properties, SIGNAL(PropertiesChanged ( const TQString&, const TQMap< TQString, TQT_DBusVariant >&, const TQStringList& )), this, SLOT(slotPropertiesChanged ( const TQString& , const TQMap< TQString, TQT_DBusVariant >&, const TQStringList& )));
|
||||
devices.insert(TQString(object), properties);
|
||||
//notify others
|
||||
emit deviceAdded(TQString(object));
|
||||
}
|
||||
else if (interface == "org.bluez.MediaControl1")
|
||||
{
|
||||
kdDebug() << "Interface not implemented: org.bluez.MediaControl1" << endl;
|
||||
kdDebug() << "as the media control is triggered via properties changed." << endl;
|
||||
}
|
||||
else if (interface == "org.bluez.MediaTransport1")
|
||||
{
|
||||
kdDebug() << "Interface not implemented: org.bluez.MediaTransport1" << endl;
|
||||
// TODO: Implement MediaTransport1
|
||||
}
|
||||
else if (interface == "org.freedesktop.DBus.Introspectable")
|
||||
{
|
||||
// do nothing
|
||||
}
|
||||
else if (interface == "org.freedesktop.DBus.Properties")
|
||||
{
|
||||
// do nothing
|
||||
}
|
||||
else
|
||||
{
|
||||
tqWarning("Interface not implemented: %s", interface.local8Bit().data());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ObjectManagerImpl::slotInterfacesRemoved(const TQT_DBusObjectPath& object, const TQStringList& interfaces)
|
||||
{
|
||||
// TODO: remove interface
|
||||
for (TQValueListConstIterator<TQString> it = interfaces.begin();
|
||||
it != interfaces.end(); ++it)
|
||||
{
|
||||
if ((*it) == "org.bluez.AgentManager1")
|
||||
{
|
||||
kdDebug() << "Remove org.bluez.AgentManager1" << endl;
|
||||
// TODO: remove AgentManager1
|
||||
}
|
||||
else if ((*it) == "org.bluez.ProfileManager1")
|
||||
{
|
||||
kdDebug() << "Interface not implemented: org.bluez.ProfileManager1" << endl;
|
||||
// TODO: remove ProfileManager1
|
||||
}
|
||||
else if ((*it) == "org.bluez.HealthManager1")
|
||||
{
|
||||
kdDebug() << "Interface not implemented: org.bluez.HealthManager1" << endl;
|
||||
// TODO: remove HealthManager1
|
||||
}
|
||||
else if ((*it) == "org.bluez.Adapter1")
|
||||
{
|
||||
kdDebug() << "Remove org.bluez.Adapter1" << endl;
|
||||
disconnect(adapters[object], SIGNAL(PropertiesChanged ( const TQString&, const TQMap< TQString, TQT_DBusVariant >&, const TQStringList& )), this, SLOT(slotPropertiesChanged ( const TQString& , const TQMap< TQString, TQT_DBusVariant >&, const TQStringList& )));
|
||||
adapters.remove(object);
|
||||
emit adapterRemoved(TQString(object));
|
||||
}
|
||||
else if ((*it) == "org.bluez.GattManager1")
|
||||
{
|
||||
kdDebug() << "Interface not implemented: org.bluez.GattManager1" << endl;
|
||||
// TODO: Implement GattManager1
|
||||
}
|
||||
else if ((*it) == "org.bluez.Media1")
|
||||
{
|
||||
kdDebug() << "Interface not implemented: org.bluez.Media1" << endl;
|
||||
// TODO: Implement Media1
|
||||
}
|
||||
else if ((*it) == "org.bluez.NetworkServer1")
|
||||
{
|
||||
kdDebug() << "Interface not implemented: org.bluez.NetworkServer1" << endl;
|
||||
// TODO: Implement NetworkServer1
|
||||
}
|
||||
else if ((*it) == "org.bluez.Device1")
|
||||
{
|
||||
kdDebug() << "Remove org.bluez.Device1" << endl;
|
||||
disconnect(devices[object], SIGNAL(PropertiesChanged ( const TQString&, const TQMap< TQString, TQT_DBusVariant >&, const TQStringList& )), this, SLOT(slotPropertiesChanged ( const TQString& , const TQMap< TQString, TQT_DBusVariant >&, const TQStringList& )));
|
||||
devices.remove(object);
|
||||
emit deviceRemoved(TQString(object));
|
||||
}
|
||||
else if ((*it) == "org.bluez.MediaControl1")
|
||||
{
|
||||
kdDebug() << "Interface not implemented: org.bluez.MediaControl1" << endl;
|
||||
kdDebug() << "as the media control is triggered via properties changed." << endl;
|
||||
// emit mediaControlRemoved(TQString ( object.data() ));
|
||||
}
|
||||
else if ((*it) == "org.freedesktop.DBus.Introspectable")
|
||||
{
|
||||
// do nothing
|
||||
}
|
||||
else if ((*it) == "org.freedesktop.DBus.Properties")
|
||||
{
|
||||
// do nothing
|
||||
}
|
||||
else
|
||||
{
|
||||
tqWarning("Interface not implemented: %s", (*it).local8Bit().data());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ObjectManagerImpl::slotPropertiesChanged(const TQString& interface, const TQMap<TQString, TQT_DBusVariant>& changed_properties, const TQStringList& invalidated_properties)
|
||||
{
|
||||
// who send the signal ?
|
||||
const TQObject * o = TQObject::sender();
|
||||
org::freedesktop::DBus::PropertiesProxy *obj;
|
||||
obj = const_cast<org::freedesktop::DBus::PropertiesProxy*>(reinterpret_cast<const org::freedesktop::DBus::PropertiesProxy*>(o));
|
||||
TQString path;
|
||||
|
||||
if (interface == "org.bluez.Adapter1")
|
||||
{
|
||||
for (PropertiesMap::Iterator it = adapters.begin();
|
||||
it != adapters.end(); ++it)
|
||||
{
|
||||
if (obj == it.data())
|
||||
path = it.key();
|
||||
}
|
||||
if (!path.isEmpty())
|
||||
adapterPropertiesChanged(path, changed_properties);
|
||||
}
|
||||
else if (interface == "org.bluez.Device1")
|
||||
{
|
||||
for (PropertiesMap::Iterator it = devices.begin(); it != devices.end();
|
||||
++it)
|
||||
{
|
||||
if (obj == it.data())
|
||||
path = it.key();
|
||||
}
|
||||
if (!path.isEmpty())
|
||||
devicePropertiesChanged(path, changed_properties);
|
||||
}
|
||||
else if (interface == "org.bluez.MediaControl1")
|
||||
{
|
||||
for (PropertiesMap::Iterator it = devices.begin(); it != devices.end();
|
||||
++it)
|
||||
{
|
||||
if (obj == it.data())
|
||||
path = it.key();
|
||||
}
|
||||
if (!path.isEmpty())
|
||||
mediaControlPropertiesChanged(path, changed_properties);
|
||||
}
|
||||
|
||||
// TQStringList::const_iterator it1;
|
||||
// for ( it1 = invalidated_properties.begin(); it1 != invalidated_properties.end(); ++it1 )
|
||||
// {
|
||||
// kdDebug() << "Invalidated Key: " << (*it1) << endl;
|
||||
//// if ( it.key() == "Powered" )
|
||||
//// emit powerOnChanged(TQT_DBusData::fromVariant ( it.data() ).toBool());
|
||||
//// if ( it.key() == "DiscoverableTimeout" )
|
||||
//// emit discoverableTimeoutChanged(TQT_DBusData::fromVariant ( it.data() ).toUInt32());
|
||||
//// if ( it.key() == "Discoverable" )
|
||||
//// emit discoverableTimeoutChanged(TQT_DBusData::fromVariant ( it.data() ).toBool());
|
||||
// }
|
||||
|
||||
}
|
||||
|
||||
}; // namespace TDEBluetooth
|
||||
|
||||
#include "objectmanagerImpl.moc"
|
||||
// End of File
|
||||
|
@ -0,0 +1,177 @@
|
||||
/*
|
||||
*
|
||||
* Object Manager implementation of bluez5
|
||||
*
|
||||
* Copyright (C) 2018 Emanoil Kotsev <deloptes@gmail.com>
|
||||
*
|
||||
*
|
||||
* This file is part of libtdebluez.
|
||||
*
|
||||
* libtdebluez 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.
|
||||
*
|
||||
* libtdebluez 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 kbluetooth; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef OBJECTMANAGERIMPL_H_INCLUDED
|
||||
#define OBJECTMANAGERIMPL_H_INCLUDED
|
||||
|
||||
#include <tqdbusconnection.h>
|
||||
#include <tdelocale.h>
|
||||
|
||||
#include "interfaces/objectmanagerProxy.h"
|
||||
#include "interfaces/agentmanager1Proxy.h"
|
||||
#include "interfaces/profilemanager1Proxy.h"
|
||||
#include "interfaces/healthmanager1Proxy.h"
|
||||
#include "interfaces/propertiesProxy.h"
|
||||
|
||||
#include "adapterImpl.h"
|
||||
#include "deviceImpl.h"
|
||||
|
||||
//using namespace org::bluez;
|
||||
|
||||
#define DBUS_CONN_NAME "TDEBluez"
|
||||
|
||||
#define DBUS_AUTH_SERVICE_PATH "/org/trinitydesktop/tdebluez"
|
||||
#define DEVICE_PIN_CAPABILITY "KeyboardDisplay"
|
||||
|
||||
namespace TDEBluetooth
|
||||
{
|
||||
|
||||
class ObjectManagerImpl : public org::freedesktop::DBus::ObjectManagerProxy
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
ObjectManagerImpl(const TQString& service, const TQString& path, TQObject* parent = 0, const char* name = 0);
|
||||
|
||||
virtual ~ObjectManagerImpl();
|
||||
typedef TQMap<TQString,org::freedesktop::DBus::PropertiesProxy*> PropertiesMap;
|
||||
typedef TQValueList<TQString> AdapterList;
|
||||
typedef TQValueList<TQString> DeviceList;
|
||||
typedef TQValueList<TQString> ConnectionList;
|
||||
// typedef TQValueList<TQString> ServiceList;
|
||||
|
||||
// --- helper to get private members of the class --- //
|
||||
//! to get information if TDEBluez is connected to D-Bus
|
||||
bool isConnectedToDBUS();
|
||||
//! pointer to the D-Bus connection
|
||||
TQT_DBusConnection* getConnection();
|
||||
//! to close the connection to D-Bus
|
||||
bool close();
|
||||
|
||||
//
|
||||
AgentManager1Proxy* getAgentManager();
|
||||
ProfileManager1Proxy* getProfileManager();
|
||||
HealthManager1Proxy* getHealthManager();
|
||||
AdapterList getAdapters();
|
||||
DeviceList getDevices();
|
||||
// ServiceList getServices();
|
||||
ConnectionList listConnections(const TQString&);
|
||||
|
||||
|
||||
//! to register the agent to D-Bus
|
||||
bool registerAgent(); //TQT_DBusError&
|
||||
//! to unregister the agent to D-Bus
|
||||
bool unregisterAgent(); //TQT_DBusError&
|
||||
//! to register the agent to D-Bus
|
||||
bool requestDefaultAgent(); //TQT_DBusError&
|
||||
|
||||
bool isAgentRegistered();
|
||||
|
||||
bool isAgentDefaultAgent();
|
||||
|
||||
private:
|
||||
bool initDBUS();
|
||||
void adapterPropertiesChanged(TQString path, const TQMap<TQString, TQT_DBusVariant>& changed_properties);
|
||||
void devicePropertiesChanged(TQString path, const TQMap<TQString, TQT_DBusVariant>& changed_properties);
|
||||
void mediaControlPropertiesChanged(TQString path, const TQMap<TQString, TQT_DBusVariant>& changed_properties);
|
||||
|
||||
private:
|
||||
//! TQt connection to D-Bus
|
||||
TQT_DBusConnection dBusConn;
|
||||
AgentManager1Proxy* agentManager;
|
||||
ProfileManager1Proxy* profileManager;
|
||||
HealthManager1Proxy* healthManager;
|
||||
PropertiesMap adapters;
|
||||
PropertiesMap devices;
|
||||
bool agentRegisteredStatus;
|
||||
bool agentIsDefaultAgent;
|
||||
|
||||
signals:
|
||||
// from ObjectManager
|
||||
void adapterAdded(const TQString&);
|
||||
void adapterRemoved(const TQString&);
|
||||
|
||||
void deviceAdded(const TQString&);
|
||||
void deviceRemoved(const TQString&);
|
||||
|
||||
void mediaControlAdded(const TQString&);
|
||||
void mediaControlRemoved(const TQString&);
|
||||
|
||||
// from Adapter1
|
||||
void adapterNameChanged(const TQString&, const TQString&);
|
||||
// void adapterModeChanged(const TQString&, const TQString&);
|
||||
void adapterAliasChanged(const TQString&, const TQString&);
|
||||
void adapterPowerOnChanged(const TQString&, bool state);
|
||||
void adapterClassChanged(const TQString&, TQ_UINT32 classvalue);
|
||||
void adapterDiscoverableTimeoutChanged(const TQString&, TQ_UINT32 timeout);
|
||||
// TODO: this should be same as modeChanged
|
||||
void adapterDiscoverableChanged(const TQString&, bool state);
|
||||
void adapterDiscoveringChanged(const TQString&, bool state);
|
||||
|
||||
// from Device1
|
||||
void deviceAddressChanged(const TQString&, const TQString&);
|
||||
void deviceClassChanged(const TQString&, TQ_UINT32);
|
||||
void deviceNameChanged(const TQString&, const TQString&);
|
||||
void deviceAliasChanged(const TQString&, const TQString&);
|
||||
// https://www.bluetooth.com/specifications/gatt/viewer?attributeXmlFile=org.bluetooth.characteristic.gap.appearance.xml
|
||||
void deviceAppearanceChanged(const TQString&, TQ_UINT32);
|
||||
void deviceIconChanged(const TQString&, const TQString&);
|
||||
void devicePairedChanged(const TQString&, bool);
|
||||
void deviceTrustedChanged(const TQString&, bool);
|
||||
void deviceBlockedChanged(const TQString&, bool);
|
||||
void deviceLegacyPairingChanged(const TQString&, bool);
|
||||
void deviceRSSIChanged(const TQString&, TQ_INT16);
|
||||
void deviceConnectedChanged(const TQString&, bool);
|
||||
void deviceUUIDsChanged(const TQString&, TQStringList);
|
||||
void deviceAdapterChanged(const TQString&, const TQT_DBusObjectPath&);
|
||||
void deviceManufacturerDataChanged(const TQString&, TQT_DBusDataMap<TQ_UINT16>);
|
||||
void deviceServiceDataChanged(const TQString&, TQT_DBusDataMap<TQString>);
|
||||
void deviceTxPowerChanged(const TQString&, TQ_INT16);
|
||||
void deviceServicesResolvedChanged(const TQString&, bool);
|
||||
|
||||
// from MediaControl1
|
||||
void mediaControlConnectedChanged(const TQString&, bool state);
|
||||
void mediaControlPlayerChanged(const TQString&, const TQT_DBusObjectPath&);
|
||||
|
||||
private slots:
|
||||
bool reconnect();
|
||||
|
||||
// inherited from ObjectManager
|
||||
void slotInterfacesAdded(const TQT_DBusObjectPath& object, const TQT_DBusDataMap< TQString >& interfaces);
|
||||
void slotInterfacesRemoved(const TQT_DBusObjectPath& object, const TQStringList& interfaces);
|
||||
|
||||
/**
|
||||
* parse properties changed on any interface
|
||||
* emit signal for the interface and property
|
||||
*/
|
||||
void slotPropertiesChanged(const TQString& interface, const TQMap< TQString, TQT_DBusVariant >& changed_properties, const TQStringList& invalidated_properties);
|
||||
|
||||
}; // class ObjectManagerImpl
|
||||
|
||||
}; // namespace TDEBluetooth
|
||||
|
||||
#endif //OBJECTMANAGERIMPL_H_INCLUDED
|
||||
|
||||
// End of File
|
@ -0,0 +1,66 @@
|
||||
#################################################
|
||||
#
|
||||
# (C) 2018 Emanoil Kotsev
|
||||
# deloptes (AT) gmail.com
|
||||
#
|
||||
# Improvements and feedback are welcome
|
||||
#
|
||||
# This file is released under GPL >= 2
|
||||
#
|
||||
#################################################
|
||||
|
||||
project( libtdeobex )
|
||||
set(LIBRARY_VERSION 0.0.1)
|
||||
|
||||
# include( ConfigureChecks.cmake )
|
||||
foreach( f ${TQT_LIBRARIES} )
|
||||
if( ${f} STREQUAL "tqt-mt" )
|
||||
set(TQUI_LIBRARIES "tqui" CACHE TYPE STRING FORCE)
|
||||
endif()
|
||||
if( ${f} STREQUAL "qt-mt" )
|
||||
set(TQUI_LIBRARIES "qui" CACHE TYPE STRING FORCE)
|
||||
endif()
|
||||
endforeach()
|
||||
|
||||
# import required
|
||||
#tde_import( lib... )
|
||||
|
||||
add_subdirectory( interfaces )
|
||||
|
||||
include_directories(
|
||||
${CMAKE_CURRENT_BINARY_DIR}
|
||||
${CMAKE_BINARY_DIR}
|
||||
${CMAKE_SOURCE_DIR}
|
||||
${TDE_INCLUDE_DIR}
|
||||
${TQT_INCLUDE_DIRS}
|
||||
${DBUS_INCLUDE_DIRS}
|
||||
${DBUS_TQT_INCLUDE_DIRS}
|
||||
)
|
||||
|
||||
link_directories(
|
||||
${TQT_LIBRARY_DIRS}
|
||||
)
|
||||
|
||||
##### headers ###################################
|
||||
# implementations
|
||||
install(
|
||||
FILES obexobjectmanagerImpl.h
|
||||
DESTINATION ${INCLUDE_INSTALL_DIR}/tdeobex )
|
||||
|
||||
set( target tdeobex )
|
||||
|
||||
set( ${target}_SRCS obexobjectmanagerImpl.cpp )
|
||||
|
||||
|
||||
##### tdeobex (shared) ###########################
|
||||
# set( KDE3_DCOPIDL_EXECUTABLE ${KDE3_DCOPIDLNG_EXECUTABLE} )
|
||||
tde_add_library( ${target} SHARED AUTOMOC
|
||||
SOURCES ${${target}_SRCS}
|
||||
VERSION ${LIBRARY_VERSION}
|
||||
DEPENDS obexinterfaces-static
|
||||
LINK ${DBUS_TQT_LIBRARIES} tdeparts-shared obexinterfaces-static ${TQUI_LIBRARIES}
|
||||
DESTINATION ${LIB_INSTALL_DIR}
|
||||
)
|
||||
|
||||
##### install import cmake modules ###############
|
||||
tde_install_export( )
|
@ -0,0 +1,286 @@
|
||||
/*
|
||||
*
|
||||
* Object Manager implementation of bluez5
|
||||
*
|
||||
* Copyright (C) 2018 Emanoil Kotsev <deloptes@gmail.com>
|
||||
*
|
||||
*
|
||||
* This file is part of libtdebluez.
|
||||
*
|
||||
* libtdebluez 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.
|
||||
*
|
||||
* libtdebluez 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 kbluetooth; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
*/
|
||||
|
||||
// QT - Header
|
||||
#include <tqtimer.h>
|
||||
//
|
||||
// debug
|
||||
#include <kdebug.h>
|
||||
|
||||
// declaration include
|
||||
#include <tqdbusproxy.h>
|
||||
#include <tqdbusmessage.h>
|
||||
#include <tqdbusobjectpath.h>
|
||||
#include <tqdbusdatamap.h>
|
||||
#include <tqdbusdata.h>
|
||||
//
|
||||
#include <tqstringlist.h>
|
||||
|
||||
#include "obexobjectmanagerImpl.h"
|
||||
#include "../libtdebluez/btuuids.h"
|
||||
|
||||
namespace TDEObex
|
||||
{
|
||||
|
||||
ObexObjectManagerImpl::ObexObjectManagerImpl(const TQString& service, const TQString& path, TQObject* parent, const char* name) :
|
||||
org::freedesktop::DBus::ObjectManagerProxy(service, path, parent, name)
|
||||
{
|
||||
kdDebug() << k_funcinfo << endl;
|
||||
// init connection to dbus
|
||||
initDBUS();
|
||||
}
|
||||
|
||||
ObexObjectManagerImpl::~ObexObjectManagerImpl()
|
||||
{
|
||||
kdDebug() << k_funcinfo << endl;
|
||||
close();
|
||||
}
|
||||
|
||||
/*!
|
||||
* This function try a reconnect to D-Bus.
|
||||
* \return boolean with the result of the operation
|
||||
* \retval true if successful reconnected to D-Bus
|
||||
* \retval false if unsuccessful
|
||||
*/
|
||||
bool ObexObjectManagerImpl::reconnect()
|
||||
{
|
||||
kdDebug() << k_funcinfo << endl;
|
||||
// close D-Bus connection
|
||||
close();
|
||||
// init D-Bus conntection
|
||||
return (initDBUS());
|
||||
}
|
||||
|
||||
/*!
|
||||
* This function return information about connection status to the DBUS daemon.
|
||||
* \return boolean with the state of the connection to D-Bus
|
||||
* \retval true if connected
|
||||
* \retval false if disconnected
|
||||
*/
|
||||
bool ObexObjectManagerImpl::isConnectedToDBUS()
|
||||
{
|
||||
kdDebug() << k_funcinfo << endl;
|
||||
return dBusConn.isConnected();
|
||||
}
|
||||
|
||||
/*!
|
||||
* This function returns pointer to connection of the DBUS.
|
||||
* \return TQT_DBusConnection* of the connection to D-Bus
|
||||
* \retval TQT_DBusConnection*
|
||||
*/
|
||||
TQT_DBusConnection* ObexObjectManagerImpl::getConnection()
|
||||
{
|
||||
kdDebug() << k_funcinfo << endl;
|
||||
return &dBusConn;
|
||||
}
|
||||
|
||||
/*!
|
||||
* This function close the connection to manager over the D-Bus daemon.
|
||||
* \return boolean with the result of the operation
|
||||
* \retval true if successful closed the connection
|
||||
* \retval false if any problems
|
||||
*/
|
||||
bool ObexObjectManagerImpl::close()
|
||||
{
|
||||
kdDebug() << k_funcinfo << endl;
|
||||
|
||||
if (mSession)
|
||||
delete mSession;
|
||||
if (mFileTransfer)
|
||||
delete mFileTransfer;
|
||||
if (mClient)
|
||||
delete mClient;
|
||||
if (dBusConn.isConnected())
|
||||
dBusConn.closeConnection(DBUS_CONN_NAME);
|
||||
return true;
|
||||
}
|
||||
|
||||
/*!
|
||||
* This function initialise the connection to the D-Bus daemon.
|
||||
* \return boolean with the result of the operation
|
||||
* \retval true if successful initialised D-Bus connection
|
||||
* \retval false if unsuccessful
|
||||
*/
|
||||
bool ObexObjectManagerImpl::initDBUS()
|
||||
{
|
||||
kdDebug() << k_funcinfo << endl;
|
||||
dBusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SessionBus, DBUS_CONN_NAME);
|
||||
if (!dBusConn.isConnected())
|
||||
{
|
||||
kdError() << "Failed to open connection to system message bus: " << dBusConn.lastError().message() << endl;
|
||||
TQTimer::singleShot(4000, this, TQT_SLOT(reconnect()));
|
||||
return false;
|
||||
}
|
||||
setConnection(dBusConn);
|
||||
|
||||
TQT_DBusDataMap<TQT_DBusObjectPath> objects;
|
||||
TQT_DBusError error;
|
||||
if (!GetManagedObjects(objects, error))
|
||||
{
|
||||
tqDebug("GetManagedObjects(objects,error) FAILED\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
TQT_DBusDataMap<TQT_DBusObjectPath>::const_iterator it = objects.begin();
|
||||
for (it; it != objects.end(); ++it)
|
||||
{
|
||||
bool ok = false;
|
||||
TQT_DBusDataMap<TQString> tqMap1 = it.data().toStringKeyMap(&ok);
|
||||
if (!ok)
|
||||
{
|
||||
tqWarning("Failed to convert dbus data to string map: %s", it.key().latin1());
|
||||
return false;
|
||||
}
|
||||
slotInterfacesAdded(it.key(), tqMap1);
|
||||
}
|
||||
|
||||
connect(this, SIGNAL(InterfacesAdded(const TQT_DBusObjectPath&, const TQT_DBusDataMap< TQString >&)), this, SLOT(slotInterfacesAdded(const TQT_DBusObjectPath&, const TQT_DBusDataMap< TQString >& )));
|
||||
connect(this, SIGNAL(InterfacesRemoved(const TQT_DBusObjectPath& , const TQStringList& )), this, SLOT(slotInterfacesRemoved(const TQT_DBusObjectPath& , const TQStringList& )));
|
||||
return true;
|
||||
}
|
||||
|
||||
/*!
|
||||
* This function initialise the connection to the D-Bus daemon.
|
||||
* \return pointer to AgentManager1
|
||||
*/
|
||||
org::bluez::obex::AgentManager1Proxy * ObexObjectManagerImpl::getAgentManager()
|
||||
{
|
||||
kdDebug() << k_funcinfo << endl;
|
||||
return mAgentManager;
|
||||
}
|
||||
|
||||
/*!
|
||||
* This function initialise the connection to the D-Bus daemon.
|
||||
* \return pointer to AgentManager1
|
||||
*/
|
||||
org::bluez::obex::Client1Proxy * ObexObjectManagerImpl::getClient()
|
||||
{
|
||||
kdDebug() << k_funcinfo << endl;
|
||||
return mClient;
|
||||
}
|
||||
|
||||
void ObexObjectManagerImpl::slotInterfacesAdded(const TQT_DBusObjectPath& object, const TQT_DBusDataMap<TQString>& interfaces)
|
||||
{
|
||||
kdDebug() << k_funcinfo << endl;
|
||||
|
||||
TQT_DBusDataMap<TQString>::const_iterator it1 = interfaces.begin();
|
||||
for (it1; it1 != interfaces.end(); it1++)
|
||||
{
|
||||
TQString interface = it1.key();
|
||||
if (interface == "org.bluez.obex.AgentManager1")
|
||||
{
|
||||
mAgentManager = new org::bluez::obex::AgentManager1Proxy("org.bluez.obex", object);
|
||||
if (mAgentManager)
|
||||
{
|
||||
mAgentManager->setConnection(dBusConn);
|
||||
}
|
||||
else
|
||||
{
|
||||
tqDebug("org.bluez.obex.AgentManager1 initialization failed\n");
|
||||
}
|
||||
}
|
||||
else if (interface == "org.bluez.obex.Client1")
|
||||
{
|
||||
mClient = new org::bluez::obex::Client1Proxy("org.bluez.obex", object);
|
||||
if (mClient)
|
||||
{
|
||||
mClient->setConnection(dBusConn);
|
||||
}
|
||||
else
|
||||
{
|
||||
tqDebug("org.bluez.obex.Client1 initialization failed\n");
|
||||
}
|
||||
}
|
||||
else if (interface == "org.bluez.obex.Session1")
|
||||
{
|
||||
mSession = new org::bluez::obex::Session1Proxy("org.bluez.obex", object);
|
||||
if (mSession)
|
||||
{
|
||||
mSession->setConnection(dBusConn);
|
||||
}
|
||||
else
|
||||
{
|
||||
tqDebug("org.bluez.obex.Session1 initialization failed\n");
|
||||
}
|
||||
}
|
||||
else if (interface == "org.bluez.obex.FileTransfer1")
|
||||
{
|
||||
mFileTransfer = new org::bluez::obex::FileTransfer1Proxy("org.bluez.obex", object);
|
||||
if (mFileTransfer)
|
||||
{
|
||||
mFileTransfer->setConnection(dBusConn);
|
||||
}
|
||||
else
|
||||
{
|
||||
tqDebug("org.bluez.obex.FileTransfer1 initialization failed\n");
|
||||
}
|
||||
}
|
||||
else if (interface == "org.freedesktop.DBus.Introspectable")
|
||||
{
|
||||
// do nothing
|
||||
}
|
||||
else
|
||||
{
|
||||
tqWarning("Interface not implemented: %s", interface.local8Bit().data());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ObexObjectManagerImpl::slotInterfacesRemoved(const TQT_DBusObjectPath& object, const TQStringList& interfaces)
|
||||
{
|
||||
kdDebug() << k_funcinfo << endl;
|
||||
// TODO: remove interface
|
||||
for (TQValueListConstIterator<TQString> it = interfaces.begin();
|
||||
it != interfaces.end(); ++it)
|
||||
{
|
||||
if ((*it) == "org.bluez.obex.AgentManager1")
|
||||
{
|
||||
// TODO: remove AgentManager1
|
||||
}
|
||||
else if ((*it) == "org.bluez.obex.Client1")
|
||||
{
|
||||
// TODO: remove Client1
|
||||
}
|
||||
else if ((*it) == "org.bluez.obex.Session1")
|
||||
{
|
||||
// TODO: remove Session1
|
||||
}
|
||||
else if ((*it) == "org.bluez.obex.FileTransfer1")
|
||||
{
|
||||
// TODO: remove FileTransfer1
|
||||
}
|
||||
else
|
||||
{
|
||||
tqWarning("Interface not implemented: %s", (*it).local8Bit().data());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
};
|
||||
// namespace TDEObex
|
||||
|
||||
#include "obexobjectmanagerImpl.moc"
|
||||
// End of File
|
||||
|
@ -0,0 +1,94 @@
|
||||
/*
|
||||
*
|
||||
* Obex Object Manager implementation of bluez5
|
||||
*
|
||||
* Copyright (C) 2018 Emanoil Kotsev <deloptes@gmail.com>
|
||||
*
|
||||
*
|
||||
* This file is part of libtdebluez.
|
||||
*
|
||||
* libtdebluez 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.
|
||||
*
|
||||
* libtdebluez 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 kbluetooth; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef OBEXOBJECTMANAGERIMPL_H_INCLUDED
|
||||
#define OBEXOBJECTMANAGERIMPL_H_INCLUDED
|
||||
|
||||
#include <tqdbusconnection.h>
|
||||
#include <tdelocale.h>
|
||||
|
||||
#include "interfaces/propertiesProxy.h"
|
||||
#include "interfaces/objectmanagerProxy.h"
|
||||
#include "interfaces/agentmanager1Proxy.h"
|
||||
#include "interfaces/client1Proxy.h"
|
||||
#include "interfaces/session1Proxy.h"
|
||||
#include "interfaces/filetransfer1Proxy.h"
|
||||
|
||||
namespace TDEObex
|
||||
{
|
||||
|
||||
#define DBUS_CONN_NAME "TDEBluezObex"
|
||||
|
||||
class ObexObjectManagerImpl: public org::freedesktop::DBus::ObjectManagerProxy
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
// ObexObjectManagerImpl(){}
|
||||
ObexObjectManagerImpl(const TQString& service, const TQString& path, TQObject* parent = 0, const char* name = 0);
|
||||
|
||||
virtual ~ObexObjectManagerImpl();
|
||||
|
||||
// --- helper to get private members of the class --- //
|
||||
//! to get information if TDEBluez is connected to D-Bus
|
||||
bool isConnectedToDBUS();
|
||||
//! pointer to the D-Bus connection
|
||||
TQT_DBusConnection* getConnection();
|
||||
//! to close the connection to D-Bus
|
||||
bool close();
|
||||
|
||||
//
|
||||
org::bluez::obex::AgentManager1Proxy* getAgentManager();
|
||||
org::bluez::obex::Client1Proxy* getClient();
|
||||
// ConnectionList listConnections(const TQString&);
|
||||
|
||||
private:
|
||||
bool initDBUS();
|
||||
|
||||
void slotInterfacesAdded(const TQT_DBusObjectPath& object, const TQT_DBusDataMap<
|
||||
TQString>& interfaces);
|
||||
|
||||
void slotInterfacesRemoved(const TQT_DBusObjectPath& object, const TQStringList& interfaces);
|
||||
|
||||
private:
|
||||
//! TQt connection to D-Bus
|
||||
TQT_DBusConnection dBusConn;
|
||||
org::bluez::obex::AgentManager1Proxy* mAgentManager;
|
||||
org::bluez::obex::Client1Proxy* mClient;
|
||||
org::bluez::obex::Session1Proxy* mSession;
|
||||
org::bluez::obex::FileTransfer1Proxy* mFileTransfer;
|
||||
|
||||
private slots:
|
||||
bool reconnect();
|
||||
|
||||
};
|
||||
// class ObexObjectManagerImpl
|
||||
|
||||
};
|
||||
// namespace TDEObex
|
||||
|
||||
#endif //OBEXOBJECTMANAGERIMPL_H_INCLUDED
|
||||
|
||||
// End of File
|
@ -0,0 +1,67 @@
|
||||
#################################################
|
||||
#
|
||||
# (C) 2018 Emanoil Kotsev
|
||||
# deloptes (AT) gmail.com
|
||||
#
|
||||
# Improvements and feedback are welcome
|
||||
#
|
||||
# This file is released under GPL >= 2
|
||||
#
|
||||
#################################################
|
||||
|
||||
project( tdebluez-common )
|
||||
|
||||
# include( ConfigureChecks.cmake )
|
||||
|
||||
# import required
|
||||
#tde_import( lib... )
|
||||
|
||||
include_directories(
|
||||
${CMAKE_CURRENT_BINARY_DIR}
|
||||
${CMAKE_BINARY_DIR}
|
||||
${CMAKE_SOURCE_DIR}
|
||||
${CMAKE_SOURCE_DIR}/tdebluez-common
|
||||
${TDE_INCLUDE_DIR}
|
||||
${TQT_INCLUDE_DIRS}
|
||||
)
|
||||
|
||||
#link_directories(
|
||||
# ${TQT_LIBRARY_DIRS}
|
||||
#)
|
||||
|
||||
|
||||
##### other data ################################
|
||||
# Example
|
||||
#install( FILES knotes.desktop DESTINATION ${XDG_APPS_INSTALL_DIR} )
|
||||
#install( FILES knoteconfig.kcfg knotesglobalconfig.kcfg DESTINATION ${KCFG_INSTALL_DIR} )
|
||||
#install( FILES knotesappui.rc knotesui.rc DESTINATION ${DATA_INSTALL_DIR}/knotes )
|
||||
#install( FILES local.desktop DESTINATION ${SERVICES_INSTALL_DIR}/tderesources/knotes )
|
||||
#install( FILES knotes_manager.desktop DESTINATION ${SERVICES_INSTALL_DIR}/tderesources )
|
||||
|
||||
# # from tdebase/applnk/Makefile.am
|
||||
# install-data-local:
|
||||
# $(mkinstalldirs) $(DESTDIR)$(kde_appsdir)/Settings/Network/Bluetooth
|
||||
# $(INSTALL_DATA) $(srcdir)/kde-settings-network-bluetooth.directory \
|
||||
# $(DESTDIR)$(kde_appsdir)/Settings/Network/Bluetooth/.directory
|
||||
#
|
||||
# uninstall-local:
|
||||
# -rm -f $(DESTDIR)$(kde_appsdir)/Settings/Network/Bluetooth/.directory
|
||||
|
||||
##### install import cmake modules ###############
|
||||
#tde_install_export( )
|
||||
|
||||
# Bluetooth directory entry in the control center
|
||||
install( FILES tde-settings-network-bluetooth.directory
|
||||
DESTINATION ${DATA_INSTALL_DIR}/tdebluez )
|
||||
|
||||
# Bluetooth access to system debus org.bluez
|
||||
install( FILES org.trinitydesktop.tdebluez.conf
|
||||
DESTINATION ${DBUS_SYS_DIR} )
|
||||
# DESTINATION ${DBUS_SYSTEM_CONF_DIRECTORY} )
|
||||
|
||||
|
||||
|
||||
add_subdirectory( icons )
|
||||
add_subdirectory( mimetypes )
|
||||
#add_subdirectory( dunhandler )
|
||||
#add_subdirectory( faxhandler )
|
@ -0,0 +1,3 @@
|
||||
This directory contains some files which are shared
|
||||
among the various modules in tdebluez.
|
||||
|
@ -0,0 +1,7 @@
|
||||
|
||||
dunhandlerdir = $(kde_datadir)/kdebluetooth/dunhandler
|
||||
dunhandler_SCRIPTS=dunhandler
|
||||
|
||||
# The desktop file
|
||||
servicemenudir = $(kde_appsdir)/Utilities
|
||||
servicemenu_DATA = dunhandler.desktop
|
@ -0,0 +1,804 @@
|
||||
# Makefile.in generated by automake 1.15 from Makefile.am.
|
||||
# KDE tags expanded automatically by am_edit - $Revision$
|
||||
# @configure_input@
|
||||
|
||||
# Copyright (C) 1994-2014 Free Software Foundation, Inc.
|
||||
|
||||
# This Makefile.in is free software; the Free Software Foundation
|
||||
# gives unlimited permission to copy and/or distribute it,
|
||||
# with or without modifications, as long as this notice is preserved.
|
||||
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
|
||||
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||
# PARTICULAR PURPOSE.
|
||||
|
||||
@SET_MAKE@
|
||||
|
||||
|
||||
VPATH = @srcdir@
|
||||
am__is_gnu_make = { \
|
||||
if test -z '$(MAKELEVEL)'; then \
|
||||
false; \
|
||||
elif test -n '$(MAKE_HOST)'; then \
|
||||
true; \
|
||||
elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
|
||||
true; \
|
||||
else \
|
||||
false; \
|
||||
fi; \
|
||||
}
|
||||
am__make_running_with_option = \
|
||||
case $${target_option-} in \
|
||||
?) ;; \
|
||||
*) echo "am__make_running_with_option: internal error: invalid" \
|
||||
"target option '$${target_option-}' specified" >&2; \
|
||||
exit 1;; \
|
||||
esac; \
|
||||
has_opt=no; \
|
||||
sane_makeflags=$$MAKEFLAGS; \
|
||||
if $(am__is_gnu_make); then \
|
||||
sane_makeflags=$$MFLAGS; \
|
||||
else \
|
||||
case $$MAKEFLAGS in \
|
||||
*\\[\ \ ]*) \
|
||||
bs=\\; \
|
||||
sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
|
||||
| sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
|
||||
esac; \
|
||||
fi; \
|
||||
skip_next=no; \
|
||||
strip_trailopt () \
|
||||
{ \
|
||||
flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
|
||||
}; \
|
||||
for flg in $$sane_makeflags; do \
|
||||
test $$skip_next = yes && { skip_next=no; continue; }; \
|
||||
case $$flg in \
|
||||
*=*|--*) continue;; \
|
||||
-*I) strip_trailopt 'I'; skip_next=yes;; \
|
||||
-*I?*) strip_trailopt 'I';; \
|
||||
-*O) strip_trailopt 'O'; skip_next=yes;; \
|
||||
-*O?*) strip_trailopt 'O';; \
|
||||
-*l) strip_trailopt 'l'; skip_next=yes;; \
|
||||
-*l?*) strip_trailopt 'l';; \
|
||||
-[dEDm]) skip_next=yes;; \
|
||||
-[JT]) skip_next=yes;; \
|
||||
esac; \
|
||||
case $$flg in \
|
||||
*$$target_option*) has_opt=yes; break;; \
|
||||
esac; \
|
||||
done; \
|
||||
test $$has_opt = yes
|
||||
am__make_dryrun = (target_option=n; $(am__make_running_with_option))
|
||||
am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
|
||||
pkgdatadir = $(datadir)/@PACKAGE@
|
||||
pkgincludedir = $(includedir)/@PACKAGE@
|
||||
pkglibdir = $(libdir)/@PACKAGE@
|
||||
pkglibexecdir = $(libexecdir)/@PACKAGE@
|
||||
am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
|
||||
install_sh_DATA = $(install_sh) -c -m 644
|
||||
install_sh_PROGRAM = $(install_sh) -c
|
||||
install_sh_SCRIPT = $(install_sh) -c
|
||||
INSTALL_HEADER = $(INSTALL_DATA)
|
||||
transform = $(program_transform_name)
|
||||
NORMAL_INSTALL = :
|
||||
PRE_INSTALL = :
|
||||
POST_INSTALL = :
|
||||
NORMAL_UNINSTALL = :
|
||||
PRE_UNINSTALL = :
|
||||
POST_UNINSTALL = :
|
||||
build_triplet = @build@
|
||||
host_triplet = @host@
|
||||
target_triplet = @target@
|
||||
subdir = kdebluetooth/kdebluetooth-common/dunhandler
|
||||
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
||||
am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \
|
||||
$(top_srcdir)/configure.in
|
||||
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
||||
$(ACLOCAL_M4)
|
||||
DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
|
||||
mkinstalldirs = $(SHELL) $(top_srcdir)/admin/mkinstalldirs
|
||||
CONFIG_HEADER = $(top_builddir)/config.h
|
||||
CONFIG_CLEAN_FILES = dunhandler.desktop
|
||||
CONFIG_CLEAN_VPATH_FILES =
|
||||
am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
|
||||
am__vpath_adj = case $$p in \
|
||||
$(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
|
||||
*) f=$$p;; \
|
||||
esac;
|
||||
am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
|
||||
am__install_max = 40
|
||||
am__nobase_strip_setup = \
|
||||
srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
|
||||
am__nobase_strip = \
|
||||
for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
|
||||
am__nobase_list = $(am__nobase_strip_setup); \
|
||||
for p in $$list; do echo "$$p $$p"; done | \
|
||||
sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
|
||||
$(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
|
||||
if (++n[$$2] == $(am__install_max)) \
|
||||
{ print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
|
||||
END { for (dir in files) print dir, files[dir] }'
|
||||
am__base_list = \
|
||||
sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
|
||||
sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
|
||||
am__uninstall_files_from_dir = { \
|
||||
test -z "$$files" \
|
||||
|| { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
|
||||
|| { echo " ( cd '$$dir' && rm -f" $$files ")"; \
|
||||
$(am__cd) "$$dir" && rm -f $$files; }; \
|
||||
}
|
||||
am__installdirs = "$(DESTDIR)$(dunhandlerdir)" \
|
||||
"$(DESTDIR)$(servicemenudir)"
|
||||
SCRIPTS = $(dunhandler_SCRIPTS)
|
||||
AM_V_P = $(am__v_P_@AM_V@)
|
||||
am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
|
||||
am__v_P_0 = false
|
||||
am__v_P_1 = :
|
||||
AM_V_GEN = $(am__v_GEN_@AM_V@)
|
||||
am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
|
||||
am__v_GEN_0 = @echo " GEN " $@;
|
||||
am__v_GEN_1 =
|
||||
AM_V_at = $(am__v_at_@AM_V@)
|
||||
am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
|
||||
am__v_at_0 = @
|
||||
am__v_at_1 =
|
||||
SOURCES =
|
||||
DIST_SOURCES =
|
||||
am__can_run_installinfo = \
|
||||
case $$AM_UPDATE_INFO_DIR in \
|
||||
n|no|NO) false;; \
|
||||
*) (install-info --version) >/dev/null 2>&1;; \
|
||||
esac
|
||||
DATA = $(servicemenu_DATA)
|
||||
am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
|
||||
am__DIST_COMMON = $(srcdir)/Makefile.in \
|
||||
$(srcdir)/dunhandler.desktop.in \
|
||||
$(top_srcdir)/admin/mkinstalldirs
|
||||
#>- DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
|
||||
#>+ 1
|
||||
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) $(KDE_DIST)
|
||||
ACLOCAL = @ACLOCAL@
|
||||
AMTAR = @AMTAR@
|
||||
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
|
||||
AR = @AR@
|
||||
ARTSCCONFIG = @ARTSCCONFIG@
|
||||
AUTOCONF = @AUTOCONF@
|
||||
AUTODIRS = @AUTODIRS@
|
||||
AUTOHEADER = @AUTOHEADER@
|
||||
AUTOMAKE = @AUTOMAKE@
|
||||
AWK = @AWK@
|
||||
BLUETOOTH_CFLAGS = @BLUETOOTH_CFLAGS@
|
||||
BLUETOOTH_LIBS = @BLUETOOTH_LIBS@
|
||||
CC = @CC@
|
||||
CCDEPMODE = @CCDEPMODE@
|
||||
CFLAGS = @CFLAGS@
|
||||
CONF_FILES = @CONF_FILES@
|
||||
CPP = @CPP@
|
||||
CPPFLAGS = @CPPFLAGS@
|
||||
CXX = @CXX@
|
||||
CXXCPP = @CXXCPP@
|
||||
CXXDEPMODE = @CXXDEPMODE@
|
||||
CXXFLAGS = @CXXFLAGS@
|
||||
CYGPATH_W = @CYGPATH_W@
|
||||
DBUSTQT_CFLAGS = @DBUSTQT_CFLAGS@
|
||||
DBUSTQT_LIBS = @DBUSTQT_LIBS@
|
||||
DBUS_CFLAGS = @DBUS_CFLAGS@
|
||||
DBUS_LIBS = @DBUS_LIBS@
|
||||
DCOPIDL = @DCOPIDL@
|
||||
DCOPIDL2CPP = @DCOPIDL2CPP@
|
||||
DCOPIDLNG = @DCOPIDLNG@
|
||||
DCOP_DEPENDENCIES = @DCOP_DEPENDENCIES@
|
||||
DEFS = @DEFS@
|
||||
DEPDIR = @DEPDIR@
|
||||
DLLTOOL = @DLLTOOL@
|
||||
DOXYGEN = @DOXYGEN@
|
||||
DOXYGEN_PROJECT_NAME = @DOXYGEN_PROJECT_NAME@
|
||||
DOXYGEN_PROJECT_NUMBER = @DOXYGEN_PROJECT_NUMBER@
|
||||
DSYMUTIL = @DSYMUTIL@
|
||||
DUMPBIN = @DUMPBIN@
|
||||
ECHO_C = @ECHO_C@
|
||||
ECHO_N = @ECHO_N@
|
||||
ECHO_T = @ECHO_T@
|
||||
EGREP = @EGREP@
|
||||
ENABLE_PERMISSIVE_FLAG = @ENABLE_PERMISSIVE_FLAG@
|
||||
EXEEXT = @EXEEXT@
|
||||
FGREP = @FGREP@
|
||||
FRAMEWORK_COREAUDIO = @FRAMEWORK_COREAUDIO@
|
||||
GMSGFMT = @GMSGFMT@
|
||||
GREP = @GREP@
|
||||
HAVE_GCC_VISIBILITY = @HAVE_GCC_VISIBILITY@
|
||||
INSTALL = @INSTALL@
|
||||
INSTALL_DATA = @INSTALL_DATA@
|
||||
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
||||
INSTALL_SCRIPT = @INSTALL_SCRIPT@
|
||||
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
|
||||
KBTOBEXSRV_BINDIR = @KBTOBEXSRV_BINDIR@
|
||||
KCFG_DEPENDENCIES = @KCFG_DEPENDENCIES@
|
||||
KCONFIG_COMPILER = @KCONFIG_COMPILER@
|
||||
KDEBLUETOOTH_VERSION = @KDEBLUETOOTH_VERSION@
|
||||
KDECONFIG = @KDECONFIG@
|
||||
KDE_CHECK_PLUGIN = @KDE_CHECK_PLUGIN@
|
||||
KDE_EXTRA_RPATH = @KDE_EXTRA_RPATH@
|
||||
KDE_HAS_DOXYGEN = @KDE_HAS_DOXYGEN@
|
||||
KDE_HAVE_DOT = @KDE_HAVE_DOT@
|
||||
KDE_INCLUDES = @KDE_INCLUDES@
|
||||
KDE_LDFLAGS = @KDE_LDFLAGS@
|
||||
KDE_MT_LDFLAGS = @KDE_MT_LDFLAGS@
|
||||
KDE_MT_LIBS = @KDE_MT_LIBS@
|
||||
KDE_NO_UNDEFINED = @KDE_NO_UNDEFINED@
|
||||
KDE_PLUGIN = @KDE_PLUGIN@
|
||||
KDE_RPATH = @KDE_RPATH@
|
||||
KDE_USE_CLOSURE_FALSE = @KDE_USE_CLOSURE_FALSE@
|
||||
KDE_USE_CLOSURE_TRUE = @KDE_USE_CLOSURE_TRUE@
|
||||
KDE_USE_FINAL_FALSE = @KDE_USE_FINAL_FALSE@
|
||||
KDE_USE_FINAL_TRUE = @KDE_USE_FINAL_TRUE@
|
||||
KDE_USE_FPIE = @KDE_USE_FPIE@
|
||||
KDE_USE_NMCHECK_FALSE = @KDE_USE_NMCHECK_FALSE@
|
||||
KDE_USE_NMCHECK_TRUE = @KDE_USE_NMCHECK_TRUE@
|
||||
KDE_USE_PIE = @KDE_USE_PIE@
|
||||
KDE_XSL_STYLESHEET = @KDE_XSL_STYLESHEET@
|
||||
LD = @LD@
|
||||
LDFLAGS = @LDFLAGS@
|
||||
LDFLAGS_AS_NEEDED = @LDFLAGS_AS_NEEDED@
|
||||
LDFLAGS_NEW_DTAGS = @LDFLAGS_NEW_DTAGS@
|
||||
LIBCOMPAT = @LIBCOMPAT@
|
||||
LIBCRYPT = @LIBCRYPT@
|
||||
LIBDL = @LIBDL@
|
||||
LIBJPEG = @LIBJPEG@
|
||||
LIBOBJS = @LIBOBJS@
|
||||
LIBPNG = @LIBPNG@
|
||||
LIBPTHREAD = @LIBPTHREAD@
|
||||
LIBRESOLV = @LIBRESOLV@
|
||||
LIBS = @LIBS@
|
||||
LIBSM = @LIBSM@
|
||||
LIBSOCKET = @LIBSOCKET@
|
||||
LIBTOOL = @LIBTOOL@
|
||||
LIBTQT_LDFLAGS = @LIBTQT_LDFLAGS@
|
||||
LIBUCB = @LIBUCB@
|
||||
LIBUTIL = @LIBUTIL@
|
||||
LIBXML_CFLAGS = @LIBXML_CFLAGS@
|
||||
LIBXML_LIBS = @LIBXML_LIBS@
|
||||
LIBZ = @LIBZ@
|
||||
LIB_ARTS = @LIB_ARTS@
|
||||
LIB_BLUETOOTH = @LIB_BLUETOOTH@
|
||||
LIB_KAB = @LIB_KAB@
|
||||
LIB_KDED = @LIB_KDED@
|
||||
LIB_KFM = @LIB_KFM@
|
||||
LIB_KJS = @LIB_KJS@
|
||||
LIB_LOCKDEV = @LIB_LOCKDEV@
|
||||
LIB_POLL = @LIB_POLL@
|
||||
LIB_QPE = @LIB_QPE@
|
||||
LIB_QT = @LIB_QT@
|
||||
LIB_QUI = @LIB_QUI@
|
||||
LIB_SDP = @LIB_SDP@
|
||||
LIB_SMB = @LIB_SMB@
|
||||
LIB_TDEABC = @LIB_TDEABC@
|
||||
LIB_TDECORE = @LIB_TDECORE@
|
||||
LIB_TDEDNSSD = @LIB_TDEDNSSD@
|
||||
LIB_TDEFILE = @LIB_TDEFILE@
|
||||
LIB_TDEHTML = @LIB_TDEHTML@
|
||||
LIB_TDEIMPROXY = @LIB_TDEIMPROXY@
|
||||
LIB_TDEIO = @LIB_TDEIO@
|
||||
LIB_TDENEWSTUFF = @LIB_TDENEWSTUFF@
|
||||
LIB_TDEPARTS = @LIB_TDEPARTS@
|
||||
LIB_TDEPIM = @LIB_TDEPIM@
|
||||
LIB_TDEPRINT = @LIB_TDEPRINT@
|
||||
LIB_TDESPELL = @LIB_TDESPELL@
|
||||
LIB_TDESYCOCA = @LIB_TDESYCOCA@
|
||||
LIB_TDEUI = @LIB_TDEUI@
|
||||
LIB_TDEUNITTEST = @LIB_TDEUNITTEST@
|
||||
LIB_TDEUTILS = @LIB_TDEUTILS@
|
||||
LIB_X11 = @LIB_X11@
|
||||
LIB_XEXT = @LIB_XEXT@
|
||||
LIB_XRENDER = @LIB_XRENDER@
|
||||
LIPO = @LIPO@
|
||||
LN_S = @LN_S@
|
||||
LTLIBOBJS = @LTLIBOBJS@
|
||||
LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
|
||||
MAINT = @MAINT@
|
||||
MAKEINFO = @MAKEINFO@
|
||||
MAKETDEWIDGETS = @MAKETDEWIDGETS@
|
||||
MANIFEST_TOOL = @MANIFEST_TOOL@
|
||||
MCOPIDL = @MCOPIDL@
|
||||
MEINPROC = @MEINPROC@
|
||||
MKDIR_P = @MKDIR_P@
|
||||
MOC = @MOC@
|
||||
MSGFMT = @MSGFMT@
|
||||
NM = @NM@
|
||||
NMEDIT = @NMEDIT@
|
||||
NOOPT_CFLAGS = @NOOPT_CFLAGS@
|
||||
NOOPT_CXXFLAGS = @NOOPT_CXXFLAGS@
|
||||
OBJDUMP = @OBJDUMP@
|
||||
OBJEXT = @OBJEXT@
|
||||
OPENOBEX_CFLAGS = @OPENOBEX_CFLAGS@
|
||||
OPENOBEX_LIBS = @OPENOBEX_LIBS@
|
||||
OTOOL = @OTOOL@
|
||||
OTOOL64 = @OTOOL64@
|
||||
PACKAGE = @PACKAGE@
|
||||
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
|
||||
PACKAGE_NAME = @PACKAGE_NAME@
|
||||
PACKAGE_STRING = @PACKAGE_STRING@
|
||||
PACKAGE_TARNAME = @PACKAGE_TARNAME@
|
||||
PACKAGE_URL = @PACKAGE_URL@
|
||||
PACKAGE_VERSION = @PACKAGE_VERSION@
|
||||
PATH_SEPARATOR = @PATH_SEPARATOR@
|
||||
PERL = @PERL@
|
||||
PKG_CONFIG = @PKG_CONFIG@
|
||||
QTDOCDIR = @QTDOCDIR@
|
||||
QTE_NORTTI = @QTE_NORTTI@
|
||||
QT_INCLUDES = @QT_INCLUDES@
|
||||
QT_LDFLAGS = @QT_LDFLAGS@
|
||||
RANLIB = @RANLIB@
|
||||
SED = @SED@
|
||||
SET_MAKE = @SET_MAKE@
|
||||
SHELL = @SHELL@
|
||||
STRIP = @STRIP@
|
||||
TOPSUBDIRS = @TOPSUBDIRS@
|
||||
TQTDCOPIDL = @TQTDCOPIDL@
|
||||
TQTDCOPIDL2CPP = @TQTDCOPIDL2CPP@
|
||||
TQTDCOPIDLNG = @TQTDCOPIDLNG@
|
||||
TQTMCOPIDL = @TQTMCOPIDL@
|
||||
TQTMOC = @TQTMOC@
|
||||
UIC = @UIC@
|
||||
UIC_TR = @UIC_TR@
|
||||
USER_INCLUDES = @USER_INCLUDES@
|
||||
USER_LDFLAGS = @USER_LDFLAGS@
|
||||
USE_EXCEPTIONS = @USE_EXCEPTIONS@
|
||||
USE_RTTI = @USE_RTTI@
|
||||
USE_THREADS = @USE_THREADS@
|
||||
VERSION = @VERSION@
|
||||
WOVERLOADED_VIRTUAL = @WOVERLOADED_VIRTUAL@
|
||||
XGETTEXT = @XGETTEXT@
|
||||
XMKMF = @XMKMF@
|
||||
XMLLINT = @XMLLINT@
|
||||
X_EXTRA_LIBS = @X_EXTRA_LIBS@
|
||||
X_INCLUDES = @X_INCLUDES@
|
||||
X_LDFLAGS = @X_LDFLAGS@
|
||||
X_PRE_LIBS = @X_PRE_LIBS@
|
||||
X_RPATH = @X_RPATH@
|
||||
abs_builddir = @abs_builddir@
|
||||
abs_srcdir = @abs_srcdir@
|
||||
abs_top_builddir = @abs_top_builddir@
|
||||
abs_top_srcdir = @abs_top_srcdir@
|
||||
ac_ct_AR = @ac_ct_AR@
|
||||
ac_ct_CC = @ac_ct_CC@
|
||||
ac_ct_CXX = @ac_ct_CXX@
|
||||
ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
|
||||
all_includes = @all_includes@
|
||||
all_libraries = @all_libraries@
|
||||
am__include = @am__include@
|
||||
am__leading_dot = @am__leading_dot@
|
||||
am__quote = @am__quote@
|
||||
am__tar = @am__tar@
|
||||
am__untar = @am__untar@
|
||||
bindir = @bindir@
|
||||
build = @build@
|
||||
build_alias = @build_alias@
|
||||
build_cpu = @build_cpu@
|
||||
build_os = @build_os@
|
||||
build_vendor = @build_vendor@
|
||||
builddir = @builddir@
|
||||
datadir = @datadir@
|
||||
datarootdir = @datarootdir@
|
||||
docdir = @docdir@
|
||||
dunhandler_dir = @dunhandler_dir@
|
||||
dvidir = @dvidir@
|
||||
exec_prefix = @exec_prefix@
|
||||
faxhandler_dir = @faxhandler_dir@
|
||||
host = @host@
|
||||
host_alias = @host_alias@
|
||||
host_cpu = @host_cpu@
|
||||
host_os = @host_os@
|
||||
host_vendor = @host_vendor@
|
||||
htmldir = @htmldir@
|
||||
includedir = @includedir@
|
||||
infodir = @infodir@
|
||||
install_sh = @install_sh@
|
||||
kde_appsdir = @kde_appsdir@
|
||||
kde_bindir = @kde_bindir@
|
||||
kde_confdir = @kde_confdir@
|
||||
kde_datadir = @kde_datadir@
|
||||
kde_htmldir = @kde_htmldir@
|
||||
kde_icondir = @kde_icondir@
|
||||
kde_includes = @kde_includes@
|
||||
kde_kcfgdir = @kde_kcfgdir@
|
||||
kde_libraries = @kde_libraries@
|
||||
kde_libs_htmldir = @kde_libs_htmldir@
|
||||
kde_libs_prefix = @kde_libs_prefix@
|
||||
kde_locale = @kde_locale@
|
||||
kde_mimedir = @kde_mimedir@
|
||||
kde_moduledir = @kde_moduledir@
|
||||
kde_qtver = @kde_qtver@
|
||||
kde_servicesdir = @kde_servicesdir@
|
||||
kde_servicetypesdir = @kde_servicetypesdir@
|
||||
kde_sounddir = @kde_sounddir@
|
||||
kde_styledir = @kde_styledir@
|
||||
kde_templatesdir = @kde_templatesdir@
|
||||
kde_wallpaperdir = @kde_wallpaperdir@
|
||||
kde_widgetdir = @kde_widgetdir@
|
||||
libdir = @libdir@
|
||||
libexecdir = @libexecdir@
|
||||
localedir = @localedir@
|
||||
localstatedir = @localstatedir@
|
||||
mandir = @mandir@
|
||||
mkdir_p = @mkdir_p@
|
||||
oldincludedir = @oldincludedir@
|
||||
pdfdir = @pdfdir@
|
||||
prefix = @prefix@
|
||||
program_transform_name = @program_transform_name@
|
||||
psdir = @psdir@
|
||||
qt_includes = @qt_includes@
|
||||
qt_libraries = @qt_libraries@
|
||||
runstatedir = @runstatedir@
|
||||
sbindir = @sbindir@
|
||||
sharedstatedir = @sharedstatedir@
|
||||
srcdir = @srcdir@
|
||||
sysconfdir = @sysconfdir@
|
||||
target = @target@
|
||||
target_alias = @target_alias@
|
||||
target_cpu = @target_cpu@
|
||||
target_os = @target_os@
|
||||
target_vendor = @target_vendor@
|
||||
tdeinitdir = @tdeinitdir@
|
||||
top_build_prefix = @top_build_prefix@
|
||||
top_builddir = @top_builddir@
|
||||
top_srcdir = @top_srcdir@
|
||||
x_includes = @x_includes@
|
||||
x_libraries = @x_libraries@
|
||||
xdg_appsdir = @xdg_appsdir@
|
||||
xdg_directorydir = @xdg_directorydir@
|
||||
xdg_menudir = @xdg_menudir@
|
||||
dunhandlerdir = $(kde_datadir)/kdebluetooth/dunhandler
|
||||
dunhandler_SCRIPTS = dunhandler
|
||||
|
||||
# The desktop file
|
||||
servicemenudir = $(kde_appsdir)/Utilities
|
||||
servicemenu_DATA = dunhandler.desktop
|
||||
#>- all: all-am
|
||||
#>+ 1
|
||||
all: docs-am all-am
|
||||
|
||||
.SUFFIXES:
|
||||
$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
|
||||
#>- @for dep in $?; do \
|
||||
#>- case '$(am__configure_deps)' in \
|
||||
#>- *$$dep*) \
|
||||
#>- ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
|
||||
#>- && { if test -f $@; then exit 0; else break; fi; }; \
|
||||
#>- exit 1;; \
|
||||
#>- esac; \
|
||||
#>- done; \
|
||||
#>- echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign kdebluetooth/kdebluetooth-common/dunhandler/Makefile'; \
|
||||
#>- $(am__cd) $(top_srcdir) && \
|
||||
#>- $(AUTOMAKE) --foreign kdebluetooth/kdebluetooth-common/dunhandler/Makefile
|
||||
#>+ 12
|
||||
@for dep in $?; do \
|
||||
case '$(am__configure_deps)' in \
|
||||
*$$dep*) \
|
||||
( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
|
||||
&& { if test -f $@; then exit 0; else break; fi; }; \
|
||||
exit 1;; \
|
||||
esac; \
|
||||
done; \
|
||||
echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign kdebluetooth/kdebluetooth-common/dunhandler/Makefile'; \
|
||||
$(am__cd) $(top_srcdir) && \
|
||||
$(AUTOMAKE) --foreign kdebluetooth/kdebluetooth-common/dunhandler/Makefile
|
||||
cd $(top_srcdir) && perl admin/am_edit kdebluetooth/kdebluetooth-common/dunhandler/Makefile.in
|
||||
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
||||
@case '$?' in \
|
||||
*config.status*) \
|
||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
|
||||
*) \
|
||||
echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
|
||||
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
|
||||
esac;
|
||||
|
||||
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
|
||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||
|
||||
$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
|
||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||
$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
|
||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||
$(am__aclocal_m4_deps):
|
||||
dunhandler.desktop: $(top_builddir)/config.status $(srcdir)/dunhandler.desktop.in
|
||||
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
|
||||
install-dunhandlerSCRIPTS: $(dunhandler_SCRIPTS)
|
||||
@$(NORMAL_INSTALL)
|
||||
@list='$(dunhandler_SCRIPTS)'; test -n "$(dunhandlerdir)" || list=; \
|
||||
if test -n "$$list"; then \
|
||||
echo " $(MKDIR_P) '$(DESTDIR)$(dunhandlerdir)'"; \
|
||||
$(MKDIR_P) "$(DESTDIR)$(dunhandlerdir)" || exit 1; \
|
||||
fi; \
|
||||
for p in $$list; do \
|
||||
if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
|
||||
if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \
|
||||
done | \
|
||||
sed -e 'p;s,.*/,,;n' \
|
||||
-e 'h;s|.*|.|' \
|
||||
-e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \
|
||||
$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \
|
||||
{ d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
|
||||
if ($$2 == $$4) { files[d] = files[d] " " $$1; \
|
||||
if (++n[d] == $(am__install_max)) { \
|
||||
print "f", d, files[d]; n[d] = 0; files[d] = "" } } \
|
||||
else { print "f", d "/" $$4, $$1 } } \
|
||||
END { for (d in files) print "f", d, files[d] }' | \
|
||||
while read type dir files; do \
|
||||
if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
|
||||
test -z "$$files" || { \
|
||||
echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(dunhandlerdir)$$dir'"; \
|
||||
$(INSTALL_SCRIPT) $$files "$(DESTDIR)$(dunhandlerdir)$$dir" || exit $$?; \
|
||||
} \
|
||||
; done
|
||||
|
||||
uninstall-dunhandlerSCRIPTS:
|
||||
@$(NORMAL_UNINSTALL)
|
||||
@list='$(dunhandler_SCRIPTS)'; test -n "$(dunhandlerdir)" || exit 0; \
|
||||
files=`for p in $$list; do echo "$$p"; done | \
|
||||
sed -e 's,.*/,,;$(transform)'`; \
|
||||
dir='$(DESTDIR)$(dunhandlerdir)'; $(am__uninstall_files_from_dir)
|
||||
|
||||
mostlyclean-libtool:
|
||||
-rm -f *.lo
|
||||
|
||||
clean-libtool:
|
||||
-rm -rf .libs _libs
|
||||
install-servicemenuDATA: $(servicemenu_DATA)
|
||||
@$(NORMAL_INSTALL)
|
||||
@list='$(servicemenu_DATA)'; test -n "$(servicemenudir)" || list=; \
|
||||
if test -n "$$list"; then \
|
||||
echo " $(MKDIR_P) '$(DESTDIR)$(servicemenudir)'"; \
|
||||
$(MKDIR_P) "$(DESTDIR)$(servicemenudir)" || exit 1; \
|
||||
fi; \
|
||||
for p in $$list; do \
|
||||
if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
|
||||
echo "$$d$$p"; \
|
||||
done | $(am__base_list) | \
|
||||
while read files; do \
|
||||
echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(servicemenudir)'"; \
|
||||
$(INSTALL_DATA) $$files "$(DESTDIR)$(servicemenudir)" || exit $$?; \
|
||||
done
|
||||
|
||||
uninstall-servicemenuDATA:
|
||||
@$(NORMAL_UNINSTALL)
|
||||
@list='$(servicemenu_DATA)'; test -n "$(servicemenudir)" || list=; \
|
||||
files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
|
||||
dir='$(DESTDIR)$(servicemenudir)'; $(am__uninstall_files_from_dir)
|
||||
tags TAGS:
|
||||
|
||||
ctags CTAGS:
|
||||
|
||||
cscope cscopelist:
|
||||
|
||||
|
||||
distdir: $(DISTFILES)
|
||||
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
||||
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
||||
list='$(DISTFILES)'; \
|
||||
dist_files=`for file in $$list; do echo $$file; done | \
|
||||
sed -e "s|^$$srcdirstrip/||;t" \
|
||||
-e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
|
||||
case $$dist_files in \
|
||||
*/*) $(MKDIR_P) `echo "$$dist_files" | \
|
||||
sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
|
||||
sort -u` ;; \
|
||||
esac; \
|
||||
for file in $$dist_files; do \
|
||||
if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
|
||||
if test -d $$d/$$file; then \
|
||||
dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
|
||||
if test -d "$(distdir)/$$file"; then \
|
||||
find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
|
||||
fi; \
|
||||
if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
|
||||
cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
|
||||
find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
|
||||
fi; \
|
||||
cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
|
||||
else \
|
||||
test -f "$(distdir)/$$file" \
|
||||
|| cp -p $$d/$$file "$(distdir)/$$file" \
|
||||
|| exit 1; \
|
||||
fi; \
|
||||
done
|
||||
check-am: all-am
|
||||
check: check-am
|
||||
all-am: Makefile $(SCRIPTS) $(DATA)
|
||||
installdirs:
|
||||
for dir in "$(DESTDIR)$(dunhandlerdir)" "$(DESTDIR)$(servicemenudir)"; do \
|
||||
test -z "$$dir" || $(MKDIR_P) "$$dir"; \
|
||||
done
|
||||
install: install-am
|
||||
install-exec: install-exec-am
|
||||
install-data: install-data-am
|
||||
uninstall: uninstall-am
|
||||
|
||||
install-am: all-am
|
||||
@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
|
||||
|
||||
installcheck: installcheck-am
|
||||
install-strip:
|
||||
if test -z '$(STRIP)'; then \
|
||||
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
|
||||
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
|
||||
install; \
|
||||
else \
|
||||
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
|
||||
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
|
||||
"INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
|
||||
fi
|
||||
mostlyclean-generic:
|
||||
|
||||
clean-generic:
|
||||
|
||||
distclean-generic:
|
||||
-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
|
||||
-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
|
||||
|
||||
maintainer-clean-generic:
|
||||
@echo "This command is intended for maintainers to use"
|
||||
@echo "it deletes files that may require special tools to rebuild."
|
||||
#>- clean: clean-am
|
||||
#>+ 1
|
||||
clean: kde-rpo-clean clean-am
|
||||
|
||||
#>- clean-am: clean-generic clean-libtool mostlyclean-am
|
||||
#>+ 1
|
||||
clean-am: clean-bcheck clean-generic clean-libtool mostlyclean-am
|
||||
|
||||
distclean: distclean-am
|
||||
-rm -f Makefile
|
||||
distclean-am: clean-am distclean-generic
|
||||
|
||||
dvi: dvi-am
|
||||
|
||||
dvi-am:
|
||||
|
||||
html: html-am
|
||||
|
||||
html-am:
|
||||
|
||||
info: info-am
|
||||
|
||||
info-am:
|
||||
|
||||
install-data-am: install-dunhandlerSCRIPTS install-servicemenuDATA
|
||||
|
||||
install-dvi: install-dvi-am
|
||||
|
||||
install-dvi-am:
|
||||
|
||||
install-exec-am:
|
||||
|
||||
install-html: install-html-am
|
||||
|
||||
install-html-am:
|
||||
|
||||
install-info: install-info-am
|
||||
|
||||
install-info-am:
|
||||
|
||||
install-man:
|
||||
|
||||
install-pdf: install-pdf-am
|
||||
|
||||
install-pdf-am:
|
||||
|
||||
install-ps: install-ps-am
|
||||
|
||||
install-ps-am:
|
||||
|
||||
installcheck-am:
|
||||
|
||||
maintainer-clean: maintainer-clean-am
|
||||
-rm -f Makefile
|
||||
maintainer-clean-am: distclean-am maintainer-clean-generic
|
||||
|
||||
mostlyclean: mostlyclean-am
|
||||
|
||||
mostlyclean-am: mostlyclean-generic mostlyclean-libtool
|
||||
|
||||
pdf: pdf-am
|
||||
|
||||
pdf-am:
|
||||
|
||||
ps: ps-am
|
||||
|
||||
ps-am:
|
||||
|
||||
uninstall-am: uninstall-dunhandlerSCRIPTS uninstall-servicemenuDATA
|
||||
|
||||
.MAKE: install-am install-strip
|
||||
|
||||
.PHONY: all all-am check check-am clean clean-generic clean-libtool \
|
||||
cscopelist-am ctags-am distclean distclean-generic \
|
||||
distclean-libtool distdir dvi dvi-am html html-am info info-am \
|
||||
install install-am install-data install-data-am \
|
||||
install-dunhandlerSCRIPTS install-dvi install-dvi-am \
|
||||
install-exec install-exec-am install-html install-html-am \
|
||||
install-info install-info-am install-man install-pdf \
|
||||
install-pdf-am install-ps install-ps-am \
|
||||
install-servicemenuDATA install-strip installcheck \
|
||||
installcheck-am installdirs maintainer-clean \
|
||||
maintainer-clean-generic mostlyclean mostlyclean-generic \
|
||||
mostlyclean-libtool pdf pdf-am ps ps-am tags-am uninstall \
|
||||
uninstall-am uninstall-dunhandlerSCRIPTS \
|
||||
uninstall-servicemenuDATA
|
||||
|
||||
.PRECIOUS: Makefile
|
||||
|
||||
|
||||
# Tell versions [3.59,3.63) of GNU make to not export all variables.
|
||||
# Otherwise a system limit (for SysV at least) may be exceeded.
|
||||
.NOEXPORT:
|
||||
|
||||
#>+ 2
|
||||
KDE_DIST=dunhandler dunhandler.desktop.in configure.in.in Makefile.in Makefile.am
|
||||
|
||||
#>+ 2
|
||||
docs-am:
|
||||
|
||||
#>+ 15
|
||||
force-reedit:
|
||||
@for dep in $?; do \
|
||||
case '$(am__configure_deps)' in \
|
||||
*$$dep*) \
|
||||
( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
|
||||
&& { if test -f $@; then exit 0; else break; fi; }; \
|
||||
exit 1;; \
|
||||
esac; \
|
||||
done; \
|
||||
echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign kdebluetooth/kdebluetooth-common/dunhandler/Makefile'; \
|
||||
$(am__cd) $(top_srcdir) && \
|
||||
$(AUTOMAKE) --foreign kdebluetooth/kdebluetooth-common/dunhandler/Makefile
|
||||
cd $(top_srcdir) && perl admin/am_edit kdebluetooth/kdebluetooth-common/dunhandler/Makefile.in
|
||||
|
||||
|
||||
#>+ 21
|
||||
clean-bcheck:
|
||||
rm -f *.bchecktest.cc *.bchecktest.cc.class a.out
|
||||
|
||||
bcheck: bcheck-am
|
||||
|
||||
bcheck-am:
|
||||
@for i in ; do \
|
||||
if test $(srcdir)/$$i -nt $$i.bchecktest.cc; then \
|
||||
echo "int main() {return 0;}" > $$i.bchecktest.cc ; \
|
||||
echo "#include \"$$i\"" >> $$i.bchecktest.cc ; \
|
||||
echo "$$i"; \
|
||||
if ! $(CXX) $(DEFS) -I. -I$(srcdir) -I$(top_builddir) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS) --dump-class-hierarchy -c $$i.bchecktest.cc; then \
|
||||
rm -f $$i.bchecktest.cc; exit 1; \
|
||||
fi ; \
|
||||
echo "" >> $$i.bchecktest.cc.class; \
|
||||
perl $(top_srcdir)/admin/bcheck.pl $$i.bchecktest.cc.class || { rm -f $$i.bchecktest.cc; exit 1; }; \
|
||||
rm -f a.out; \
|
||||
fi ; \
|
||||
done
|
||||
|
||||
|
||||
#>+ 3
|
||||
final:
|
||||
$(MAKE) all-am
|
||||
|
||||
#>+ 3
|
||||
final-install:
|
||||
$(MAKE) install-am
|
||||
|
||||
#>+ 3
|
||||
no-final:
|
||||
$(MAKE) all-am
|
||||
|
||||
#>+ 3
|
||||
no-final-install:
|
||||
$(MAKE) install-am
|
||||
|
||||
#>+ 3
|
||||
kde-rpo-clean:
|
||||
-rm -f *.rpo
|
||||
|
||||
#>+ 3
|
||||
nmcheck:
|
||||
nmcheck-am: nmcheck
|
@ -0,0 +1,4 @@
|
||||
dnl AC_OUTPUT(kdebluetooth/kdebluetooth-common/dunhandler/dunhandler.desktop)
|
||||
KDE_EXPAND_MAKEVAR(dunhandler_dir, kde_datadir)
|
||||
AC_SUBST(dunhandler_dir)
|
||||
|
@ -0,0 +1,70 @@
|
||||
#!/bin/sh
|
||||
#/***************************************************************************
|
||||
# dunhandler - a script for tdeio_sdp
|
||||
# -------------------
|
||||
# begin : Mon March 29 2004
|
||||
# copyright : (C) 2004 by Simone Gotti
|
||||
# email : simone.gotti@email.it
|
||||
# ***************************************************************************/
|
||||
#
|
||||
#/***************************************************************************
|
||||
# * *
|
||||
# * 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. *
|
||||
# * *
|
||||
# ***************************************************************************/
|
||||
|
||||
|
||||
|
||||
# get the btaddress and the rfcomm channel from the command line
|
||||
BTADDR=$(echo $1 | cut -d'/' -f3 | cut -d'[' -f2 | cut -d']' -f1)
|
||||
PARAMS=$(echo $1 | cut -d'?' -f2 )
|
||||
|
||||
OLDIFS=$IFS
|
||||
IFS='&'
|
||||
for i in $PARAMS; do
|
||||
if test $(echo $i | cut -d'=' -f1) = "rfcommchannel"; then
|
||||
RFCOMM_CHANNEL=$(echo $i | cut -d'=' -f2)
|
||||
fi
|
||||
done;
|
||||
IFS=$OLDIFS
|
||||
|
||||
RFCOMM_SHOW_OUT=$(rfcomm show)
|
||||
|
||||
# Check if the channel is already binded
|
||||
BINDED_CHANNEL=$(echo $RFCOMM_SHOW_OUT | grep -i $BTADDR | grep -i " "$RFCOMM_CHANNEL" " | cut -d' ' -f1 | cut -d':' -f1)
|
||||
|
||||
if test "x"$BINDED_CHANNEL != "x"; then
|
||||
MESSAGE1="A bind between the bluetooth device (using the dial-up-networking profile) and /dev/rfcomm$DEV_NUMBER already exists. You can use any connection program (kppp, pppd script etc...) using /dev/rfcomm$DEV_NUMBER like the modem device"
|
||||
|
||||
kdialog --msgbox "$MESSAGE1"
|
||||
else
|
||||
|
||||
# Find the first unbinded /dev/rfcommX
|
||||
DEV_NUMBER=0
|
||||
while test "x"$(echo $RFCOMM_SHOW_OUT | grep "rfcomm"$DEV_NUMBER":"| cut -d' ' -f1 ) != "x"; do
|
||||
DEV_NUMBER=$[$DEV_NUMBER+1]
|
||||
if test $DEV_NUMBER -gt 255; then break; fi;
|
||||
done;
|
||||
|
||||
|
||||
# do the bind
|
||||
echo "doing: rfcomm bind $DEV_NUMBER $BTADDR $RFCOMM_CHANNEL"
|
||||
|
||||
if test -e /def/rfcomm$DEV_NUMBER; then
|
||||
EXIT_CODE=$(tdesu -f/dev/rfcomm$DEV_NUMBER -c "rfcomm bind $DEV_NUMBER $BTADDR $RFCOMM_CHANNEL")
|
||||
else
|
||||
EXIT_CODE=$(tdesu -c "rfcomm bind $DEV_NUMBER $BTADDR $RFCOMM_CHANNEL")
|
||||
fi
|
||||
|
||||
echo $EXIT_CODE
|
||||
|
||||
MESSAGE1="Created a bind between the bluetooth device (using the dial-up-networking profile) and /dev/rfcomm$DEV_NUMBER. You can use any connection program (kppp, pppd script etc...) using /dev/rfcomm$DEV_NUMBER like the modem device"
|
||||
|
||||
kdialog --msgbox "$MESSAGE1"
|
||||
|
||||
fi;
|
||||
|
||||
|
@ -0,0 +1,10 @@
|
||||
[Desktop Entry]
|
||||
Encoding=UTF-8
|
||||
Name=@dunhandler_dir@/kdebluetooth/dunhandler/dunhandler
|
||||
Exec=dunhandler %u
|
||||
Icon=network_local
|
||||
Type=Application
|
||||
Comment=An OBEX Object Push client for the KdeBluetooth Framework
|
||||
Comment[et]=OBEX objekti saatmise klient KdeBluetooth raamistikule
|
||||
MimeType=bluetooth/dun-profile;
|
||||
Hidden=true
|
@ -0,0 +1,7 @@
|
||||
|
||||
dunhandlerdir = $(kde_datadir)/kdebluetooth/faxhandler
|
||||
dunhandler_SCRIPTS=faxhandler kbtfax
|
||||
|
||||
# The desktop file
|
||||
servicemenudir = $(kde_appsdir)/Utilities
|
||||
servicemenu_DATA = faxhandler.desktop
|
@ -0,0 +1,804 @@
|
||||
# Makefile.in generated by automake 1.15 from Makefile.am.
|
||||
# KDE tags expanded automatically by am_edit - $Revision$
|
||||
# @configure_input@
|
||||
|
||||
# Copyright (C) 1994-2014 Free Software Foundation, Inc.
|
||||
|
||||
# This Makefile.in is free software; the Free Software Foundation
|
||||
# gives unlimited permission to copy and/or distribute it,
|
||||
# with or without modifications, as long as this notice is preserved.
|
||||
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
|
||||
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||
# PARTICULAR PURPOSE.
|
||||
|
||||
@SET_MAKE@
|
||||
|
||||
|
||||
VPATH = @srcdir@
|
||||
am__is_gnu_make = { \
|
||||
if test -z '$(MAKELEVEL)'; then \
|
||||
false; \
|
||||
elif test -n '$(MAKE_HOST)'; then \
|
||||
true; \
|
||||
elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
|
||||
true; \
|
||||
else \
|
||||
false; \
|
||||
fi; \
|
||||
}
|
||||
am__make_running_with_option = \
|
||||
case $${target_option-} in \
|
||||
?) ;; \
|
||||
*) echo "am__make_running_with_option: internal error: invalid" \
|
||||
"target option '$${target_option-}' specified" >&2; \
|
||||
exit 1;; \
|
||||
esac; \
|
||||
has_opt=no; \
|
||||
sane_makeflags=$$MAKEFLAGS; \
|
||||
if $(am__is_gnu_make); then \
|
||||
sane_makeflags=$$MFLAGS; \
|
||||
else \
|
||||
case $$MAKEFLAGS in \
|
||||
*\\[\ \ ]*) \
|
||||
bs=\\; \
|
||||
sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
|
||||
| sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
|
||||
esac; \
|
||||
fi; \
|
||||
skip_next=no; \
|
||||
strip_trailopt () \
|
||||
{ \
|
||||
flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
|
||||
}; \
|
||||
for flg in $$sane_makeflags; do \
|
||||
test $$skip_next = yes && { skip_next=no; continue; }; \
|
||||
case $$flg in \
|
||||
*=*|--*) continue;; \
|
||||
-*I) strip_trailopt 'I'; skip_next=yes;; \
|
||||
-*I?*) strip_trailopt 'I';; \
|
||||
-*O) strip_trailopt 'O'; skip_next=yes;; \
|
||||
-*O?*) strip_trailopt 'O';; \
|
||||
-*l) strip_trailopt 'l'; skip_next=yes;; \
|
||||
-*l?*) strip_trailopt 'l';; \
|
||||
-[dEDm]) skip_next=yes;; \
|
||||
-[JT]) skip_next=yes;; \
|
||||
esac; \
|
||||
case $$flg in \
|
||||
*$$target_option*) has_opt=yes; break;; \
|
||||
esac; \
|
||||
done; \
|
||||
test $$has_opt = yes
|
||||
am__make_dryrun = (target_option=n; $(am__make_running_with_option))
|
||||
am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
|
||||
pkgdatadir = $(datadir)/@PACKAGE@
|
||||
pkgincludedir = $(includedir)/@PACKAGE@
|
||||
pkglibdir = $(libdir)/@PACKAGE@
|
||||
pkglibexecdir = $(libexecdir)/@PACKAGE@
|
||||
am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
|
||||
install_sh_DATA = $(install_sh) -c -m 644
|
||||
install_sh_PROGRAM = $(install_sh) -c
|
||||
install_sh_SCRIPT = $(install_sh) -c
|
||||
INSTALL_HEADER = $(INSTALL_DATA)
|
||||
transform = $(program_transform_name)
|
||||
NORMAL_INSTALL = :
|
||||
PRE_INSTALL = :
|
||||
POST_INSTALL = :
|
||||
NORMAL_UNINSTALL = :
|
||||
PRE_UNINSTALL = :
|
||||
POST_UNINSTALL = :
|
||||
build_triplet = @build@
|
||||
host_triplet = @host@
|
||||
target_triplet = @target@
|
||||
subdir = kdebluetooth/kdebluetooth-common/faxhandler
|
||||
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
||||
am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \
|
||||
$(top_srcdir)/configure.in
|
||||
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
||||
$(ACLOCAL_M4)
|
||||
DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
|
||||
mkinstalldirs = $(SHELL) $(top_srcdir)/admin/mkinstalldirs
|
||||
CONFIG_HEADER = $(top_builddir)/config.h
|
||||
CONFIG_CLEAN_FILES = faxhandler.desktop
|
||||
CONFIG_CLEAN_VPATH_FILES =
|
||||
am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
|
||||
am__vpath_adj = case $$p in \
|
||||
$(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
|
||||
*) f=$$p;; \
|
||||
esac;
|
||||
am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
|
||||
am__install_max = 40
|
||||
am__nobase_strip_setup = \
|
||||
srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
|
||||
am__nobase_strip = \
|
||||
for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
|
||||
am__nobase_list = $(am__nobase_strip_setup); \
|
||||
for p in $$list; do echo "$$p $$p"; done | \
|
||||
sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
|
||||
$(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
|
||||
if (++n[$$2] == $(am__install_max)) \
|
||||
{ print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
|
||||
END { for (dir in files) print dir, files[dir] }'
|
||||
am__base_list = \
|
||||
sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
|
||||
sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
|
||||
am__uninstall_files_from_dir = { \
|
||||
test -z "$$files" \
|
||||
|| { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
|
||||
|| { echo " ( cd '$$dir' && rm -f" $$files ")"; \
|
||||
$(am__cd) "$$dir" && rm -f $$files; }; \
|
||||
}
|
||||
am__installdirs = "$(DESTDIR)$(dunhandlerdir)" \
|
||||
"$(DESTDIR)$(servicemenudir)"
|
||||
SCRIPTS = $(dunhandler_SCRIPTS)
|
||||
AM_V_P = $(am__v_P_@AM_V@)
|
||||
am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
|
||||
am__v_P_0 = false
|
||||
am__v_P_1 = :
|
||||
AM_V_GEN = $(am__v_GEN_@AM_V@)
|
||||
am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
|
||||
am__v_GEN_0 = @echo " GEN " $@;
|
||||
am__v_GEN_1 =
|
||||
AM_V_at = $(am__v_at_@AM_V@)
|
||||
am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
|
||||
am__v_at_0 = @
|
||||
am__v_at_1 =
|
||||
SOURCES =
|
||||
DIST_SOURCES =
|
||||
am__can_run_installinfo = \
|
||||
case $$AM_UPDATE_INFO_DIR in \
|
||||
n|no|NO) false;; \
|
||||
*) (install-info --version) >/dev/null 2>&1;; \
|
||||
esac
|
||||
DATA = $(servicemenu_DATA)
|
||||
am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
|
||||
am__DIST_COMMON = $(srcdir)/Makefile.in \
|
||||
$(srcdir)/faxhandler.desktop.in \
|
||||
$(top_srcdir)/admin/mkinstalldirs
|
||||
#>- DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
|
||||
#>+ 1
|
||||
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) $(KDE_DIST)
|
||||
ACLOCAL = @ACLOCAL@
|
||||
AMTAR = @AMTAR@
|
||||
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
|
||||
AR = @AR@
|
||||
ARTSCCONFIG = @ARTSCCONFIG@
|
||||
AUTOCONF = @AUTOCONF@
|
||||
AUTODIRS = @AUTODIRS@
|
||||
AUTOHEADER = @AUTOHEADER@
|
||||
AUTOMAKE = @AUTOMAKE@
|
||||
AWK = @AWK@
|
||||
BLUETOOTH_CFLAGS = @BLUETOOTH_CFLAGS@
|
||||
BLUETOOTH_LIBS = @BLUETOOTH_LIBS@
|
||||
CC = @CC@
|
||||
CCDEPMODE = @CCDEPMODE@
|
||||
CFLAGS = @CFLAGS@
|
||||
CONF_FILES = @CONF_FILES@
|
||||
CPP = @CPP@
|
||||
CPPFLAGS = @CPPFLAGS@
|
||||
CXX = @CXX@
|
||||
CXXCPP = @CXXCPP@
|
||||
CXXDEPMODE = @CXXDEPMODE@
|
||||
CXXFLAGS = @CXXFLAGS@
|
||||
CYGPATH_W = @CYGPATH_W@
|
||||
DBUSTQT_CFLAGS = @DBUSTQT_CFLAGS@
|
||||
DBUSTQT_LIBS = @DBUSTQT_LIBS@
|
||||
DBUS_CFLAGS = @DBUS_CFLAGS@
|
||||
DBUS_LIBS = @DBUS_LIBS@
|
||||
DCOPIDL = @DCOPIDL@
|
||||
DCOPIDL2CPP = @DCOPIDL2CPP@
|
||||
DCOPIDLNG = @DCOPIDLNG@
|
||||
DCOP_DEPENDENCIES = @DCOP_DEPENDENCIES@
|
||||
DEFS = @DEFS@
|
||||
DEPDIR = @DEPDIR@
|
||||
DLLTOOL = @DLLTOOL@
|
||||
DOXYGEN = @DOXYGEN@
|
||||
DOXYGEN_PROJECT_NAME = @DOXYGEN_PROJECT_NAME@
|
||||
DOXYGEN_PROJECT_NUMBER = @DOXYGEN_PROJECT_NUMBER@
|
||||
DSYMUTIL = @DSYMUTIL@
|
||||
DUMPBIN = @DUMPBIN@
|
||||
ECHO_C = @ECHO_C@
|
||||
ECHO_N = @ECHO_N@
|
||||
ECHO_T = @ECHO_T@
|
||||
EGREP = @EGREP@
|
||||
ENABLE_PERMISSIVE_FLAG = @ENABLE_PERMISSIVE_FLAG@
|
||||
EXEEXT = @EXEEXT@
|
||||
FGREP = @FGREP@
|
||||
FRAMEWORK_COREAUDIO = @FRAMEWORK_COREAUDIO@
|
||||
GMSGFMT = @GMSGFMT@
|
||||
GREP = @GREP@
|
||||
HAVE_GCC_VISIBILITY = @HAVE_GCC_VISIBILITY@
|
||||
INSTALL = @INSTALL@
|
||||
INSTALL_DATA = @INSTALL_DATA@
|
||||
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
||||
INSTALL_SCRIPT = @INSTALL_SCRIPT@
|
||||
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
|
||||
KBTOBEXSRV_BINDIR = @KBTOBEXSRV_BINDIR@
|
||||
KCFG_DEPENDENCIES = @KCFG_DEPENDENCIES@
|
||||
KCONFIG_COMPILER = @KCONFIG_COMPILER@
|
||||
KDEBLUETOOTH_VERSION = @KDEBLUETOOTH_VERSION@
|
||||
KDECONFIG = @KDECONFIG@
|
||||
KDE_CHECK_PLUGIN = @KDE_CHECK_PLUGIN@
|
||||
KDE_EXTRA_RPATH = @KDE_EXTRA_RPATH@
|
||||
KDE_HAS_DOXYGEN = @KDE_HAS_DOXYGEN@
|
||||
KDE_HAVE_DOT = @KDE_HAVE_DOT@
|
||||
KDE_INCLUDES = @KDE_INCLUDES@
|
||||
KDE_LDFLAGS = @KDE_LDFLAGS@
|
||||
KDE_MT_LDFLAGS = @KDE_MT_LDFLAGS@
|
||||
KDE_MT_LIBS = @KDE_MT_LIBS@
|
||||
KDE_NO_UNDEFINED = @KDE_NO_UNDEFINED@
|
||||
KDE_PLUGIN = @KDE_PLUGIN@
|
||||
KDE_RPATH = @KDE_RPATH@
|
||||
KDE_USE_CLOSURE_FALSE = @KDE_USE_CLOSURE_FALSE@
|
||||
KDE_USE_CLOSURE_TRUE = @KDE_USE_CLOSURE_TRUE@
|
||||
KDE_USE_FINAL_FALSE = @KDE_USE_FINAL_FALSE@
|
||||
KDE_USE_FINAL_TRUE = @KDE_USE_FINAL_TRUE@
|
||||
KDE_USE_FPIE = @KDE_USE_FPIE@
|
||||
KDE_USE_NMCHECK_FALSE = @KDE_USE_NMCHECK_FALSE@
|
||||
KDE_USE_NMCHECK_TRUE = @KDE_USE_NMCHECK_TRUE@
|
||||
KDE_USE_PIE = @KDE_USE_PIE@
|
||||
KDE_XSL_STYLESHEET = @KDE_XSL_STYLESHEET@
|
||||
LD = @LD@
|
||||
LDFLAGS = @LDFLAGS@
|
||||
LDFLAGS_AS_NEEDED = @LDFLAGS_AS_NEEDED@
|
||||
LDFLAGS_NEW_DTAGS = @LDFLAGS_NEW_DTAGS@
|
||||
LIBCOMPAT = @LIBCOMPAT@
|
||||
LIBCRYPT = @LIBCRYPT@
|
||||
LIBDL = @LIBDL@
|
||||
LIBJPEG = @LIBJPEG@
|
||||
LIBOBJS = @LIBOBJS@
|
||||
LIBPNG = @LIBPNG@
|
||||
LIBPTHREAD = @LIBPTHREAD@
|
||||
LIBRESOLV = @LIBRESOLV@
|
||||
LIBS = @LIBS@
|
||||
LIBSM = @LIBSM@
|
||||
LIBSOCKET = @LIBSOCKET@
|
||||
LIBTOOL = @LIBTOOL@
|
||||
LIBTQT_LDFLAGS = @LIBTQT_LDFLAGS@
|
||||
LIBUCB = @LIBUCB@
|
||||
LIBUTIL = @LIBUTIL@
|
||||
LIBXML_CFLAGS = @LIBXML_CFLAGS@
|
||||
LIBXML_LIBS = @LIBXML_LIBS@
|
||||
LIBZ = @LIBZ@
|
||||
LIB_ARTS = @LIB_ARTS@
|
||||
LIB_BLUETOOTH = @LIB_BLUETOOTH@
|
||||
LIB_KAB = @LIB_KAB@
|
||||
LIB_KDED = @LIB_KDED@
|
||||
LIB_KFM = @LIB_KFM@
|
||||
LIB_KJS = @LIB_KJS@
|
||||
LIB_LOCKDEV = @LIB_LOCKDEV@
|
||||
LIB_POLL = @LIB_POLL@
|
||||
LIB_QPE = @LIB_QPE@
|
||||
LIB_QT = @LIB_QT@
|
||||
LIB_QUI = @LIB_QUI@
|
||||
LIB_SDP = @LIB_SDP@
|
||||
LIB_SMB = @LIB_SMB@
|
||||
LIB_TDEABC = @LIB_TDEABC@
|
||||
LIB_TDECORE = @LIB_TDECORE@
|
||||
LIB_TDEDNSSD = @LIB_TDEDNSSD@
|
||||
LIB_TDEFILE = @LIB_TDEFILE@
|
||||
LIB_TDEHTML = @LIB_TDEHTML@
|
||||
LIB_TDEIMPROXY = @LIB_TDEIMPROXY@
|
||||
LIB_TDEIO = @LIB_TDEIO@
|
||||
LIB_TDENEWSTUFF = @LIB_TDENEWSTUFF@
|
||||
LIB_TDEPARTS = @LIB_TDEPARTS@
|
||||
LIB_TDEPIM = @LIB_TDEPIM@
|
||||
LIB_TDEPRINT = @LIB_TDEPRINT@
|
||||
LIB_TDESPELL = @LIB_TDESPELL@
|
||||
LIB_TDESYCOCA = @LIB_TDESYCOCA@
|
||||
LIB_TDEUI = @LIB_TDEUI@
|
||||
LIB_TDEUNITTEST = @LIB_TDEUNITTEST@
|
||||
LIB_TDEUTILS = @LIB_TDEUTILS@
|
||||
LIB_X11 = @LIB_X11@
|
||||
LIB_XEXT = @LIB_XEXT@
|
||||
LIB_XRENDER = @LIB_XRENDER@
|
||||
LIPO = @LIPO@
|
||||
LN_S = @LN_S@
|
||||
LTLIBOBJS = @LTLIBOBJS@
|
||||
LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
|
||||
MAINT = @MAINT@
|
||||
MAKEINFO = @MAKEINFO@
|
||||
MAKETDEWIDGETS = @MAKETDEWIDGETS@
|
||||
MANIFEST_TOOL = @MANIFEST_TOOL@
|
||||
MCOPIDL = @MCOPIDL@
|
||||
MEINPROC = @MEINPROC@
|
||||
MKDIR_P = @MKDIR_P@
|
||||
MOC = @MOC@
|
||||
MSGFMT = @MSGFMT@
|
||||
NM = @NM@
|
||||
NMEDIT = @NMEDIT@
|
||||
NOOPT_CFLAGS = @NOOPT_CFLAGS@
|
||||
NOOPT_CXXFLAGS = @NOOPT_CXXFLAGS@
|
||||
OBJDUMP = @OBJDUMP@
|
||||
OBJEXT = @OBJEXT@
|
||||
OPENOBEX_CFLAGS = @OPENOBEX_CFLAGS@
|
||||
OPENOBEX_LIBS = @OPENOBEX_LIBS@
|
||||
OTOOL = @OTOOL@
|
||||
OTOOL64 = @OTOOL64@
|
||||
PACKAGE = @PACKAGE@
|
||||
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
|
||||
PACKAGE_NAME = @PACKAGE_NAME@
|
||||
PACKAGE_STRING = @PACKAGE_STRING@
|
||||
PACKAGE_TARNAME = @PACKAGE_TARNAME@
|
||||
PACKAGE_URL = @PACKAGE_URL@
|
||||
PACKAGE_VERSION = @PACKAGE_VERSION@
|
||||
PATH_SEPARATOR = @PATH_SEPARATOR@
|
||||
PERL = @PERL@
|
||||
PKG_CONFIG = @PKG_CONFIG@
|
||||
QTDOCDIR = @QTDOCDIR@
|
||||
QTE_NORTTI = @QTE_NORTTI@
|
||||
QT_INCLUDES = @QT_INCLUDES@
|
||||
QT_LDFLAGS = @QT_LDFLAGS@
|
||||
RANLIB = @RANLIB@
|
||||
SED = @SED@
|
||||
SET_MAKE = @SET_MAKE@
|
||||
SHELL = @SHELL@
|
||||
STRIP = @STRIP@
|
||||
TOPSUBDIRS = @TOPSUBDIRS@
|
||||
TQTDCOPIDL = @TQTDCOPIDL@
|
||||
TQTDCOPIDL2CPP = @TQTDCOPIDL2CPP@
|
||||
TQTDCOPIDLNG = @TQTDCOPIDLNG@
|
||||
TQTMCOPIDL = @TQTMCOPIDL@
|
||||
TQTMOC = @TQTMOC@
|
||||
UIC = @UIC@
|
||||
UIC_TR = @UIC_TR@
|
||||
USER_INCLUDES = @USER_INCLUDES@
|
||||
USER_LDFLAGS = @USER_LDFLAGS@
|
||||
USE_EXCEPTIONS = @USE_EXCEPTIONS@
|
||||
USE_RTTI = @USE_RTTI@
|
||||
USE_THREADS = @USE_THREADS@
|
||||
VERSION = @VERSION@
|
||||
WOVERLOADED_VIRTUAL = @WOVERLOADED_VIRTUAL@
|
||||
XGETTEXT = @XGETTEXT@
|
||||
XMKMF = @XMKMF@
|
||||
XMLLINT = @XMLLINT@
|
||||
X_EXTRA_LIBS = @X_EXTRA_LIBS@
|
||||
X_INCLUDES = @X_INCLUDES@
|
||||
X_LDFLAGS = @X_LDFLAGS@
|
||||
X_PRE_LIBS = @X_PRE_LIBS@
|
||||
X_RPATH = @X_RPATH@
|
||||
abs_builddir = @abs_builddir@
|
||||
abs_srcdir = @abs_srcdir@
|
||||
abs_top_builddir = @abs_top_builddir@
|
||||
abs_top_srcdir = @abs_top_srcdir@
|
||||
ac_ct_AR = @ac_ct_AR@
|
||||
ac_ct_CC = @ac_ct_CC@
|
||||
ac_ct_CXX = @ac_ct_CXX@
|
||||
ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
|
||||
all_includes = @all_includes@
|
||||
all_libraries = @all_libraries@
|
||||
am__include = @am__include@
|
||||
am__leading_dot = @am__leading_dot@
|
||||
am__quote = @am__quote@
|
||||
am__tar = @am__tar@
|
||||
am__untar = @am__untar@
|
||||
bindir = @bindir@
|
||||
build = @build@
|
||||
build_alias = @build_alias@
|
||||
build_cpu = @build_cpu@
|
||||
build_os = @build_os@
|
||||
build_vendor = @build_vendor@
|
||||
builddir = @builddir@
|
||||
datadir = @datadir@
|
||||
datarootdir = @datarootdir@
|
||||
docdir = @docdir@
|
||||
dunhandler_dir = @dunhandler_dir@
|
||||
dvidir = @dvidir@
|
||||
exec_prefix = @exec_prefix@
|
||||
faxhandler_dir = @faxhandler_dir@
|
||||
host = @host@
|
||||
host_alias = @host_alias@
|
||||
host_cpu = @host_cpu@
|
||||
host_os = @host_os@
|
||||
host_vendor = @host_vendor@
|
||||
htmldir = @htmldir@
|
||||
includedir = @includedir@
|
||||
infodir = @infodir@
|
||||
install_sh = @install_sh@
|
||||
kde_appsdir = @kde_appsdir@
|
||||
kde_bindir = @kde_bindir@
|
||||
kde_confdir = @kde_confdir@
|
||||
kde_datadir = @kde_datadir@
|
||||
kde_htmldir = @kde_htmldir@
|
||||
kde_icondir = @kde_icondir@
|
||||
kde_includes = @kde_includes@
|
||||
kde_kcfgdir = @kde_kcfgdir@
|
||||
kde_libraries = @kde_libraries@
|
||||
kde_libs_htmldir = @kde_libs_htmldir@
|
||||
kde_libs_prefix = @kde_libs_prefix@
|
||||
kde_locale = @kde_locale@
|
||||
kde_mimedir = @kde_mimedir@
|
||||
kde_moduledir = @kde_moduledir@
|
||||
kde_qtver = @kde_qtver@
|
||||
kde_servicesdir = @kde_servicesdir@
|
||||
kde_servicetypesdir = @kde_servicetypesdir@
|
||||
kde_sounddir = @kde_sounddir@
|
||||
kde_styledir = @kde_styledir@
|
||||
kde_templatesdir = @kde_templatesdir@
|
||||
kde_wallpaperdir = @kde_wallpaperdir@
|
||||
kde_widgetdir = @kde_widgetdir@
|
||||
libdir = @libdir@
|
||||
libexecdir = @libexecdir@
|
||||
localedir = @localedir@
|
||||
localstatedir = @localstatedir@
|
||||
mandir = @mandir@
|
||||
mkdir_p = @mkdir_p@
|
||||
oldincludedir = @oldincludedir@
|
||||
pdfdir = @pdfdir@
|
||||
prefix = @prefix@
|
||||
program_transform_name = @program_transform_name@
|
||||
psdir = @psdir@
|
||||
qt_includes = @qt_includes@
|
||||
qt_libraries = @qt_libraries@
|
||||
runstatedir = @runstatedir@
|
||||
sbindir = @sbindir@
|
||||
sharedstatedir = @sharedstatedir@
|
||||
srcdir = @srcdir@
|
||||
sysconfdir = @sysconfdir@
|
||||
target = @target@
|
||||
target_alias = @target_alias@
|
||||
target_cpu = @target_cpu@
|
||||
target_os = @target_os@
|
||||
target_vendor = @target_vendor@
|
||||
tdeinitdir = @tdeinitdir@
|
||||
top_build_prefix = @top_build_prefix@
|
||||
top_builddir = @top_builddir@
|
||||
top_srcdir = @top_srcdir@
|
||||
x_includes = @x_includes@
|
||||
x_libraries = @x_libraries@
|
||||
xdg_appsdir = @xdg_appsdir@
|
||||
xdg_directorydir = @xdg_directorydir@
|
||||
xdg_menudir = @xdg_menudir@
|
||||
dunhandlerdir = $(kde_datadir)/kdebluetooth/faxhandler
|
||||
dunhandler_SCRIPTS = faxhandler kbtfax
|
||||
|
||||
# The desktop file
|
||||
servicemenudir = $(kde_appsdir)/Utilities
|
||||
servicemenu_DATA = faxhandler.desktop
|
||||
#>- all: all-am
|
||||
#>+ 1
|
||||
all: docs-am all-am
|
||||
|
||||
.SUFFIXES:
|
||||
$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
|
||||
#>- @for dep in $?; do \
|
||||
#>- case '$(am__configure_deps)' in \
|
||||
#>- *$$dep*) \
|
||||
#>- ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
|
||||
#>- && { if test -f $@; then exit 0; else break; fi; }; \
|
||||
#>- exit 1;; \
|
||||
#>- esac; \
|
||||
#>- done; \
|
||||
#>- echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign kdebluetooth/kdebluetooth-common/faxhandler/Makefile'; \
|
||||
#>- $(am__cd) $(top_srcdir) && \
|
||||
#>- $(AUTOMAKE) --foreign kdebluetooth/kdebluetooth-common/faxhandler/Makefile
|
||||
#>+ 12
|
||||
@for dep in $?; do \
|
||||
case '$(am__configure_deps)' in \
|
||||
*$$dep*) \
|
||||
( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
|
||||
&& { if test -f $@; then exit 0; else break; fi; }; \
|
||||
exit 1;; \
|
||||
esac; \
|
||||
done; \
|
||||
echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign kdebluetooth/kdebluetooth-common/faxhandler/Makefile'; \
|
||||
$(am__cd) $(top_srcdir) && \
|
||||
$(AUTOMAKE) --foreign kdebluetooth/kdebluetooth-common/faxhandler/Makefile
|
||||
cd $(top_srcdir) && perl admin/am_edit kdebluetooth/kdebluetooth-common/faxhandler/Makefile.in
|
||||
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
||||
@case '$?' in \
|
||||
*config.status*) \
|
||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
|
||||
*) \
|
||||
echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
|
||||
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
|
||||
esac;
|
||||
|
||||
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
|
||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||
|
||||
$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
|
||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||
$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
|
||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||
$(am__aclocal_m4_deps):
|
||||
faxhandler.desktop: $(top_builddir)/config.status $(srcdir)/faxhandler.desktop.in
|
||||
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
|
||||
install-dunhandlerSCRIPTS: $(dunhandler_SCRIPTS)
|
||||
@$(NORMAL_INSTALL)
|
||||
@list='$(dunhandler_SCRIPTS)'; test -n "$(dunhandlerdir)" || list=; \
|
||||
if test -n "$$list"; then \
|
||||
echo " $(MKDIR_P) '$(DESTDIR)$(dunhandlerdir)'"; \
|
||||
$(MKDIR_P) "$(DESTDIR)$(dunhandlerdir)" || exit 1; \
|
||||
fi; \
|
||||
for p in $$list; do \
|
||||
if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
|
||||
if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \
|
||||
done | \
|
||||
sed -e 'p;s,.*/,,;n' \
|
||||
-e 'h;s|.*|.|' \
|
||||
-e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \
|
||||
$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \
|
||||
{ d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
|
||||
if ($$2 == $$4) { files[d] = files[d] " " $$1; \
|
||||
if (++n[d] == $(am__install_max)) { \
|
||||
print "f", d, files[d]; n[d] = 0; files[d] = "" } } \
|
||||
else { print "f", d "/" $$4, $$1 } } \
|
||||
END { for (d in files) print "f", d, files[d] }' | \
|
||||
while read type dir files; do \
|
||||
if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
|
||||
test -z "$$files" || { \
|
||||
echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(dunhandlerdir)$$dir'"; \
|
||||
$(INSTALL_SCRIPT) $$files "$(DESTDIR)$(dunhandlerdir)$$dir" || exit $$?; \
|
||||
} \
|
||||
; done
|
||||
|
||||
uninstall-dunhandlerSCRIPTS:
|
||||
@$(NORMAL_UNINSTALL)
|
||||
@list='$(dunhandler_SCRIPTS)'; test -n "$(dunhandlerdir)" || exit 0; \
|
||||
files=`for p in $$list; do echo "$$p"; done | \
|
||||
sed -e 's,.*/,,;$(transform)'`; \
|
||||
dir='$(DESTDIR)$(dunhandlerdir)'; $(am__uninstall_files_from_dir)
|
||||
|
||||
mostlyclean-libtool:
|
||||
-rm -f *.lo
|
||||
|
||||
clean-libtool:
|
||||
-rm -rf .libs _libs
|
||||
install-servicemenuDATA: $(servicemenu_DATA)
|
||||
@$(NORMAL_INSTALL)
|
||||
@list='$(servicemenu_DATA)'; test -n "$(servicemenudir)" || list=; \
|
||||
if test -n "$$list"; then \
|
||||
echo " $(MKDIR_P) '$(DESTDIR)$(servicemenudir)'"; \
|
||||
$(MKDIR_P) "$(DESTDIR)$(servicemenudir)" || exit 1; \
|
||||
fi; \
|
||||
for p in $$list; do \
|
||||
if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
|
||||
echo "$$d$$p"; \
|
||||
done | $(am__base_list) | \
|
||||
while read files; do \
|
||||
echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(servicemenudir)'"; \
|
||||
$(INSTALL_DATA) $$files "$(DESTDIR)$(servicemenudir)" || exit $$?; \
|
||||
done
|
||||
|
||||
uninstall-servicemenuDATA:
|
||||
@$(NORMAL_UNINSTALL)
|
||||
@list='$(servicemenu_DATA)'; test -n "$(servicemenudir)" || list=; \
|
||||
files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
|
||||
dir='$(DESTDIR)$(servicemenudir)'; $(am__uninstall_files_from_dir)
|
||||
tags TAGS:
|
||||
|
||||
ctags CTAGS:
|
||||
|
||||
cscope cscopelist:
|
||||
|
||||
|
||||
distdir: $(DISTFILES)
|
||||
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
||||
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
||||
list='$(DISTFILES)'; \
|
||||
dist_files=`for file in $$list; do echo $$file; done | \
|
||||
sed -e "s|^$$srcdirstrip/||;t" \
|
||||
-e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
|
||||
case $$dist_files in \
|
||||
*/*) $(MKDIR_P) `echo "$$dist_files" | \
|
||||
sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
|
||||
sort -u` ;; \
|
||||
esac; \
|
||||
for file in $$dist_files; do \
|
||||
if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
|
||||
if test -d $$d/$$file; then \
|
||||
dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
|
||||
if test -d "$(distdir)/$$file"; then \
|
||||
find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
|
||||
fi; \
|
||||
if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
|
||||
cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
|
||||
find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
|
||||
fi; \
|
||||
cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
|
||||
else \
|
||||
test -f "$(distdir)/$$file" \
|
||||
|| cp -p $$d/$$file "$(distdir)/$$file" \
|
||||
|| exit 1; \
|
||||
fi; \
|
||||
done
|
||||
check-am: all-am
|
||||
check: check-am
|
||||
all-am: Makefile $(SCRIPTS) $(DATA)
|
||||
installdirs:
|
||||
for dir in "$(DESTDIR)$(dunhandlerdir)" "$(DESTDIR)$(servicemenudir)"; do \
|
||||
test -z "$$dir" || $(MKDIR_P) "$$dir"; \
|
||||
done
|
||||
install: install-am
|
||||
install-exec: install-exec-am
|
||||
install-data: install-data-am
|
||||
uninstall: uninstall-am
|
||||
|
||||
install-am: all-am
|
||||
@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
|
||||
|
||||
installcheck: installcheck-am
|
||||
install-strip:
|
||||
if test -z '$(STRIP)'; then \
|
||||
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
|
||||
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
|
||||
install; \
|
||||
else \
|
||||
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
|
||||
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
|
||||
"INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
|
||||
fi
|
||||
mostlyclean-generic:
|
||||
|
||||
clean-generic:
|
||||
|
||||
distclean-generic:
|
||||
-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
|
||||
-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
|
||||
|
||||
maintainer-clean-generic:
|
||||
@echo "This command is intended for maintainers to use"
|
||||
@echo "it deletes files that may require special tools to rebuild."
|
||||
#>- clean: clean-am
|
||||
#>+ 1
|
||||
clean: kde-rpo-clean clean-am
|
||||
|
||||
#>- clean-am: clean-generic clean-libtool mostlyclean-am
|
||||
#>+ 1
|
||||
clean-am: clean-bcheck clean-generic clean-libtool mostlyclean-am
|
||||
|
||||
distclean: distclean-am
|
||||
-rm -f Makefile
|
||||
distclean-am: clean-am distclean-generic
|
||||
|
||||
dvi: dvi-am
|
||||
|
||||
dvi-am:
|
||||
|
||||
html: html-am
|
||||
|
||||
html-am:
|
||||
|
||||
info: info-am
|
||||
|
||||
info-am:
|
||||
|
||||
install-data-am: install-dunhandlerSCRIPTS install-servicemenuDATA
|
||||
|
||||
install-dvi: install-dvi-am
|
||||
|
||||
install-dvi-am:
|
||||
|
||||
install-exec-am:
|
||||
|
||||
install-html: install-html-am
|
||||
|
||||
install-html-am:
|
||||
|
||||
install-info: install-info-am
|
||||
|
||||
install-info-am:
|
||||
|
||||
install-man:
|
||||
|
||||
install-pdf: install-pdf-am
|
||||
|
||||
install-pdf-am:
|
||||
|
||||
install-ps: install-ps-am
|
||||
|
||||
install-ps-am:
|
||||
|
||||
installcheck-am:
|
||||
|
||||
maintainer-clean: maintainer-clean-am
|
||||
-rm -f Makefile
|
||||
maintainer-clean-am: distclean-am maintainer-clean-generic
|
||||
|
||||
mostlyclean: mostlyclean-am
|
||||
|
||||
mostlyclean-am: mostlyclean-generic mostlyclean-libtool
|
||||
|
||||
pdf: pdf-am
|
||||
|
||||
pdf-am:
|
||||
|
||||
ps: ps-am
|
||||
|
||||
ps-am:
|
||||
|
||||
uninstall-am: uninstall-dunhandlerSCRIPTS uninstall-servicemenuDATA
|
||||
|
||||
.MAKE: install-am install-strip
|
||||
|
||||
.PHONY: all all-am check check-am clean clean-generic clean-libtool \
|
||||
cscopelist-am ctags-am distclean distclean-generic \
|
||||
distclean-libtool distdir dvi dvi-am html html-am info info-am \
|
||||
install install-am install-data install-data-am \
|
||||
install-dunhandlerSCRIPTS install-dvi install-dvi-am \
|
||||
install-exec install-exec-am install-html install-html-am \
|
||||
install-info install-info-am install-man install-pdf \
|
||||
install-pdf-am install-ps install-ps-am \
|
||||
install-servicemenuDATA install-strip installcheck \
|
||||
installcheck-am installdirs maintainer-clean \
|
||||
maintainer-clean-generic mostlyclean mostlyclean-generic \
|
||||
mostlyclean-libtool pdf pdf-am ps ps-am tags-am uninstall \
|
||||
uninstall-am uninstall-dunhandlerSCRIPTS \
|
||||
uninstall-servicemenuDATA
|
||||
|
||||
.PRECIOUS: Makefile
|
||||
|
||||
|
||||
# Tell versions [3.59,3.63) of GNU make to not export all variables.
|
||||
# Otherwise a system limit (for SysV at least) may be exceeded.
|
||||
.NOEXPORT:
|
||||
|
||||
#>+ 2
|
||||
KDE_DIST=faxhandler kbtfax configure.in.in Makefile.am faxhandler.desktop.in Makefile.in
|
||||
|
||||
#>+ 2
|
||||
docs-am:
|
||||
|
||||
#>+ 15
|
||||
force-reedit:
|
||||
@for dep in $?; do \
|
||||
case '$(am__configure_deps)' in \
|
||||
*$$dep*) \
|
||||
( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
|
||||
&& { if test -f $@; then exit 0; else break; fi; }; \
|
||||
exit 1;; \
|
||||
esac; \
|
||||
done; \
|
||||
echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign kdebluetooth/kdebluetooth-common/faxhandler/Makefile'; \
|
||||
$(am__cd) $(top_srcdir) && \
|
||||
$(AUTOMAKE) --foreign kdebluetooth/kdebluetooth-common/faxhandler/Makefile
|
||||
cd $(top_srcdir) && perl admin/am_edit kdebluetooth/kdebluetooth-common/faxhandler/Makefile.in
|
||||
|
||||
|
||||
#>+ 21
|
||||
clean-bcheck:
|
||||
rm -f *.bchecktest.cc *.bchecktest.cc.class a.out
|
||||
|
||||
bcheck: bcheck-am
|
||||
|
||||
bcheck-am:
|
||||
@for i in ; do \
|
||||
if test $(srcdir)/$$i -nt $$i.bchecktest.cc; then \
|
||||
echo "int main() {return 0;}" > $$i.bchecktest.cc ; \
|
||||
echo "#include \"$$i\"" >> $$i.bchecktest.cc ; \
|
||||
echo "$$i"; \
|
||||
if ! $(CXX) $(DEFS) -I. -I$(srcdir) -I$(top_builddir) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS) --dump-class-hierarchy -c $$i.bchecktest.cc; then \
|
||||
rm -f $$i.bchecktest.cc; exit 1; \
|
||||
fi ; \
|
||||
echo "" >> $$i.bchecktest.cc.class; \
|
||||
perl $(top_srcdir)/admin/bcheck.pl $$i.bchecktest.cc.class || { rm -f $$i.bchecktest.cc; exit 1; }; \
|
||||
rm -f a.out; \
|
||||
fi ; \
|
||||
done
|
||||
|
||||
|
||||
#>+ 3
|
||||
final:
|
||||
$(MAKE) all-am
|
||||
|
||||
#>+ 3
|
||||
final-install:
|
||||
$(MAKE) install-am
|
||||
|
||||
#>+ 3
|
||||
no-final:
|
||||
$(MAKE) all-am
|
||||
|
||||
#>+ 3
|
||||
no-final-install:
|
||||
$(MAKE) install-am
|
||||
|
||||
#>+ 3
|
||||
kde-rpo-clean:
|
||||
-rm -f *.rpo
|
||||
|
||||
#>+ 3
|
||||
nmcheck-am: nmcheck
|
||||
nmcheck:
|
@ -0,0 +1,4 @@
|
||||
dnl AC_OUTPUT(kdebluetooth/kdebluetooth-common/faxhandler/faxhandler.desktop)
|
||||
KDE_EXPAND_MAKEVAR(faxhandler_dir, kde_datadir)
|
||||
AC_SUBST(faxhandler_dir)
|
||||
|
@ -0,0 +1,10 @@
|
||||
#!/bin/sh
|
||||
|
||||
# copyright 2004 by Fred Schaettgen <kdebluetooth@schaettgen.de>
|
||||
|
||||
|
||||
MESSAGE="To send faxes you can set up tdeprintfax to use the kbtfax script, which comes with kdebluetooth. Do you want to read more about that?"
|
||||
|
||||
if $(kdialog --yesno "$MESSAGE" --title "KDE Bluetooth Framework") ; then
|
||||
konqueror help:/kdebluetooth/otherprofiles.html#fax
|
||||
fi
|
@ -0,0 +1,9 @@
|
||||
[Desktop Entry]
|
||||
Encoding=UTF-8
|
||||
Name=@faxhandler_dir@/kdebluetooth/faxhandler/faxhandler
|
||||
Exec=faxhandler %u
|
||||
Icon=network_local
|
||||
Type=Application
|
||||
Comment=A handler for the fax profile
|
||||
MimeType=bluetooth/fax-profile;
|
||||
Hidden=true
|
@ -0,0 +1,105 @@
|
||||
#!/bin/bash
|
||||
|
||||
# A wrapper for efax to be used together with a bluetooth mobile phone
|
||||
# and tdeprintfax to send faxes via bluetooth from any kde application.
|
||||
#
|
||||
# This script does basically the same as the "efax" command, which is
|
||||
# already configured in tdeprintfax.
|
||||
# The difference is that kbtfax will ask you which bluetooth device
|
||||
# you want to connect to and then sets up a virtual serial device
|
||||
# with the rfcomm utility. Then the fax command is started and
|
||||
# finally the rfcomm binding is released.
|
||||
|
||||
# Use the following fax command when printing (without the 'FAXCMDLINE=')
|
||||
FAXCMDLINE="kbtfax NAME=%user PAGE=%page FROM=%from send %res %number %files"
|
||||
# This is the same as for eFax, but without the DEV parameter
|
||||
|
||||
# If your device does not support the fax profile
|
||||
# and works of the serial port profile instead,
|
||||
# you will have to change this script to use
|
||||
# SPP instead of FAX for the search UUID.
|
||||
# Default: SEARCH_UUID="FAX"
|
||||
SEARCH_UUID="FAX"
|
||||
|
||||
# This will list all possibly relevant services, including fax,
|
||||
# dialup and serial port profile. It will also list many
|
||||
# unrelated services like obex push etc., but it should be
|
||||
# easy to see what's the right choice.
|
||||
#SEARCH_UUID="0x0003"
|
||||
|
||||
# If you don't want to use the default rfcomm
|
||||
# device (/dev/rfcomm1) you can specify another one here.
|
||||
# Default: RFCOMM_DEVICE=1
|
||||
RFCOMM_DEVICE=1
|
||||
|
||||
# ----- End of options -----
|
||||
|
||||
BIND_ERROR=10
|
||||
FAX_ERROR=11
|
||||
RELEASE_ERROR=12
|
||||
RFCOMM_PERM_ERROR=13
|
||||
DEV_ERROR=14
|
||||
|
||||
if [ "x$1" == "x" ] ; then
|
||||
|
||||
kdialog --inputbox "Use this command for \"Other fax system\" in tdeprintfax:" "$FAXCMDLINE"
|
||||
|
||||
|
||||
elif [ "x$KBTFAX_ROOTMODE" != "xYES" ] ; then
|
||||
|
||||
# The script was not called with the special
|
||||
# argument RFCOMM, so the script was called
|
||||
# by the user/kprintfax
|
||||
|
||||
# We search for a service now
|
||||
SEARCH_RESULT=( $(kbtsearch -u $SEARCH_UUID --title "Select fax service") )
|
||||
SEARCH_STATUS=$?
|
||||
echo "Status: $SEARCH_STATUS"
|
||||
|
||||
if [ $SEARCH_STATUS -eq 0 ] ; then
|
||||
|
||||
# The user has selected a service
|
||||
export ADDRESS=${SEARCH_RESULT[0]}
|
||||
export CHANNEL=${SEARCH_RESULT[1]}
|
||||
export KBTFAX_ROOTMODE="YES"
|
||||
echo "Address=$ADDRESS Channel=$CHANNEL"
|
||||
tdesu -t -- $0 "$@"
|
||||
RET=$?
|
||||
if [ $RET == $BIND_ERROR ] ; then
|
||||
kdialog --error "Error binding rfcomm device."
|
||||
elif [ $RET == $FAX_ERROR ] ; then
|
||||
kdialog --error "Failed to send the fax."
|
||||
elif [ $RET == $RELEASE_ERROR ] ; then
|
||||
kdialog --error "Could not release rfcomm device."
|
||||
elif [ $ERT == 0 ] ; then
|
||||
kdialog --msgbox "Fax sent."
|
||||
elif [ $RET == $DEV_ERROR ] ; then
|
||||
kdialog --error "The rfcomm device /dev/rfcomm$RFCOMM_DEVICE did \
|
||||
not exist or had wrong permissions. Please check if the rfcomm utility is wworking correctly."
|
||||
else
|
||||
kdialog --error "Unknown error in kbtfax: Root mode returned with code $RET"
|
||||
fi
|
||||
exit $RET
|
||||
else
|
||||
|
||||
# The search dialog was aborted
|
||||
kdialog --msgbox "Sending fax was aborted."
|
||||
fi
|
||||
else
|
||||
|
||||
# Recursive call. We should be running as root
|
||||
# now, so we can set up rfcomm and call fax
|
||||
echo "Binding /dev/rfcomm$RFCOMM_DEVICE to $ADDRESS, channel $CHANNEL"
|
||||
rfcomm bind $RFCOMM_DEVICE $ADDRESS $CHANNEL || exit $BIND_ERROR
|
||||
# Rfcomm (or is it udev?) seems to need some time
|
||||
# to set up the device
|
||||
sleep 5
|
||||
[ -w /dev/rfcomm$RFCOMM_DEVICE -a -r /dev/rfcomm$RFCOMM_DEVICE ] || exit $DEV_ERROR
|
||||
fax "DEV=rfcomm$RFCOMM_DEVICE" "$@"
|
||||
FAXRET=$?
|
||||
echo -n "Releasing rfcomm device... "
|
||||
rfcomm release $ADDRESS || exit $RELEASE_ERROR
|
||||
[ $FAXRET -eq 0 ] || exit $FAX_ERROR
|
||||
echo "done."
|
||||
kdialog --msgbox "kbtfax script root mode done"
|
||||
fi
|
@ -0,0 +1,14 @@
|
||||
#################################################
|
||||
#
|
||||
# (C) 2018 Emanoil Kotsev
|
||||
# deloptes (AT) gmail.com
|
||||
#
|
||||
# Improvements and feedback are welcome
|
||||
#
|
||||
# This file is released under GPL >= 2
|
||||
#
|
||||
#################################################
|
||||
|
||||
##### install icons in /opt/trinity/share/icons ###############
|
||||
tde_install_icons( DESTINATION ${DATA_INSTALL_DIR}/tdebluez/icons )
|
||||
|
@ -0,0 +1,86 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
viewBox="0 0 976 976"
|
||||
version="1.1"
|
||||
id="svg6"
|
||||
sodipodi:docname="bluetooth.svg"
|
||||
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
|
||||
width="976"
|
||||
height="976">
|
||||
<metadata
|
||||
id="metadata12">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs10" />
|
||||
<sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1887"
|
||||
inkscape:window-height="873"
|
||||
id="namedview8"
|
||||
showgrid="false"
|
||||
inkscape:zoom="0.48360656"
|
||||
inkscape:cx="136.78185"
|
||||
inkscape:cy="443.014"
|
||||
inkscape:window-x="25"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="0"
|
||||
inkscape:current-layer="svg6" />
|
||||
<rect
|
||||
y="2.0677919"
|
||||
x="163.86441"
|
||||
style="fill:#0a3d91"
|
||||
ry="291"
|
||||
height="976"
|
||||
width="640"
|
||||
id="rect2" />
|
||||
<path
|
||||
d="M 262.34658,304.21164 676.45662,643.63499 476.86916,840.43425 V 137.264 L 676.45662,325.2183 262.34658,655.79674"
|
||||
id="path4"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:none;stroke:#ffffff;stroke-width:64.93599701" />
|
||||
<flowRoot
|
||||
xml:space="preserve"
|
||||
id="flowRoot18"
|
||||
style="font-style:normal;font-weight:normal;font-size:12px;line-height:1.25;font-family:Arial;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
transform="translate(72.881352,217.11865)"><flowRegion
|
||||
id="flowRegion20"><rect
|
||||
id="rect22"
|
||||
width="31.016949"
|
||||
height="29.983051"
|
||||
x="68.754234"
|
||||
y="-300.86441" /></flowRegion><flowPara
|
||||
id="flowPara24" /></flowRoot> <flowRoot
|
||||
xml:space="preserve"
|
||||
id="flowRoot26"
|
||||
style="font-style:normal;font-weight:normal;font-size:12px;line-height:1.25;font-family:Arial;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
transform="translate(72.881352,217.11865)"><flowRegion
|
||||
id="flowRegion28"><rect
|
||||
id="rect30"
|
||||
width="11.372881"
|
||||
height="12.406779"
|
||||
x="-48.59322"
|
||||
y="-301.89832" /></flowRegion><flowPara
|
||||
id="flowPara32" /></flowRoot></svg>
|
After Width: | Height: | Size: 3.0 KiB |
After Width: | Height: | Size: 5.1 KiB |
After Width: | Height: | Size: 4.8 KiB |
After Width: | Height: | Size: 684 B |
After Width: | Height: | Size: 663 B |
After Width: | Height: | Size: 948 B |
After Width: | Height: | Size: 432 B |
After Width: | Height: | Size: 1.3 KiB |
After Width: | Height: | Size: 339 B |
After Width: | Height: | Size: 681 B |
After Width: | Height: | Size: 471 B |
After Width: | Height: | Size: 785 B |
After Width: | Height: | Size: 494 B |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 875 B |
After Width: | Height: | Size: 1.3 KiB |
After Width: | Height: | Size: 2.0 KiB |
After Width: | Height: | Size: 1.3 KiB |
After Width: | Height: | Size: 2.0 KiB |
After Width: | Height: | Size: 1.9 KiB |
After Width: | Height: | Size: 2.6 KiB |
After Width: | Height: | Size: 2.6 KiB |
@ -0,0 +1,14 @@
|
||||
inkscape -z -e hi128-app-tdebluez.png -h128 tde-bluetooth.svg
|
||||
inkscape -z -e hi16-app-tdebluez.png -h16 tde-bluetooth.svg
|
||||
inkscape -z -e hi22-app-tdebluez.png -h22 tde-bluetooth.svg
|
||||
inkscape -z -e hi32-app-tdebluez.png -h32 tde-bluetooth.svg
|
||||
inkscape -z -e hi48-app-tdebluez.png -h48 tde-bluetooth.svg
|
||||
inkscape -z -e hi64-app-tdebluez.png -h64 tde-bluetooth.svg
|
||||
|
||||
inkscape -z -e hi128-app-bluetooth.png -h128 bluetooth.svg
|
||||
inkscape -z -e hi16-app-bluetooth.png -h16 bluetooth.svg
|
||||
inkscape -z -e hi22-app-bluetooth.png -h22 bluetooth.svg
|
||||
inkscape -z -e hi32-app-bluetooth.png -h32 bluetooth.svg
|
||||
inkscape -z -e hi48-app-bluetooth.png -h48 bluetooth.svg
|
||||
inkscape -z -e hi64-app-bluetooth.png -h64 bluetooth.svg
|
||||
|
@ -0,0 +1,82 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="210mm"
|
||||
height="210mm"
|
||||
viewBox="0 0 210 210"
|
||||
version="1.1"
|
||||
id="svg3740"
|
||||
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
|
||||
sodipodi:docname="tde-bluetooth.svg">
|
||||
<defs
|
||||
id="defs3734" />
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="0.35"
|
||||
inkscape:cx="-232.85714"
|
||||
inkscape:cy="445.71429"
|
||||
inkscape:document-units="mm"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="false"
|
||||
inkscape:window-width="1887"
|
||||
inkscape:window-height="1018"
|
||||
inkscape:window-x="25"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1" />
|
||||
<metadata
|
||||
id="metadata3737">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
transform="translate(0,-87)">
|
||||
<rect
|
||||
y="93.044044"
|
||||
x="43.845242"
|
||||
style="fill:#0a3d91;stroke-width:0.1917409"
|
||||
ry="58.060863"
|
||||
height="194.73334"
|
||||
width="117.92857"
|
||||
id="rect2" />
|
||||
<path
|
||||
d="m 62.179732,153.31429 76.305318,67.72238 -36.77666,39.26575 V 120.00459 l 36.77666,37.501 -76.305318,65.95762"
|
||||
id="path4"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:none;stroke:#ffffff;stroke-width:12.45088673" />
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:95.53657532px;line-height:1.25;font-family:Arial;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:7.96138191px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
x="82.105263"
|
||||
y="209.84634"
|
||||
id="text16"
|
||||
transform="scale(0.9224945,1.0840173)"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan14"
|
||||
x="82.105263"
|
||||
y="209.84634"
|
||||
style="fill:#ffffff;stroke-width:7.96138191px">T</tspan></text>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 2.6 KiB |
@ -0,0 +1,37 @@
|
||||
#################################################
|
||||
#
|
||||
# (C) 2018 Emanoil Kotsev
|
||||
# deloptes (AT) gmail.com
|
||||
#
|
||||
# Improvements and feedback are welcome
|
||||
#
|
||||
# This file is released under GPL >= 2
|
||||
#
|
||||
#################################################
|
||||
|
||||
#shellmimedir = $(kde_mimedir)/bluetooth
|
||||
#/opt/trinity/share/mimelnk
|
||||
install( FILES
|
||||
av-device-class.desktop
|
||||
computer-device-class.desktop
|
||||
imaging-device-class.desktop
|
||||
health-device-class.desktop
|
||||
keyboard-device-class.desktop
|
||||
lan-device-class.desktop
|
||||
misc-device-class.desktop
|
||||
mouse-device-class.desktop
|
||||
peripheral-device-class.desktop
|
||||
phone-device-class.desktop
|
||||
toy-device-class.desktop
|
||||
wearable-device-class.desktop
|
||||
unknown-device-class.desktop
|
||||
dun-profile.desktop
|
||||
fax-profile.desktop
|
||||
handsfree-profile.desktop
|
||||
headset-profile.desktop
|
||||
obex-ftp-profile.desktop
|
||||
obex-objectpush-profile.desktop
|
||||
serial-port-profile.desktop
|
||||
synchronization-profile.desktop
|
||||
unknown-profile.desktop
|
||||
DESTINATION ${MIME_INSTALL_DIR}/bluetooth )
|
@ -0,0 +1,29 @@
|
||||
[Desktop Entry]
|
||||
Encoding=UTF-8
|
||||
Type=MimeType
|
||||
MimeType=bluetooth/handsfree-profile
|
||||
Icon=kaddressbook
|
||||
Comment=Bluetooth Hands-Free Profile
|
||||
Comment[bg]=Профил Hands-Free за Bluetooth
|
||||
Comment[bs]=Bluetooth hands-free profil
|
||||
Comment[ca]=Perfil de mans lliures Bluetooth
|
||||
Comment[da]=Bluetooth Hands-Free-profil
|
||||
Comment[de]=Bluetooth Hands-Free-Profil
|
||||
Comment[el]=Προφίλ Bluetooth Hands-Free
|
||||
Comment[es]=Perfil manos libres Bluetooth
|
||||
Comment[et]=Bluetoothi handsfree profiil
|
||||
Comment[fr]=Profil Hands-Free Bluetooth
|
||||
Comment[gl]=Perfil de Maos-Libres Bluetooth
|
||||
Comment[it]=Profilo viva voce Bluetooth
|
||||
Comment[ja]=Bluetooth ハンズフリー プロファイル (HFP)
|
||||
Comment[lt]=Bluetooth laisvų rankų profilis
|
||||
Comment[nl]=Bluetooth Hands-Free-profiel
|
||||
Comment[pl]=Profil Bluetooth zestawu słuchawkowego
|
||||
Comment[pt]=Perfil Mãos-Livres Bluetooth
|
||||
Comment[pt_BR]=Perfil Mãos-Livres Bluetooth
|
||||
Comment[sr]=Bluetooth хендсфри профил
|
||||
Comment[sr@Latn]=Bluetooth hendsfri profil
|
||||
Comment[sv]=Blåtandsprofil för handsfree
|
||||
Comment[ta]=புலுடுத் கைஇல்லா பக்கநோக்கு
|
||||
Comment[tr]=Bluetooth Eller Serbest Profili
|
||||
Comment[xx]=xxBluetooth Hands-Free Profilexx
|
@ -0,0 +1,9 @@
|
||||
[Desktop Entry]
|
||||
Encoding=UTF-8
|
||||
Type=MimeType
|
||||
MimeType=bluetooth/health-device-class
|
||||
Icon=health
|
||||
X-TDE-IsAlso=inode/directory
|
||||
Comment=Health Bluetooth Device
|
||||
Comment[bg]=Медицинско Bluetooth устройство
|
||||
Comment[xx]=xxHealth Bluetooth Devicexx
|
@ -0,0 +1,29 @@
|
||||
[Desktop Entry]
|
||||
Encoding=UTF-8
|
||||
Type=MimeType
|
||||
MimeType=bluetooth/obex-ftp-profile
|
||||
Icon=nfs_unmount
|
||||
Comment=OBEX File Transfer Profile
|
||||
Comment[bg]=Профил за пренос на OBEX файл
|
||||
Comment[ca]=Perfil de transferència de fitxers OBEX
|
||||
Comment[da]=OBEX filoverførselsprofil
|
||||
Comment[de]=OBEX Dateitransferprotokoll
|
||||
Comment[el]=Προφίλ μεταφοράς αρχείων OBEX
|
||||
Comment[es]=Perfil de transferencia de archivos OBEX
|
||||
Comment[et]=OBEX failiedastuse profiil
|
||||
Comment[fr]=Profil de transfert de fichiers via OBEX
|
||||
Comment[gl]=Perfil de Transferéncia de Ficheiros OBEX
|
||||
Comment[it]=Profilo di trasferimento file OBEX
|
||||
Comment[ja]=OBEX ファイル転送プロファイル (FTP)
|
||||
Comment[lt]=OBEX bylų persiuntimo profilis
|
||||
Comment[nl]=OBEX bestandsoverdrachtprofiel
|
||||
Comment[pa]=OBEX ਫਾਇਲ ਸੰਚਾਰ ਪ੍ਰੋਫਾਇਲ
|
||||
Comment[pl]=Profil transferu plików OBEX
|
||||
Comment[pt]=Perfil de Transferência de Ficheiros OBEX
|
||||
Comment[pt_BR]=Perfil de Transferência de Ficheiros OBEX
|
||||
Comment[sr]=Профил за OBEX пренос фајлова
|
||||
Comment[sr@Latn]=Profil za OBEX prenos fajlova
|
||||
Comment[sv]=OBEX-filöverföringsprofil
|
||||
Comment[ta]=OBEX கோப்பு மாற்று பக்கநோக்கு
|
||||
Comment[tr]=OBEX Dosya Transfer Profili
|
||||
Comment[xx]=xxOBEX File Transfer Profilexx
|
@ -0,0 +1,32 @@
|
||||
[Desktop Entry]
|
||||
Encoding=UTF-8
|
||||
Comment=OBEX Object Push Profile
|
||||
Comment[bg]=Профил OBEX Object Push
|
||||
Comment[ca]=Perfil d'enviament d'objectes OBEX
|
||||
Comment[da]=OBEX objekt-skubbeprofil
|
||||
Comment[de]=OBEX Object-Push-Profil
|
||||
Comment[el]=Προφίλ αποστολής αντικειμένων OBEX
|
||||
Comment[es]=Perfil de envío de objetos OBEX
|
||||
Comment[et]=OBEX objekti saatmise profiil
|
||||
Comment[fr]=Profil OBEX Object Push
|
||||
Comment[gl]=Perfil de Envio de Obxectos OBEX
|
||||
Comment[it]=Profilo di Oggetto Push OBEX
|
||||
Comment[ja]=OBEX オブジェクトプッシュ プロファイル (OPP)
|
||||
Comment[lt]=OBEX persiuntimo profilis
|
||||
Comment[nl]=OBEX Object Push-profiel
|
||||
Comment[pa]=OBEX Object Push ਪ੍ਰੋਫਾਇਲ
|
||||
Comment[pl]=Profil OBEX Object Push
|
||||
Comment[pt]=Perfil de Envio de Objectos OBEX
|
||||
Comment[pt_BR]=Perfil de Envio de Objectos OBEX
|
||||
Comment[sr]=Профил за OBEX гурање објеката
|
||||
Comment[sr@Latn]=Profil za OBEX guranje objekata
|
||||
Comment[sv]=OBEX-objektsändingsprofil
|
||||
Comment[ta]=OBEX பொருள் விளக்கக்குறிப்பு
|
||||
Comment[tr]=OBEX Nesne Ekleme Profili
|
||||
Comment[xx]=xxOBEX Object Push Profilexx
|
||||
Icon=mail_send
|
||||
Type=MimeType
|
||||
MimeType=bluetooth/obex-object-push-profile
|
||||
Patterns=
|
||||
NoDisplay=false
|
||||
X-TDE-AutoEmbed=true
|
@ -0,0 +1,29 @@
|
||||
[Desktop Entry]
|
||||
Encoding=UTF-8
|
||||
Type=MimeType
|
||||
MimeType=bluetooth/serial-port-profile
|
||||
Icon=input_devices_settings
|
||||
Comment=Bluetooth Serial Port Profile
|
||||
Comment[bg]=Профил за сериен порт за Bluetooth
|
||||
Comment[ca]=Perfil de port sèrie Bluetooth
|
||||
Comment[da]=Bluetooth seriel port profil
|
||||
Comment[de]=Serielles Bluetooth-Anschlussprofil
|
||||
Comment[el]=Προφίλ σειριακής θύρας Bluetooth
|
||||
Comment[es]=Perfil Bluetooth de puerto serie
|
||||
Comment[et]=Bluetoothi jadapordi profiil
|
||||
Comment[fr]=Profil de port série Bluetooth
|
||||
Comment[gl]=Perfil Bluetooth de Porto Série
|
||||
Comment[it]=Profilo di porta seriale Bluetooth
|
||||
Comment[ja]=Bluetooth シリアルポート プロファイル (SPP)
|
||||
Comment[lt]=Bluetooth nuoseklaus prievado profilis
|
||||
Comment[nl]=Bluetooth seriële-poort-profiel
|
||||
Comment[pa]=ਬਲਿਊਟੁੱਥ ਸੀਰੀਅਲ ਪੋਰਟ ਪ੍ਰੋਫਾਇਲ
|
||||
Comment[pl]=Profil Bluetooth portu szeregowego
|
||||
Comment[pt]=Perfil Bluetooth de Portal Série
|
||||
Comment[pt_BR]=Perfil Bluetooth de Portal Série
|
||||
Comment[sr]=Bluetooth профил серијског порта
|
||||
Comment[sr@Latn]=Bluetooth profil serijskog porta
|
||||
Comment[sv]=Blåtandsprofil för serieport
|
||||
Comment[ta]=புலுடுத் தொடர் துரை பக்கநோக்கு
|
||||
Comment[tr]=Bluetooth Seri Port Profili
|
||||
Comment[xx]=xxBluetooth Serial Port Profilexx
|
@ -0,0 +1,31 @@
|
||||
[Desktop Entry]
|
||||
Encoding=UTF-8
|
||||
Type=MimeType
|
||||
MimeType=bluetooth/synchronization-profile
|
||||
Icon=pda_blue
|
||||
Comment=Bluetooth Synchronization Profile
|
||||
Comment[ar]=مواصفات مقارنة التزامن Bluetooth
|
||||
Comment[bg]=Профил за синхронизиране на Bluetooth
|
||||
Comment[ca]=Perfil de sincronització Bluetooth
|
||||
Comment[da]=Bluetooth synkroniseringsprofil
|
||||
Comment[de]=Bluetooth Synchronisationsprofil
|
||||
Comment[el]=Προφίλ συγχρονισμού Bluetooth
|
||||
Comment[en_GB]=Bluetooth Synchronisation Profile
|
||||
Comment[es]=Perfil de sincronización Bluetooth
|
||||
Comment[et]=Bluetoothi sünkroprofiil
|
||||
Comment[fr]=Profil de Synchronisation Bluetooth
|
||||
Comment[gl]=Perfil de Sincronizazón Bluetooth
|
||||
Comment[it]=Profilo di sincronizzazione Bluetooth
|
||||
Comment[ja]=Bluetooth 同期プロファイル (SYNC)
|
||||
Comment[lt]=Bluetooth sinchronizacijos profilis
|
||||
Comment[nl]=Bluetooth synchronisatieprofiel
|
||||
Comment[pa]=ਬਲਿਊਟੁੱਥ ਸਮਕਾਲੀ ਪ੍ਰੋਫਾਇਲ
|
||||
Comment[pl]=Profil Bluetooth synchronizacji
|
||||
Comment[pt]=Perfil de Sincronização Bluetooth
|
||||
Comment[pt_BR]=Perfil de Sincronização Bluetooth
|
||||
Comment[sr]=Bluetooth профил синхронизације
|
||||
Comment[sr@Latn]=Bluetooth profil sinhronizacije
|
||||
Comment[sv]=Blåtandsprofil för synkronisering
|
||||
Comment[ta]=புலுடுத் ஒத்திசை பக்கநோக்கு
|
||||
Comment[tr]=Bluetooth Eşzamanlama Profili
|
||||
Comment[xx]=xxBluetooth Synchronization Profilexx
|
@ -0,0 +1,9 @@
|
||||
[Desktop Entry]
|
||||
Encoding=UTF-8
|
||||
Type=MimeType
|
||||
MimeType=bluetooth/toy-device-class
|
||||
Icon=package_toys
|
||||
X-TDE-IsAlso=inode/directory
|
||||
Comment=Toy Bluetooth Device
|
||||
Comment[bg]=Играчка Bluetooth устройство
|
||||
Comment[xx]=xxToy Bluetooth Devicexx
|
@ -0,0 +1,33 @@
|
||||
[Desktop Entry]
|
||||
Encoding=UTF-8
|
||||
Comment=Unknown Bluetooth Profile
|
||||
Comment[ar]=مواصفات Bluetooth غير معروفة
|
||||
Comment[bg]=Неизвестен профил на Bluetooth
|
||||
Comment[br]=Profil Bluetooth dianav
|
||||
Comment[ca]=Perfil Bluetooth desconegut
|
||||
Comment[da]=Ukendt Bluetooth-profil
|
||||
Comment[de]=Unkekanntes Bluetooth Profil
|
||||
Comment[el]=Άγνωστο προφίλ Bluetooth
|
||||
Comment[es]=Perfil Bluetooth desconocido
|
||||
Comment[et]=Tundmatu Bluetoothi profiil
|
||||
Comment[fr]=Profil Bluetooth inconnu
|
||||
Comment[gl]=Perfil Bluetooth Descoñecido
|
||||
Comment[it]=Profilo Bluetooth ignoto
|
||||
Comment[ja]=未知の Bluetooth プロファイル
|
||||
Comment[lt]=Nežinomas Bluetooth profilis
|
||||
Comment[nl]=Onbekend Bluetooth-profiel
|
||||
Comment[pa]=ਅਣਜਾਣ ਬਲਿਊਟੁੱਥ ਪ੍ਰੋਫਾਇਲ
|
||||
Comment[pl]=Nieznany profil Bluetooth
|
||||
Comment[pt]=Perfil Bluetooth Desconhecido
|
||||
Comment[pt_BR]=Perfil Bluetooth Desconhecido
|
||||
Comment[sr]=Непознати bluetooth профил
|
||||
Comment[sr@Latn]=Nepoznati bluetooth profil
|
||||
Comment[sv]=Okänd Blåtandsprofil
|
||||
Comment[ta]=தெரியாத ப்ளூ டூத் விளக்கக்குறிப்பு
|
||||
Comment[tg]=Профили Bluetooth номуайян
|
||||
Comment[tr]=Bilinmeyen Bluetooth Profili
|
||||
Comment[xx]=xxUnknown Bluetooth Profilexx
|
||||
Icon=misc
|
||||
Type=MimeType
|
||||
MimeType=bluetooth/unknown-profile
|
||||
Patterns=
|
@ -0,0 +1,9 @@
|
||||
[Desktop Entry]
|
||||
Encoding=UTF-8
|
||||
Type=MimeType
|
||||
MimeType=bluetooth/wearable-device-class
|
||||
Icon=kaddressbook
|
||||
X-TDE-IsAlso=inode/directory
|
||||
Comment=Wearable Bluetooth Device
|
||||
Comment[bg]=Преносимо Bluetooth устройство
|
||||
Comment[xx]=xxWearable Bluetooth Devicexx
|
@ -0,0 +1,42 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?> <!-- -*- XML -*- -->
|
||||
<!DOCTYPE busconfig PUBLIC
|
||||
"-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"
|
||||
"http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
|
||||
<busconfig>
|
||||
<!-- Only root can own the service -->
|
||||
<policy user="root">
|
||||
<allow own="org.trinitydesktop.tdebluez"/>
|
||||
<allow send_destination="org.bluez"/>
|
||||
<allow send_destination="org.trinitydesktop.tdebluez"/>
|
||||
<allow send_path="/org/trinitydesktop/tdebluez"
|
||||
send_interface="org.bluez.Agent1"/>
|
||||
<allow send_path="/org/trinitydesktop/tdebluez"
|
||||
send_interface="org.freedesktop.DBus.Introspectable"/>
|
||||
</policy>
|
||||
|
||||
<policy at_console="true">
|
||||
<!-- Users with physical access to the machine are allowed access -->
|
||||
<allow send_destination="org.bluez"/>
|
||||
<allow send_destination="org.trinitydesktop.tdebluez"/>
|
||||
<allow send_path="/org/trinitydesktop/tdebluez"
|
||||
send_interface="org.freedesktop.DBus.Introspectable"/>
|
||||
<allow send_path="/org/trinitydesktop/tdebluez"
|
||||
send_interface="org.bluez.Agent1"/>
|
||||
</policy>
|
||||
|
||||
<!-- allow users of bluetooth group to communicate -->
|
||||
<policy group="bluetooth">
|
||||
<allow own="org.trinitydesktop.tdebluez"/>
|
||||
<allow send_destination="org.bluez"/>
|
||||
<allow send_destination="org.trinitydesktop.tdebluez"/>
|
||||
<allow send_path="/org/trinitydesktop/tdebluez"
|
||||
send_interface="org.freedesktop.DBus.Introspectable"/>
|
||||
<allow send_path="/org/trinitydesktop/tdebluez"
|
||||
send_interface="org.bluez.Agent1"/>
|
||||
</policy>
|
||||
|
||||
<policy context="default">
|
||||
<!-- Everyone else is denied access -->
|
||||
<deny send_destination="org.trinitydesktop.tdebluez"/>
|
||||
</policy>
|
||||
</busconfig>
|
@ -0,0 +1,4 @@
|
||||
[D-BUS Service]
|
||||
Name=org.trinitydesktop.tdebluez
|
||||
Exec=/bin/false
|
||||
User=root
|
@ -0,0 +1,7 @@
|
||||
[Desktop Entry]
|
||||
Encoding=UTF-8
|
||||
Name=Bluetooth
|
||||
Name[pa]=ਬਲਿਊਟੁੱਥ
|
||||
Name[sv]=Blåtand
|
||||
Name[xx]=xxBluetoothxx
|
||||
Icon=tdebluez
|
@ -0,0 +1,48 @@
|
||||
#################################################
|
||||
#
|
||||
# (C) 2018 Emanoil Kotsev
|
||||
# deloptes (AT) gmail.com
|
||||
#
|
||||
# Improvements and feedback are welcome
|
||||
#
|
||||
# This file is released under GPL >= 2
|
||||
#
|
||||
#################################################
|
||||
|
||||
project (tdebluez)
|
||||
|
||||
include_directories(
|
||||
${TDE_INCLUDE_DIR}
|
||||
${TQT_INCLUDE_DIRS}
|
||||
${CMAKE_CURRENT_BINARY_DIR}
|
||||
${CMAKE_SOURCE_DIR}
|
||||
${CMAKE_BINARY_DIR}
|
||||
${CMAKE_SOURCE_DIR}/src/libtdebluez
|
||||
${CMAKE_BINARY_DIR}/src/libtdebluez
|
||||
${CMAKE_SOURCE_DIR}/src/tdebluezauth
|
||||
# ${DBUS_INCLUDE_DIRS}
|
||||
${DBUS_TQT_INCLUDE_DIRS}
|
||||
)
|
||||
|
||||
link_directories(
|
||||
${TQT_LIBRARY_DIRS}
|
||||
)
|
||||
|
||||
##### tdebluez (tdeinit) ######################
|
||||
tde_add_tdeinit_executable( tdebluez AUTOMOC
|
||||
SOURCES
|
||||
adapterconfig.cpp adapterdialog.ui application.cpp
|
||||
devicedialog.ui devicedialog_ext.ui adapterconfigdialog.cpp
|
||||
devicewizard.cpp devicesetupwizarddialog.ui devicesetupwizard.cpp
|
||||
mediacontrol.cpp mediactl.ui trayicon.cpp main.cpp
|
||||
LINK
|
||||
${DBUS_TQT_LIBRARIES} tdecore-shared tdeui-shared tdeio-shared tdebluez-shared bluezinterfaces-static
|
||||
${XEXT_LIBRARIES} ${XTST_LIBRARIES} ${XSCRNSAVER_LIBRARIES}
|
||||
DESTINATION ${BIN_INSTALL_DIR}
|
||||
)
|
||||
|
||||
##### other data ################################
|
||||
#
|
||||
install( FILES tdebluez.desktop DESTINATION ${XDG_APPS_INSTALL_DIR} )
|
||||
install( FILES tdebluez.autostart.desktop DESTINATION ${AUTOSTART_INSTALL_DIR} )
|
||||
install( FILES eventsrc DESTINATION ${DATA_INSTALL_DIR}/tdebluez )
|
@ -0,0 +1,386 @@
|
||||
/*
|
||||
*
|
||||
* Adapter config dialog for tdebluez
|
||||
*
|
||||
* Copyright (C) 2018 Emanoil Kotsev <deloptes@gmail.com>
|
||||
*
|
||||
*
|
||||
* This file is part of tdebluez.
|
||||
*
|
||||
* tdebluez 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.
|
||||
*
|
||||
* tdebluez 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 kbluetooth; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
*/
|
||||
|
||||
#include <kdebug.h>
|
||||
#include "adapterconfig.h"
|
||||
#include <devicemimeconverter.h>
|
||||
|
||||
#include <btuuids.h>
|
||||
|
||||
AdapterConfig::AdapterConfig(ObjectManagerImpl *mgr, AdapterImpl *a)
|
||||
{
|
||||
adapterDialog = new AdapterDialog();
|
||||
manager = mgr;
|
||||
adapter = a;
|
||||
|
||||
TQT_DBusError dbuserr;
|
||||
name = adapter->getAlias(dbuserr);
|
||||
if (dbuserr.isValid())
|
||||
tqDebug("Get alias for the adapter failed: %s", dbuserr.message().local8Bit().data());
|
||||
|
||||
adapterDialog->deviceModes->insertItem(i18n("Hidden"));
|
||||
adapterDialog->deviceModes->insertItem(i18n("Always visible"));
|
||||
adapterDialog->deviceModes->insertItem(i18n("Temporary visible"));
|
||||
|
||||
adapterDialog->deviceClass->insertItem(i18n("Unknown"));
|
||||
adapterDialog->deviceClass->insertItem(i18n("Computer"));
|
||||
adapterDialog->deviceClass->setEnabled(false);
|
||||
|
||||
adapterDialog->adapterName->setText(name);
|
||||
|
||||
addAdapterDialogInfo();
|
||||
|
||||
// ADAPTER -> MANAGER -> DIALOG
|
||||
connect(manager, SIGNAL(adapterNameChanged(const TQString&,const TQString&)),
|
||||
this, TQT_SLOT(slotAdapterNameChanged(const TQString&, const TQString&)));
|
||||
connect(manager, SIGNAL(adapterAliasChanged(const TQString&,const TQString&)),
|
||||
this, TQT_SLOT(slotAdapterNameChanged(const TQString&, const TQString&)));
|
||||
|
||||
connect(manager, SIGNAL(adapterDiscoverableTimeoutChanged(const TQString&, TQ_UINT32)),
|
||||
this, TQT_SLOT(slotDiscoverableTimeoutChanged(const TQString&, TQ_UINT32)));
|
||||
connect(manager, SIGNAL(adapterDiscoverableChanged(const TQString&, bool)),
|
||||
this, TQT_SLOT(slotDiscoverableChanged(const TQString&, bool)));
|
||||
connect(manager, SIGNAL(adapterPowerOnChanged(const TQString&, bool)), this, TQT_SLOT(slotPowerOnChanged(const TQString&, bool)));
|
||||
|
||||
// DIALOG -> ADAPTER
|
||||
connect(adapterDialog->adapterName, SIGNAL(textChanged(const TQString &)),
|
||||
this, TQT_SLOT(slotChangeName(const TQString &)));
|
||||
connect(adapterDialog->deviceModes, SIGNAL(activated(int)),
|
||||
this, TQT_SLOT(slotSetMode(int)));
|
||||
// connect(adapterDialog->deviceClass, SIGNAL(activated(const TQString &)),
|
||||
// this, TQT_SLOT(slotSetClass(const TQString &)));
|
||||
connect(adapterDialog->sliderTimeout, SIGNAL(valueChanged(int)),
|
||||
this, TQT_SLOT(slotChangeTimeout(int)));
|
||||
|
||||
adapterDialog->setModal(false);
|
||||
}
|
||||
|
||||
AdapterConfig::~AdapterConfig()
|
||||
{
|
||||
if (adapterDialog)
|
||||
delete adapterDialog;
|
||||
}
|
||||
|
||||
void AdapterConfig::addAdapterDialogInfo()
|
||||
{
|
||||
TQT_DBusError dbuserr;
|
||||
bool disc = adapter->getDiscoverable(dbuserr);
|
||||
int timeout = adapter->getDiscoverableTimeout(dbuserr);
|
||||
if (disc)
|
||||
{
|
||||
if (timeout > 0)
|
||||
{
|
||||
adapterDialog->deviceModes->setCurrentItem(2);
|
||||
adapterDialog->timeout->setNum(int(timeout) / 60);
|
||||
adapterDialog->timeout->setText(adapterDialog->timeout->text().append(i18n("min")));
|
||||
adapterDialog->sliderTimeout->setValue(timeout);
|
||||
|
||||
adapterDialog->sliderTimeout->setEnabled(true);
|
||||
adapterDialog->timeout->setEnabled(true);
|
||||
adapterDialog->textLabel9->setEnabled(true);
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
adapterDialog->deviceModes->setCurrentItem(1);
|
||||
adapterDialog->timeout->setNum(int(timeout) / 60);
|
||||
adapterDialog->timeout->setText(adapterDialog->timeout->text().append(i18n("min")));
|
||||
adapterDialog->sliderTimeout->setValue(timeout);
|
||||
|
||||
adapterDialog->sliderTimeout->setEnabled(false);
|
||||
adapterDialog->timeout->setEnabled(false);
|
||||
adapterDialog->textLabel9->setEnabled(false);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
adapterDialog->deviceModes->setCurrentItem(0);
|
||||
adapterDialog->timeout->setText(i18n("none"));
|
||||
adapterDialog->sliderTimeout->setValue(0);
|
||||
|
||||
adapterDialog->sliderTimeout->setEnabled(false);
|
||||
adapterDialog->timeout->setEnabled(false);
|
||||
adapterDialog->textLabel9->setEnabled(false);
|
||||
}
|
||||
|
||||
slotSetClass(DeviceMimeConverter::classToMimeType(adapter->getClass(dbuserr)));
|
||||
if (dbuserr.isValid())
|
||||
tqDebug("Get class for the adapter failed: %s", dbuserr.message().local8Bit().data());
|
||||
|
||||
TQString address = adapter->getAddress(dbuserr);
|
||||
if (dbuserr.isValid())
|
||||
tqDebug("Get address for the adapter failed: %s", dbuserr.message().local8Bit().data());
|
||||
TQStringList uuids = adapter->getUUIDs(dbuserr);
|
||||
if (dbuserr.isValid())
|
||||
tqDebug("Get uuids for the adapter failed: %s", dbuserr.message().local8Bit().data());
|
||||
TQVBoxLayout *infoLayout = new TQVBoxLayout(adapterDialog->groupBoxInfo->layout());
|
||||
// GridLayout *infoGrid = new TQGridLayout(adapterDialog->groupBoxInfo->layout());
|
||||
|
||||
if (!address.isNull())
|
||||
adapterDialog->macLabel->setText(i18n("MAC Address: <b>%1</b>").arg(address));
|
||||
|
||||
if (!uuids.isEmpty())
|
||||
{
|
||||
TQString supported;
|
||||
// DeviceList;
|
||||
for (TQStringList::iterator it = uuids.begin(); it != uuids.end(); ++it)
|
||||
{
|
||||
supported += resolveUUID((*it)) + ", ";
|
||||
}
|
||||
adapterDialog->verLabel->setText(i18n("<p>Services:<br/><b>%1</b></p>").arg(supported.left(supported.length() - 2)));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//from adapter
|
||||
|
||||
void AdapterConfig::slotAdapterNameChanged(const TQString &path, const TQString &n)
|
||||
{
|
||||
if (path != adapter->getPath())
|
||||
return;
|
||||
name = n;
|
||||
disconnect(adapterDialog->adapterName, SIGNAL(textChanged(const TQString &)),
|
||||
this, TQT_SLOT(slotChangeName(const TQString &)));
|
||||
|
||||
adapterDialog->adapterName->setText(name);
|
||||
|
||||
connect(adapterDialog->adapterName, SIGNAL(textChanged(const TQString &)),
|
||||
this, TQT_SLOT(slotChangeName(const TQString &)));
|
||||
}
|
||||
|
||||
void AdapterConfig::slotPowerOnChanged(const TQString &path, bool state)
|
||||
{
|
||||
if (path != adapter->getPath())
|
||||
return;
|
||||
|
||||
addAdapterDialogInfo();
|
||||
|
||||
adapterDialog->setEnabled(state);
|
||||
}
|
||||
|
||||
void AdapterConfig::slotDiscoverableChanged(const TQString &path, bool changed)
|
||||
{
|
||||
if (path != adapter->getPath())
|
||||
return;
|
||||
|
||||
TQT_DBusError dbuserr;
|
||||
TQ_UINT32 timeout = adapter->getDiscoverableTimeout(dbuserr);
|
||||
if (dbuserr.isValid())
|
||||
tqDebug("Get discoverable timeout for the adapter failed: %s", dbuserr.message().local8Bit().data());
|
||||
disconnect(adapterDialog->deviceModes, SIGNAL(activated(int)),
|
||||
this, TQT_SLOT(slotSetMode(int)));
|
||||
disconnect(adapterDialog->sliderTimeout, SIGNAL(valueChanged(int)),
|
||||
this, TQT_SLOT(slotChangeTimeout(int)));
|
||||
|
||||
if (changed)
|
||||
{
|
||||
if (timeout > 0)
|
||||
{
|
||||
adapterDialog->deviceModes->setCurrentItem(2);
|
||||
adapterDialog->timeout->setNum(int(timeout) / 60);
|
||||
adapterDialog->timeout->setText(adapterDialog->timeout->text().append(i18n("min")));
|
||||
adapterDialog->sliderTimeout->setValue(timeout);
|
||||
adapterDialog->sliderTimeout->setEnabled(false);
|
||||
adapterDialog->timeout->setEnabled(false);
|
||||
adapterDialog->textLabel9->setEnabled(false);
|
||||
}
|
||||
else
|
||||
{
|
||||
adapterDialog->deviceModes->setCurrentItem(1);
|
||||
adapterDialog->timeout->setNum(int(timeout) / 60);
|
||||
adapterDialog->timeout->setText(adapterDialog->timeout->text().append(i18n("min")));
|
||||
adapterDialog->sliderTimeout->setValue(timeout);
|
||||
adapterDialog->sliderTimeout->setEnabled(true);
|
||||
adapterDialog->timeout->setEnabled(true);
|
||||
adapterDialog->textLabel9->setEnabled(true);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
adapterDialog->deviceModes->setCurrentItem(0);
|
||||
adapterDialog->sliderTimeout->setValue(0);
|
||||
adapterDialog->timeout->setText(i18n("none"));
|
||||
adapterDialog->sliderTimeout->setEnabled(false);
|
||||
adapterDialog->timeout->setEnabled(false);
|
||||
adapterDialog->textLabel9->setEnabled(false);
|
||||
}
|
||||
connect(adapterDialog->deviceModes, SIGNAL(activated(int)),
|
||||
this, TQT_SLOT(slotSetMode(int)));
|
||||
connect(adapterDialog->sliderTimeout, SIGNAL(valueChanged(int)),
|
||||
this, TQT_SLOT(slotChangeTimeout(int)));
|
||||
}
|
||||
|
||||
void AdapterConfig::slotDiscoverableTimeoutChanged(const TQString &path, TQ_UINT32 timeout)
|
||||
{
|
||||
if (path != adapter->getPath())
|
||||
return;
|
||||
|
||||
disconnect(adapterDialog->sliderTimeout, SIGNAL(valueChanged(int)),
|
||||
this, TQT_SLOT(slotChangeTimeout(int)));
|
||||
|
||||
if (timeout == 0)
|
||||
{
|
||||
adapterDialog->sliderTimeout->setValue(0);
|
||||
adapterDialog->timeout->setText(i18n("none"));
|
||||
adapterDialog->sliderTimeout->setEnabled(false);
|
||||
adapterDialog->timeout->setEnabled(false);
|
||||
adapterDialog->textLabel9->setEnabled(false);
|
||||
}
|
||||
else
|
||||
{
|
||||
adapterDialog->timeout->setNum(int(timeout) / 60);
|
||||
adapterDialog->timeout->setText(adapterDialog->timeout->text().append(i18n("min")));
|
||||
adapterDialog->sliderTimeout->setValue(int(timeout));
|
||||
adapterDialog->sliderTimeout->setEnabled(true);
|
||||
adapterDialog->timeout->setEnabled(true);
|
||||
adapterDialog->textLabel9->setEnabled(true);
|
||||
}
|
||||
connect(adapterDialog->sliderTimeout, SIGNAL(valueChanged(int)),
|
||||
this, TQT_SLOT(slotChangeTimeout(int)));
|
||||
}
|
||||
|
||||
// from dialog
|
||||
void AdapterConfig::slotChangeName(const TQString &n)
|
||||
{
|
||||
name = n;
|
||||
TQT_DBusError dbuserr;
|
||||
if (adapterDialog->adapterName->text() != name)
|
||||
{
|
||||
//otherwise signal textchanged() from the dialog and slot nameChanged
|
||||
//from the adapter will end in a endless loop.
|
||||
disconnect(manager, SIGNAL(adapterNameChanged(const TQString&,const TQString&)),
|
||||
this, TQT_SLOT(slotAdapterNameChanged(const TQString&, const TQString&)));
|
||||
disconnect(manager, SIGNAL(adapterAliasChanged(const TQString&,const TQString&)),
|
||||
this, TQT_SLOT(slotAdapterNameChanged(const TQString&, const TQString&)));
|
||||
|
||||
// adapterDialog->adapterName->setText(name);
|
||||
adapter->setAlias(name, dbuserr);
|
||||
if (dbuserr.isValid())
|
||||
tqDebug("Set alias for the adapter failed: %s", dbuserr.message().local8Bit().data());
|
||||
|
||||
connect(manager, SIGNAL(adapterNameChanged(const TQString&,const TQString&)),
|
||||
this, TQT_SLOT(slotAdapterNameChanged(const TQString&, const TQString&)));
|
||||
connect(manager, SIGNAL(adapterAliasChanged(const TQString&,const TQString&)),
|
||||
this, TQT_SLOT(slotAdapterNameChanged(const TQString&, const TQString&)));
|
||||
}
|
||||
}
|
||||
|
||||
void AdapterConfig::slotChangeTimeout(int timeout)
|
||||
{
|
||||
// Disconnect signal of valueChanged!
|
||||
// D-Bus signal get emmited immeditaly ..
|
||||
// and would trigger a endless loop of signals!
|
||||
TQT_DBusError dbuserr;
|
||||
disconnect(manager, SIGNAL(adapterDiscoverableChanged(const TQString&, bool)),
|
||||
this, TQT_SLOT(slotDiscoverableChanged(const TQString&, bool)));
|
||||
disconnect(manager, SIGNAL(adapterDiscoverableTimeoutChanged(const TQString&, TQ_UINT32)),
|
||||
this, TQT_SLOT(slotDiscoverableTimeoutChanged(const TQString&, TQ_UINT32)));
|
||||
|
||||
adapterDialog->timeout->setNum(int(timeout) / 60);
|
||||
adapterDialog->sliderTimeout->setValue(int(timeout));
|
||||
adapterDialog->timeout->setText(adapterDialog->timeout->text().append(i18n("min")));
|
||||
adapter->setDiscoverableTimeout(timeout, dbuserr);
|
||||
if (dbuserr.isValid())
|
||||
tqDebug("Set discoverable timeout for the adapter failed: %s", dbuserr.message().local8Bit().data());
|
||||
|
||||
connect(manager, SIGNAL(adapterDiscoverableChanged(const TQString&, bool)),
|
||||
this, TQT_SLOT(slotDiscoverableChanged(const TQString&, bool)));
|
||||
connect(manager, SIGNAL(adapterDiscoverableTimeoutChanged(const TQString&, TQ_UINT32)),
|
||||
this, TQT_SLOT(slotDiscoverableTimeoutChanged(const TQString&, TQ_UINT32)));
|
||||
}
|
||||
|
||||
void AdapterConfig::slotSetMode(int modenr)
|
||||
{
|
||||
|
||||
TQT_DBusError dbuserr;
|
||||
int timeout = adapter->getDiscoverableTimeout(dbuserr);
|
||||
if (dbuserr.isValid())
|
||||
tqDebug("Get discoverable timeout for the adapter failed: %s", dbuserr.message().local8Bit().data());
|
||||
|
||||
// Disconnect signal of valueChanged!
|
||||
// D-Bus signal get emmited immeditaly ..
|
||||
// and would trigger a endless loop of signals!
|
||||
disconnect(adapterDialog->deviceModes, SIGNAL(activated(int)),
|
||||
this, TQT_SLOT(slotSetMode(int)));
|
||||
disconnect(adapterDialog->sliderTimeout, SIGNAL(valueChanged(int)),
|
||||
this, TQT_SLOT(slotChangeTimeout(int)));
|
||||
disconnect(manager, SIGNAL(adapterDiscoverableChanged(const TQString&, bool)),
|
||||
this, TQT_SLOT(slotDiscoverableChanged(const TQString&, bool)));
|
||||
disconnect(manager, SIGNAL(adapterDiscoverableTimeoutChanged(const TQString&, TQ_UINT32)),
|
||||
this, TQT_SLOT(slotDiscoverableTimeoutChanged(const TQString&, TQ_UINT32)));
|
||||
|
||||
switch (modenr)
|
||||
{
|
||||
case 0:
|
||||
case 1:
|
||||
timeout = 0;
|
||||
adapterDialog->timeout->setText(i18n("none"));
|
||||
adapterDialog->sliderTimeout->setValue(timeout);
|
||||
|
||||
adapterDialog->sliderTimeout->setEnabled(false);
|
||||
adapterDialog->timeout->setEnabled(false);
|
||||
adapterDialog->textLabel9->setEnabled(false);
|
||||
break;
|
||||
case 2:
|
||||
if (timeout == 0)
|
||||
timeout = 180;
|
||||
adapterDialog->timeout->setNum(timeout / 60);
|
||||
adapterDialog->timeout->setText(adapterDialog->timeout->text().append(i18n("min")));
|
||||
adapterDialog->sliderTimeout->setValue(timeout);
|
||||
|
||||
adapterDialog->sliderTimeout->setEnabled(true);
|
||||
adapterDialog->timeout->setEnabled(true);
|
||||
adapterDialog->textLabel9->setEnabled(true);
|
||||
break;
|
||||
}
|
||||
adapter->setDiscoverable(((modenr > 0) ? true : false), dbuserr);
|
||||
adapter->setDiscoverableTimeout(timeout, dbuserr);
|
||||
if (dbuserr.isValid())
|
||||
tqDebug("Get discoverable for the adapter failed: %s", dbuserr.message().local8Bit().data());
|
||||
|
||||
connect(adapterDialog->deviceModes, SIGNAL(activated(int)),
|
||||
this, TQT_SLOT(slotSetMode(int)));
|
||||
connect(adapterDialog->sliderTimeout, SIGNAL(valueChanged(int)),
|
||||
this, TQT_SLOT(slotChangeTimeout(int)));
|
||||
|
||||
connect(manager, SIGNAL(adapterDiscoverableChanged(const TQString&, bool)),
|
||||
this, TQT_SLOT(slotDiscoverableChanged(const TQString&, bool)));
|
||||
connect(manager, SIGNAL(adapterDiscoverableTimeoutChanged(const TQString&, TQ_UINT32)),
|
||||
this, TQT_SLOT(slotDiscoverableTimeoutChanged(const TQString&, TQ_UINT32)));
|
||||
}
|
||||
|
||||
void AdapterConfig::slotSetClass(const TQString & deviceClass)
|
||||
{
|
||||
if (deviceClass == "bluetooth/computer-device-class")
|
||||
{
|
||||
adapterDialog->deviceClass->setCurrentItem(1);
|
||||
}
|
||||
else
|
||||
{
|
||||
adapterDialog->deviceClass->setCurrentItem(0);
|
||||
}
|
||||
}
|
||||
|
||||
#include "adapterconfig.moc"
|
@ -0,0 +1,83 @@
|
||||
/*
|
||||
*
|
||||
* Adapter config dialog for tdebluez
|
||||
*
|
||||
* Copyright (C) 2018 Emanoil Kotsev <deloptes@gmail.com>
|
||||
*
|
||||
*
|
||||
* This file is part of tdebluez.
|
||||
*
|
||||
* tdebluez 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.
|
||||
*
|
||||
* tdebluez 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 kbluetooth; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
*/
|
||||
#ifndef ADAPTERCONFIG_H_
|
||||
#define ADAPTERCONFIG_H_
|
||||
|
||||
#include <tqlabel.h>
|
||||
#include <tqlineedit.h>
|
||||
#include <tqtabwidget.h>
|
||||
#include <tqlayout.h>
|
||||
#include <tqgroupbox.h>
|
||||
#include <tqcombobox.h>
|
||||
#include <tqobject.h>
|
||||
#include <tqslider.h>
|
||||
|
||||
#include <adapterImpl.h>
|
||||
|
||||
#include "adapterdialog.h"
|
||||
#include "application.h"
|
||||
|
||||
using namespace TDEBluetooth;
|
||||
|
||||
class AdapterConfig: public TQObject
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
AdapterConfig(ObjectManagerImpl *mgr, AdapterImpl *adapter);
|
||||
~AdapterConfig();
|
||||
|
||||
AdapterDialog *dialog() const
|
||||
{
|
||||
return adapterDialog;
|
||||
}
|
||||
;
|
||||
TQString getName()
|
||||
{
|
||||
return name;
|
||||
}
|
||||
;
|
||||
|
||||
public slots:
|
||||
// from adapter
|
||||
void slotAdapterNameChanged(const TQString&, const TQString&);
|
||||
void slotPowerOnChanged(const TQString&, bool);
|
||||
void slotDiscoverableChanged(const TQString&, bool);
|
||||
void slotDiscoverableTimeoutChanged(const TQString&, TQ_UINT32 timeout);
|
||||
// from dialog
|
||||
void slotChangeName(const TQString& name);
|
||||
void slotSetMode(int);
|
||||
void slotSetClass(const TQString& mime);
|
||||
void slotChangeTimeout(int timeout);
|
||||
|
||||
private:
|
||||
AdapterDialog *adapterDialog;
|
||||
AdapterImpl *adapter;
|
||||
ObjectManagerImpl *manager;
|
||||
TQString name;
|
||||
void addAdapterDialogInfo();
|
||||
};
|
||||
|
||||
#endif // ADAPTERCONFIG_H_
|
@ -0,0 +1,141 @@
|
||||
/*
|
||||
*
|
||||
* Adapter Manager Gui for tdebluez
|
||||
*
|
||||
* Copyright (C) 2018 Emanoil Kotsev <deloptes@gmail.com>
|
||||
*
|
||||
*
|
||||
* This file is part of tdebluez.
|
||||
*
|
||||
* tdebluez 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.
|
||||
*
|
||||
* tdebluez 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 kbluetooth; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
*/
|
||||
|
||||
#include "adapterconfig.h"
|
||||
#include "adapterconfigdialog.h"
|
||||
|
||||
AdapterConfigDialog::AdapterConfigDialog(TDEBluetoothApp *_app) :
|
||||
KDialogBase(NULL, "AdapterConfigDialog", true, "Adapter Configuration", (Ok)), app(_app), manager(_app->manager)
|
||||
{
|
||||
nodevice = NULL;
|
||||
tabWidget = new TQTabWidget(this);
|
||||
|
||||
ObjectManagerImpl::AdapterList list = manager->getAdapters();
|
||||
ObjectManagerImpl::AdapterList::iterator it;
|
||||
for (it = list.begin(); it != list.end(); ++it)
|
||||
addAdapter((*it));
|
||||
|
||||
if (list.count() == 0)
|
||||
{
|
||||
nodevice = new TQLabel(i18n("No Bluetooth adapter found!"), this);
|
||||
tabWidget->addTab(nodevice, i18n("no adapter"));
|
||||
tabWidget->setMinimumSize(250, 300);
|
||||
}
|
||||
|
||||
tabWidget->show();
|
||||
setMainWidget(tabWidget);
|
||||
setModal(false);
|
||||
|
||||
connect(this, SIGNAL(okClicked()), this, TQT_SLOT(hide()));
|
||||
connect(manager, SIGNAL(adapterAdded(const TQString&)), TQT_SLOT(addAdapter(const TQString&)));
|
||||
connect(manager, SIGNAL(adapterRemoved(const TQString&)), TQT_SLOT(removeAdapter(const TQString&)));
|
||||
connect(tabWidget, SIGNAL(currentChanged(TQWidget *)), this, TQT_SLOT(slotCurrentChanged(TQWidget *)));
|
||||
}
|
||||
|
||||
AdapterConfigDialog::~AdapterConfigDialog()
|
||||
{
|
||||
close();
|
||||
if (nodevice)
|
||||
delete nodevice;
|
||||
delete tabWidget;
|
||||
// tabWidget = 0;
|
||||
}
|
||||
|
||||
void AdapterConfigDialog::addAdapter(const TQString &path)
|
||||
{
|
||||
AdapterConfig *aconfig = new AdapterConfig(app->manager, app->adapters[path]);
|
||||
tabWidget->addTab(aconfig->dialog(), aconfig->getName());
|
||||
|
||||
TQT_DBusError dbuserr;
|
||||
bool powered = app->adapters[path]->getPowered(dbuserr);
|
||||
if (dbuserr.isValid())
|
||||
tqDebug("Adapter getPowered failed: %s", dbuserr.message().local8Bit().data());
|
||||
|
||||
aconfig->dialog()->setEnabled(powered);
|
||||
//
|
||||
// if (tabWidget->isTabEnabled(aconfig->dialog()))
|
||||
// {
|
||||
tabWidget->showPage(aconfig->dialog());
|
||||
// }
|
||||
adapterList.insert(path, aconfig);
|
||||
|
||||
connect(aconfig->dialog()->adapterName, SIGNAL(textChanged(const TQString &)),
|
||||
this, TQT_SLOT(slotChangeName(const TQString &)));
|
||||
connect(aconfig->dialog()->adapterName, SIGNAL(textChanged(const TQString &)),
|
||||
app->adapters[path], TQT_SLOT(slotSetAlias(const TQString &)));
|
||||
|
||||
if (nodevice)
|
||||
{
|
||||
tabWidget->removePage(nodevice);
|
||||
nodevice = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void AdapterConfigDialog::removeAdapter(const TQString &path)
|
||||
{
|
||||
AdapterConfig *aconfig = adapterList[path];
|
||||
if (!aconfig)
|
||||
return;
|
||||
|
||||
tabWidget->removePage(aconfig->dialog());
|
||||
delete adapterList[path];
|
||||
adapterList.remove(path);
|
||||
|
||||
if (adapterList.count() == 0)
|
||||
{
|
||||
nodevice = new TQLabel(i18n("No Bluetooth device found!"), tabWidget);
|
||||
tabWidget->addTab(nodevice, i18n("no device"));
|
||||
if (tabWidget->isTabEnabled(nodevice))
|
||||
{
|
||||
tabWidget->showPage(nodevice);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void AdapterConfigDialog::slotChangeName(const TQString &name)
|
||||
{
|
||||
tabWidget->changeTab(tabWidget->currentPage(), name);
|
||||
}
|
||||
|
||||
void AdapterConfigDialog::slotCurrentChanged(TQWidget *widget)
|
||||
{
|
||||
TQMap<TQString,AdapterConfig *>::iterator it;
|
||||
for (it = adapterList.begin(); it != adapterList.end(); ++it)
|
||||
{
|
||||
if (it.data()->dialog() == widget)
|
||||
{
|
||||
TQString path = it.key();
|
||||
TQT_DBusError dbuserr;
|
||||
TQString name = app->adapters[path]->getAlias(dbuserr);
|
||||
if (dbuserr.isValid())
|
||||
tqDebug("Adapter getAlias failed: %s", dbuserr.message().local8Bit().data());
|
||||
// kdDebug() << "Adapter changed: " << it.data()->dialog()->macLabel->text() << endl;
|
||||
emit signalAdapterSelected(path,name);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#include "adapterconfigdialog.moc"
|
@ -0,0 +1,70 @@
|
||||
/*
|
||||
*
|
||||
* Adapter Manager Gui for tdebluez
|
||||
*
|
||||
* Copyright (C) 2018 Emanoil Kotsev <deloptes@gmail.com>
|
||||
*
|
||||
*
|
||||
* This file is part of tdebluez.
|
||||
*
|
||||
* tdebluez 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.
|
||||
*
|
||||
* tdebluez 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 kbluetooth; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
*/
|
||||
#ifndef ADAPTERCONFIGDIALOG_H_
|
||||
#define ADAPTERCONFIGDIALOG_H_
|
||||
|
||||
#include <tqmap.h>
|
||||
#include <kdialogbase.h>
|
||||
|
||||
#include <adapterImpl.h>
|
||||
|
||||
#include "application.h"
|
||||
#include "adapterconfig.h"
|
||||
|
||||
using namespace TDEBluetooth;
|
||||
|
||||
class AdapterConfigDialog: public KDialogBase
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
AdapterConfigDialog(TDEBluetoothApp *app);
|
||||
~AdapterConfigDialog();
|
||||
|
||||
public slots:
|
||||
void addAdapter(const TQString&);
|
||||
void removeAdapter(const TQString&);
|
||||
void slotChangeName(const TQString&);
|
||||
void slotCurrentChanged(TQWidget *);
|
||||
|
||||
signals:
|
||||
void signalAdapterSelected(const TQString&, const TQString&);
|
||||
|
||||
private:
|
||||
TQLabel *nodevice;
|
||||
|
||||
TDEBluetoothApp *app;
|
||||
ObjectManagerImpl *manager;
|
||||
TQMap<TQString,AdapterConfig *> adapterList;
|
||||
|
||||
void addAdapterDialog(AdapterImpl *adapter);
|
||||
void addAdapterDialogInfo(AdapterImpl &adapater,
|
||||
AdapterDialog *adapterDialog);
|
||||
|
||||
TQTabWidget *tabWidget;
|
||||
};
|
||||
|
||||
#endif // ADAPTERCONFIGDIALOG_H_
|
||||
|
@ -0,0 +1,346 @@
|
||||
<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
|
||||
<class>AdapterDialog</class>
|
||||
<widget class="TQDialog">
|
||||
<property name="name">
|
||||
<cstring>AdapterDialog</cstring>
|
||||
</property>
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>404</width>
|
||||
<height>385</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="caption">
|
||||
<string>AdapterDialog</string>
|
||||
</property>
|
||||
<vbox>
|
||||
<widget class="TQGroupBox">
|
||||
<property name="name">
|
||||
<cstring>groupBoxSettings</cstring>
|
||||
</property>
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>21</x>
|
||||
<y>21</y>
|
||||
<width>360</width>
|
||||
<height>218</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy>
|
||||
<hsizetype>5</hsizetype>
|
||||
<vsizetype>0</vsizetype>
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>360</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="font">
|
||||
<font>
|
||||
</font>
|
||||
</property>
|
||||
<property name="title">
|
||||
<string>Device Settings</string>
|
||||
</property>
|
||||
<hbox>
|
||||
<property name="name">
|
||||
<cstring>unnamed</cstring>
|
||||
</property>
|
||||
<widget class="TQLayoutWidget">
|
||||
<property name="name">
|
||||
<cstring>layout11</cstring>
|
||||
</property>
|
||||
<vbox>
|
||||
<property name="name">
|
||||
<cstring>unnamed</cstring>
|
||||
</property>
|
||||
<widget class="TQLayoutWidget">
|
||||
<property name="name">
|
||||
<cstring>layout13</cstring>
|
||||
</property>
|
||||
<vbox>
|
||||
<property name="name">
|
||||
<cstring>unnamed</cstring>
|
||||
</property>
|
||||
<widget class="TQLayoutWidget">
|
||||
<property name="name">
|
||||
<cstring>layoutName</cstring>
|
||||
</property>
|
||||
<vbox>
|
||||
<property name="name">
|
||||
<cstring>unnamed</cstring>
|
||||
</property>
|
||||
<widget class="TQLabel">
|
||||
<property name="name">
|
||||
<cstring>textLabel10</cstring>
|
||||
</property>
|
||||
<property name="font">
|
||||
<font>
|
||||
</font>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Adapter Name:</string>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="TQLineEdit">
|
||||
<property name="name">
|
||||
<cstring>adapterName</cstring>
|
||||
</property>
|
||||
<property name="font">
|
||||
<font>
|
||||
</font>
|
||||
</property>
|
||||
</widget>
|
||||
</vbox>
|
||||
</widget>
|
||||
<widget class="TQLayoutWidget">
|
||||
<property name="name">
|
||||
<cstring>layout12</cstring>
|
||||
</property>
|
||||
<hbox>
|
||||
<property name="name">
|
||||
<cstring>unnamed</cstring>
|
||||
</property>
|
||||
<widget class="TQLabel">
|
||||
<property name="name">
|
||||
<cstring>textLabel1</cstring>
|
||||
</property>
|
||||
<property name="font">
|
||||
<font>
|
||||
</font>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Mode:</string>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="TQComboBox">
|
||||
<property name="name">
|
||||
<cstring>deviceModes</cstring>
|
||||
</property>
|
||||
<property name="font">
|
||||
<font>
|
||||
</font>
|
||||
</property>
|
||||
<property name="currentItem">
|
||||
<number>0</number>
|
||||
</property>
|
||||
</widget>
|
||||
</hbox>
|
||||
</widget>
|
||||
<widget class="TQLayoutWidget">
|
||||
<property name="name">
|
||||
<cstring>layout10</cstring>
|
||||
</property>
|
||||
<hbox>
|
||||
<property name="name">
|
||||
<cstring>unnamed</cstring>
|
||||
</property>
|
||||
<widget class="TQLabel">
|
||||
<property name="name">
|
||||
<cstring>textLabel9</cstring>
|
||||
</property>
|
||||
<property name="font">
|
||||
<font>
|
||||
</font>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Discoverable Timeout:</string>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="TQLabel">
|
||||
<property name="name">
|
||||
<cstring>timeout</cstring>
|
||||
</property>
|
||||
<property name="font">
|
||||
<font>
|
||||
</font>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string></string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>AlignVCenter|AlignRight</set>
|
||||
</property>
|
||||
</widget>
|
||||
</hbox>
|
||||
</widget>
|
||||
<widget class="TQSlider">
|
||||
<property name="name">
|
||||
<cstring>sliderTimeout</cstring>
|
||||
</property>
|
||||
<property name="paletteForegroundColor">
|
||||
<color>
|
||||
<red>0</red>
|
||||
<green>0</green>
|
||||
<blue>0</blue>
|
||||
</color>
|
||||
</property>
|
||||
<property name="minValue">
|
||||
<number>60</number>
|
||||
</property>
|
||||
<property name="maxValue">
|
||||
<number>900</number>
|
||||
</property>
|
||||
<property name="lineStep">
|
||||
<number>60</number>
|
||||
</property>
|
||||
<property name="pageStep">
|
||||
<number>120</number>
|
||||
</property>
|
||||
<property name="orientation">
|
||||
<enum>Horizontal</enum>
|
||||
</property>
|
||||
<property name="tickmarks">
|
||||
<enum>NoMarks</enum>
|
||||
</property>
|
||||
<property name="toolTip" stdset="0">
|
||||
<string>Timeout after the adapter gets invisible</string>
|
||||
</property>
|
||||
</widget>
|
||||
</vbox>
|
||||
</widget>
|
||||
<widget class="TQLayoutWidget">
|
||||
<property name="name">
|
||||
<cstring>layout8</cstring>
|
||||
</property>
|
||||
<hbox>
|
||||
<property name="name">
|
||||
<cstring>unnamed</cstring>
|
||||
</property>
|
||||
<widget class="TQLabel">
|
||||
<property name="name">
|
||||
<cstring>textLabel1_2</cstring>
|
||||
</property>
|
||||
<property name="font">
|
||||
<font>
|
||||
</font>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Class of Device:</string>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="TQComboBox">
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>Unspecified</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>Desktop</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>Laptop</string>
|
||||
</property>
|
||||
</item>
|
||||
<property name="name">
|
||||
<cstring>deviceClass</cstring>
|
||||
</property>
|
||||
<property name="font">
|
||||
<font>
|
||||
</font>
|
||||
</property>
|
||||
</widget>
|
||||
</hbox>
|
||||
</widget>
|
||||
</vbox>
|
||||
</widget>
|
||||
</hbox>
|
||||
</widget>
|
||||
<widget class="TQGroupBox">
|
||||
<property name="name">
|
||||
<cstring>groupBoxInfo</cstring>
|
||||
</property>
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>21</x>
|
||||
<y>245</y>
|
||||
<width>360</width>
|
||||
<height>131</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy>
|
||||
<hsizetype>3</hsizetype>
|
||||
<vsizetype>3</vsizetype>
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>360</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="font">
|
||||
<font>
|
||||
</font>
|
||||
</property>
|
||||
<property name="title">
|
||||
<string>Device Information</string>
|
||||
</property>
|
||||
<vbox>
|
||||
<property name="name">
|
||||
<cstring>unnamed</cstring>
|
||||
</property>
|
||||
<widget class="TQLayoutWidget">
|
||||
<property name="name">
|
||||
<cstring>layout14</cstring>
|
||||
</property>
|
||||
<vbox>
|
||||
<property name="name">
|
||||
<cstring>unnamed</cstring>
|
||||
</property>
|
||||
<widget class="TQLabel">
|
||||
<property name="name">
|
||||
<cstring>macLabel</cstring>
|
||||
</property>
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy>
|
||||
<hsizetype>5</hsizetype>
|
||||
<vsizetype>0</vsizetype>
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="font">
|
||||
<font>
|
||||
</font>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string></string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>AlignTop</set>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="TQLabel">
|
||||
<property name="name">
|
||||
<cstring>verLabel</cstring>
|
||||
</property>
|
||||
<property name="font">
|
||||
<font>
|
||||
</font>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string></string>
|
||||
</property>
|
||||
</widget>
|
||||
</vbox>
|
||||
</widget>
|
||||
</vbox>
|
||||
</widget>
|
||||
</vbox>
|
||||
</widget>
|
||||
<layoutdefaults spacing="6" margin="11"/>
|
||||
</UI>
|
@ -0,0 +1,372 @@
|
||||
/*
|
||||
*
|
||||
* New Bluetooth App for TDE and bluez5
|
||||
*
|
||||
* Copyright (C) 2018 Emanoil Kotsev <deloptes@gmail.com>
|
||||
*
|
||||
*
|
||||
* This file is part of tdebluez.
|
||||
*
|
||||
* tdebluez 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.
|
||||
*
|
||||
* tdebluez 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 kbluetooth; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
*/
|
||||
#include <dcopclient.h>
|
||||
#include <kuser.h>
|
||||
#include <tqregexp.h>
|
||||
|
||||
#include <errno.h>
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <signal.h>
|
||||
|
||||
#include "trayicon.h"
|
||||
#include "application.h"
|
||||
|
||||
#define WAIT_BEFORE_KILL 5000 // 5sec
|
||||
#define CONFIGURATION_FILE "tdebluezrc"
|
||||
#define TDEBLUEZAUTH_EXE "tdebluezauth"
|
||||
#define OBEX_EXE "/usr/lib/bluetooth/obexd"
|
||||
#define OBEX_EXE_ALT "/usr/libexec/bluetooth/obexd"
|
||||
#define BLUEZ_DN "org.bluez"
|
||||
#define DOWNLOAD_DIRECTORY "Downloads"
|
||||
|
||||
TDEBluetoothApp::TDEBluetoothApp() :
|
||||
KUniqueApplication()
|
||||
{
|
||||
// set default config file
|
||||
m_config = new TDEConfig(CONFIGURATION_FILE);
|
||||
m_config->setGroup("General");
|
||||
bool autostart = m_config->readBoolEntry("autoStart", false);
|
||||
m_waitBeforeKill = m_config->readNumEntry("waitBeforeKill", WAIT_BEFORE_KILL);
|
||||
TQString authAgentExe = m_config->readEntry("authAgentExe", TDEBLUEZAUTH_EXE);
|
||||
TQString obexSrvExe = m_config->readEntry("obexSrvExe", OBEX_EXE);
|
||||
TQString downloadDir = m_config->readPathEntry("downloadDir", "");
|
||||
|
||||
if (!autostart)
|
||||
disableSessionManagement();
|
||||
|
||||
if (m_waitBeforeKill == 0)
|
||||
{
|
||||
m_waitBeforeKill = WAIT_BEFORE_KILL;
|
||||
m_config->writeEntry("waitBeforeKill", m_waitBeforeKill);
|
||||
}
|
||||
|
||||
if (obexSrvExe.isEmpty())
|
||||
{
|
||||
obexSrvExe=TQString(OBEX_EXE);
|
||||
}
|
||||
|
||||
if (authAgentExe.isEmpty())
|
||||
{
|
||||
authAgentExe = TDEBLUEZAUTH_EXE;
|
||||
m_config->writePathEntry("authAgentExe", authAgentExe);
|
||||
}
|
||||
|
||||
if (downloadDir.isEmpty())
|
||||
{
|
||||
downloadDir = DOWNLOAD_DIRECTORY;
|
||||
m_config->writePathEntry("downloadDir", downloadDir);
|
||||
}
|
||||
|
||||
manager = new ObjectManagerImpl(BLUEZ_DN, "/", this, "ObjectManager");
|
||||
if (!manager->isConnectedToDBUS())
|
||||
{
|
||||
tqDebug("ObjectManager is not connected to DBus");
|
||||
return;
|
||||
}
|
||||
|
||||
ObjectManagerImpl::AdapterList al = manager->getAdapters();
|
||||
ObjectManagerImpl::AdapterList::Iterator ait = al.begin();
|
||||
for (ait; ait != al.end(); ++ait)
|
||||
{
|
||||
AdapterImpl *a = new AdapterImpl(BLUEZ_DN, (*ait));
|
||||
a->setConnection((*(manager->getConnection())));
|
||||
adapters.insert((*ait), a);
|
||||
}
|
||||
|
||||
ObjectManagerImpl::DeviceList dl = manager->getDevices();
|
||||
ObjectManagerImpl::DeviceList::Iterator dit = dl.begin();
|
||||
for (dit; dit != dl.end(); ++dit)
|
||||
{
|
||||
DeviceImpl *d = new DeviceImpl(BLUEZ_DN, (*dit));
|
||||
d->setConnection((*(manager->getConnection())));
|
||||
devices.insert((*dit), d);
|
||||
}
|
||||
|
||||
authAgent = new TQProcess(authAgentExe, this);
|
||||
authAgent->addArgument("--nofork");
|
||||
|
||||
TQFileInfo obexSrvExeFile( obexSrvExe );
|
||||
if (!obexSrvExeFile.exists())
|
||||
{
|
||||
obexSrvExeFile.setFile(OBEX_EXE_ALT);
|
||||
if (obexSrvExeFile.exists())
|
||||
{
|
||||
m_config->writePathEntry("obexSrvExe", obexSrvExeFile.filePath());
|
||||
}
|
||||
else
|
||||
{
|
||||
tqWarning( "obexd executable was not found\nSet path in configuration file \"%s\"\nVariable: obexSrvExe=<path to obexd>", CONFIGURATION_FILE);
|
||||
m_config->writeEntry("obexSrv", false);
|
||||
}
|
||||
}
|
||||
|
||||
obexServer = new TQProcess(obexSrvExeFile.filePath(), this);
|
||||
obexServer->addArgument("-n");
|
||||
obexServer->addArgument("-a");
|
||||
obexServer->addArgument("-l");
|
||||
obexServer->addArgument("-r");
|
||||
obexServer->addArgument(downloadDir);
|
||||
|
||||
//stop tdebluezauth or obexd daemon to regain control
|
||||
KUser user;
|
||||
long uid = user.uid();
|
||||
|
||||
TQDir d("/proc");
|
||||
d.setFilter(TQDir::Dirs);
|
||||
|
||||
TQRegExp rx( "^\\d+$" );
|
||||
for (int i = 0; i < d.count(); i++)
|
||||
{
|
||||
if ( ! rx.exactMatch(d[i]) )
|
||||
continue;
|
||||
|
||||
TQFile f("/proc/" + d[i] + "/status");
|
||||
if ( ! f.open( IO_ReadOnly ) )
|
||||
{
|
||||
tqDebug( "Failed to open file for reading: %s", f.name().local8Bit().data() );
|
||||
continue;
|
||||
}
|
||||
|
||||
TQTextStream stream( &f );
|
||||
TQString pid;
|
||||
bool tokill = false;
|
||||
while ( !stream.atEnd() ) {
|
||||
TQString line = stream.readLine(); // line of text excluding '\n'
|
||||
if (line.startsWith("Name:") &&
|
||||
( line.endsWith("tdebluezauth") || line.endsWith("obexd") ))
|
||||
{
|
||||
pid = d[i];
|
||||
}
|
||||
if (line.find(TQRegExp(TQString("Uid:\\s+%1").arg(uid))) != -1)
|
||||
{
|
||||
tokill = true;
|
||||
}
|
||||
}
|
||||
f.close();
|
||||
|
||||
if (tokill && ! pid.isEmpty())
|
||||
{
|
||||
if ( kill( (pid_t) pid.toLong(), SIGKILL ) == -1 )
|
||||
{
|
||||
switch ( errno )
|
||||
{
|
||||
case EINVAL:
|
||||
tqDebug( "4\t%s", pid.local8Bit().data() );
|
||||
break;
|
||||
case ESRCH:
|
||||
tqDebug( "3\t%s", pid.local8Bit().data() );
|
||||
break;
|
||||
case EPERM:
|
||||
tqDebug( "2\t%s", pid.local8Bit().data() );
|
||||
break;
|
||||
default: /* unknown error */
|
||||
tqDebug( "1\t%s", pid.local8Bit().data() );
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
tqWarning( "Cleanup pid\t%s", pid.local8Bit().data() );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// connect to manager signals
|
||||
connect(manager, SIGNAL(adapterAdded(const TQString&)), TQT_SLOT(slotAdapterAdded(const TQString&)));
|
||||
connect(manager, SIGNAL(adapterRemoved(const TQString&)), TQT_SLOT(slotAdapterRemoved(const TQString&)));
|
||||
connect(manager, SIGNAL(deviceAdded(const TQString&)), TQT_SLOT(slotDeviceAdded(const TQString&)));
|
||||
connect(manager, SIGNAL(deviceRemoved(const TQString&)), TQT_SLOT(slotDeviceRemoved(const TQString&)));
|
||||
// connect(manager, SIGNAL(adapterPowerOnChanged(const TQString&, bool)), SLOT(slotPowerOnChanged(const TQString&, bool)));
|
||||
|
||||
trayIcon = new TrayIcon(this);
|
||||
setMainWidget(trayIcon);
|
||||
}
|
||||
|
||||
TDEBluetoothApp::~TDEBluetoothApp()
|
||||
{
|
||||
|
||||
if (obexServer)
|
||||
{
|
||||
if (obexServer->isRunning())
|
||||
obexServer->kill();
|
||||
delete obexServer;
|
||||
}
|
||||
if (authAgent)
|
||||
{
|
||||
if (authAgent->isRunning())
|
||||
authAgent->kill();
|
||||
delete authAgent;
|
||||
}
|
||||
delete trayIcon;
|
||||
|
||||
if (manager->isConnectedToDBUS())
|
||||
{
|
||||
DevicesMap::Iterator dit = devices.begin();
|
||||
for (dit; dit != devices.end(); ++dit)
|
||||
{
|
||||
DeviceImpl *d = dit.data();
|
||||
if (d)
|
||||
delete d;
|
||||
}
|
||||
devices.clear();
|
||||
|
||||
AdaptersMap::Iterator ait = adapters.begin();
|
||||
for (ait; ait != adapters.end(); ++ait)
|
||||
{
|
||||
AdapterImpl *a = ait.data();
|
||||
if (a)
|
||||
{
|
||||
TQT_DBusError error;
|
||||
if (a->getDiscovering(error))
|
||||
a->StopDiscovery(error);
|
||||
if (error.isValid())
|
||||
tqDebug("Stop discoverable for the adapter failed: %s", error.message().local8Bit().data());
|
||||
delete a;
|
||||
}
|
||||
}
|
||||
adapters.clear();
|
||||
}
|
||||
delete manager;
|
||||
|
||||
if (m_config->isDirty())
|
||||
m_config->sync();
|
||||
|
||||
delete m_config;
|
||||
}
|
||||
|
||||
bool TDEBluetoothApp::startAuthAgent()
|
||||
{
|
||||
if (!authAgent->isRunning())
|
||||
{
|
||||
if (!authAgent->start())
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool TDEBluetoothApp::stopAuthAgent()
|
||||
{
|
||||
if (authAgent->isRunning())
|
||||
{
|
||||
authAgent->tryTerminate();
|
||||
TQTimer::singleShot(m_waitBeforeKill, authAgent, SLOT(kill()));
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool TDEBluetoothApp::startObexSrv()
|
||||
{
|
||||
if (!obexServer->isRunning())
|
||||
{
|
||||
if (!obexServer->start())
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool TDEBluetoothApp::stopObexSrv()
|
||||
{
|
||||
if (obexServer->isRunning())
|
||||
{
|
||||
obexServer->tryTerminate();
|
||||
TQTimer::singleShot(m_waitBeforeKill, obexServer, SLOT(kill()));
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool TDEBluetoothApp::isConnected()
|
||||
{
|
||||
return manager->isConnectedToDBUS();
|
||||
}
|
||||
|
||||
void TDEBluetoothApp::setAutoStart(bool val)
|
||||
{
|
||||
if (val)
|
||||
enableSessionManagement();
|
||||
else
|
||||
disableSessionManagement();
|
||||
|
||||
m_config->setGroup("General");
|
||||
m_config->writeEntry("autoStart", val);
|
||||
}
|
||||
|
||||
void TDEBluetoothApp::setStartObex(bool val)
|
||||
{
|
||||
m_config->setGroup("General");
|
||||
m_config->writeEntry("obexSrv", val);
|
||||
}
|
||||
|
||||
void TDEBluetoothApp::setStartAuthAgent(bool val)
|
||||
{
|
||||
m_config->setGroup("General");
|
||||
m_config->writeEntry("authAgent", val);
|
||||
}
|
||||
|
||||
bool TDEBluetoothApp::getAutoStart()
|
||||
{
|
||||
m_config->setGroup("General");
|
||||
return m_config->readBoolEntry("autoStart");
|
||||
}
|
||||
|
||||
bool TDEBluetoothApp::getStartObex()
|
||||
{
|
||||
m_config->setGroup("General");
|
||||
return m_config->readBoolEntry("obexSrv");
|
||||
}
|
||||
|
||||
bool TDEBluetoothApp::getStartAuthAgent()
|
||||
{
|
||||
m_config->setGroup("General");
|
||||
return m_config->readBoolEntry("authAgent");
|
||||
}
|
||||
|
||||
void TDEBluetoothApp::slotAdapterAdded(const TQString &adapter)
|
||||
{
|
||||
AdapterImpl *a = new AdapterImpl(BLUEZ_DN, adapter);
|
||||
a->setConnection((*(manager->getConnection())));
|
||||
adapters.insert(adapter, a);
|
||||
emit signalAdapterAdded(adapter);
|
||||
}
|
||||
|
||||
void TDEBluetoothApp::slotAdapterRemoved(const TQString &adapter)
|
||||
{
|
||||
delete adapters[adapter];
|
||||
adapters.remove(adapter);
|
||||
emit signalAdapterRemoved(adapter);
|
||||
}
|
||||
|
||||
void TDEBluetoothApp::slotDeviceAdded(const TQString &device)
|
||||
{
|
||||
DeviceImpl *d = new DeviceImpl(BLUEZ_DN, device);
|
||||
d->setConnection((*(manager->getConnection())));
|
||||
devices.insert(device, d);
|
||||
}
|
||||
|
||||
void TDEBluetoothApp::slotDeviceRemoved(const TQString &device)
|
||||
{
|
||||
delete devices[device];
|
||||
devices.remove(device);
|
||||
}
|
||||
|
||||
#include "application.moc"
|
@ -0,0 +1,97 @@
|
||||
/*
|
||||
*
|
||||
* New Bluetooth App for TDE and bluez5
|
||||
*
|
||||
* Copyright (C) 2018 Emanoil Kotsev <deloptes@gmail.com>
|
||||
*
|
||||
*
|
||||
* This file is part of tdebluez.
|
||||
*
|
||||
* tdebluez 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.
|
||||
*
|
||||
* tdebluez 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 kbluetooth; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef APPLICATION_H_
|
||||
#define APPLICATION_H_
|
||||
|
||||
#include <kuniqueapplication.h>
|
||||
#include <tdemessagebox.h>
|
||||
#include <tqprocess.h>
|
||||
|
||||
#include <objectmanagerImpl.h>
|
||||
|
||||
class TDEConfig;
|
||||
class TrayIcon;
|
||||
class AdapterConfig;
|
||||
class AdapterConfigDialog;
|
||||
class DeviceWizard;
|
||||
|
||||
using namespace TDEBluetooth;
|
||||
|
||||
class TDEBluetoothApp: public KUniqueApplication
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
TDEBluetoothApp();
|
||||
~TDEBluetoothApp();
|
||||
|
||||
typedef TQMap<TQString,AdapterImpl*> AdaptersMap;
|
||||
typedef TQMap<TQString,DeviceImpl*> DevicesMap;
|
||||
|
||||
bool startAuthAgent();
|
||||
bool stopAuthAgent();
|
||||
|
||||
bool startObexSrv();
|
||||
bool stopObexSrv();
|
||||
|
||||
bool isConnected();
|
||||
|
||||
protected:
|
||||
ObjectManagerImpl *manager;
|
||||
AdaptersMap adapters;
|
||||
DevicesMap devices;
|
||||
void setAutoStart(bool val);
|
||||
void setStartObex(bool val);
|
||||
void setStartAuthAgent(bool val);
|
||||
bool getAutoStart();
|
||||
bool getStartObex();
|
||||
bool getStartAuthAgent();
|
||||
|
||||
private:
|
||||
TQProcess *obexServer;
|
||||
TQProcess *authAgent;
|
||||
TrayIcon *trayIcon;
|
||||
TDEConfig *m_config;
|
||||
int m_waitBeforeKill;
|
||||
|
||||
friend class TrayIcon;
|
||||
friend class AdapterConfig;
|
||||
friend class AdapterConfigDialog;
|
||||
friend class DeviceWizard;
|
||||
|
||||
public slots:
|
||||
void slotAdapterAdded(const TQString& adapter);
|
||||
void slotAdapterRemoved(const TQString& adapter);
|
||||
// void slotPowerOnChanged(const TQString&, bool);
|
||||
void slotDeviceAdded(const TQString& device);
|
||||
void slotDeviceRemoved(const TQString& device);
|
||||
|
||||
signals:
|
||||
void signalAdapterAdded(const TQString &adapter);
|
||||
void signalAdapterRemoved(const TQString &adapter);
|
||||
};
|
||||
|
||||
#endif // APPLICATION_H_
|
@ -0,0 +1,335 @@
|
||||
<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
|
||||
<class>DeviceDialog</class>
|
||||
<include location="global">kseparator.h</include>
|
||||
<widget class="TQDialog">
|
||||
<property name="name">
|
||||
<cstring>DeviceDialog</cstring>
|
||||
</property>
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>550</width>
|
||||
<height>190</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="caption">
|
||||
<string>Devices</string>
|
||||
</property>
|
||||
<vbox>
|
||||
<property name="name">
|
||||
<cstring>unnamed</cstring>
|
||||
</property>
|
||||
<widget class="TQLabel">
|
||||
<property name="name">
|
||||
<cstring>textLabel1_2</cstring>
|
||||
</property>
|
||||
<property name="paletteForegroundColor">
|
||||
<color>
|
||||
<red>0</red>
|
||||
<green>0</green>
|
||||
<blue>0</blue>
|
||||
</color>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string><font size="+1">Configured Devices:</font></string>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="TQLayoutWidget">
|
||||
<property name="name">
|
||||
<cstring>layout6</cstring>
|
||||
</property>
|
||||
<hbox>
|
||||
<property name="name">
|
||||
<cstring>unnamed</cstring>
|
||||
</property>
|
||||
<widget class="TQListView">
|
||||
<column>
|
||||
<property name="text">
|
||||
<string>1</string>
|
||||
</property>
|
||||
<property name="clickable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="resizable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</column>
|
||||
<column>
|
||||
<property name="text">
|
||||
<string>2</string>
|
||||
</property>
|
||||
<property name="clickable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="resizable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</column>
|
||||
<column>
|
||||
<property name="text">
|
||||
<string>3</string>
|
||||
</property>
|
||||
<property name="clickable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="resizable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</column>
|
||||
<column>
|
||||
<property name="text">
|
||||
<string>4</string>
|
||||
</property>
|
||||
<property name="clickable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="resizable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</column>
|
||||
<property name="name">
|
||||
<cstring>deviceBox</cstring>
|
||||
</property>
|
||||
<property name="frameShape">
|
||||
<enum>GroupBoxPanel</enum>
|
||||
</property>
|
||||
<property name="frameShadow">
|
||||
<enum>Plain</enum>
|
||||
</property>
|
||||
<property name="lineWidth">
|
||||
<number>2</number>
|
||||
</property>
|
||||
<property name="selectionMode">
|
||||
<enum>Single</enum>
|
||||
</property>
|
||||
<property name="allColumnsShowFocus">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="showSortIndicator">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="TQLayoutWidget">
|
||||
<property name="name">
|
||||
<cstring>layout9</cstring>
|
||||
</property>
|
||||
<vbox>
|
||||
<property name="name">
|
||||
<cstring>unnamed</cstring>
|
||||
</property>
|
||||
<widget class="TQLayoutWidget">
|
||||
<property name="name">
|
||||
<cstring>layout8</cstring>
|
||||
</property>
|
||||
<hbox>
|
||||
<property name="name">
|
||||
<cstring>unnamed</cstring>
|
||||
</property>
|
||||
<spacer>
|
||||
<property name="name">
|
||||
<cstring>spacer5</cstring>
|
||||
</property>
|
||||
<property name="orientation">
|
||||
<enum>Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeType">
|
||||
<enum>Fixed</enum>
|
||||
</property>
|
||||
<property name="sizeHint">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
<widget class="TQLayoutWidget">
|
||||
<property name="name">
|
||||
<cstring>layout7</cstring>
|
||||
</property>
|
||||
<vbox>
|
||||
<property name="name">
|
||||
<cstring>unnamed</cstring>
|
||||
</property>
|
||||
<widget class="TQLabel">
|
||||
<property name="name">
|
||||
<cstring>pixmapLabel</cstring>
|
||||
</property>
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy>
|
||||
<hsizetype>0</hsizetype>
|
||||
<vsizetype>0</vsizetype>
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>48</width>
|
||||
<height>50</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string></string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>AlignCenter</set>
|
||||
</property>
|
||||
</widget>
|
||||
<spacer>
|
||||
<property name="name">
|
||||
<cstring>spacer2</cstring>
|
||||
</property>
|
||||
<property name="orientation">
|
||||
<enum>Vertical</enum>
|
||||
</property>
|
||||
<property name="sizeType">
|
||||
<enum>Expanding</enum>
|
||||
</property>
|
||||
<property name="sizeHint">
|
||||
<size>
|
||||
<width>20</width>
|
||||
<height>40</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</vbox>
|
||||
</widget>
|
||||
<spacer>
|
||||
<property name="name">
|
||||
<cstring>spacer6</cstring>
|
||||
</property>
|
||||
<property name="orientation">
|
||||
<enum>Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeType">
|
||||
<enum>Fixed</enum>
|
||||
</property>
|
||||
<property name="sizeHint">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</hbox>
|
||||
</widget>
|
||||
<widget class="TQToolButton">
|
||||
<property name="name">
|
||||
<cstring>configureButton</cstring>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>130</width>
|
||||
<height>28</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Co&nfigure</string>
|
||||
</property>
|
||||
<property name="accel">
|
||||
<string>Alt+N</string>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="TQPushButton">
|
||||
<property name="name">
|
||||
<cstring>connectButton</cstring>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>130</width>
|
||||
<height>28</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>C&onnect</string>
|
||||
</property>
|
||||
<property name="accel">
|
||||
<string>Alt+O</string>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="TQPushButton">
|
||||
<property name="name">
|
||||
<cstring>deleteButton</cstring>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>130</width>
|
||||
<height>28</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>&Delete</string>
|
||||
</property>
|
||||
<property name="accel">
|
||||
<string>Alt+D</string>
|
||||
</property>
|
||||
</widget>
|
||||
</vbox>
|
||||
</widget>
|
||||
</hbox>
|
||||
</widget>
|
||||
<widget class="KSeparator">
|
||||
<property name="name">
|
||||
<cstring>kSeparator1</cstring>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="TQLayoutWidget">
|
||||
<property name="name">
|
||||
<cstring>lastLayout</cstring>
|
||||
</property>
|
||||
<hbox>
|
||||
<property name="name">
|
||||
<cstring>unnamed</cstring>
|
||||
</property>
|
||||
<widget class="TQPushButton">
|
||||
<property name="name">
|
||||
<cstring>addButton</cstring>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>&Start Discovery <<</string>
|
||||
</property>
|
||||
<property name="accel">
|
||||
<string>Alt+S</string>
|
||||
</property>
|
||||
<property name="toggleButton">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="TQPushButton">
|
||||
<property name="name">
|
||||
<cstring>okButton</cstring>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>&Close</string>
|
||||
</property>
|
||||
<property name="accel">
|
||||
<string>Alt+C</string>
|
||||
</property>
|
||||
</widget>
|
||||
<spacer>
|
||||
<property name="name">
|
||||
<cstring>spacer1</cstring>
|
||||
</property>
|
||||
<property name="orientation">
|
||||
<enum>Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeType">
|
||||
<enum>Expanding</enum>
|
||||
</property>
|
||||
<property name="sizeHint">
|
||||
<size>
|
||||
<width>410</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</hbox>
|
||||
</widget>
|
||||
</vbox>
|
||||
</widget>
|
||||
<layoutdefaults spacing="6" margin="11"/>
|
||||
<includehints>
|
||||
|
||||
</includehints>
|
||||
</UI>
|
@ -0,0 +1,155 @@
|
||||
<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
|
||||
<class>DeviceDialog_Ext</class>
|
||||
<widget class="TQDialog">
|
||||
<property name="name">
|
||||
<cstring>DeviceDialog_Ext</cstring>
|
||||
</property>
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>550</width>
|
||||
<height>190</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="caption">
|
||||
<string>New Device</string>
|
||||
</property>
|
||||
<vbox>
|
||||
<property name="name">
|
||||
<cstring>unnamed</cstring>
|
||||
</property>
|
||||
<widget class="TQFrame">
|
||||
<property name="name">
|
||||
<cstring>newDevFrame</cstring>
|
||||
</property>
|
||||
<property name="frameShape">
|
||||
<enum>StyledPanel</enum>
|
||||
</property>
|
||||
<property name="frameShadow">
|
||||
<enum>Plain</enum>
|
||||
</property>
|
||||
<property name="lineWidth">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<vbox>
|
||||
<property name="name">
|
||||
<cstring>unnamed</cstring>
|
||||
</property>
|
||||
<widget class="TQLayoutWidget">
|
||||
<property name="name">
|
||||
<cstring>layout7</cstring>
|
||||
</property>
|
||||
<vbox>
|
||||
<property name="name">
|
||||
<cstring>unnamed</cstring>
|
||||
</property>
|
||||
<widget class="TQLabel">
|
||||
<property name="name">
|
||||
<cstring>textLabel1</cstring>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string><b>New Device:</b></string>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="TQListView">
|
||||
<column>
|
||||
<property name="text">
|
||||
<string>Name</string>
|
||||
</property>
|
||||
<property name="clickable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="resizable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</column>
|
||||
<column>
|
||||
<property name="text">
|
||||
<string>Address</string>
|
||||
</property>
|
||||
<property name="clickable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="resizable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</column>
|
||||
<column>
|
||||
<property name="text">
|
||||
<string>3</string>
|
||||
</property>
|
||||
<property name="clickable">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="resizable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</column>
|
||||
<property name="name">
|
||||
<cstring>newdevList</cstring>
|
||||
</property>
|
||||
<property name="allColumnsShowFocus">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</vbox>
|
||||
</widget>
|
||||
<widget class="TQLayoutWidget">
|
||||
<property name="name">
|
||||
<cstring>layout4</cstring>
|
||||
</property>
|
||||
<hbox>
|
||||
<property name="name">
|
||||
<cstring>unnamed</cstring>
|
||||
</property>
|
||||
<widget class="TQPushButton">
|
||||
<property name="name">
|
||||
<cstring>setupButton</cstring>
|
||||
</property>
|
||||
<property name="enabled">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>&Setup</string>
|
||||
</property>
|
||||
<property name="accel">
|
||||
<string>Alt+S</string>
|
||||
</property>
|
||||
</widget>
|
||||
<spacer>
|
||||
<property name="name">
|
||||
<cstring>spacer2</cstring>
|
||||
</property>
|
||||
<property name="orientation">
|
||||
<enum>Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeType">
|
||||
<enum>Expanding</enum>
|
||||
</property>
|
||||
<property name="sizeHint">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</hbox>
|
||||
</widget>
|
||||
<widget class="TQLabel">
|
||||
<property name="name">
|
||||
<cstring>statusbar</cstring>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string></string>
|
||||
</property>
|
||||
</widget>
|
||||
</vbox>
|
||||
</widget>
|
||||
</vbox>
|
||||
</widget>
|
||||
<includes>
|
||||
<include location="local" impldecl="in implementation">devicedialog_ext.ui.h</include>
|
||||
</includes>
|
||||
<layoutdefaults spacing="6" margin="11"/>
|
||||
</UI>
|
@ -0,0 +1,662 @@
|
||||
/*
|
||||
*
|
||||
* Dialogs for tdebluez device configuration
|
||||
*
|
||||
* Copyright (C) 2018 Emanoil Kotsev <deloptes@gmail.com>
|
||||
*
|
||||
*
|
||||
* This file is part of tdebluez.
|
||||
*
|
||||
* tdebluez 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.
|
||||
*
|
||||
* tdebluez 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 kbluetooth; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
*/
|
||||
|
||||
#include <tqradiobutton.h>
|
||||
#include <tqpushbutton.h>
|
||||
#include <tqprogressbar.h>
|
||||
#include <tqcheckbox.h>
|
||||
#include <tdeconfig.h>
|
||||
#include <knotifydialog.h>
|
||||
#include <knotifyclient.h>
|
||||
|
||||
#include <interfaces/device1Proxy.h>
|
||||
#include <btuuids.h>
|
||||
#include <devicemimeconverter.h>
|
||||
|
||||
#include "application.h"
|
||||
#include "devicesetupwizard.h"
|
||||
|
||||
#define LOGOTIMEOUT 100 //100 msec
|
||||
#define ASYNC_TIMEOUT 15000 //15 sec
|
||||
#define CONNECT_TIMEOUT 5000 // 5 sec
|
||||
#define PROGRESS_TIMEOUT 50 // 50 msec
|
||||
|
||||
DeviceSetupWizard::DeviceSetupWizard(ObjectManagerImpl* _manager) :
|
||||
DeviceSetupWizardDialog(), manager(_manager)
|
||||
{
|
||||
device = 0;
|
||||
address = TQString();
|
||||
|
||||
pairpage = page(0);
|
||||
setHelpEnabled(pairpage, false);
|
||||
|
||||
pairingpage = page(1);
|
||||
setHelpEnabled(pairingpage, false);
|
||||
|
||||
connectpage = page(2);
|
||||
setHelpEnabled(connectpage, false);
|
||||
|
||||
connectingpage = page(3);
|
||||
setHelpEnabled(connectingpage, false);
|
||||
|
||||
donepage = page(4);
|
||||
setHelpEnabled(donepage, false);
|
||||
setFinishEnabled(donepage, true);
|
||||
cancelButton()->setText(i18n("S&kip Wizard"));
|
||||
|
||||
setModal(true);
|
||||
|
||||
m_config = TDEGlobal::config();
|
||||
|
||||
// create the first ListView
|
||||
tQListViewSrc->setRootIsDecorated(TRUE);
|
||||
tQListViewSrc->setSelectionMode(TQListView::Multi);
|
||||
tQListViewSrc->clear();
|
||||
|
||||
// create the second ListView
|
||||
tQListViewDst->setRootIsDecorated(TRUE);
|
||||
tQListViewDst->setSelectionMode(TQListView::Multi);
|
||||
tQListViewDst->clear();
|
||||
|
||||
// progress bars
|
||||
pairingProgressBar->setProgress(0,ASYNC_TIMEOUT);
|
||||
pairingProgressBar->setPercentageVisible(false);
|
||||
connectingProgressBar->setProgress(0,ASYNC_TIMEOUT);
|
||||
connectingProgressBar->setPercentageVisible(false);
|
||||
|
||||
pairingTimer = new TQTimer(this);
|
||||
connectTimer = new TQTimer(this);
|
||||
connect(pairingTimer, SIGNAL(timeout()), this, TQT_SLOT(slotAdvancePairingProgressBar()));
|
||||
connect(connectTimer, SIGNAL(timeout()), this, TQT_SLOT(slotAdvanceConnectProgressBar()));
|
||||
|
||||
connect(manager, SIGNAL(deviceServicesResolvedChanged(const TQString&, bool)),
|
||||
this, TQT_SLOT(slotDeviceServicesResolvedChanged(const TQString&, bool)));
|
||||
|
||||
connect(buttonSrc2Dst, SIGNAL(clicked()), this, SLOT(slotCopySrc2Dst()));
|
||||
connect(buttonDst2Src, SIGNAL(clicked()), this, SLOT(slotCopyDst2Src()));
|
||||
connect(cancelPairingButton, SIGNAL(clicked()), this, SLOT(slotCancelPairing()));
|
||||
connect(cancelConnectButton, SIGNAL(clicked()), this, SLOT(slotCancelConnecting()));
|
||||
}
|
||||
|
||||
DeviceSetupWizard::~DeviceSetupWizard()
|
||||
{
|
||||
}
|
||||
|
||||
void DeviceSetupWizard::next()
|
||||
{
|
||||
if (pairingTimer->isActive())
|
||||
{
|
||||
pairingTimer->stop();
|
||||
}
|
||||
if (connectTimer->isActive())
|
||||
{
|
||||
connectTimer->stop();
|
||||
}
|
||||
|
||||
if (currentPage() == pairpage)
|
||||
{
|
||||
if (pairingRadioButton1->isChecked())
|
||||
{
|
||||
pairingProgressBar->setProgress(0,ASYNC_TIMEOUT);
|
||||
pairingTimer->start(PROGRESS_TIMEOUT);
|
||||
setNextEnabled(pairpage, false);
|
||||
setNextEnabled(pairingpage, false);
|
||||
TQWizard::showPage(pairingpage);
|
||||
startPairing();
|
||||
}
|
||||
else
|
||||
TQWizard::showPage(donepage);
|
||||
}
|
||||
else if (currentPage() == connectpage)
|
||||
{
|
||||
preferredProfiles.clear();
|
||||
TQListViewItemIterator it2(tQListViewDst);
|
||||
while (it2.current())
|
||||
{
|
||||
TQString selText = it2.current()->text(0);
|
||||
for (TQStringList::iterator it3 = uuids.begin(); it3 != uuids.end();
|
||||
++it3)
|
||||
{
|
||||
TQString u = (*it3);
|
||||
if (selText == resolveUUID(u))
|
||||
{
|
||||
kdDebug() << "REQUESTED UUID: " << u << endl;
|
||||
preferredProfiles.append(u);
|
||||
}
|
||||
}
|
||||
++it2;
|
||||
}
|
||||
|
||||
m_config->setGroup(address);
|
||||
m_config->writeEntry("profile", preferredProfiles);
|
||||
m_config->sync();
|
||||
|
||||
// set the progress bar depending on the number of profiles to be connected
|
||||
// and CONNECT_TIMEOUT value
|
||||
// connectingProgressBar->setProgress(0, (ASYNC_TIMEOUT + CONNECT_TIMEOUT) * preferredProfiles.count());
|
||||
connectingProgressBar->setProgress(0,ASYNC_TIMEOUT);
|
||||
|
||||
connectTimer->start(PROGRESS_TIMEOUT);
|
||||
TQWizard::showPage(connectingpage);
|
||||
|
||||
slotConnectNextProfile();
|
||||
}
|
||||
// else if (currentPage() == connectingpage)
|
||||
// {
|
||||
// TQT_DBusError error;
|
||||
// if (!device->getConnected(error))
|
||||
// {
|
||||
// int asyncCallId=0;
|
||||
// device->ConnectAsync(asyncCallId, error);
|
||||
// manager->getConnection()->scheduleDispatch();
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// TQWizard::next();
|
||||
// }
|
||||
// if (error.isValid())
|
||||
// tqDebug("Failed in connecting device: %s", error.message().local8Bit().data());
|
||||
// }
|
||||
else if (currentPage() == donepage)
|
||||
{
|
||||
if (trustedCheckBox->isChecked())
|
||||
{
|
||||
finishButton()->setFocus();
|
||||
}
|
||||
else
|
||||
{
|
||||
trustedCheckBox->setFocus();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void DeviceSetupWizard::back()
|
||||
{
|
||||
TQWizard::back();
|
||||
}
|
||||
|
||||
void DeviceSetupWizard::setDevice(DeviceImpl *_device)
|
||||
{
|
||||
kdDebug() << "New device: " << _device << endl;
|
||||
|
||||
if (device == _device)
|
||||
return;
|
||||
|
||||
if (device)
|
||||
closeDevice();
|
||||
|
||||
device = _device;
|
||||
|
||||
TQWizard::showPage(pairpage);
|
||||
setNextEnabled(pairpage, true);
|
||||
|
||||
TQT_DBusError error;
|
||||
address = device->getAddress(error);
|
||||
if (error.isValid())
|
||||
tqDebug("Failed to get address for the new device: %s", error.message().local8Bit().data());
|
||||
|
||||
if (device->getPaired(error))
|
||||
{
|
||||
updateServiceList();
|
||||
preferredProfiles.clear();
|
||||
tQListViewDst->clear();
|
||||
m_config->setGroup(address);
|
||||
preferredProfiles = m_config->readListEntry("profile");
|
||||
TQStringList::iterator it = preferredProfiles.begin();
|
||||
for (it; it != preferredProfiles.end(); ++it)
|
||||
{
|
||||
(void) new TQListViewItem(tQListViewDst, resolveUUID(*it));
|
||||
}
|
||||
setAppropriate(pairpage, false);
|
||||
if (tQListViewDst->childCount() > 0)
|
||||
setNextEnabled(connectpage, true);
|
||||
TQWizard::showPage(connectpage);
|
||||
} else {
|
||||
tQListViewDst->clear();
|
||||
}
|
||||
if (error.isValid())
|
||||
tqDebug("Failed to get paired status for the new device: %s", error.message().local8Bit().data());
|
||||
|
||||
if (device->getConnected(error))
|
||||
{
|
||||
setAppropriate(pairpage, false);
|
||||
setAppropriate(pairingpage, false);
|
||||
setAppropriate(connectpage, false);
|
||||
setAppropriate(connectingpage, false);
|
||||
TQWizard::showPage(donepage);
|
||||
}
|
||||
if (error.isValid())
|
||||
tqDebug("Failed to get connecting status of the new device: %s", error.message().local8Bit().data());
|
||||
|
||||
if (device->getTrusted(error))
|
||||
trustedCheckBox->setChecked(true);
|
||||
if (error.isValid())
|
||||
tqDebug("Failed to get trusted status of the new device: %s", error.message().local8Bit().data());
|
||||
|
||||
connect(device, SIGNAL(PairAsyncReply(int /*asyncCallId*/)),
|
||||
this, TQT_SLOT(slotPairAsyncReply(int /*asyncCallId*/)));
|
||||
connect(device, SIGNAL(CancelPairingAsyncReply(int /*asyncCallId*/)),
|
||||
this, TQT_SLOT(slotCancelPairingAsyncReply(int /*asyncCallId*/)));
|
||||
connect(device, SIGNAL(AsyncErrorResponseDetected(int /*asyncCallId*/, const TQT_DBusError)),
|
||||
this, TQT_SLOT(slotAsyncErrorResponseDetected(int /*asyncCallId*/, const TQT_DBusError)));
|
||||
connect(device, SIGNAL(ConnectAsyncReply(int /*asyncCallId*/)),
|
||||
this, TQT_SLOT(slotConnectAsyncReply(int /*asyncCallId*/)));
|
||||
// connect(device, SIGNAL(DisonnectAsyncReply(int /*asyncCallId*/)),
|
||||
// this, TQT_SLOT(slotDisconnectAsyncReply(int /*asyncCallId*/)));
|
||||
connect(device, SIGNAL(ConnectProfileAsyncReply(int /*asyncCallId*/)),
|
||||
this, TQT_SLOT(slotConnectProfileAsyncReply(int /*asyncCallId*/)));
|
||||
// connect(device, SIGNAL(DisconnectProfileAsyncReply(int /*asyncCallId*/)),
|
||||
// this, TQT_SLOT(slotDisconnectProfileAsyncReply(int /*asyncCallId*/)));
|
||||
}
|
||||
|
||||
void DeviceSetupWizard::updateServiceList()
|
||||
{
|
||||
TQT_DBusError error;
|
||||
uuids.clear();
|
||||
uuids = device->getUUIDs(error);
|
||||
if (error.isValid())
|
||||
tqDebug("Failed to get uuids: %s", error.message().local8Bit().data());
|
||||
|
||||
tQListViewSrc->clear();
|
||||
for (TQStringList::iterator it = uuids.begin(); it != uuids.end(); ++it)
|
||||
{
|
||||
if (
|
||||
((*it) == "00001203-0000-1000-8000-00805f9b34fb") || //Generic Audio
|
||||
((*it) == "00001108-0000-1000-8000-00805f9b34fb") || //Headset
|
||||
((*it) == "0000111e-0000-1000-8000-00805f9b34fb") || //Handsfree
|
||||
((*it) == "0000111f-0000-1000-8000-00805f9b34fb") || //Handsfree AG
|
||||
((*it) == "0000110a-0000-1000-8000-00805f9b34fb") || //A2DP Source
|
||||
((*it) == "0000110b-0000-1000-8000-00805f9b34fb") || //A2DP Sink
|
||||
((*it) == "00001103-0000-1000-8000-00805f9b34fb") || //DUN Gateway
|
||||
((*it) == "00001800-0000-1000-8000-00805f9b34fb") //GAP
|
||||
)
|
||||
{
|
||||
(void) new TQListViewItem(tQListViewSrc, resolveUUID((*it)));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void DeviceSetupWizard::startPairing()
|
||||
{
|
||||
TQT_DBusError error;
|
||||
int asyncCallId = 0;
|
||||
if (!device->PairAsync(asyncCallId, error))
|
||||
{
|
||||
if (error.isValid())
|
||||
tqDebug("Failed to get paired status for the new device: %s", error.message().local8Bit().data());
|
||||
}
|
||||
manager->getConnection()->scheduleDispatch();
|
||||
}
|
||||
|
||||
void DeviceSetupWizard::slotPairingTimeOut()
|
||||
{
|
||||
if(pairingTimer->isActive())
|
||||
pairingTimer->stop();
|
||||
|
||||
if (!device)
|
||||
return;
|
||||
|
||||
TQT_DBusError error;
|
||||
if (!device->getPaired(error))
|
||||
{
|
||||
if (!error.isValid())
|
||||
{
|
||||
TQWizard::showPage(pairpage);
|
||||
setNextEnabled(pairpage, true);
|
||||
}
|
||||
else
|
||||
tqDebug("Failed pairing the new device: %s", error.message().local8Bit().data());
|
||||
}
|
||||
else
|
||||
{
|
||||
if (tQListViewDst->childCount() > 0)
|
||||
setNextEnabled(connectpage, true);
|
||||
TQWizard::showPage(connectpage);
|
||||
}
|
||||
}
|
||||
|
||||
void DeviceSetupWizard::slotConnectTimeOut()
|
||||
{
|
||||
if(connectTimer->isActive())
|
||||
connectTimer->stop();
|
||||
|
||||
if (!device)
|
||||
return;
|
||||
|
||||
TQT_DBusError error;
|
||||
if (!device->getConnected(error))
|
||||
{
|
||||
if (!error.isValid())
|
||||
{
|
||||
TQWizard::showPage(connectpage);
|
||||
if (tQListViewDst->childCount() > 0)
|
||||
setNextEnabled(connectpage, true);
|
||||
setNextEnabled(connectpage, true);
|
||||
}
|
||||
else
|
||||
tqDebug("Failed connecting the new device: %s", error.message().local8Bit().data());
|
||||
}
|
||||
else
|
||||
{
|
||||
setNextEnabled(connectingpage, false);
|
||||
setBackEnabled(donepage, false);
|
||||
TQWizard::showPage(donepage);
|
||||
}
|
||||
}
|
||||
|
||||
/** the cancel button is connected to the reject() slot of TQDialog,
|
||||
* so we have to reimplement this here to add a dialogbox to ask if we
|
||||
* really want to quit the wizard.
|
||||
*/
|
||||
void DeviceSetupWizard::reject()
|
||||
{
|
||||
close(); // this will trigger the close event caught below
|
||||
}
|
||||
|
||||
void DeviceSetupWizard::closeEvent(TQCloseEvent* e)
|
||||
{
|
||||
if (askClose())
|
||||
{
|
||||
hide();
|
||||
closeDevice();
|
||||
}
|
||||
else
|
||||
{
|
||||
e->ignore();
|
||||
}
|
||||
}
|
||||
|
||||
/** maybe call a dialog that the wizard has finished. */
|
||||
void DeviceSetupWizard::accept()
|
||||
{
|
||||
TQT_DBusError error;
|
||||
if (trustedCheckBox->isChecked())
|
||||
{
|
||||
if (!device->getTrusted(error))
|
||||
{
|
||||
device->setTrusted(true, error);
|
||||
}
|
||||
if (error.isValid())
|
||||
tqDebug("Could not set trusted for %s\nError: %s",
|
||||
address.latin1(), error.message().local8Bit().data());
|
||||
}
|
||||
|
||||
hide();
|
||||
closeDevice();
|
||||
}
|
||||
|
||||
void DeviceSetupWizard::closeDevice()
|
||||
{
|
||||
// make sure timers go down
|
||||
if (pairingTimer->isActive())
|
||||
{
|
||||
pairingTimer->stop();
|
||||
}
|
||||
if (connectTimer->isActive())
|
||||
{
|
||||
connectTimer->stop();
|
||||
}
|
||||
|
||||
if (!device)
|
||||
return;
|
||||
|
||||
disconnect(device, SIGNAL(PairAsyncReply(int /*asyncCallId*/)),
|
||||
this, TQT_SLOT(slotPairAsyncReply(int /*asyncCallId*/)));
|
||||
disconnect(device, SIGNAL(CancelPairingAsyncReply(int /*asyncCallId*/)),
|
||||
this, TQT_SLOT(slotCancelPairingAsyncReply(int /*asyncCallId*/)));
|
||||
disconnect(device, SIGNAL(AsyncErrorResponseDetected(int /*asyncCallId*/, const TQT_DBusError)),
|
||||
this, TQT_SLOT(slotAsyncErrorResponseDetected(int /*asyncCallId*/, const TQT_DBusError)));
|
||||
disconnect(device, SIGNAL(ConnectAsyncReply(int /*asyncCallId*/)),
|
||||
this, TQT_SLOT(slotConnectAsyncReply(int /*asyncCallId*/)));
|
||||
// disconnect(device, SIGNAL(DisonnectAsyncReply(int /*asyncCallId*/)),
|
||||
// this, TQT_SLOT(slotDisconnectAsyncReply(int /*asyncCallId*/)));
|
||||
disconnect(device, SIGNAL(ConnectProfileAsyncReply(int /*asyncCallId*/)),
|
||||
this, TQT_SLOT(slotConnectProfileAsyncReply(int /*asyncCallId*/)));
|
||||
// connect(device, SIGNAL(DisconnectProfileAsyncReply(int /*asyncCallId*/)),
|
||||
// this, TQT_SLOT(slotDisconnectProfileAsyncReply(int /*asyncCallId*/)));
|
||||
|
||||
preferredProfiles.clear();
|
||||
address = TQString();
|
||||
device = 0;
|
||||
}
|
||||
|
||||
void DeviceSetupWizard::slotDeviceServicesResolvedChanged(const TQString &path, bool resolved)
|
||||
{
|
||||
if (!device)
|
||||
return;
|
||||
|
||||
if (path != device->getPath())
|
||||
return;
|
||||
|
||||
updateServiceList();
|
||||
}
|
||||
|
||||
void DeviceSetupWizard::slotConnectNextProfile()
|
||||
{
|
||||
if (preferredProfiles.isEmpty())
|
||||
{
|
||||
slotConnectTimeOut();
|
||||
}
|
||||
else
|
||||
{
|
||||
TQString connect = preferredProfiles.first();
|
||||
//disable next button while profiles are being handled
|
||||
setBackEnabled(connectpage, false);
|
||||
setNextEnabled(connectpage, false);
|
||||
setBackEnabled(connectingpage, false);
|
||||
setNextEnabled(connectingpage, false);
|
||||
int asyncCallId = 0;
|
||||
TQT_DBusError error;
|
||||
if (!device->ConnectProfileAsync(asyncCallId, connect, error))
|
||||
{
|
||||
if (error.isValid())
|
||||
tqDebug("Failed to call DBus ConnectProfileAsync: %s", error.message().local8Bit().data());
|
||||
}
|
||||
manager->getConnection()->scheduleDispatch();
|
||||
}
|
||||
}
|
||||
|
||||
void DeviceSetupWizard::slotAsyncErrorResponseDetected(int asyncCallId, const TQT_DBusError error)
|
||||
{
|
||||
tqDebug("AsyncErrorResponseDetected: %i %s %s", error.type(), error.name().local8Bit().data(), error.message().local8Bit().data());
|
||||
|
||||
if(pairingTimer->isActive())
|
||||
pairingTimer->stop();
|
||||
|
||||
if(connectTimer->isActive())
|
||||
connectTimer->stop();
|
||||
|
||||
switch (error.type())
|
||||
{
|
||||
case 5: //org.freedesktop.DBus.Error.NoReply
|
||||
case 22: // org.bluez.Error.InProgress, org.bluez.Error.Failed Host is down
|
||||
default:
|
||||
if (currentPage() == pairingpage)
|
||||
{
|
||||
slotPairingTimeOut();
|
||||
}
|
||||
if (currentPage() == connectingpage)
|
||||
{
|
||||
slotConnectTimeOut();
|
||||
}
|
||||
}
|
||||
// TQMessageBox::critical( 0, "Device Setup Wizard",
|
||||
// TQString("AsyncErrorResponseDetected: %1\n%2\n%3")
|
||||
// .arg(error.type())
|
||||
// .arg(error.name().local8Bit().data())
|
||||
// .arg(error.message().local8Bit().data()),
|
||||
// TQMessageBox::Ok, TQMessageBox::NoButton, TQMessageBox::NoButton);
|
||||
|
||||
KNotifyClient::event(TDEApplication::kApplication()->mainWidget()->winId(),
|
||||
"ConnectionError", tr("AsyncErrorResponseDetected: %1\n%2\n%3")
|
||||
.arg(error.type())
|
||||
.arg(error.name().local8Bit().data())
|
||||
.arg(error.message().local8Bit().data()));
|
||||
}
|
||||
|
||||
void DeviceSetupWizard::slotConnectAsyncReply(int asyncCallId)
|
||||
{
|
||||
slotConnectTimeOut();
|
||||
}
|
||||
|
||||
//void DeviceSetupWizard::slotDisconnectAsyncReply(int asyncCallId)
|
||||
//{
|
||||
// slotConnectNextProfile();
|
||||
//}
|
||||
|
||||
void DeviceSetupWizard::slotConnectProfileAsyncReply(int asyncCallId)
|
||||
{
|
||||
kdDebug() << __func__ << endl;
|
||||
if (!preferredProfiles.isEmpty())
|
||||
preferredProfiles.pop_front();
|
||||
|
||||
if (!preferredProfiles.isEmpty() && connectTimer->isActive())
|
||||
// delay connecting next profile to prevent error InProgress
|
||||
TQTimer::singleShot(CONNECT_TIMEOUT, this, TQT_SLOT(slotConnectNextProfile()));
|
||||
else
|
||||
slotConnectTimeOut();
|
||||
}
|
||||
|
||||
//void DeviceSetupWizard::slotDisconnectProfileAsyncReply(int asyncCallId)
|
||||
//{
|
||||
// slotConnectTimeOut();
|
||||
//}
|
||||
|
||||
void DeviceSetupWizard::slotPairAsyncReply(int asyncCallId)
|
||||
{
|
||||
slotPairingTimeOut();
|
||||
}
|
||||
|
||||
void DeviceSetupWizard::slotCancelPairingAsyncReply(int asyncCallId)
|
||||
{
|
||||
slotPairingTimeOut();
|
||||
}
|
||||
|
||||
void DeviceSetupWizard::slotCancelPairing()
|
||||
{
|
||||
int asyncCallId = 0;
|
||||
TQT_DBusError error;
|
||||
if (!device->CancelPairingAsync(asyncCallId, error))
|
||||
{
|
||||
if (error.isValid())
|
||||
tqDebug("Failed to call DBus CancelPairingAsync: %s", error.message().local8Bit().data());
|
||||
}
|
||||
|
||||
if(pairingTimer->isActive())
|
||||
pairingTimer->stop();
|
||||
}
|
||||
|
||||
void DeviceSetupWizard::slotCancelConnecting()
|
||||
{
|
||||
int asyncCallId = 0;
|
||||
TQT_DBusError error;
|
||||
if (device->getConnected(error))
|
||||
{
|
||||
if (!device->DisconnectAsync(asyncCallId, error))
|
||||
tqDebug("Failed to call DisconnectAsync: %s", error.message().local8Bit().data());
|
||||
}
|
||||
if (error.isValid())
|
||||
tqDebug("Failed in slotCancelConnecting: %s", error.message().local8Bit().data());
|
||||
|
||||
if(connectTimer->isActive())
|
||||
connectTimer->stop();
|
||||
}
|
||||
|
||||
void DeviceSetupWizard::slotAdvancePairingProgressBar()
|
||||
{
|
||||
if (pairingProgressBar->progress() < pairingProgressBar->totalSteps())
|
||||
{
|
||||
pairingProgressBar->setProgress(pairingProgressBar->progress() + ASYNC_TIMEOUT/PROGRESS_TIMEOUT);
|
||||
}
|
||||
else
|
||||
pairingProgressBar->setProgress(0,ASYNC_TIMEOUT);
|
||||
}
|
||||
|
||||
void DeviceSetupWizard::slotAdvanceConnectProgressBar()
|
||||
{
|
||||
if (connectingProgressBar->progress() < connectingProgressBar->totalSteps())
|
||||
{
|
||||
connectingProgressBar->setProgress(connectingProgressBar->progress() + ASYNC_TIMEOUT/PROGRESS_TIMEOUT);
|
||||
}
|
||||
else
|
||||
connectingProgressBar->setProgress(0,ASYNC_TIMEOUT);
|
||||
}
|
||||
|
||||
void DeviceSetupWizard::slotNext()
|
||||
{
|
||||
TQWizard::next();
|
||||
}
|
||||
|
||||
bool DeviceSetupWizard::askClose()
|
||||
{
|
||||
TQString text;
|
||||
if (currentPage() == page(0))
|
||||
{
|
||||
text = i18n("<p>Are you sure you want to quit the Device Settings Wizard?</p>"
|
||||
"<p>The Device Settings Wizard helps you to configure the BT device and use it later.</p>"
|
||||
"<p>Click <b>Cancel</b> to return and finish your setup.</p>");
|
||||
}
|
||||
else
|
||||
{
|
||||
text = i18n("<p>Are you sure you want to quit the Device Settings Wizard?</p>"
|
||||
"<p>If yes, click <b>Quit</b> and all changes will be lost."
|
||||
"<br>If not, click <b>Cancel</b> to return and finish your setup.</p>");
|
||||
}
|
||||
int status = KMessageBox::warningContinueCancel(this, text, i18n("All Changes Will Be Lost"), KStdGuiItem::quit());
|
||||
if (status == KMessageBox::Continue)
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
void DeviceSetupWizard::slotCopySrc2Dst()
|
||||
{
|
||||
tQListViewDst->clear();
|
||||
// iterate through the first ListView...
|
||||
TQListViewItemIterator it(tQListViewSrc, TQListViewItemIterator::Selected);
|
||||
while (it.current())
|
||||
{
|
||||
(void) new TQListViewItem(tQListViewDst, it.current()->text(0));
|
||||
++it;
|
||||
}
|
||||
if (tQListViewDst->childCount() > 0)
|
||||
setNextEnabled(connectpage, true);
|
||||
}
|
||||
|
||||
void DeviceSetupWizard::slotCopyDst2Src()
|
||||
{
|
||||
// iterate through the first ListView...
|
||||
TQListViewItemIterator it(tQListViewDst, TQListViewItemIterator::Selected);
|
||||
while (it.current())
|
||||
{
|
||||
TQListViewItem *item = it.current();
|
||||
++it;
|
||||
delete item;
|
||||
}
|
||||
if (tQListViewDst->childCount() == 0)
|
||||
setNextEnabled(connectpage, false);
|
||||
}
|
||||
|
||||
#include "devicesetupwizard.moc"
|
@ -0,0 +1,119 @@
|
||||
/*
|
||||
*
|
||||
* Dialogs for tdebluez devices
|
||||
*
|
||||
* Copyright (C) 2007 Tom Patzig <tpatzig@suse.de>
|
||||
* Copyright (C) 2018 Emanoil Kotsev <deloptes@gmail.com>
|
||||
*
|
||||
*
|
||||
* This file is part of tdebluez.
|
||||
*
|
||||
* kbluetooth 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.
|
||||
*
|
||||
* kbluetooth 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 kbluetooth; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
*/
|
||||
#ifndef DEVICESETUPWIZARD_H
|
||||
#define DEVICESETUPWIZARD_H
|
||||
|
||||
#include <tqtimer.h>
|
||||
|
||||
#include "devicesetupwizarddialog.h"
|
||||
|
||||
using namespace TDEBluetooth;
|
||||
|
||||
class DeviceSetupWizard: public DeviceSetupWizardDialog
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
DeviceSetupWizard(ObjectManagerImpl *manager);
|
||||
~DeviceSetupWizard();
|
||||
|
||||
virtual void next();
|
||||
virtual void back();
|
||||
void setDevice(DeviceImpl *device);
|
||||
|
||||
private:
|
||||
void updateServiceList();
|
||||
void startPairing();
|
||||
|
||||
public slots: // Public slots
|
||||
/** the cancel button is connected to the reject() slot of TQDialog,
|
||||
* so we have to reimplement this here to add a dialogbox to
|
||||
* ask if we really want to quit the wizard.
|
||||
*/
|
||||
void reject();
|
||||
/** maybe call a dialog that the wizard has finished.
|
||||
* Calls applySettings() to save the current selection.
|
||||
*/
|
||||
void accept();
|
||||
void closeDevice();
|
||||
|
||||
/** We need this to use it in a TQTimer */
|
||||
void slotNext();
|
||||
|
||||
private slots:
|
||||
// from object manager
|
||||
void slotDeviceServicesResolvedChanged(const TQString &path, bool resolved);
|
||||
|
||||
// local
|
||||
void slotPairingTimeOut();
|
||||
void slotConnectTimeOut();
|
||||
void slotConnectNextProfile();
|
||||
|
||||
// from device1Proxy
|
||||
void slotAsyncErrorResponseDetected(int asyncCallId, const TQT_DBusError error);
|
||||
void slotConnectAsyncReply(int asyncCallId);
|
||||
// void slotDisconnectAsyncReply(int asyncCallId);
|
||||
void slotConnectProfileAsyncReply(int asyncCallId);
|
||||
// void slotDisconnectProfileAsyncReply(int asyncCallId);
|
||||
void slotPairAsyncReply(int asyncCallId);
|
||||
void slotCancelPairingAsyncReply(int asyncCallId);
|
||||
void slotCancelPairing();
|
||||
void slotCancelConnecting();
|
||||
void slotAdvancePairingProgressBar();
|
||||
void slotAdvanceConnectProgressBar();
|
||||
|
||||
protected slots:
|
||||
void slotCopySrc2Dst();
|
||||
void slotCopyDst2Src();
|
||||
|
||||
protected:
|
||||
// Protected methods
|
||||
// the close button on the titlebar sets e->accept() which we don't want.
|
||||
virtual void closeEvent(TQCloseEvent*);
|
||||
bool askClose();
|
||||
|
||||
private:
|
||||
ObjectManagerImpl *manager;
|
||||
// AdapterImpl *adapter;
|
||||
DeviceImpl *device;
|
||||
TQString address;
|
||||
TQStringList uuids;
|
||||
|
||||
TQWidget* pairpage;
|
||||
TQWidget* pairingpage;
|
||||
TQWidget* connectpage;
|
||||
TQWidget* connectingpage;
|
||||
TQWidget* donepage;
|
||||
TQTimer* pairingTimer;
|
||||
TQTimer* connectTimer;
|
||||
|
||||
// TQMap<int, TQString> asyncCalls;
|
||||
|
||||
TQStringList preferredProfiles;
|
||||
TDEConfig* m_config;
|
||||
};
|
||||
|
||||
#endif
|
@ -0,0 +1,403 @@
|
||||
<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
|
||||
<class>DeviceSetupWizardDialog</class>
|
||||
<widget class="TQWizard">
|
||||
<property name="name">
|
||||
<cstring>DeviceSetupWizardDialog</cstring>
|
||||
</property>
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>515</width>
|
||||
<height>368</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="caption">
|
||||
<string>Device Setup Wizard</string>
|
||||
</property>
|
||||
<widget class="TQWidget">
|
||||
<property name="name">
|
||||
<cstring>WizardPage</cstring>
|
||||
</property>
|
||||
<attribute name="title">
|
||||
<string>Pair</string>
|
||||
</attribute>
|
||||
<widget class="TQButtonGroup">
|
||||
<property name="name">
|
||||
<cstring>pairingButtonGroup</cstring>
|
||||
</property>
|
||||
<property name="enabled">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>30</x>
|
||||
<y>60</y>
|
||||
<width>350</width>
|
||||
<height>110</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="title">
|
||||
<string>Device pairing</string>
|
||||
</property>
|
||||
<widget class="TQRadioButton">
|
||||
<property name="name">
|
||||
<cstring>pairingRadioButton2</cstring>
|
||||
</property>
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>10</x>
|
||||
<y>70</y>
|
||||
<width>220</width>
|
||||
<height>31</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Pair &device later</string>
|
||||
</property>
|
||||
<property name="accel">
|
||||
<string>Alt+D</string>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="TQRadioButton">
|
||||
<property name="name">
|
||||
<cstring>pairingRadioButton1</cstring>
|
||||
</property>
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>10</x>
|
||||
<y>30</y>
|
||||
<width>210</width>
|
||||
<height>30</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Pair de&vice now</string>
|
||||
</property>
|
||||
<property name="accel">
|
||||
<string>Alt+V</string>
|
||||
</property>
|
||||
<property name="checked">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</widget>
|
||||
<widget class="TQLabel">
|
||||
<property name="name">
|
||||
<cstring>pairingTextLabel</cstring>
|
||||
</property>
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>30</x>
|
||||
<y>20</y>
|
||||
<width>350</width>
|
||||
<height>30</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Do you want to pair device now or later?</string>
|
||||
</property>
|
||||
</widget>
|
||||
</widget>
|
||||
<widget class="TQWidget">
|
||||
<property name="name">
|
||||
<cstring>WizardPage</cstring>
|
||||
</property>
|
||||
<attribute name="title">
|
||||
<string>Pairing</string>
|
||||
</attribute>
|
||||
<widget class="TQFrame">
|
||||
<property name="name">
|
||||
<cstring>progressBarFrame1</cstring>
|
||||
</property>
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>30</x>
|
||||
<y>10</y>
|
||||
<width>420</width>
|
||||
<height>50</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="frameShape">
|
||||
<enum>StyledPanel</enum>
|
||||
</property>
|
||||
<property name="frameShadow">
|
||||
<enum>Raised</enum>
|
||||
</property>
|
||||
<widget class="TQProgressBar">
|
||||
<property name="name">
|
||||
<cstring>pairingProgressBar</cstring>
|
||||
</property>
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>5</x>
|
||||
<y>9</y>
|
||||
<width>300</width>
|
||||
<height>29</height>
|
||||
</rect>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="TQPushButton">
|
||||
<property name="name">
|
||||
<cstring>cancelPairingButton</cstring>
|
||||
</property>
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>315</x>
|
||||
<y>9</y>
|
||||
<width>91</width>
|
||||
<height>31</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>&Cancel</string>
|
||||
</property>
|
||||
<property name="accel">
|
||||
<string>Alt+C</string>
|
||||
</property>
|
||||
</widget>
|
||||
</widget>
|
||||
</widget>
|
||||
<widget class="TQWidget">
|
||||
<property name="name">
|
||||
<cstring>WizardPage</cstring>
|
||||
</property>
|
||||
<attribute name="title">
|
||||
<string>Connect</string>
|
||||
</attribute>
|
||||
<widget class="TQPushButton">
|
||||
<property name="name">
|
||||
<cstring>buttonSrc2Dst</cstring>
|
||||
</property>
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>204</x>
|
||||
<y>62</y>
|
||||
<width>51</width>
|
||||
<height>31</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>&>></string>
|
||||
</property>
|
||||
<property name="accel">
|
||||
<string>Alt+></string>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="TQPushButton">
|
||||
<property name="name">
|
||||
<cstring>buttonDst2Src</cstring>
|
||||
</property>
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>204</x>
|
||||
<y>102</y>
|
||||
<width>51</width>
|
||||
<height>31</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="focusPolicy">
|
||||
<enum>NoFocus</enum>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>&<<</string>
|
||||
</property>
|
||||
<property name="accel">
|
||||
<string>Alt+<</string>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="TQListView">
|
||||
<column>
|
||||
<property name="text">
|
||||
<string>Service</string>
|
||||
</property>
|
||||
<property name="clickable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="resizable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</column>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>Neuer Eintrag</string>
|
||||
</property>
|
||||
<property name="pixmap">
|
||||
<pixmap></pixmap>
|
||||
</property>
|
||||
</item>
|
||||
<property name="name">
|
||||
<cstring>tQListViewSrc</cstring>
|
||||
</property>
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>30</y>
|
||||
<width>190</width>
|
||||
<height>240</height>
|
||||
</rect>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="TQListView">
|
||||
<column>
|
||||
<property name="text">
|
||||
<string>Service</string>
|
||||
</property>
|
||||
<property name="clickable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="resizable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</column>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>Neuer Eintrag</string>
|
||||
</property>
|
||||
<property name="pixmap">
|
||||
<pixmap></pixmap>
|
||||
</property>
|
||||
</item>
|
||||
<property name="name">
|
||||
<cstring>tQListViewDst</cstring>
|
||||
</property>
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>270</x>
|
||||
<y>30</y>
|
||||
<width>201</width>
|
||||
<height>240</height>
|
||||
</rect>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="TQLabel">
|
||||
<property name="name">
|
||||
<cstring>connectTextLabel</cstring>
|
||||
</property>
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>270</width>
|
||||
<height>30</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Select service to connect:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</widget>
|
||||
<widget class="TQWidget">
|
||||
<property name="name">
|
||||
<cstring>WizardPage</cstring>
|
||||
</property>
|
||||
<attribute name="title">
|
||||
<string>Connecting</string>
|
||||
</attribute>
|
||||
<widget class="TQFrame">
|
||||
<property name="name">
|
||||
<cstring>progressBarFrame2</cstring>
|
||||
</property>
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>40</x>
|
||||
<y>20</y>
|
||||
<width>420</width>
|
||||
<height>50</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="frameShape">
|
||||
<enum>StyledPanel</enum>
|
||||
</property>
|
||||
<property name="frameShadow">
|
||||
<enum>Raised</enum>
|
||||
</property>
|
||||
<widget class="TQProgressBar">
|
||||
<property name="name">
|
||||
<cstring>connectingProgressBar</cstring>
|
||||
</property>
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>5</x>
|
||||
<y>9</y>
|
||||
<width>300</width>
|
||||
<height>29</height>
|
||||
</rect>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="TQPushButton">
|
||||
<property name="name">
|
||||
<cstring>cancelConnectButton</cstring>
|
||||
</property>
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>315</x>
|
||||
<y>9</y>
|
||||
<width>91</width>
|
||||
<height>31</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>&Cancel</string>
|
||||
</property>
|
||||
<property name="accel">
|
||||
<string>Alt+C</string>
|
||||
</property>
|
||||
</widget>
|
||||
</widget>
|
||||
</widget>
|
||||
<widget class="TQWidget">
|
||||
<property name="name">
|
||||
<cstring>WizardPage</cstring>
|
||||
</property>
|
||||
<attribute name="title">
|
||||
<string>Done</string>
|
||||
</attribute>
|
||||
<widget class="TQLabel">
|
||||
<property name="name">
|
||||
<cstring>doneTextLabel</cstring>
|
||||
</property>
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>30</x>
|
||||
<y>20</y>
|
||||
<width>261</width>
|
||||
<height>31</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="backgroundMode">
|
||||
<enum>PaletteBackground</enum>
|
||||
</property>
|
||||
<property name="backgroundOrigin">
|
||||
<enum>WidgetOrigin</enum>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Done setup device</string>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="TQCheckBox">
|
||||
<property name="name">
|
||||
<cstring>trustedCheckBox</cstring>
|
||||
</property>
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>30</x>
|
||||
<y>60</y>
|
||||
<width>270</width>
|
||||
<height>31</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Trust the &device</string>
|
||||
</property>
|
||||
<property name="accel">
|
||||
<string>Alt+D</string>
|
||||
</property>
|
||||
</widget>
|
||||
</widget>
|
||||
</widget>
|
||||
<includes>
|
||||
<include location="global" impldecl="in declaration">kcombobox.h</include>
|
||||
</includes>
|
||||
<layoutdefaults spacing="6" margin="11"/>
|
||||
</UI>
|
@ -0,0 +1,866 @@
|
||||
/*
|
||||
*
|
||||
* Device Manager Gui for tdebluez
|
||||
*
|
||||
* Copyright (C) 2018 Emanoil Kotsev <deloptes@gmail.com>
|
||||
*
|
||||
*
|
||||
* This file is part of tdebluez.
|
||||
*
|
||||
* tdebluez 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.
|
||||
*
|
||||
* tdebluez 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 kbluetooth; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
*/
|
||||
|
||||
#include <tqdbusobjectpath.h>
|
||||
#include <tdeconfig.h>
|
||||
#include <tqpushbutton.h>
|
||||
#include <knotifydialog.h>
|
||||
#include <knotifyclient.h>
|
||||
|
||||
#include <devicemimeconverter.h>
|
||||
#include <btuuids.h>
|
||||
|
||||
#include "application.h"
|
||||
#include "devicewizard.h"
|
||||
|
||||
#define LOGOTIMEOUT 80 //80 msec
|
||||
#define CONTIMEOUT 5000 //5 sec
|
||||
|
||||
DeviceWizard::DeviceWizard(TDEBluetoothApp* a) :
|
||||
DeviceDialog(), app(a)
|
||||
{
|
||||
// use the first powered adapter
|
||||
TQMap<TQString, AdapterImpl*>::Iterator ait = app->adapters.begin();
|
||||
for (ait; ait != app->adapters.end(); ++ait)
|
||||
{
|
||||
AdapterImpl *adptr = ait.data();
|
||||
if (adptr)
|
||||
{
|
||||
TQT_DBusError dbuserr;
|
||||
if (adptr->getPowered(dbuserr))
|
||||
{
|
||||
adapter = ait.data();
|
||||
break;
|
||||
}
|
||||
if (dbuserr.isValid())
|
||||
tqDebug("Get powered for active adapter failed: %s", dbuserr.message().local8Bit().data());
|
||||
}
|
||||
}
|
||||
|
||||
// else use the first available
|
||||
if (!adapter)
|
||||
adapter = (app->adapters).begin().data();
|
||||
|
||||
devicesetupwizard = new DeviceSetupWizard(app->manager);
|
||||
|
||||
devicedlg_ext = new DeviceDialog_Ext(this);
|
||||
setExtension(devicedlg_ext->newDevFrame);
|
||||
setOrientation(TQt::Vertical);
|
||||
|
||||
mainlogo = TDEGlobal::iconLoader()->loadIcon("tdebluez", TDEIcon::Small, 16);
|
||||
setIcon(mainlogo);
|
||||
|
||||
connectingDevice = {ConState::IDLE, TQString(), TQStringList()};
|
||||
|
||||
pix = TDEGlobal::iconLoader()->loadIcon("bluetooth", TDEIcon::Small, 48);
|
||||
pixmapLabel->setPixmap(pix);
|
||||
pixmapLabel->show();
|
||||
|
||||
logoBlend = pix;
|
||||
KPixmapEffect::blend(logoBlend, -1, red, KPixmapEffect::DiagonalGradient);
|
||||
|
||||
deviceBox->header()->hide();
|
||||
|
||||
// add devices
|
||||
TDEBluetoothApp::DevicesMap::Iterator dit = app->devices.begin();
|
||||
for (dit; dit != app->devices.end(); ++dit)
|
||||
{
|
||||
kdDebug() << "device path: " << dit.key() << endl;
|
||||
slotInsertDevice(dit.key());
|
||||
}
|
||||
|
||||
int colSize = deviceBox->columnWidth(1);
|
||||
deviceBox->setColumnWidth(1, colSize + 20);
|
||||
|
||||
/* disable button by default */
|
||||
setStateDeviceButtons(false);
|
||||
|
||||
devicedlg_ext->newdevList->header()->hide();
|
||||
devicedlg_ext->newdevList->setColumnAlignment(2, TQt::AlignVCenter);
|
||||
devicedlg_ext->setupButton->setEnabled(false);
|
||||
|
||||
// connect signals
|
||||
// devicedlg_ext
|
||||
connect(devicedlg_ext->setupButton, SIGNAL(clicked()),
|
||||
this, TQT_SLOT(slotSetupNewDevice()));
|
||||
connect(devicedlg_ext->newdevList, SIGNAL(clicked(TQListViewItem*)),
|
||||
this, TQT_SLOT(slotChangeSetupButton(TQListViewItem*)));
|
||||
|
||||
// deviceBox
|
||||
connect(deviceBox, SIGNAL(clicked(TQListViewItem*)),
|
||||
this, TQT_SLOT(slotDeviceBoxClicked(TQListViewItem*)));
|
||||
|
||||
// this wizard
|
||||
connect(addButton, SIGNAL(toggled(bool)),
|
||||
this, TQT_SLOT(showExtension(bool)));
|
||||
connect(addButton, SIGNAL(toggled(bool)),
|
||||
this, TQT_SLOT(slotSearch(bool)));
|
||||
|
||||
connect(okButton, SIGNAL(clicked()),
|
||||
this, SLOT(slotCloseDialog()));
|
||||
|
||||
connect(configureButton, SIGNAL(clicked()),
|
||||
this, TQT_SLOT(slotConfigDevice()));
|
||||
connect(connectButton, SIGNAL(clicked()),
|
||||
this, TQT_SLOT(slotConnectButton()));
|
||||
connect(deleteButton, SIGNAL(clicked()),
|
||||
this, TQT_SLOT(slotDeleteDevice()));
|
||||
|
||||
// ADAPTER -> DIALOG
|
||||
connect(app->manager, SIGNAL(adapterDiscoveringChanged(const TQString&, bool)),
|
||||
this, TQT_SLOT(slotAdapterDiscoveringChanged(const TQString&, bool)));
|
||||
|
||||
// DEVICE -> DIALOG
|
||||
connect(app->manager, SIGNAL(deviceConnectedChanged(const TQString&, bool)),
|
||||
this, TQT_SLOT(slotDeviceConnectedChanged(const TQString&, bool)));
|
||||
connect(app->manager, SIGNAL(deviceAdded(const TQString&)),
|
||||
this, TQT_SLOT(slotInsertDevice(const TQString&)));
|
||||
connect(app->manager, SIGNAL(deviceRemoved(const TQString&)),
|
||||
this, TQT_SLOT(slotDeviceRemoved(const TQString&)));
|
||||
connect(app->manager, SIGNAL(deviceNameChanged(const TQString&, const TQString&)),
|
||||
this, TQT_SLOT(slotDeviceNameChanged(const TQString&, const TQString&)));
|
||||
connect(app->manager, SIGNAL(deviceAliasChanged(const TQString&, const TQString&)),
|
||||
this, TQT_SLOT(slotDeviceNameChanged(const TQString&, const TQString&)));
|
||||
connect(app->manager, SIGNAL(devicePairedChanged(const TQString&,bool)),
|
||||
this, TQT_SLOT(slotDevicePairedChanged(const TQString&,bool)));
|
||||
|
||||
// connect(app->manager, SIGNAL(mediaControlConnectedChanged(const TQString&,bool)),
|
||||
// TQT_SLOT(slotMediaControlConnectedChanged(const TQString&,bool)));
|
||||
|
||||
chgLogoTimer = new TQTimer(this);
|
||||
TQObject::connect(chgLogoTimer, SIGNAL(timeout()), this, SLOT(slotUpdateLogo()));
|
||||
timer = false;
|
||||
}
|
||||
|
||||
DeviceWizard::~DeviceWizard()
|
||||
{
|
||||
// if (mediaCtlDialog)
|
||||
// delete mediaCtlDialog;
|
||||
delete devicedlg_ext;
|
||||
delete devicesetupwizard;
|
||||
}
|
||||
|
||||
void DeviceWizard::slotCloseDialog()
|
||||
{
|
||||
close();
|
||||
}
|
||||
|
||||
void DeviceWizard::slotDeviceBoxClicked(TQListViewItem *dev)
|
||||
{
|
||||
if (!dev)
|
||||
{
|
||||
setStateDeviceButtons(true);
|
||||
return;
|
||||
}
|
||||
|
||||
TQString selAddr = dev->text(2);
|
||||
if (connectingDevice.state == ConState::CONNECTING)
|
||||
{
|
||||
if (selAddr == connectingDevice.address)
|
||||
{
|
||||
connectButton->setText(i18n("&Disconnect"));
|
||||
connectButton->setEnabled(true);
|
||||
}
|
||||
else
|
||||
{
|
||||
setStateDeviceButtons(false);
|
||||
TQMessageBox::information(this,
|
||||
i18n("Trying to connect device: ") + connectingDevice.address,
|
||||
i18n("Either wait or try disconnecting first"),
|
||||
TQMessageBox::Ok | TQMessageBox::Default,
|
||||
TQMessageBox::NoButton,
|
||||
TQMessageBox::NoButton);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
TDEBluetoothApp::DevicesMap::Iterator dit = app->devices.begin();
|
||||
for (dit; dit != app->devices.end(); ++dit)
|
||||
{
|
||||
TQT_DBusError dbuserr;
|
||||
TQString addr = dit.data()->getAddress(dbuserr);
|
||||
if (dbuserr.isValid())
|
||||
tqDebug("Device getAddress failed: %s", dbuserr.message().local8Bit().data());
|
||||
if (selAddr == addr)
|
||||
{
|
||||
bool connected = dit.data()->getConnected(dbuserr);
|
||||
if (dbuserr.isValid())
|
||||
tqDebug("Device getConnected failed: %s", dbuserr.message().local8Bit().data());
|
||||
if (connected)
|
||||
{
|
||||
connectButton->setText(i18n("&Disconnect"));
|
||||
}
|
||||
else
|
||||
{
|
||||
connectButton->setText(i18n("C&onnect"));
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
setStateDeviceButtons(true);
|
||||
}
|
||||
|
||||
void DeviceWizard::slotChangeSetupButton(TQListViewItem *dev)
|
||||
{
|
||||
devicedlg_ext->setupButton->setEnabled(true);
|
||||
}
|
||||
|
||||
void DeviceWizard::slotConnectButton()
|
||||
{
|
||||
TQListViewItem *sel = deviceBox->selectedItem();
|
||||
|
||||
if (!sel)
|
||||
return;
|
||||
|
||||
setStateDeviceButtons(false);
|
||||
|
||||
TDEBluetoothApp::DevicesMap::Iterator dit = app->devices.begin();
|
||||
for (dit; dit != app->devices.end(); ++dit)
|
||||
{
|
||||
TQT_DBusError dbuserr;
|
||||
TQString addr = dit.data()->getAddress(dbuserr);
|
||||
if (dbuserr.isValid())
|
||||
tqDebug("Device getAddress failed: %s", dbuserr.message().local8Bit().data());
|
||||
if (sel->text(2) == addr)
|
||||
{
|
||||
if (connectButton->text() == "C&onnect")
|
||||
{
|
||||
connectingDevice.state = ConState::CONNECTING;
|
||||
connectingDevice.address = addr;
|
||||
|
||||
app->m_config->setGroup(addr);
|
||||
TQStringList profiles = app->m_config->readListEntry("profile");
|
||||
connectingDevice.profiles = profiles;
|
||||
|
||||
if (connectingDevice.profiles.isEmpty())
|
||||
{
|
||||
devicesetupwizard->setDevice(dit.data());
|
||||
devicesetupwizard->show();
|
||||
devicesetupwizard->raise();
|
||||
devicedlg_ext->setupButton->setEnabled(false);
|
||||
}
|
||||
else
|
||||
{
|
||||
slotConnectNextProfile();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
int asyncCallId = 0;
|
||||
if (dit.data()->DisconnectAsync(asyncCallId, dbuserr))
|
||||
{
|
||||
app->manager->getConnection()->scheduleDispatch();
|
||||
connectingDevice.state = ConState::DISCONNECTING;
|
||||
connectingDevice.profiles.clear();
|
||||
}
|
||||
if (dbuserr.isValid())
|
||||
{
|
||||
tqDebug("DisconnectAsync failed: %s", dbuserr.message().local8Bit().data());
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void DeviceWizard::slotConnectNextProfile()
|
||||
{
|
||||
TQString profile = connectingDevice.profiles.first();
|
||||
if (profile.isEmpty())
|
||||
{
|
||||
connectingDevice = {ConState::IDLE, TQString(), TQStringList()};
|
||||
return;
|
||||
}
|
||||
|
||||
TQT_DBusError dbuserr;
|
||||
TQString path;
|
||||
TDEBluetoothApp::DevicesMap::Iterator dit = app->devices.begin();
|
||||
for (dit; dit != app->devices.end(); ++dit)
|
||||
{
|
||||
TQString addr = dit.data()->getAddress(dbuserr);
|
||||
if (dbuserr.isValid())
|
||||
tqDebug("Device getAddress failed: %s", dbuserr.message().local8Bit().data());
|
||||
if (addr == connectingDevice.address)
|
||||
{
|
||||
path = dit.key();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (path.isEmpty())
|
||||
{
|
||||
connectingDevice = {ConState::IDLE, TQString(), TQStringList()};
|
||||
return;
|
||||
}
|
||||
|
||||
int asyncCallId = 0;
|
||||
if (app->devices[path]->ConnectProfileAsync(asyncCallId, profile, dbuserr))
|
||||
{
|
||||
app->manager->getConnection()->scheduleDispatch();
|
||||
|
||||
connectingDevice.profiles.pop_front();
|
||||
if (!connectingDevice.profiles.isEmpty())
|
||||
TQTimer::singleShot(CONTIMEOUT, this, TQT_SLOT(slotConnectNextProfile()));
|
||||
}
|
||||
else
|
||||
{
|
||||
if (dbuserr.isValid())
|
||||
tqDebug("ConnectProfileAsync failed: %s", dbuserr.message().local8Bit().data());
|
||||
|
||||
TQString text = i18n("<p>Attempt to start connection with the device failed</p>"
|
||||
"<p>You can retry to connect or click <b>Cancel</b> to stop.</p>");
|
||||
int status = KMessageBox::warningContinueCancel(this,
|
||||
text,
|
||||
i18n("Connection attempts will be interrupted"),
|
||||
KStdGuiItem::quit());
|
||||
if (status == KMessageBox::Continue)
|
||||
TQTimer::singleShot(CONTIMEOUT, this, TQT_SLOT(slotConnectNextProfile()));
|
||||
else
|
||||
connectingDevice = {ConState::IDLE, TQString(), TQStringList()};
|
||||
}
|
||||
}
|
||||
|
||||
void DeviceWizard::slotSetAdapter(const TQString &path, const TQString &name)
|
||||
{
|
||||
adapter = app->adapters[path];
|
||||
}
|
||||
|
||||
void DeviceWizard::setStateDeviceButtons(bool state)
|
||||
{
|
||||
connectButton->setEnabled(state);
|
||||
deleteButton->setEnabled(state);
|
||||
configureButton->setEnabled(state);
|
||||
}
|
||||
|
||||
void DeviceWizard::slotDeviceConnectedChanged(const TQString &path, bool connect)
|
||||
{
|
||||
TQT_DBusError dbuserr;
|
||||
TQString addr = app->devices[path]->getAddress(dbuserr);
|
||||
if (dbuserr.isValid())
|
||||
tqDebug("Device getAddress failed: %s", dbuserr.message().local8Bit().data());
|
||||
|
||||
TQListViewItem *devItem = deviceBox->findItem(addr, 2, TQt::ExactMatch);
|
||||
if (!devItem)
|
||||
return; // may be it was already deleted
|
||||
|
||||
//this is the selected item
|
||||
if (devItem == deviceBox->selectedItem())
|
||||
{
|
||||
if (connect)
|
||||
connectButton->setText(i18n("&Disconnect"));
|
||||
else
|
||||
connectButton->setText(i18n("C&onnect"));
|
||||
setStateDeviceButtons(true);
|
||||
}
|
||||
|
||||
if (connect)
|
||||
{
|
||||
KPixmap pix = TDEGlobal::iconLoader()->loadIcon("bookmark", TDEIcon::Small, 16);
|
||||
devItem->setPixmap(0, pix);
|
||||
}
|
||||
else
|
||||
{
|
||||
devItem->setPixmap(0, TQPixmap());
|
||||
}
|
||||
|
||||
// If we initiated the connection request, set state
|
||||
if (addr == connectingDevice.address)
|
||||
{
|
||||
switch (connectingDevice.state)
|
||||
{
|
||||
case ConState::CONNECTING:
|
||||
if (connectingDevice.profiles.isEmpty())
|
||||
connectingDevice = {ConState::IDLE, TQString(), TQStringList()};
|
||||
break;
|
||||
case ConState::DISCONNECTING:
|
||||
connectingDevice = {ConState::IDLE, TQString(), TQStringList()};
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void DeviceWizard::slotDeleteDevice()
|
||||
{
|
||||
TQListViewItem *sel = deviceBox->selectedItem();
|
||||
/* No device selected */
|
||||
if (!sel)
|
||||
return;
|
||||
|
||||
TDEBluetoothApp::DevicesMap::Iterator dit = app->devices.begin();
|
||||
for (dit; dit != app->devices.end(); ++dit)
|
||||
{
|
||||
TQT_DBusError dbuserr;
|
||||
TQString addr = dit.data()->getAddress(dbuserr);
|
||||
if (dbuserr.isValid())
|
||||
tqDebug("Device getAddress failed: %s", dbuserr.message().local8Bit().data());
|
||||
if (sel->text(2) == addr)
|
||||
{
|
||||
if (!adapter->RemoveDevice(TQT_DBusObjectPath(dit.key()), dbuserr))
|
||||
{
|
||||
TQString err = (dbuserr.isValid()) ? dbuserr.message() : i18n("No error message");
|
||||
TQMessageBox::information(this,
|
||||
i18n("Remove failed"),
|
||||
i18n("Device ") + addr + i18n(" could not be removed!\nReason: ") + err,
|
||||
TQMessageBox::Ok | TQMessageBox::Default,
|
||||
TQMessageBox::NoButton,
|
||||
TQMessageBox::NoButton);
|
||||
}
|
||||
|
||||
app->m_config->deleteGroup(addr);
|
||||
app->m_config->sync();
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
// fix for not emitting signal after device was remove
|
||||
// this results in not updating the device wizard and
|
||||
// leaving the device in the list, while the device is
|
||||
// removed from the adapter list
|
||||
app->manager->getConnection()->scheduleDispatch();
|
||||
// selection is to be removed
|
||||
setStateDeviceButtons(false);
|
||||
}
|
||||
|
||||
void DeviceWizard::slotDeviceRemoved(const TQString& path)
|
||||
{
|
||||
kdDebug() << __func__ << endl;
|
||||
// because device was already deleted from the devicemap
|
||||
// we need to find out which view item it is
|
||||
TQStringList addrList1 = TQStringList();
|
||||
TQStringList addrList2 = TQStringList();
|
||||
|
||||
TQListViewItemIterator it1(deviceBox);
|
||||
while (it1.current())
|
||||
{
|
||||
TQString addr = it1.current()->text(2);
|
||||
addrList1.append(addr);
|
||||
++it1;
|
||||
}
|
||||
|
||||
TQListViewItemIterator it2(devicedlg_ext->newdevList);
|
||||
while (it2.current())
|
||||
{
|
||||
TQString addr = it2.current()->text(1);
|
||||
addrList2.append(addr);
|
||||
++it2;
|
||||
}
|
||||
|
||||
TDEBluetoothApp::DevicesMap::Iterator dit = app->devices.begin();
|
||||
for (dit; dit != app->devices.end(); ++dit)
|
||||
{
|
||||
TQT_DBusError dbuserr;
|
||||
TQString addr = dit.data()->getAddress(dbuserr);
|
||||
if (dbuserr.isValid())
|
||||
tqDebug("Device getAddress failed: %s", dbuserr.message().local8Bit().data());
|
||||
if (addrList1.grep(addr).size() == 1)
|
||||
addrList1.remove(addr);
|
||||
if (addrList2.grep(addr).size() == 1)
|
||||
addrList2.remove(addr);
|
||||
}
|
||||
for (TQStringList::Iterator it = addrList1.begin(); it != addrList1.end();
|
||||
++it)
|
||||
{
|
||||
TQListViewItem *item = deviceBox->findItem((*it), 2, TQt::ExactMatch);
|
||||
if (item)
|
||||
delete item;
|
||||
}
|
||||
for (TQStringList::Iterator it = addrList2.begin(); it != addrList2.end();
|
||||
++it)
|
||||
{
|
||||
TQListViewItem *item = devicedlg_ext->newdevList->findItem((*it), 1, TQt::ExactMatch);
|
||||
if (item)
|
||||
delete item;
|
||||
}
|
||||
|
||||
devicedlg_ext->setupButton->setEnabled(false);
|
||||
setStateDeviceButtons(false);
|
||||
}
|
||||
|
||||
void DeviceWizard::slotConfigDevice()
|
||||
{
|
||||
TQListViewItem *sel = deviceBox->selectedItem();
|
||||
// No device selected
|
||||
if (!sel)
|
||||
return;
|
||||
|
||||
TDEBluetoothApp::DevicesMap::Iterator dit = app->devices.begin();
|
||||
for (dit; dit != app->devices.end(); ++dit)
|
||||
{
|
||||
TQT_DBusError dbuserr;
|
||||
TQString addr = dit.data()->getAddress(dbuserr);
|
||||
if (dbuserr.isValid())
|
||||
tqDebug("Device getAddress failed: %s", dbuserr.message().local8Bit().data());
|
||||
if (sel->text(2) == addr)
|
||||
{
|
||||
// device to be configured
|
||||
setStateDeviceButtons(false);
|
||||
devicesetupwizard->setDevice(dit.data());
|
||||
devicesetupwizard->show();
|
||||
devicesetupwizard->raise();
|
||||
devicedlg_ext->setupButton->setEnabled(false);
|
||||
kdDebug() << "address: _____________" << addr << endl;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void DeviceWizard::slotSearch(bool state)
|
||||
{
|
||||
// Discovering can be enabled and disabled only from
|
||||
// the one and the same application
|
||||
TQT_DBusError dbuserr;
|
||||
if (state)
|
||||
{
|
||||
adapter->StartDiscovery(dbuserr);
|
||||
if (dbuserr.isValid())
|
||||
tqDebug("Device StartDiscovery failed: %s", dbuserr.message().local8Bit().data());
|
||||
addButton->setText(i18n("&Stop Discovery >>"));
|
||||
}
|
||||
else
|
||||
{
|
||||
adapter->StopDiscovery(dbuserr);
|
||||
if (dbuserr.isValid())
|
||||
tqDebug("Device StopDiscovery failed: %s", dbuserr.message().local8Bit().data());
|
||||
addButton->setText(i18n("&Start Discovery <<"));
|
||||
}
|
||||
}
|
||||
|
||||
void DeviceWizard::slotAdapterDiscoveringChanged(const TQString& path, bool state)
|
||||
{
|
||||
timer = state;
|
||||
|
||||
if (state)
|
||||
{
|
||||
// new device list should be empty when starting search/discovery
|
||||
// but also the device should be removed from the bluetooth cache
|
||||
// this means iterate over devicedlg_ext->newdevList and call
|
||||
// adapter->RemoveDevice(object_path, error) on the device
|
||||
disconnect(app->manager, SIGNAL(deviceRemoved(const TQString&)),
|
||||
this, TQT_SLOT(slotDeviceRemoved(const TQString&)));
|
||||
TQListViewItemIterator it2(devicedlg_ext->newdevList);
|
||||
while (it2.current())
|
||||
{
|
||||
TQString addr = it2.current()->text(1);
|
||||
TDEBluetoothApp::DevicesMap::Iterator dit = app->devices.begin();
|
||||
for (dit; dit != app->devices.end(); ++dit)
|
||||
{
|
||||
TQT_DBusError dbuserr;
|
||||
TQString thepath = dit.data()->getPath();
|
||||
TQString theaddr = dit.data()->getAddress(dbuserr);
|
||||
if (dbuserr.isValid())
|
||||
tqDebug("Device getAddress failed: %s", dbuserr.message().local8Bit().data());
|
||||
if (addr == theaddr)
|
||||
{
|
||||
adapter->RemoveDevice(thepath, dbuserr);
|
||||
if (dbuserr.isValid())
|
||||
tqDebug("Remove Device failed: %s", dbuserr.message().local8Bit().data());
|
||||
break;
|
||||
}
|
||||
}
|
||||
++it2;
|
||||
}
|
||||
devicedlg_ext->newdevList->clear();
|
||||
connect(app->manager, SIGNAL(deviceRemoved(const TQString&)),
|
||||
this, TQT_SLOT(slotDeviceRemoved(const TQString&)));
|
||||
devicedlg_ext->statusbar->setText(i18n("Device Discovery started"));
|
||||
chgLogoTimer->start(LOGOTIMEOUT);
|
||||
}
|
||||
else
|
||||
{
|
||||
chgLogoTimer->stop();
|
||||
pixmapLabel->setPixmap(pix);
|
||||
}
|
||||
}
|
||||
|
||||
void DeviceWizard::slotInsertDevice(const TQString& path)
|
||||
{
|
||||
TQT_DBusError dbuserr;
|
||||
TQString addr = app->devices[path]->getAddress(dbuserr);
|
||||
if (dbuserr.isValid())
|
||||
tqDebug("Device getAddress failed: %s", dbuserr.message().local8Bit().data());
|
||||
TQString name = app->devices[path]->getName(dbuserr);
|
||||
if (dbuserr.isValid())
|
||||
tqDebug("Device getName failed: %s", dbuserr.message().local8Bit().data());
|
||||
bool paired = app->devices[path]->getPaired(dbuserr);
|
||||
if (dbuserr.isValid())
|
||||
tqDebug("Device getPaired failed: %s", dbuserr.message().local8Bit().data());
|
||||
TQ_UINT32 devclass = app->devices[path]->getClass(dbuserr);
|
||||
if (dbuserr.isValid())
|
||||
tqDebug("Device getClass failed: %s", dbuserr.message().local8Bit().data());
|
||||
bool connected = app->devices[path]->getConnected(dbuserr);
|
||||
if (dbuserr.isValid())
|
||||
tqDebug("Device getConnected failed: %s", dbuserr.message().local8Bit().data());
|
||||
|
||||
|
||||
connect(app->devices[path], SIGNAL(AsyncErrorResponseDetected(int /*asyncCallId*/, const TQT_DBusError)),
|
||||
this, TQT_SLOT(slotAsyncErrorResponseDetected(int /*asyncCallId*/, const TQT_DBusError)));
|
||||
// connect(app->devices[path], SIGNAL(ConnectAsyncReply(int /*asyncCallId*/)),
|
||||
// this, TQT_SLOT(slotConnectAsyncReply(int /*asyncCallId*/)));
|
||||
// connect(app->devices[path], SIGNAL(DisonnectAsyncReply(int /*asyncCallId*/)),
|
||||
// this, TQT_SLOT(slotDisconnectAsyncReply(int /*asyncCallId*/)));
|
||||
// connect(app->devices[path], SIGNAL(ConnectProfileAsyncReply(int /*asyncCallId*/)),
|
||||
// this, TQT_SLOT(slotConnectProfileAsyncReply(int /*asyncCallId*/)));
|
||||
|
||||
|
||||
TQListViewItem *devItem = deviceBox->findItem(addr, 2, TQt::ExactMatch);
|
||||
//device was already setup but is not in the deviceBox
|
||||
if (paired && !devItem)
|
||||
{
|
||||
TQListViewItem *toAddDev = new TQListViewItem(deviceBox);
|
||||
toAddDev->setText(1, name);
|
||||
toAddDev->setText(2, addr);
|
||||
TQString iconName = DeviceMimeConverter::classToIconName(devclass);
|
||||
KPixmap pix2 = TDEGlobal::iconLoader()->loadIcon(iconName, TDEIcon::Small, 16);
|
||||
toAddDev->setPixmap(3, pix2);
|
||||
|
||||
KPixmap pix3 = TDEGlobal::iconLoader()->loadIcon("bookmark", TDEIcon::Small, 16);
|
||||
|
||||
if (connected)
|
||||
toAddDev->setPixmap(0, pix3);
|
||||
deviceBox->insertItem(toAddDev);
|
||||
return;
|
||||
}
|
||||
|
||||
//device was not setup it belongs to the new device list
|
||||
TQString mimeType = DeviceMimeConverter::classToMimeType(devclass);
|
||||
TQString type;
|
||||
if (mimeType == "bluetooth/peripheral-device-class")
|
||||
{
|
||||
type = i18n("peripheral");
|
||||
}
|
||||
else if (mimeType == "bluetooth/av-device-class")
|
||||
{
|
||||
type = i18n("A/V");
|
||||
}
|
||||
else if (mimeType == "bluetooth/phone-device-class")
|
||||
{
|
||||
type = i18n("phone");
|
||||
}
|
||||
else if (mimeType == "bluetooth/wearable-device-class")
|
||||
{
|
||||
type = i18n("wearable");
|
||||
}
|
||||
else if (mimeType == "bluetooth/toy-device-class")
|
||||
{
|
||||
type = i18n("toy");
|
||||
}
|
||||
else if (mimeType == "bluetooth/health-device-class")
|
||||
{
|
||||
type = i18n("toy");
|
||||
}
|
||||
else if (mimeType == "bluetooth/computer-device-class")
|
||||
{
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
type = i18n("unknown");
|
||||
}
|
||||
|
||||
TQListViewItem *ndevlist = new TQListViewItem(devicedlg_ext->newdevList, name, addr);
|
||||
|
||||
TQString iconName = DeviceMimeConverter::classToIconName(devclass);
|
||||
KPixmap pix2 = TDEGlobal::iconLoader()->loadIcon(iconName, TDEIcon::Small, 32);
|
||||
ndevlist->setPixmap(2, pix2);
|
||||
|
||||
devicedlg_ext->newdevList->insertItem(ndevlist);
|
||||
|
||||
int size1 = devicedlg_ext->newdevList->columnWidth(0);
|
||||
devicedlg_ext->newdevList->setColumnWidth(0, size1 + 15);
|
||||
|
||||
int size2 = devicedlg_ext->newdevList->columnWidth(1);
|
||||
devicedlg_ext->newdevList->setColumnWidth(1, size2 + 15);
|
||||
|
||||
devicedlg_ext->statusbar->setText(i18n("Found new %1 device.").arg(type));
|
||||
}
|
||||
|
||||
void DeviceWizard::slotDeviceNameChanged(const TQString& path, const TQString& newname)
|
||||
{
|
||||
TQT_DBusError dbuserr;
|
||||
TQString addr = app->devices[path]->getAddress(dbuserr);
|
||||
if (dbuserr.isValid())
|
||||
tqDebug("Device getAddress failed: %s", dbuserr.message().local8Bit().data());
|
||||
|
||||
TQListViewItem *tmp = devicedlg_ext->newdevList->findItem(addr, 1, TQt::ExactMatch);
|
||||
if (tmp) {
|
||||
if (tmp->text(0) == "")
|
||||
{
|
||||
const TQPixmap *ico = tmp->pixmap(2);
|
||||
devicedlg_ext->newdevList->takeItem(tmp);
|
||||
TQListViewItem *ndevlist = new TQListViewItem(devicedlg_ext->newdevList, newname, addr);
|
||||
if (ndevlist)
|
||||
{
|
||||
ndevlist->setPixmap(2, (*ico));
|
||||
devicedlg_ext->newdevList->insertItem(ndevlist);
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
tmp = deviceBox->findItem(addr, 2, TQt::ExactMatch);
|
||||
if (tmp) {
|
||||
if (tmp->text(0) == "")
|
||||
{
|
||||
const TQPixmap *ico = tmp->pixmap(2);
|
||||
deviceBox->takeItem(tmp);
|
||||
TQListViewItem *devlist = new TQListViewItem(deviceBox, newname, addr);
|
||||
if (devlist)
|
||||
{
|
||||
devlist->setPixmap(2, (*ico));
|
||||
deviceBox->insertItem(devlist);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void DeviceWizard::slotAsyncErrorResponseDetected(int asyncCallId, const TQT_DBusError dbuserr)
|
||||
{
|
||||
tqDebug("AsyncErrorResponseDetected (%i): %i %s %s", asyncCallId, dbuserr.type(), dbuserr.name().local8Bit().data(), dbuserr.message().local8Bit().data());
|
||||
|
||||
connectingDevice = {ConState::IDLE, TQString(), TQStringList()};
|
||||
connectButton->setText(i18n("C&onnect"));
|
||||
setStateDeviceButtons(true);
|
||||
|
||||
KNotifyClient::event(TDEApplication::kApplication()->mainWidget()->winId(),
|
||||
"ConnectionError", tr("AsyncErrorResponseDetected: %1\n%2\n%3")
|
||||
.arg(dbuserr.type())
|
||||
.arg(dbuserr.name().local8Bit().data())
|
||||
.arg(dbuserr.message().local8Bit().data()));
|
||||
}
|
||||
|
||||
void DeviceWizard::slotSetupNewDevice()
|
||||
{
|
||||
TQListViewItem *confSel = devicedlg_ext->newdevList->currentItem();
|
||||
if (!confSel)
|
||||
{
|
||||
TQMessageBox::information(this,
|
||||
i18n("Setup device"),
|
||||
i18n("You have to select a remote Device to setup!"),
|
||||
TQMessageBox::Ok | TQMessageBox::Default,
|
||||
TQMessageBox::NoButton,
|
||||
TQMessageBox::NoButton);
|
||||
return;
|
||||
}
|
||||
|
||||
TQString selAddr = confSel->text(1);
|
||||
DeviceImpl *newdev;
|
||||
|
||||
TDEBluetoothApp::DevicesMap::Iterator dit = app->devices.begin();
|
||||
for (dit; dit != app->devices.end(); ++dit)
|
||||
{
|
||||
TQT_DBusError dbuserr;
|
||||
TQString addr = dit.data()->getAddress(dbuserr);
|
||||
if (dbuserr.isValid())
|
||||
tqDebug("Device getAddress failed: %s", dbuserr.message().local8Bit().data());
|
||||
if (selAddr == addr)
|
||||
{
|
||||
newdev = dit.data();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!newdev)
|
||||
{
|
||||
TQMessageBox::information(this,
|
||||
i18n("Setup device"),
|
||||
i18n("No device matching selection was found!"),
|
||||
TQMessageBox::Ok | TQMessageBox::Default,
|
||||
TQMessageBox::NoButton,
|
||||
TQMessageBox::NoButton);
|
||||
return;
|
||||
}
|
||||
|
||||
setStateDeviceButtons(false);
|
||||
devicesetupwizard->setDevice(newdev);
|
||||
devicesetupwizard->show();
|
||||
devicesetupwizard->raise();
|
||||
devicedlg_ext->setupButton->setEnabled(false);
|
||||
|
||||
kdDebug() << "address: _____________" << selAddr << endl;
|
||||
}
|
||||
|
||||
void DeviceWizard::slotDevicePairedChanged(const TQString& path, bool)
|
||||
{
|
||||
TQListViewItem *confSel = devicedlg_ext->newdevList->currentItem();
|
||||
if (!confSel)
|
||||
return;
|
||||
|
||||
TQString selAddr = confSel->text(1);
|
||||
TQListViewItem* newDeviceBoxItem = new TQListViewItem(deviceBox);
|
||||
newDeviceBoxItem->setText(1, confSel->text(0));
|
||||
newDeviceBoxItem->setText(2, selAddr);
|
||||
|
||||
TDEBluetoothApp::DevicesMap::Iterator dit = app->devices.begin();
|
||||
for (dit; dit != app->devices.end(); ++dit)
|
||||
{
|
||||
TQT_DBusError dbuserr;
|
||||
TQString addr = dit.data()->getAddress(dbuserr);
|
||||
if (dbuserr.isValid())
|
||||
tqDebug("Device getAddress failed: %s", dbuserr.message().local8Bit().data());
|
||||
if (addr == selAddr)
|
||||
{
|
||||
TQString iconName = DeviceMimeConverter::classToIconName(dit.data()->getClass(dbuserr));
|
||||
KPixmap pix4 = TDEGlobal::iconLoader()->loadIcon(iconName, TDEIcon::Small, 16);
|
||||
newDeviceBoxItem->setPixmap(3, pix4);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
deviceBox->insertItem(newDeviceBoxItem);
|
||||
delete confSel;
|
||||
}
|
||||
|
||||
//void DeviceWizard::slotMediaControlConnectedChanged(const TQString &path,
|
||||
// bool connect)
|
||||
//{
|
||||
// if (connect)
|
||||
// mediaCtlDialog = new MediaControl(path, app->manager->getConnection());
|
||||
// else
|
||||
// mediaCtlDialog->close();
|
||||
//}
|
||||
|
||||
void DeviceWizard::slotUpdateLogo()
|
||||
{
|
||||
if (!addButton->isOn()) {
|
||||
timer = false;
|
||||
pixmapLabel->setPixmap(pix);
|
||||
return;
|
||||
}
|
||||
|
||||
if (timer == false)
|
||||
{
|
||||
pixmapLabel->setPixmap(logoBlend);
|
||||
timer = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
pixmapLabel->setPixmap(pix);
|
||||
timer = false;
|
||||
}
|
||||
}
|
||||
|
||||
#include "devicewizard.moc"
|
||||
|
@ -0,0 +1,123 @@
|
||||
/*
|
||||
*
|
||||
* Device Manager Gui for tdebluez
|
||||
*
|
||||
* Copyright (C) 2018 Emanoil Kotsev <deloptes@gmail.com>
|
||||
*
|
||||
*
|
||||
* This file is part of tdebluez.
|
||||
*
|
||||
* tdebluez 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.
|
||||
*
|
||||
* tdebluez 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 kbluetooth; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
*/
|
||||
#ifndef DEVICEWIZARD_H
|
||||
#define DEVICEWIZARD_H
|
||||
|
||||
#include <tqheader.h>
|
||||
#include <tqtoolbutton.h>
|
||||
#include <tqlabel.h>
|
||||
//
|
||||
#include <tqlistview.h>
|
||||
#include <kpixmap.h>
|
||||
#include <kiconloader.h>
|
||||
#include <kpixmapeffect.h>
|
||||
|
||||
#include <objectmanagerImpl.h>
|
||||
#include <adapterImpl.h>
|
||||
#include <deviceImpl.h>
|
||||
|
||||
#include "devicedialog.h"
|
||||
#include "devicedialog_ext.h"
|
||||
#include "devicesetupwizard.h"
|
||||
//#include "mediacontrol.h"
|
||||
|
||||
using namespace TDEBluetooth;
|
||||
|
||||
class DeviceWizard: public DeviceDialog
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
DeviceWizard(TDEBluetoothApp* app);
|
||||
~DeviceWizard();
|
||||
|
||||
private:
|
||||
void setStateDeviceButtons(bool state);
|
||||
|
||||
private slots:
|
||||
// device wizard ui
|
||||
void slotDeviceBoxClicked(TQListViewItem*);
|
||||
void slotChangeSetupButton(TQListViewItem*);
|
||||
void slotConnectButton();
|
||||
void slotCloseDialog();
|
||||
void slotSearch(bool state);
|
||||
void slotUpdateLogo();
|
||||
void slotInsertDevice(const TQString& path);
|
||||
void slotSetupNewDevice();
|
||||
void slotDeleteDevice();
|
||||
void slotConfigDevice();
|
||||
|
||||
// supportive
|
||||
void slotConnectNextProfile();
|
||||
void slotSetAdapter(const TQString& path, const TQString& name);
|
||||
|
||||
// MANAGER -> device wizard
|
||||
// adapter related
|
||||
void slotAdapterDiscoveringChanged(const TQString&, bool);
|
||||
// void slotMediaControlConnectedChanged(const TQString&, bool);
|
||||
// device related
|
||||
// void slotSetConnectedIcon(const TQString&);
|
||||
// void slotSetDisconnectedIcon(const TQString&);
|
||||
void slotDeviceConnectedChanged(const TQString&, bool);
|
||||
void slotDeviceRemoved(const TQString& path);
|
||||
void slotDevicePairedChanged(const TQString&, bool);
|
||||
void slotDeviceNameChanged(const TQString&, const TQString&);
|
||||
|
||||
void slotAsyncErrorResponseDetected(int asyncCallId, const TQT_DBusError dbuserr);
|
||||
// void slotConnectAsyncReply(int asyncCallId);
|
||||
// void slotConnectProfileAsyncReply(int asyncCallId);
|
||||
|
||||
|
||||
|
||||
private:
|
||||
TDEBluetoothApp *app;
|
||||
AdapterImpl *adapter;
|
||||
|
||||
DeviceDialog_Ext *devicedlg_ext;
|
||||
DeviceSetupWizard *devicesetupwizard;
|
||||
// MediaControl *mediaCtlDialog;
|
||||
|
||||
enum ConState
|
||||
{
|
||||
IDLE = 0, CONNECTING, DISCONNECTING
|
||||
};
|
||||
|
||||
struct ConnectDevice {
|
||||
ConState state;
|
||||
TQString address;
|
||||
TQStringList profiles; // when multiple profiles are to be connected
|
||||
};
|
||||
|
||||
KPixmap logoBlend;
|
||||
KPixmap pix;
|
||||
KPixmap mainlogo;
|
||||
|
||||
TQTimer* chgLogoTimer;
|
||||
bool timer;
|
||||
|
||||
ConnectDevice connectingDevice;
|
||||
};
|
||||
|
||||
#endif
|
@ -0,0 +1,83 @@
|
||||
/*
|
||||
*
|
||||
* Copyright (C) 2018 Emanoil Kotsev <deloptes@gmail.com>
|
||||
*
|
||||
*
|
||||
* This file is part of tdebluez.
|
||||
*
|
||||
* tdebluez 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.
|
||||
*
|
||||
* tdebluez 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 kbluetooth; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
*/
|
||||
|
||||
#include <tdecmdlineargs.h>
|
||||
#include <tdeaboutdata.h>
|
||||
#include <iostream>
|
||||
|
||||
#include "application.h"
|
||||
static const char *description = I18N_NOOP(
|
||||
"TDEBluetooth is a bluetooth manager\nfor the Trinity Desktop.");
|
||||
|
||||
static TDECmdLineOptions options[] =
|
||||
{
|
||||
{
|
||||
"dontforceshow",
|
||||
I18N_NOOP("Show the tray icon if it was disabled before."),
|
||||
0
|
||||
},
|
||||
{ 0, 0, 0 }
|
||||
};
|
||||
|
||||
extern "C" KDE_EXPORT int kdemain(int argc, char **argv)
|
||||
{
|
||||
TDELocale::setMainCatalogue("tdebluez");
|
||||
TDEAboutData aboutData( "tdebluez",
|
||||
I18N_NOOP("TDEBluetooth"),
|
||||
0,
|
||||
description,
|
||||
TDEAboutData::License_GPL,
|
||||
"(c) 2018-, Emanoil Kotsev\n(c) 2003-2004, Fred Schaettgen",
|
||||
0,
|
||||
"http://trinitydesktop.org");
|
||||
aboutData.addAuthor( "Emanoil Kotsev",
|
||||
I18N_NOOP("Port to TDE and fundamental rework with Bluez5"),
|
||||
"deloptes@gmail.com");
|
||||
TDECmdLineArgs::init(argc, argv, &aboutData);
|
||||
TDECmdLineArgs::addCmdLineOptions(options);
|
||||
KUniqueApplication::addCmdLineOptions();
|
||||
|
||||
if (!KUniqueApplication::start())
|
||||
{
|
||||
std::cerr << i18n("TDEBluetooth is already running.\n").local8Bit();
|
||||
return 0;
|
||||
}
|
||||
|
||||
TDEBluetoothApp a;
|
||||
|
||||
if (!a.isConnected())
|
||||
{
|
||||
KMessageBox::error(NULL, i18n("Can't connect to DBus!\nUnable to start tdebluez. \n\n \
|
||||
Restart dbus and the bluetooth service"));
|
||||
// debug message for testing
|
||||
std::cerr << i18n("Can't connect to DBus!\n").local8Bit();
|
||||
KUniqueApplication::kApplication()->quit();
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
return a.exec();
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -0,0 +1,181 @@
|
||||
/*
|
||||
*
|
||||
* MediaControl for tdebluez
|
||||
*
|
||||
* Copyright (C) 2018 Emanoil Kotsev <deloptes@gmail.com>
|
||||
*
|
||||
*
|
||||
* This file is part of tdebluez.
|
||||
*
|
||||
* tdebluez 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.
|
||||
*
|
||||
* tdebluez 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 kbluetooth; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
*/
|
||||
|
||||
#include <kdebug.h>
|
||||
|
||||
#include <tqpushbutton.h>
|
||||
#include <tqslider.h>
|
||||
#include <kiconloader.h>
|
||||
#include "mediacontrol.h"
|
||||
|
||||
MediaControl::MediaControl(TQString path, TQT_DBusConnection *conn) :
|
||||
MediaCtlDlg()
|
||||
{
|
||||
pixStart = TDEGlobal::iconLoader()->loadIcon("media-playback-start", TDEIcon::Small, 22);
|
||||
pixPause = TDEGlobal::iconLoader()->loadIcon("media-playback-pause", TDEIcon::Small, 22);
|
||||
|
||||
tQPushButtonPlay->setPixmap(pixStart);
|
||||
tQPushButtonSeekForward->setPixmap(TDEGlobal::iconLoader()->loadIcon("media-seek-forward", TDEIcon::Small, 22));
|
||||
tQPushButtonSeekBackward->setPixmap(TDEGlobal::iconLoader()->loadIcon("media-seek-backward", TDEIcon::Small, 22));
|
||||
tQPushButtonForward->setPixmap(TDEGlobal::iconLoader()->loadIcon("media-skip-forward", TDEIcon::Small, 22));
|
||||
tQPushButtonBackward->setPixmap(TDEGlobal::iconLoader()->loadIcon("media-skip-backward", TDEIcon::Small, 22));
|
||||
tQPushButtonStop->setPixmap(TDEGlobal::iconLoader()->loadIcon("media-playback-stop", TDEIcon::Small, 22));
|
||||
|
||||
tQVolumeSlider->setTracking(false);
|
||||
tQVolumeSlider->setRange(0, 100);
|
||||
volume = 50;
|
||||
tQVolumeSlider->setValue(volume);
|
||||
|
||||
mPath = path;
|
||||
mediaCtlProxy = new org::bluez::MediaControl1Proxy("org.bluez", path);
|
||||
mediaCtlProxy->setConnection((*(conn)));
|
||||
|
||||
connect((TQObject*) tQPushButtonPlay, SIGNAL(clicked()), this, TQT_SLOT(slotPlay()));
|
||||
connect((TQObject*) tQPushButtonPlay, SIGNAL(toggled(bool)), this, TQT_SLOT(slotPlayToggled(bool)));
|
||||
connect((TQObject*) tQPushButtonSeekForward, SIGNAL(clicked()), this, TQT_SLOT(slotFastForward()));
|
||||
connect((TQObject*) tQPushButtonSeekBackward, SIGNAL(clicked()), this, TQT_SLOT(slotRewind()));
|
||||
connect((TQObject*) tQPushButtonForward, SIGNAL(clicked()), this, TQT_SLOT(slotNext()));
|
||||
connect((TQObject*) tQPushButtonBackward, SIGNAL(clicked()), this, TQT_SLOT(slotPrevious()));
|
||||
connect((TQObject*) tQPushButtonStop, SIGNAL(clicked()), this, TQT_SLOT(slotStop()));
|
||||
// tQProgressSlider
|
||||
connect((TQObject*) tQVolumeSlider, SIGNAL(valueChanged(int)), this, TQT_SLOT(slotVolumeValueChanged(int)));
|
||||
// tQPushButtonRepeat
|
||||
show();
|
||||
}
|
||||
|
||||
MediaControl::~MediaControl()
|
||||
{
|
||||
if (mediaCtlProxy)
|
||||
delete mediaCtlProxy;
|
||||
}
|
||||
|
||||
//void MediaControl::closeMediaControl()
|
||||
//{
|
||||
//
|
||||
//}
|
||||
|
||||
void MediaControl::slotPlay()
|
||||
{
|
||||
kdDebug() << k_funcinfo << endl;
|
||||
TQT_DBusError error;
|
||||
mediaCtlProxy->Play(error);
|
||||
if (error.isValid())
|
||||
tqDebug("Media Play failed: %s", error.message().local8Bit().data());
|
||||
}
|
||||
|
||||
void MediaControl::slotPlayToggled(bool state)
|
||||
{
|
||||
kdDebug() << k_funcinfo << endl;
|
||||
if (state)
|
||||
{
|
||||
tQPushButtonPlay->setPixmap(pixPause);
|
||||
}
|
||||
else
|
||||
{
|
||||
slotPause();
|
||||
tQPushButtonPlay->setPixmap(pixStart);
|
||||
}
|
||||
}
|
||||
|
||||
void MediaControl::slotStop()
|
||||
{
|
||||
kdDebug() << k_funcinfo << endl;
|
||||
TQT_DBusError error;
|
||||
if (mediaCtlProxy->Stop(error))
|
||||
{
|
||||
if (tQPushButtonPlay->isOn())
|
||||
tQPushButtonPlay->toggle();
|
||||
}
|
||||
|
||||
if (error.isValid())
|
||||
tqDebug("Media Stop failed: %s", error.message().local8Bit().data());
|
||||
}
|
||||
|
||||
void MediaControl::slotPause()
|
||||
{
|
||||
kdDebug() << k_funcinfo << endl;
|
||||
TQT_DBusError error;
|
||||
mediaCtlProxy->Pause(error);
|
||||
if (error.isValid())
|
||||
tqDebug("Media Pause failed: %s", error.message().local8Bit().data());
|
||||
}
|
||||
|
||||
void MediaControl::slotNext()
|
||||
{
|
||||
kdDebug() << k_funcinfo << endl;
|
||||
TQT_DBusError error;
|
||||
mediaCtlProxy->Next(error);
|
||||
if (error.isValid())
|
||||
tqDebug("Media Next failed: %s", error.message().local8Bit().data());
|
||||
}
|
||||
|
||||
void MediaControl::slotPrevious()
|
||||
{
|
||||
kdDebug() << k_funcinfo << endl;
|
||||
TQT_DBusError error;
|
||||
mediaCtlProxy->Previous(error);
|
||||
if (error.isValid())
|
||||
tqDebug("Media Previous failed: %s", error.message().local8Bit().data());
|
||||
}
|
||||
|
||||
void MediaControl::slotFastForward()
|
||||
{
|
||||
kdDebug() << k_funcinfo << endl;
|
||||
TQT_DBusError error;
|
||||
mediaCtlProxy->FastForward(error);
|
||||
if (error.isValid())
|
||||
tqDebug("Media FastForward failed: %s", error.message().local8Bit().data());
|
||||
}
|
||||
|
||||
void MediaControl::slotRewind()
|
||||
{
|
||||
kdDebug() << k_funcinfo << endl;
|
||||
TQT_DBusError error;
|
||||
mediaCtlProxy->Rewind(error);
|
||||
if (error.isValid())
|
||||
tqDebug("Media Rewind failed: %s", error.message().local8Bit().data());
|
||||
}
|
||||
|
||||
void MediaControl::slotVolumeValueChanged(int val)
|
||||
{
|
||||
kdDebug() << k_funcinfo << endl;
|
||||
TQT_DBusError error;
|
||||
if (val > volume)
|
||||
{
|
||||
TQT_DBusError error;
|
||||
mediaCtlProxy->VolumeUp(error);
|
||||
if (error.isValid())
|
||||
tqDebug("Media VolumeUp getPowered failed: %s", error.message().local8Bit().data());
|
||||
}
|
||||
if (val < volume)
|
||||
{
|
||||
mediaCtlProxy->VolumeDown(error);
|
||||
if (error.isValid())
|
||||
tqDebug("Media VolumeDown getPowered failed: %s", error.message().local8Bit().data());
|
||||
}
|
||||
volume = val;
|
||||
}
|
||||
|
||||
#include "mediacontrol.moc"
|
@ -0,0 +1,66 @@
|
||||
/*
|
||||
*
|
||||
* MediaControl for tdebluez
|
||||
*
|
||||
* Copyright (C) 2018 Emanoil Kotsev <deloptes@gmail.com>
|
||||
*
|
||||
*
|
||||
* This file is part of tdebluez.
|
||||
*
|
||||
* tdebluez 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.
|
||||
*
|
||||
* tdebluez 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 kbluetooth; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef MEDIACONTROL_H_INCLUDED
|
||||
#define MEDIACONTROL_H_INCLUDED
|
||||
|
||||
#include <kdialogbase.h>
|
||||
#include <tqobject.h>
|
||||
|
||||
#include <interfaces/mediacontrol1Proxy.h>
|
||||
#include "mediactl.h"
|
||||
|
||||
class MediaControl: public MediaCtlDlg
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
MediaControl(TQString path, TQT_DBusConnection* conn);
|
||||
~MediaControl();
|
||||
// void closeMediaControl();
|
||||
|
||||
public slots:
|
||||
void slotPlay();
|
||||
void slotPlayToggled(bool);
|
||||
void slotStop();
|
||||
void slotPause();
|
||||
void slotNext();
|
||||
void slotPrevious();
|
||||
void slotFastForward();
|
||||
void slotRewind();
|
||||
void slotVolumeValueChanged(int);
|
||||
|
||||
private:
|
||||
TQString mPath;
|
||||
int volume;
|
||||
org::bluez::MediaControl1Proxy *mediaCtlProxy;
|
||||
TQPixmap pixStart;
|
||||
TQPixmap pixPause;
|
||||
|
||||
};
|
||||
|
||||
#endif //MEDIACONTROL_H_INCLUDED
|
||||
|
||||
// End of File
|
@ -0,0 +1,265 @@
|
||||
<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
|
||||
<class>MediaCtlDlg</class>
|
||||
<widget class="TQWidget">
|
||||
<property name="name">
|
||||
<cstring>MediaCtlDlg</cstring>
|
||||
</property>
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>1</x>
|
||||
<y>0</y>
|
||||
<width>140</width>
|
||||
<height>140</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>140</width>
|
||||
<height>140</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>140</width>
|
||||
<height>140</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="caption">
|
||||
<string>Media Control</string>
|
||||
</property>
|
||||
<widget class="TQLayoutWidget">
|
||||
<property name="name">
|
||||
<cstring>layout3</cstring>
|
||||
</property>
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>10</y>
|
||||
<width>120</width>
|
||||
<height>120</height>
|
||||
</rect>
|
||||
</property>
|
||||
<grid>
|
||||
<property name="name">
|
||||
<cstring>unnamed</cstring>
|
||||
</property>
|
||||
<widget class="TQSlider" row="1" column="1">
|
||||
<property name="name">
|
||||
<cstring>tQVolumeSlider</cstring>
|
||||
</property>
|
||||
<property name="orientation">
|
||||
<enum>Vertical</enum>
|
||||
</property>
|
||||
<property name="tickmarks">
|
||||
<enum>NoMarks</enum>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="TQSlider" row="2" column="0">
|
||||
<property name="name">
|
||||
<cstring>tQProgressSlider</cstring>
|
||||
</property>
|
||||
<property name="orientation">
|
||||
<enum>Horizontal</enum>
|
||||
</property>
|
||||
<property name="tickmarks">
|
||||
<enum>Below</enum>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="TQLabel" row="0" column="1">
|
||||
<property name="name">
|
||||
<cstring>pixmapAudio</cstring>
|
||||
</property>
|
||||
<property name="pixmap">
|
||||
<pixmap>image0</pixmap>
|
||||
</property>
|
||||
<property name="scaledContents">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="TQLayoutWidget" row="0" column="0" rowspan="2" colspan="1">
|
||||
<property name="name">
|
||||
<cstring>layoutButtons</cstring>
|
||||
</property>
|
||||
<grid>
|
||||
<property name="name">
|
||||
<cstring>unnamed</cstring>
|
||||
</property>
|
||||
<widget class="TQPushButton" row="0" column="1">
|
||||
<property name="name">
|
||||
<cstring>tQPushButtonPlay</cstring>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>22</width>
|
||||
<height>22</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>22</width>
|
||||
<height>22</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>></string>
|
||||
<comment>Play</comment>
|
||||
</property>
|
||||
<property name="accel">
|
||||
<string></string>
|
||||
</property>
|
||||
<property name="toggleButton">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="TQPushButton" row="1" column="2">
|
||||
<property name="name">
|
||||
<cstring>tQPushButtonSeekForward</cstring>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>22</width>
|
||||
<height>22</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>22</width>
|
||||
<height>22</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>>></string>
|
||||
<comment>Seek Forward</comment>
|
||||
</property>
|
||||
<property name="accel">
|
||||
<string></string>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="TQPushButton" row="0" column="2">
|
||||
<property name="name">
|
||||
<cstring>tQPushButtonForward</cstring>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>22</width>
|
||||
<height>22</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>22</width>
|
||||
<height>22</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>>|</string>
|
||||
<comment>Next</comment>
|
||||
</property>
|
||||
<property name="accel">
|
||||
<string></string>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="TQPushButton" row="1" column="0">
|
||||
<property name="name">
|
||||
<cstring>tQPushButtonSeekBackward</cstring>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>22</width>
|
||||
<height>22</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>22</width>
|
||||
<height>22</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string><<</string>
|
||||
<comment>Seek Back</comment>
|
||||
</property>
|
||||
<property name="accel">
|
||||
<string></string>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="TQPushButton" row="0" column="0">
|
||||
<property name="name">
|
||||
<cstring>tQPushButtonBackward</cstring>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>22</width>
|
||||
<height>22</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>22</width>
|
||||
<height>22</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>|<</string>
|
||||
<comment>Previous</comment>
|
||||
</property>
|
||||
<property name="accel">
|
||||
<string></string>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="TQPushButton" row="1" column="1">
|
||||
<property name="name">
|
||||
<cstring>tQPushButtonStop</cstring>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>22</width>
|
||||
<height>22</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>22</width>
|
||||
<height>22</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>-</string>
|
||||
<comment>Stop</comment>
|
||||
</property>
|
||||
<property name="accel">
|
||||
<string></string>
|
||||
</property>
|
||||
</widget>
|
||||
</grid>
|
||||
</widget>
|
||||
<widget class="TQPushButton" row="2" column="1">
|
||||
<property name="name">
|
||||
<cstring>tQPushButtonRepeat</cstring>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string></string>
|
||||
</property>
|
||||
<property name="pixmap">
|
||||
<pixmap>image1</pixmap>
|
||||
</property>
|
||||
<property name="accel">
|
||||
<string></string>
|
||||
</property>
|
||||
<property name="toggleButton">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</grid>
|
||||
</widget>
|
||||
</widget>
|
||||
<images>
|
||||
<image name="image0">
|
||||
<data format="PNG" length="389">89504e470d0a1a0a0000000d4948445200000020000000200806000000737a7af40000000473424954080808087c0864880000013c494441545885edd44d8a22311887f19f3078010fe6091457e2815c097e5d4711575e4010541475a1961f65f52a3da4a9699a1eed81a1febba4429ee74dbd09458a1429f28f53fa415696c7fef553e06ab50a2a958a5eaff7fef1950219349b4dd06eb741abd58a16bd42208346a3118167b359eee2670a6450abd540a7d389c0cbe5f2650211b8dbed82d3e91481e7f3f9d30572c1c7e3118cc7e308bc5eaf9f26108187c321381c0e60341a81cd66f329f83b0219d4eb7530180cc07ebfc7ef8ac378b55a7d69d3af084415f7fbfd08349d4ea3f162b10097cbe5af05a2eb14ba3a1c750087a30ef301fc783cbe2d900bfed85ca1e200de6eb7e07ebf835229ff954fd3f453812cfce38fe0d05cb7db0dec76bb77709aa6cee7b324496459e67abd4a922457205ccf3f09984c26a05c2ee76e50a4489122ff5dde0051dcb85173c955470000000049454e44ae426082</data>
|
||||
</image>
|
||||
<image name="image1">
|
||||
<data format="PNG" length="854">89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b0000000473424954080808087c0864880000030d49444154388dedd55b4814511807f0ff9999bdccec2415ae9bb8ed206e51b151490f5eb6d8cca8a7e862659715840a89ae04fa20928291866117e8c5a790a82028eaa17a88322c82a848964d0da92ca4a0dad471e7d4ceecd743bab86169906f7df03d9c0bbf73f8387c871111a623846951ffc3e3431a3f608c89001c00c4291e9a046001f84644d6843063cc595357332fb422d862936c45494aaa93a982200c9b09abf3c1fd7bd58cb13e2232d2e0402060afae3e12280d85eecef5fa94acac3992ec94c1184b4b207dccb931a3fffddb3562a9f0c834ad924020d0158944bea7e0bcbcbcccc260715376768ea2aa19e2d3e74f74ce8d496f2c3b157de18245ae2cb7472e0c16357577f755001848c19aa6cdb49256414e768ef4f071a76e18c69eb28ddb2e4f065fbd76a5fcd98ba76df94b97abaffa7a0b344d9b39060b00e0f57a338c78dce574ca88c5bea8534101a06ce3b6cb5f6331d566b3c1881b2eafd79b91aa3f00f8fd7e99733e5a373e1533159c735856029c73f8fd7e796c5e02009fcf270f3ce907f067f8fcf9b34126b23b8c61b86aef813963b0699ae09cc3b7d897820500d0340d969534e2c608ec36bbded2da5cfe2b7aea54739089ecd6d62ddb157d64c403002dadcde5a228ea834383304dd3d0340d69b0dbedd615598946225d66c9aa5297c36e6f6b3c514f4d271b3f00c0f1e686a060136f55842b55d929431004de78a29e24496a5bb62cdfd5dbdb6329b21275bbdd7a5a290044d7ac5ed77ef1d285854585c58e1de56175d6acd938d650eb01b0548070a96cd3565512258cc475ecda59e14c9809c4625fd4972fa3564f77f7f75d3b2adb0144c76036ae1f075ebfee5b77e3e6f5f0a7cf9fe673ce9d8aac0c35d41f3ffaa0f3bebfa3a3e3f0a183471cc9a489b3e75a13c3c3bacd6e77189999993d1bd66fbe989b9b7b1b4024550b221a9f1e225a4b446122aa22a2dd44944f44a17b1d775b6aeb6a78ffbb37b4ff60158dae8747f77b7e71d29b10808f00ee4cf020586865892832493c7da6759fa2b8bee167036affdd0b627ff1353100c500960020009d00bafe05fc57316d8dfe07fa3155dcf5eed88b0000000049454e44ae426082</data>
|
||||
</image>
|
||||
</images>
|
||||
<layoutdefaults spacing="6" margin="11"/>
|
||||
</UI>
|
@ -0,0 +1,253 @@
|
||||
<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
|
||||
<class>MediaCtlDlg</class>
|
||||
<widget class="TQWidget">
|
||||
<property name="name">
|
||||
<cstring>MediaCtlDlg</cstring>
|
||||
</property>
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>257</width>
|
||||
<height>178</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="caption">
|
||||
<string>Media Control</string>
|
||||
</property>
|
||||
<widget class="TQLayoutWidget">
|
||||
<property name="name">
|
||||
<cstring>layout3</cstring>
|
||||
</property>
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>10</y>
|
||||
<width>247</width>
|
||||
<height>159</height>
|
||||
</rect>
|
||||
</property>
|
||||
<grid>
|
||||
<property name="name">
|
||||
<cstring>unnamed</cstring>
|
||||
</property>
|
||||
<widget class="TQSlider" row="1" column="1">
|
||||
<property name="name">
|
||||
<cstring>tQVolumeSlider</cstring>
|
||||
</property>
|
||||
<property name="orientation">
|
||||
<enum>Vertical</enum>
|
||||
</property>
|
||||
<property name="tickmarks">
|
||||
<enum>NoMarks</enum>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="TQSlider" row="2" column="0">
|
||||
<property name="name">
|
||||
<cstring>tQProgressSlider</cstring>
|
||||
</property>
|
||||
<property name="orientation">
|
||||
<enum>Horizontal</enum>
|
||||
</property>
|
||||
<property name="tickmarks">
|
||||
<enum>Below</enum>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="TQLabel" row="0" column="1">
|
||||
<property name="name">
|
||||
<cstring>pixmapAudio</cstring>
|
||||
</property>
|
||||
<property name="pixmap">
|
||||
<pixmap>image0</pixmap>
|
||||
</property>
|
||||
<property name="scaledContents">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="TQLayoutWidget" row="0" column="0" rowspan="2" colspan="1">
|
||||
<property name="name">
|
||||
<cstring>layoutButtons</cstring>
|
||||
</property>
|
||||
<grid>
|
||||
<property name="name">
|
||||
<cstring>unnamed</cstring>
|
||||
</property>
|
||||
<widget class="TQPushButton" row="0" column="1">
|
||||
<property name="name">
|
||||
<cstring>tQPushButtonPlay</cstring>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>22</width>
|
||||
<height>22</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>32</width>
|
||||
<height>32</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>></string>
|
||||
<comment>Play</comment>
|
||||
</property>
|
||||
<property name="accel">
|
||||
<string></string>
|
||||
</property>
|
||||
<property name="toggleButton">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="TQPushButton" row="1" column="2">
|
||||
<property name="name">
|
||||
<cstring>tQPushButtonSeekForward</cstring>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>22</width>
|
||||
<height>22</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>31</width>
|
||||
<height>32</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>>></string>
|
||||
<comment>Seek Forward</comment>
|
||||
</property>
|
||||
<property name="accel">
|
||||
<string></string>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="TQPushButton" row="0" column="2">
|
||||
<property name="name">
|
||||
<cstring>tQPushButtonForward</cstring>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>22</width>
|
||||
<height>22</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>32</width>
|
||||
<height>32</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>>|</string>
|
||||
<comment>Next</comment>
|
||||
</property>
|
||||
<property name="accel">
|
||||
<string></string>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="TQPushButton" row="1" column="0">
|
||||
<property name="name">
|
||||
<cstring>tQPushButtonSeekBackward</cstring>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>22</width>
|
||||
<height>22</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>32</width>
|
||||
<height>32</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string><<</string>
|
||||
<comment>Seek Back</comment>
|
||||
</property>
|
||||
<property name="accel">
|
||||
<string></string>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="TQPushButton" row="0" column="0">
|
||||
<property name="name">
|
||||
<cstring>tQPushButtonBackward</cstring>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>22</width>
|
||||
<height>22</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>32</width>
|
||||
<height>32</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>|<</string>
|
||||
<comment>Previous</comment>
|
||||
</property>
|
||||
<property name="accel">
|
||||
<string></string>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="TQPushButton" row="1" column="1">
|
||||
<property name="name">
|
||||
<cstring>tQPushButtonStop</cstring>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>22</width>
|
||||
<height>22</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>32</width>
|
||||
<height>32</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>-</string>
|
||||
<comment>Stop</comment>
|
||||
</property>
|
||||
<property name="accel">
|
||||
<string></string>
|
||||
</property>
|
||||
</widget>
|
||||
</grid>
|
||||
</widget>
|
||||
<widget class="TQPushButton" row="2" column="1">
|
||||
<property name="name">
|
||||
<cstring>tQPushButtonRepeat</cstring>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string></string>
|
||||
</property>
|
||||
<property name="pixmap">
|
||||
<pixmap>image1</pixmap>
|
||||
</property>
|
||||
<property name="accel">
|
||||
<string></string>
|
||||
</property>
|
||||
<property name="toggleButton">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</grid>
|
||||
</widget>
|
||||
</widget>
|
||||
<images>
|
||||
<image name="image0">
|
||||
<data format="PNG" length="389">89504e470d0a1a0a0000000d4948445200000020000000200806000000737a7af40000000473424954080808087c0864880000013c494441545885edd44d8a22311887f19f3078010fe6091457e2815c097e5d4711575e4010541475a1961f65f52a3da4a9699a1eed81a1febba4429ee74dbd09458a1429f28f53fa415696c7fef553e06ab50a2a958a5eaff7fef1950219349b4dd06eb741abd58a16bd42208346a3118167b359eee2670a6450abd540a7d389c0cbe5f2650211b8dbed82d3e91481e7f3f9d30572c1c7e3118cc7e308bc5eaf9f26108187c321381c0e60341a81cd66f329f83b0219d4eb7530180cc07ebfc7ef8ac378b55a7d69d3af084415f7fbfd08349d4ea3f162b10097cbe5af05a2eb14ba3a1c750087a30ef301fc783cbe2d900bfed85ca1e200de6eb7e07ebf835229ff954fd3f453812cfce38fe0d05cb7db0dec76bb77709aa6cee7b324496459e67abd4a922457205ccf3f09984c26a05c2ee76e50a4489122ff5dde0051dcb85173c955470000000049454e44ae426082</data>
|
||||
</image>
|
||||
<image name="image1">
|
||||
<data format="PNG" length="854">89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b0000000473424954080808087c0864880000030d49444154388dedd55b4814511807f0ff9999bdccec2415ae9bb8ed206e51b151490f5eb6d8cca8a7e862659715840a89ae04fa20928291866117e8c5a790a82028eaa17a88322c82a848964d0da92ca4a0dad471e7d4ceecd743bab86169906f7df03d9c0bbf73f8387c871111a623846951ffc3e3431a3f608c89001c00c4291e9a046001f84644d6843063cc595357332fb422d862936c45494aaa93a982200c9b09abf3c1fd7bd58cb13e2232d2e0402060afae3e12280d85eecef5fa94acac3992ec94c1184b4b207dccb931a3fffddb3562a9f0c834ad924020d0158944bea7e0bcbcbcccc260715376768ea2aa19e2d3e74f74ce8d496f2c3b157de18245ae2cb7472e0c16357577f755001848c19aa6cdb49256414e768ef4f071a76e18c69eb28ddb2e4f065fbd76a5fcd98ba76df94b97abaffa7a0b344d9b39060b00e0f57a338c78dce574ca88c5bea8534101a06ce3b6cb5f6331d566b3c1881b2eafd79b91aa3f00f8fd7e99733e5a373e1533159c735856029c73f8fd7e796c5e02009fcf270f3ce907f067f8fcf9b34126b23b8c61b86aef813963b0699ae09cc3b7d897820500d0340d969534e2c608ec36bbded2da5cfe2b7aea54739089ecd6d62ddb157d64c403002dadcde5a228ea834383304dd3d0340d69b0dbedd615598946225d66c9aa5297c36e6f6b3c514f4d271b3f00c0f1e686a060136f55842b55d929431004de78a29e24496a5bb62cdfd5dbdb6329b21275bbdd7a5a290044d7ac5ed77ef1d285854585c58e1de56175d6acd938d650eb01b0548070a96cd3565512258cc475ecda59e14c9809c4625fd4972fa3564f77f7f75d3b2adb0144c76036ae1f075ebfee5b77e3e6f5f0a7cf9fe673ce9d8aac0c35d41f3ffaa0f3bebfa3a3e3f0a183471cc9a489b3e75a13c3c3bacd6e77189999993d1bd66fbe989b9b7b1b4024550b221a9f1e225a4b446122aa22a2dd44944f44a17b1d775b6aeb6a78ffbb37b4ff60158dae8747f77b7e71d29b10808f00ee4cf020586865892832493c7da6759fa2b8bee167036affdd0b627ff1353100c500960020009d00bafe05fc57316d8dfe07fa3155dcf5eed88b0000000049454e44ae426082</data>
|
||||
</image>
|
||||
</images>
|
||||
<layoutdefaults spacing="6" margin="11"/>
|
||||
</UI>
|
@ -0,0 +1,806 @@
|
||||
/*
|
||||
*
|
||||
* TrayIcon for tdebluez
|
||||
*
|
||||
* Copyright (C) 2018 Emanoil Kotsev <deloptes@gmail.com>
|
||||
*
|
||||
*
|
||||
* This file is part of tdebluez.
|
||||
*
|
||||
* tdebluez 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.
|
||||
*
|
||||
* tdebluez 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 kbluetooth; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
*/
|
||||
|
||||
#include <objectmanagerImpl.h>
|
||||
#include <adapterImpl.h>
|
||||
|
||||
#include "application.h"
|
||||
|
||||
#include "trayicon.h"
|
||||
|
||||
#define PIXMAP_LOGO "tdebluez"
|
||||
#define HELP_DOCUMENT "tdebluez/components.html#components.TDEBluetooth"
|
||||
#define PROCESS_KINPUTWIZARD "kinputwizard"
|
||||
#define PROCESS_KBLUEMON "kbluemon"
|
||||
#define PROCESS_KBLUELOCK "kbluelock"
|
||||
|
||||
|
||||
using namespace TDEBluetooth;
|
||||
|
||||
TrayIcon::TrayIcon(TDEBluetoothApp* _app)
|
||||
{
|
||||
app = _app;
|
||||
|
||||
iconConnectingBlinkState = false;
|
||||
helpMenu = new KHelpMenu(this, TDEApplication::kApplication()->aboutData());
|
||||
|
||||
adapterConfigDialog = new AdapterConfigDialog(app);
|
||||
deviceWizard = new DeviceWizard(app);
|
||||
|
||||
// alwaysVisible was part of the old code and is to be decided if we need it in the future
|
||||
// the idea is that the tray icon may be invisible if desired
|
||||
// config->setGroup("UI");
|
||||
// alwaysVisible = config->readBoolEntry("alwaysVisible", true);
|
||||
|
||||
bool agentstate = app->getStartAuthAgent();
|
||||
bool obexserver = app->getStartObex();
|
||||
bool autostart = app->getAutoStart();
|
||||
|
||||
// blinkTimer = new TQTimer(this);
|
||||
// connect(blinkTimer, SIGNAL(timeout()), this, TQT_SLOT(slotSearchIcon()));
|
||||
|
||||
// This following commented out lines are also part of the old code
|
||||
// They represent features that were not migrated to Bluez5
|
||||
// KBlueMon
|
||||
//// kbluemonAction = new TDEAction(tr("KBlue&Mon"),
|
||||
//// TDEGlobal::iconLoader()->loadIcon("info", TDEIcon::Small, 16),
|
||||
//// TDEShortcut::null(), this, "kbluemon");
|
||||
//// connect(kbluemonAction, SIGNAL(activated()), this, SLOT(slotkbluemonitor()));
|
||||
////
|
||||
//// // KBlueLock
|
||||
//// kbluelockAction = new TDEAction(tr("KBlue&Lock"),
|
||||
//// TDEGlobal::iconLoader()->loadIcon("kbluelock", TDEIcon::Small, 16),
|
||||
//// TDEShortcut::null(), this, "kbluelock");
|
||||
//// connect(kbluelockAction, SIGNAL(activated()), this, SLOT(slotkbluelock()));
|
||||
////
|
||||
//// // KBtobexclient
|
||||
//// kbtobexclientAction = new TDEAction(tr("&Send File..."),
|
||||
//// TDEGlobal::iconLoader()->loadIcon("attach", TDEIcon::Small, 16),
|
||||
//// TDEShortcut::null(), this, "kbtobexclient");
|
||||
//// connect(kbtobexclientAction, SIGNAL(activated()), this, SLOT(slotkbtobexclient()));
|
||||
////
|
||||
// // BT switch
|
||||
bool anyPowered = false;
|
||||
TDEBluetoothApp::AdaptersMap::iterator it = app->adapters.begin();
|
||||
for (it; it != app->adapters.end(); ++it)
|
||||
{
|
||||
// slotAddAdapter(it.key());
|
||||
TQT_DBusError dbuserr;
|
||||
bool powered = app->adapters[it.key()]->getPowered(dbuserr);
|
||||
if (dbuserr.isValid())
|
||||
tqDebug("Adapter getPowered failed: %s", dbuserr.message().local8Bit().data());
|
||||
TQString name = app->adapters[it.key()]->getAlias(dbuserr);
|
||||
if (dbuserr.isValid())
|
||||
tqDebug("Adapter getAlias failed: %s", dbuserr.message().local8Bit().data());
|
||||
|
||||
TQString msg;
|
||||
if (powered) {
|
||||
anyPowered = powered;
|
||||
msg = tr("Power off [%1]").arg(name);
|
||||
}
|
||||
else
|
||||
{
|
||||
msg = tr("Power on [%1]").arg(name);
|
||||
}
|
||||
|
||||
TDEToggleAction *ad_a = new TDEToggleAction(this, name.utf8());
|
||||
ad_a->setText(msg);
|
||||
ad_a->setChecked(powered);
|
||||
|
||||
showPowerOnActionMap.insert(it.key(), ad_a);
|
||||
connect(ad_a, SIGNAL(toggled(bool)), this, TQT_SLOT(slotPowerOn(bool)));
|
||||
|
||||
}
|
||||
|
||||
// Configuration menu
|
||||
configActionMenu = new TDEActionMenu(tr("&Configuration"), TDEGlobal::iconLoader()->loadIcon("configure", TDEIcon::Small, 16), this, "config_menu");
|
||||
|
||||
// Help menu
|
||||
helpActionMenu = new TDEActionMenu(tr("&Help"), TDEGlobal::iconLoader()->loadIcon("help", TDEIcon::Small, 16), this, "help_menu");
|
||||
|
||||
// show documentation
|
||||
showHelpAction = KStdAction::help(this, TQT_SLOT(slotShowHelp()), actionCollection());
|
||||
|
||||
// "About" menu item
|
||||
aboutAction = KStdAction::aboutApp(this, TQT_SLOT(slotAbout()), actionCollection());
|
||||
|
||||
// // Inputdevice configuration
|
||||
// inputConfigAction = new TDEAction(tr("&Input Devices..."),
|
||||
// TDEGlobal::iconLoader()->loadIcon("configure", TDEIcon::Small, 16),
|
||||
// TDEShortcut::null(), this, "input_config");
|
||||
// connect(inputConfigAction, SIGNAL(activated()), this, SLOT(slotInputConfig()));
|
||||
|
||||
// Bluetooth Device configuration
|
||||
// from 06_rev748007.patch
|
||||
deviceConfigAction = new TDEAction(tr("&Devices..."), TDEGlobal::iconLoader()->loadIcon("configure", TDEIcon::Small, 16), TDEShortcut::null(), this, "device_config");
|
||||
connect(deviceConfigAction, SIGNAL(activated()), this, TQT_SLOT(slotDeviceConfig()));
|
||||
|
||||
// Bluetooth Adapter configuration
|
||||
adapterConfigAction = new TDEAction(tr("&Adapters..."), TDEGlobal::iconLoader()->loadIcon("configure", TDEIcon::Small, 16), TDEShortcut::null(), this, "adapter_config");
|
||||
connect(adapterConfigAction, SIGNAL(activated()), this, TQT_SLOT(slotAdapterConfig()));
|
||||
|
||||
// // Paired device configuration
|
||||
// pairedConfigAction = new TDEAction(tr("&Paired/Trusted Devices..."),
|
||||
// TDEGlobal::iconLoader()->loadIcon("configure", TDEIcon::Small, 16),
|
||||
// TDEShortcut::null(), this, "paired_config");
|
||||
// connect(pairedConfigAction, SIGNAL(activated()), this, SLOT(slotPairedConfig()));
|
||||
|
||||
// Autostart switch
|
||||
autostartIconAction = new TDEToggleAction(this, "autostart");
|
||||
connect(autostartIconAction, SIGNAL(toggled(bool)), this, TQT_SLOT(slotIconAutostartToggled(bool)));
|
||||
autostartIconAction->setChecked(autostart);
|
||||
autostartIconAction->setText(tr("&Auto Start"));
|
||||
|
||||
// Agent switch
|
||||
agentIconAction = new TDEToggleAction(this, "tdeauthagent");
|
||||
connect(agentIconAction, SIGNAL(toggled(bool)), this, TQT_SLOT(slotIconAgentToggled(bool)));
|
||||
agentIconAction->setChecked(agentstate);
|
||||
agentIconAction->setText(tr("Auth A&gent"));
|
||||
|
||||
// Obexsrv switch
|
||||
obexIconAction = new TDEToggleAction(this, "tdebtobexsrv");
|
||||
connect(obexIconAction, SIGNAL(toggled(bool)), this, TQT_SLOT(slotIconObexToggled(bool)));
|
||||
obexIconAction->setChecked(obexserver);
|
||||
obexIconAction->setText(tr("&Obex Server"));
|
||||
|
||||
slotIconAgentToggled(agentstate);
|
||||
slotIconObexToggled(obexserver);
|
||||
|
||||
// // Always-visible switch
|
||||
// showIconAction = new TDEToggleAction(this, "always_visible");
|
||||
// connect(showIconAction, SIGNAL(toggled(bool)), this, SLOT(slotShowIconToggled(bool)));
|
||||
// showIconAction->setChecked(alwaysVisible);
|
||||
// showIconAction->setText(tr("Always &Visible"));
|
||||
// configActionMenu->insert(showIconAction);
|
||||
|
||||
KPixmap logoPixmap = TDEGlobal::iconLoader()->loadIcon(PIXMAP_LOGO, TDEIcon::Small, 22);
|
||||
iconIdle = logoPixmap;
|
||||
iconOff = logoPixmap;
|
||||
iconConnected = logoPixmap;
|
||||
iconNoAdapter = logoPixmap;
|
||||
KPixmapEffect::toGray(iconOff);
|
||||
KPixmapEffect::fade(iconOff, 0.3, TQColor(255, 255, 255));
|
||||
KPixmapEffect::fade(iconConnected, 0.5, TQColor(255, 0, 0));
|
||||
KPixmapEffect::toGray(iconNoAdapter);
|
||||
KPixmapEffect::fade(iconNoAdapter, 0.5, TQColor(128, 128, 128));
|
||||
|
||||
setupTray(anyPowered);
|
||||
|
||||
connect(app, SIGNAL(signalAdapterAdded(const TQString&)), this, TQT_SLOT(slotAddAdapter(const TQString&)));
|
||||
connect(app, SIGNAL(signalAdapterRemoved(const TQString&)), this, TQT_SLOT(slotRemoveAdapter(const TQString&)));
|
||||
|
||||
connect(app->manager, SIGNAL(adapterPowerOnChanged(const TQString&, bool)), this, TQT_SLOT(slotPowerOnChanged(const TQString&, bool)));
|
||||
connect(app->manager, SIGNAL(adapterNameChanged(const TQString&, const TQString&)), this, TQT_SLOT(slotUpdateToolTip(const TQString&, const TQString&)));
|
||||
connect(app->manager, SIGNAL(adapterAliasChanged(const TQString&, const TQString&)), this, TQT_SLOT(slotUpdateToolTip(const TQString&, const TQString&)));
|
||||
connect(app->manager, SIGNAL(adapterNameChanged(const TQString&, const TQString&)), this, TQT_SLOT(slotAdapterAliasChanged(const TQString&, const TQString&)));
|
||||
connect(app->manager, SIGNAL(adapterAliasChanged(const TQString&, const TQString&)), this, TQT_SLOT(slotAdapterAliasChanged(const TQString&, const TQString&)));
|
||||
|
||||
// connect(app->manager, SIGNAL(adapterModeChanged(const TQString&, const TQString&)), this, TQT_SLOT(slotUpdateToolTip(const TQString&, const TQString&)));
|
||||
// connect(app->manager, SIGNAL(adapterPowerOnChanged(const TQString&, bool)), this, TQT_SLOT(slotPowerOnChanged(const TQString&, bool)));
|
||||
connect(app->manager, SIGNAL(adapterDiscoverableTimeoutChanged(const TQString&, TQ_UINT32)),
|
||||
this, TQT_SLOT(slotDiscoverableTimeoutChanged(const TQString&, TQ_UINT32)));
|
||||
connect(app->manager, SIGNAL(adapterDiscoverableChanged(const TQString&, bool)),
|
||||
this, TQT_SLOT(slotDiscoverableChanged(const TQString&, bool)));
|
||||
// connect(app->manager, SIGNAL(adapterDiscoveringChanged(const TQString&, bool)), this, TQT_SLOT(slotDiscoveringChanged(const TQString&, bool)));
|
||||
connect(app->manager, SIGNAL(deviceConnectedChanged(const TQString&, bool)), this, TQT_SLOT(slotDeviceConnectedChanged(const TQString&, bool)));
|
||||
|
||||
connect(adapterConfigDialog, SIGNAL(signalAdapterSelected(const TQString&, const TQString&)),
|
||||
deviceWizard, TQT_SLOT(slotSetAdapter(const TQString&, const TQString&)));
|
||||
connect(adapterConfigDialog, SIGNAL(signalAdapterSelected(const TQString&, const TQString&)),
|
||||
this, TQT_SLOT(slotUpdateToolTip(const TQString&, const TQString&)));
|
||||
|
||||
connect(this, SIGNAL(quitSelected()), this, SLOT(slotQuitSelected()));
|
||||
|
||||
}
|
||||
|
||||
TrayIcon::~TrayIcon()
|
||||
{
|
||||
|
||||
// disconnect(app->manager, SIGNAL(deviceConnectedChanged(const TQString&, bool)), this, TQT_SLOT(slotDeviceConnectedChanged(const TQString&, bool)));
|
||||
// disconnect(app->manager, SIGNAL(adapterNameChanged(const TQString&, const TQString&)), this, TQT_SLOT(slotUpdateToolTip(const TQString&, const TQString&)));
|
||||
// disconnect(app->manager, SIGNAL(adapterAliasChanged(const TQString&, const TQString&)), this, TQT_SLOT(slotUpdateToolTip(const TQString&, const TQString&)));
|
||||
//// disconnect(app->manager, SIGNAL(adapterModeChanged(const TQString&, const TQString&)), this, SLOT(slotUpdateToolTip(const TQString&, const TQString&)));
|
||||
//// disconnect(app->manager, SIGNAL(adapterPowerOnChanged(const TQString&, bool)), this, TQT_SLOT(slotPowerOnChanged(const TQString&, bool)));
|
||||
// disconnect(app->manager, SIGNAL(adapterDiscoverableTimeoutChanged(const TQString&, TQ_UINT32)),
|
||||
// this, SLOT(slotDiscoverableTimeoutChanged(const TQString&, TQ_UINT32)));
|
||||
// disconnect(app->manager, SIGNAL(adapterDiscoverableChanged(const TQString&, bool)),
|
||||
// this, SLOT(slotDiscoverableChanged(const TQString&, bool)));
|
||||
//// disconnect(app->manager, SIGNAL(adapterDiscoveringChanged(const TQString&, bool)), this, SLOT(slotDiscoveringChanged(const TQString&, bool)));
|
||||
|
||||
if (deviceWizard)
|
||||
delete deviceWizard;
|
||||
if (adapterConfigDialog)
|
||||
delete adapterConfigDialog;
|
||||
|
||||
delete obexIconAction;
|
||||
delete agentIconAction;
|
||||
delete autostartIconAction;
|
||||
delete adapterConfigAction;
|
||||
delete deviceConfigAction;
|
||||
delete helpActionMenu;
|
||||
delete configActionMenu;
|
||||
delete helpMenu;
|
||||
}
|
||||
|
||||
void TrayIcon::setupTray(bool enable)
|
||||
{
|
||||
|
||||
// CONTEXT MENU
|
||||
|
||||
// if (!kbluemonAction->isPlugged())
|
||||
// kbluemonAction->plug(contextMenu());
|
||||
// kbluemonAction->setEnabled(enable);
|
||||
//
|
||||
// if (!kbluelockAction->isPlugged())
|
||||
// kbluelockAction->plug(contextMenu());
|
||||
// kbluelockAction->setEnabled(enable);
|
||||
//
|
||||
// if (!kbtobexclientAction->isPlugged())
|
||||
// kbtobexclientAction->plug(contextMenu());
|
||||
// kbtobexclientAction->setEnabled(enable);
|
||||
|
||||
TQMap<TQString, TDEToggleAction *>::iterator it = showPowerOnActionMap.begin();
|
||||
for (it; it != showPowerOnActionMap.end(); ++it)
|
||||
{
|
||||
if (!it.data()->isPlugged())
|
||||
it.data()->plug(contextMenu(), 1);
|
||||
// The toggle should always be active in order to power on and off
|
||||
it.data()->setEnabled(true);
|
||||
}
|
||||
|
||||
// device wizard
|
||||
if (!deviceConfigAction->isPlugged())
|
||||
deviceConfigAction->plug(contextMenu());
|
||||
deviceConfigAction->setEnabled(enable);
|
||||
|
||||
// adapter configuration
|
||||
if (!adapterConfigAction->isPlugged())
|
||||
adapterConfigAction->plug(contextMenu());
|
||||
adapterConfigAction->setEnabled(enable);
|
||||
|
||||
// the config menu
|
||||
if (!configActionMenu->isPlugged())
|
||||
configActionMenu->plug(contextMenu());
|
||||
if (!showPowerOnActionMap.isEmpty())
|
||||
configActionMenu->setEnabled(true);
|
||||
else
|
||||
configActionMenu->setEnabled(false);
|
||||
|
||||
// the help menu
|
||||
if (!helpActionMenu->isPlugged())
|
||||
helpActionMenu->plug(contextMenu());
|
||||
|
||||
// the help sub menu
|
||||
if (!showHelpAction->isPlugged())
|
||||
showHelpAction->plug(helpActionMenu->popupMenu());
|
||||
|
||||
// Report bug menu item
|
||||
/*
|
||||
TDEAction* reportBugAction = KStdAction::reportBug(this,
|
||||
SLOT(slotReportBug()), actionCollection());
|
||||
helpActionMenu->insert(reportBugAction);
|
||||
*/
|
||||
|
||||
// ABOUT MENU
|
||||
if (!aboutAction->isPlugged())
|
||||
aboutAction->plug(helpActionMenu->popupMenu());
|
||||
|
||||
// Menu entries:
|
||||
// -------------
|
||||
|
||||
// // CONFIG MENU
|
||||
// if (!inputConfigAction->isPlugged())
|
||||
// inputConfigAction->plug(configActionMenu->popupMenu());
|
||||
|
||||
// Service configuration
|
||||
/* TODO: create BlueZ service UI
|
||||
serviceConfigAction = new TDEAction(tr("Configure &Services..."),
|
||||
TDEGlobal::iconLoader()->loadIcon("configure", TDEIcon::Small, 16),
|
||||
TDEShortcut::null(), this, "service_config");
|
||||
connect(serviceConfigAction, SIGNAL(activated()), this, SLOT(slotServiceConfig()));
|
||||
configActionMenu->insert(serviceConfigAction);
|
||||
*/
|
||||
|
||||
// if (!pairedConfigAction->isPlugged())
|
||||
// pairedConfigAction->plug(configActionMenu->popupMenu());
|
||||
// configure notifications
|
||||
/*
|
||||
TDEAction* notificationAction = KStdAction::configureNotifications(this,
|
||||
SLOT(slotConfigureNotifications()), actionCollection());
|
||||
configActionMenu->insert(notificationAction);
|
||||
*/
|
||||
|
||||
// Autostart option
|
||||
if (!autostartIconAction->isPlugged())
|
||||
autostartIconAction->plug(configActionMenu->popupMenu());
|
||||
|
||||
// Agent option
|
||||
if (!agentIconAction->isPlugged())
|
||||
agentIconAction->plug(configActionMenu->popupMenu());
|
||||
|
||||
//Obex option
|
||||
if (!obexIconAction->isPlugged())
|
||||
obexIconAction->plug(configActionMenu->popupMenu());
|
||||
|
||||
// if (!showIconAction->isPlugged())
|
||||
// showIconAction->plug(configActionMenu->popupMenu());
|
||||
|
||||
updateIcon();
|
||||
show();
|
||||
}
|
||||
|
||||
void TrayIcon::updateIcon()
|
||||
{
|
||||
TQString oldText = TQToolTip::textFor(this);
|
||||
if (showPowerOnActionMap.isEmpty())
|
||||
{
|
||||
setPixmap(iconNoAdapter);
|
||||
updateTooltip(tr("No BT adapter"));
|
||||
if (!this->isHidden())
|
||||
KNotifyClient::event(TDEApplication::kApplication()->mainWidget()->winId(),
|
||||
"AdapterDetached", tr("<b>No BT adapter available.</b><br/>(BT adapter removed)"));
|
||||
|
||||
adapterConfigAction->setEnabled(false);
|
||||
deviceConfigAction->setEnabled(false);
|
||||
return;
|
||||
}
|
||||
|
||||
TQT_DBusError dbuserr;
|
||||
bool anyPowered = false;
|
||||
TQString name;
|
||||
TQString path;
|
||||
TQMap<TQString, TDEToggleAction *>::iterator it = showPowerOnActionMap.begin();
|
||||
for (it; it != showPowerOnActionMap.end(); ++it)
|
||||
{
|
||||
anyPowered = app->adapters[it.key()]->getPowered(dbuserr);
|
||||
if (dbuserr.isValid())
|
||||
tqDebug("Adapter getPowered failed: %s", dbuserr.message().local8Bit().data());
|
||||
// know if any adapter is powered
|
||||
if (anyPowered)
|
||||
{
|
||||
path = app->adapters[it.key()]->getPath();
|
||||
name = app->adapters[it.key()]->getAlias(dbuserr);
|
||||
if (dbuserr.isValid())
|
||||
tqDebug("Adapter getAlias failed: %s", dbuserr.message().local8Bit().data());
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (anyPowered)
|
||||
{
|
||||
bool anyConnected = false;
|
||||
TDEBluetoothApp::DevicesMap::Iterator dit = app->devices.begin();
|
||||
for (dit; dit != app->devices.end(); ++dit)
|
||||
{
|
||||
anyConnected = dit.data()->getConnected(dbuserr);
|
||||
if (dbuserr.isValid())
|
||||
tqDebug("Check for connected device failed: %s", dbuserr.message().local8Bit().data());
|
||||
if (anyConnected)
|
||||
break;
|
||||
}
|
||||
|
||||
if (anyConnected)
|
||||
setPixmap(iconConnected);
|
||||
else
|
||||
setPixmap(iconIdle);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (deviceWizard)
|
||||
deviceWizard->hide();
|
||||
|
||||
if (adapterConfigDialog)
|
||||
adapterConfigDialog->hide();
|
||||
|
||||
//if no other adapter was powered, use the first one for the tooltip
|
||||
path = app->adapters.begin().data()->getPath();
|
||||
name = app->adapters.begin().data()->getAlias(dbuserr);
|
||||
if (dbuserr.isValid())
|
||||
tqDebug("Adapter getAlias failed: %s", dbuserr.message().local8Bit().data());
|
||||
|
||||
setPixmap(iconOff);
|
||||
}
|
||||
|
||||
slotUpdateToolTip(path, name);
|
||||
|
||||
adapterConfigAction->setEnabled(anyPowered);
|
||||
deviceConfigAction->setEnabled(anyPowered);
|
||||
}
|
||||
|
||||
void TrayIcon::slotIconAutostartToggled(bool state)
|
||||
{
|
||||
app->setAutoStart(state);
|
||||
}
|
||||
|
||||
void TrayIcon::slotServiceConfig()
|
||||
{
|
||||
kdDebug() << k_funcinfo << endl;
|
||||
}
|
||||
|
||||
void TrayIcon::slotAdapterConfig()
|
||||
{
|
||||
adapterConfigDialog->show();
|
||||
adapterConfigDialog->raise();
|
||||
}
|
||||
|
||||
void TrayIcon::slotDeviceConfig()
|
||||
{
|
||||
deviceWizard->show();
|
||||
deviceWizard->raise();
|
||||
deviceWizard->setFocus();
|
||||
}
|
||||
|
||||
void TrayIcon::slotInputConfig()
|
||||
{
|
||||
TDEProcess process(0);
|
||||
|
||||
process << PROCESS_KINPUTWIZARD;
|
||||
if (!process.start(TDEProcess::DontCare))
|
||||
{
|
||||
KMessageBox::information(this, tr("Could not execute kinputwizard."), tr("TDEBluetooth"));
|
||||
}
|
||||
}
|
||||
|
||||
void TrayIcon::slotkbluemonitor()
|
||||
{
|
||||
TDEProcess process(0);
|
||||
process << PROCESS_KBLUEMON;
|
||||
|
||||
if (!process.start(TDEProcess::DontCare))
|
||||
{
|
||||
KMessageBox::information(this, tr("Could not execute KBlueMon."), tr("TDEBluetooth"));
|
||||
}
|
||||
}
|
||||
|
||||
void TrayIcon::slotkbluelock()
|
||||
{
|
||||
TDEProcess process(0);
|
||||
process << PROCESS_KBLUELOCK;
|
||||
|
||||
if (!process.start(TDEProcess::DontCare))
|
||||
{
|
||||
KMessageBox::information(this, tr("Could not execute KBlueLock."), tr("TDEBluetooth"));
|
||||
}
|
||||
}
|
||||
|
||||
void TrayIcon::slotIconObexToggled(bool state)
|
||||
{
|
||||
app->setStartObex(state);
|
||||
|
||||
if (state)
|
||||
{
|
||||
if (!app->startObexSrv())
|
||||
{
|
||||
KMessageBox::information(this, tr("Could not start OBEX server."), tr("TDEBluetooth"));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!app->stopObexSrv())
|
||||
{
|
||||
KMessageBox::information(this, tr("Could not stop OBEX server."), tr("TDEBluetooth"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void TrayIcon::slotIconAgentToggled(bool state)
|
||||
{
|
||||
app->setStartAuthAgent(state);
|
||||
|
||||
if (state)
|
||||
{
|
||||
if (!app->startAuthAgent())
|
||||
{
|
||||
KMessageBox::information(this, tr("Could not start TDEBluez Authentication Agent."), tr("TDEBluetooth"));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!app->stopAuthAgent())
|
||||
{
|
||||
KMessageBox::information(this, tr("Could not stop TDEBluez Authentication Agent."), tr("TDEBluetooth"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void TrayIcon::slotPowerOn(bool state)
|
||||
{
|
||||
// who send the signal ?
|
||||
const TQObject * o = TQObject::sender();
|
||||
const TDEToggleAction* obj = const_cast<TDEToggleAction*>(reinterpret_cast<const TDEToggleAction*>(o));
|
||||
TQMap<TQString, TDEToggleAction *>::Iterator it = showPowerOnActionMap.begin();
|
||||
|
||||
TQString path;
|
||||
for (it; it != showPowerOnActionMap.end(); ++it)
|
||||
{
|
||||
if (obj == it.data())
|
||||
{
|
||||
path = it.key();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
app->adapters[path]->powerOn(state);
|
||||
}
|
||||
|
||||
void TrayIcon::slotPowerOnChanged(const TQString &adapter, bool state)
|
||||
{
|
||||
TQT_DBusError dbuserr;
|
||||
TQString name = app->adapters[adapter]->getAlias(dbuserr);
|
||||
if (dbuserr.isValid())
|
||||
tqDebug("Adapter getAlias failed: %s", dbuserr.message().local8Bit().data());
|
||||
|
||||
TQString addr = app->adapters[adapter]->getAddress(dbuserr);
|
||||
if (dbuserr.isValid())
|
||||
tqDebug("Adapter getAddress failed: %s", dbuserr.message().local8Bit().data());
|
||||
|
||||
if (name.isEmpty() && addr.isEmpty()) // adapter was removed
|
||||
return;
|
||||
|
||||
TQString msg;
|
||||
if (state)
|
||||
{
|
||||
KNotifyClient::event(TDEApplication::kApplication()->mainWidget()->winId(),
|
||||
"AdapterAvailable", tr("BT adapter <b>%1</b> is on<br/>(<b>%2</b>)").arg(name).arg(addr));
|
||||
msg = tr("Power off [%1]").arg(name);
|
||||
}
|
||||
else
|
||||
{
|
||||
KNotifyClient::event(TDEApplication::kApplication()->mainWidget()->winId(),
|
||||
"AdapterAvailable", tr("BT adapter <b>%1</b> is off<br/>(<b>%2</b>)").arg(name).arg(addr));
|
||||
msg = tr("Power on [%1]").arg(name);
|
||||
}
|
||||
|
||||
showPowerOnActionMap[adapter]->setText(msg);
|
||||
showPowerOnActionMap[adapter]->setChecked(state);
|
||||
slotUpdateToolTip(adapter, name);
|
||||
updateIcon();
|
||||
}
|
||||
|
||||
void TrayIcon::slotDeviceConnectedChanged(const TQString& path, bool state)
|
||||
{
|
||||
TQT_DBusError dbuserr;
|
||||
TQString name = app->devices[path]->getAlias(dbuserr);
|
||||
if (dbuserr.isValid())
|
||||
tqDebug("Device getAlias failed: %s", dbuserr.message().local8Bit().data());
|
||||
TQString address = app->devices[path]->getAddress(dbuserr);
|
||||
if (dbuserr.isValid())
|
||||
tqDebug("Adapter getAddress failed: %s", dbuserr.message().local8Bit().data());
|
||||
if (state)
|
||||
{
|
||||
KNotifyClient::event(TDEApplication::kApplication()->mainWidget()->winId(),
|
||||
"IncomingConnection", tr("Connected to <b>%1</b> (<b>%2</b>)").arg(name).arg(address));
|
||||
}
|
||||
else
|
||||
{
|
||||
KNotifyClient::event(TDEApplication::kApplication()->mainWidget()->winId(),
|
||||
"IncomingConnection", tr("Disconnected from <b>%1</b> (<b>%2</b>)").arg(name).arg(address));
|
||||
}
|
||||
updateIcon();
|
||||
}
|
||||
|
||||
TQString TrayIcon::localAndEnglish(const TQCString& s)
|
||||
{
|
||||
if (TQString(s) != tr(s))
|
||||
return TQString("%1 (\"%2\")").arg(tr(s)).arg(s);
|
||||
else
|
||||
return s;
|
||||
}
|
||||
|
||||
void TrayIcon::mousePressEvent(TQMouseEvent *e)
|
||||
{
|
||||
if (e->button() == TQMouseEvent::LeftButton)
|
||||
{
|
||||
// TQMessageBox::information(this,
|
||||
// tr("Use right click to open the menu"),
|
||||
// tr("Left click is reserved for ObexFTP browsing.\n"
|
||||
// "ObexFTP is subject of development."));
|
||||
e->accept();
|
||||
TDEProcess proc;
|
||||
proc << "kfmclient" << "openURL" << "bluetooth:/";
|
||||
proc.start(TDEProcess::DontCare);
|
||||
}
|
||||
else
|
||||
{
|
||||
KSystemTray::mousePressEvent(e);
|
||||
}
|
||||
}
|
||||
|
||||
void TrayIcon::slotQuitSelected()
|
||||
{
|
||||
// Ask if the user want to simply quit or disable
|
||||
// automatic start of TDEBluetooth
|
||||
if (!autostartIconAction->isChecked())
|
||||
{
|
||||
int autoStart = KMessageBox::questionYesNoCancel(0,
|
||||
tr("Should TDEBluetooth still be restarted when you login?"),
|
||||
tr("Automatically Start TDEBluetooth?"),
|
||||
tr("Start"),
|
||||
tr("Do Not Start"));
|
||||
|
||||
if (autoStart == KMessageBox::Yes)
|
||||
app->setAutoStart(true);
|
||||
else if (autoStart == KMessageBox::No)
|
||||
app->setAutoStart(false);
|
||||
}
|
||||
}
|
||||
|
||||
void TrayIcon::slotShowHelp()
|
||||
{
|
||||
// TODO: This is surely not the correct way to jump to the
|
||||
// right chapter. Do I really have to mention the html-file,
|
||||
// or is the id enough?
|
||||
TDEApplication::kApplication()->invokeHelp("", HELP_DOCUMENT);
|
||||
}
|
||||
|
||||
void TrayIcon::slotAddAdapter(const TQString& path)
|
||||
{
|
||||
kdDebug() << k_funcinfo << endl; // for debugging MicheleC report
|
||||
TQT_DBusError dbuserr;
|
||||
|
||||
bool powered = app->adapters[path]->getPowered(dbuserr);
|
||||
if (dbuserr.isValid())
|
||||
tqDebug("Adapter getPowered failed: %s", dbuserr.message().local8Bit().data());
|
||||
|
||||
TQString name = app->adapters[path]->getAlias(dbuserr);
|
||||
if (dbuserr.isValid())
|
||||
tqDebug("Adapter getAlias failed: %s", dbuserr.message().local8Bit().data());
|
||||
|
||||
TQString addr = app->adapters[path]->getAddress(dbuserr);
|
||||
if (dbuserr.isValid())
|
||||
tqDebug("Adapter getAddress failed: %s", dbuserr.message().local8Bit().data());
|
||||
|
||||
TQString msg;
|
||||
if (powered)
|
||||
msg = tr("Power off [%1]").arg(name);
|
||||
else
|
||||
msg = tr("Power on [%1]").arg(name);
|
||||
|
||||
TDEToggleAction *ad_a = new TDEToggleAction(this, name.utf8());
|
||||
ad_a->setText(msg);
|
||||
ad_a->setChecked(powered);
|
||||
|
||||
showPowerOnActionMap.insert(path, ad_a);
|
||||
connect(ad_a, SIGNAL(toggled(bool)), this, SLOT(slotPowerOn(bool)));
|
||||
|
||||
KNotifyClient::event(TDEApplication::kApplication()->mainWidget()->winId(),
|
||||
"AdapterAttached", tr("BT adapter <b>%1</b> attached<br/>(<b>%2</b>)").arg(name).arg(addr));
|
||||
|
||||
if(!powered) // find out if we have some powered adapter
|
||||
{
|
||||
TQMap<TQString, TDEToggleAction *>::iterator it = showPowerOnActionMap.begin();
|
||||
for (it; it != showPowerOnActionMap.end(); ++it)
|
||||
{
|
||||
powered = app->adapters[it.key()]->getPowered(dbuserr);
|
||||
if (dbuserr.isValid())
|
||||
tqDebug("Adapter getPowered failed: %s", dbuserr.message().local8Bit().data());
|
||||
// know if any adapter is powered
|
||||
if (powered)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (obexIconAction->isChecked())
|
||||
{
|
||||
if (!app->obexServer->isRunning())
|
||||
app->startObexSrv();
|
||||
}
|
||||
|
||||
if (agentIconAction->isChecked())
|
||||
{
|
||||
if (!app->authAgent->isRunning())
|
||||
app->startAuthAgent();
|
||||
}
|
||||
|
||||
setupTray(powered);
|
||||
}
|
||||
|
||||
void TrayIcon::slotRemoveAdapter(const TQString& path)
|
||||
{
|
||||
kdDebug() << k_funcinfo << endl; // for debugging MicheleC report
|
||||
disconnect(showPowerOnActionMap[path], SIGNAL(toggled(bool)), this, SLOT(slotPowerOn(bool)));
|
||||
|
||||
if (showPowerOnActionMap[path]->isPlugged())
|
||||
showPowerOnActionMap[path]->unplug(contextMenu());
|
||||
showPowerOnActionMap.remove(path);
|
||||
|
||||
KNotifyClient::event(TDEApplication::kApplication()->mainWidget()->winId(),
|
||||
"AdapterDetached", tr("BT adapter detached"));
|
||||
|
||||
if (showPowerOnActionMap.isEmpty())
|
||||
{
|
||||
if (deviceWizard)
|
||||
deviceWizard->hide();
|
||||
if (adapterConfigDialog)
|
||||
adapterConfigDialog->hide();
|
||||
if (app->obexServer->isRunning())
|
||||
app->stopObexSrv();
|
||||
if (app->authAgent->isRunning())
|
||||
app->stopAuthAgent();
|
||||
setupTray(false);
|
||||
}
|
||||
else
|
||||
{
|
||||
setupTray(true);
|
||||
}
|
||||
}
|
||||
|
||||
void TrayIcon::slotAdapterAliasChanged(const TQString &path, const TQString &alias)
|
||||
{
|
||||
// slotAddAdapter(it.key());
|
||||
TQT_DBusError dbuserr;
|
||||
bool powered = showPowerOnActionMap[path]->isChecked();
|
||||
TQString msg;
|
||||
if (powered)
|
||||
msg = tr("Power off [%1]").arg(alias);
|
||||
else
|
||||
msg = tr("Power on [%1]").arg(alias);
|
||||
showPowerOnActionMap[path]->setText(msg);
|
||||
}
|
||||
|
||||
void TrayIcon::slotDiscoverableTimeoutChanged(const TQString &path, TQ_UINT32 timeout)
|
||||
{
|
||||
TQT_DBusError dbuserr;
|
||||
TQString name = app->adapters[path]->getAlias(dbuserr);
|
||||
if (dbuserr.isValid())
|
||||
tqDebug("Error: %s", dbuserr.message().local8Bit().data());
|
||||
slotUpdateToolTip(path, name);
|
||||
}
|
||||
|
||||
void TrayIcon::slotDiscoverableChanged(const TQString &path, bool state)
|
||||
{
|
||||
TQT_DBusError dbuserr;
|
||||
TQString name = app->adapters[path]->getAlias(dbuserr);
|
||||
if (dbuserr.isValid())
|
||||
tqDebug("Error: %s", dbuserr.message().local8Bit().data());
|
||||
slotUpdateToolTip(path, name);
|
||||
}
|
||||
|
||||
void TrayIcon::slotUpdateToolTip(const TQString& adapter, const TQString& name)
|
||||
{
|
||||
TQT_DBusError dbuserr;
|
||||
TQString addr = app->adapters[adapter]->getAddress(dbuserr);
|
||||
if (dbuserr.isValid())
|
||||
tqDebug("Error: %s", dbuserr.message().local8Bit().data());
|
||||
TQString disc =
|
||||
(app->adapters[adapter]->getDiscoverable(dbuserr)) ? "discoverable" : "hidden";
|
||||
if (dbuserr.isValid())
|
||||
tqDebug("Error: %s", dbuserr.message().local8Bit().data());
|
||||
|
||||
TQString newText = tr("Adapter: %1\nAddress: %2\nMode: %3\n").arg(name, addr, disc);
|
||||
updateTooltip(newText);
|
||||
}
|
||||
|
||||
void TrayIcon::updateTooltip(const TQString &text)
|
||||
{
|
||||
TQString oldText = TQToolTip::textFor(this);
|
||||
if (oldText != text)
|
||||
{
|
||||
TQToolTip::remove(this);
|
||||
TQToolTip::add(this, text);
|
||||
}
|
||||
}
|
||||
|
||||
#include "trayicon.moc"
|
@ -0,0 +1,160 @@
|
||||
/*
|
||||
*
|
||||
* TrayIcon for tdebluez
|
||||
*
|
||||
* Copyright (C) 2018 Emanoil Kotsev <deloptes@gmail.com>
|
||||
*
|
||||
*
|
||||
* This file is part of tdebluez.
|
||||
*
|
||||
* tdebluez 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.
|
||||
*
|
||||
* tdebluez 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 kbluetooth; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef TRAYICON_H
|
||||
#define TRAYICON_H
|
||||
|
||||
|
||||
#include <tqtooltip.h>
|
||||
#include <tdeconfig.h>
|
||||
#include <tdepopupmenu.h>
|
||||
#include <tdeactionclasses.h>
|
||||
|
||||
#include <ksystemtray.h>
|
||||
#include <khelpmenu.h>
|
||||
#include <knotifydialog.h>
|
||||
#include <knotifyclient.h>
|
||||
#include <kprocess.h>
|
||||
|
||||
#include "adapterconfigdialog.h"
|
||||
#include "devicewizard.h"
|
||||
|
||||
class TQTimer;
|
||||
class TDEToggleAction;
|
||||
class TDEAction;
|
||||
class TDEActionMenu;
|
||||
class TDEPopupMenu;
|
||||
class KHelpMenu;
|
||||
class TDEBluetoothApp;
|
||||
|
||||
/**
|
||||
@author Fred Schaettgen
|
||||
*/
|
||||
class TrayIcon: public KSystemTray
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
TrayIcon(TDEBluetoothApp* app);
|
||||
~TrayIcon();
|
||||
// void setAlwaysShowIcon(bool state);
|
||||
|
||||
private slots:
|
||||
// void slotQuitSelected();
|
||||
// void slotShowIconToggled(bool);
|
||||
void slotServiceConfig();
|
||||
// void slotPairedConfig();
|
||||
void slotDeviceConfig();
|
||||
void slotAdapterConfig();
|
||||
void slotInputConfig();
|
||||
void slotkbluemonitor();
|
||||
void slotkbluelock();
|
||||
// void slotkbtobexclient();
|
||||
void slotConfigureNotifications()
|
||||
{
|
||||
KNotifyDialog::configure(this);
|
||||
}
|
||||
;
|
||||
void slotQuitSelected();
|
||||
void slotReportBug()
|
||||
{
|
||||
helpMenu->reportBug();
|
||||
}
|
||||
;
|
||||
void slotAbout()
|
||||
{
|
||||
helpMenu->aboutApplication();
|
||||
}
|
||||
;
|
||||
void slotShowHelp();
|
||||
// void slotSearchIcon();
|
||||
void slotIconAutostartToggled(bool state);
|
||||
void slotIconAgentToggled(bool state);
|
||||
void slotIconObexToggled(bool state);
|
||||
// gui -> manager
|
||||
void slotPowerOn(bool state);
|
||||
// manager -> gui
|
||||
void slotPowerOnChanged(const TQString&, bool);
|
||||
void slotDeviceConnectedChanged(const TQString&, bool);
|
||||
void slotAddAdapter(const TQString&);
|
||||
void slotRemoveAdapter(const TQString&);
|
||||
void slotDiscoverableTimeoutChanged(const TQString&, TQ_UINT32 timeout);
|
||||
void slotDiscoverableChanged(const TQString&, bool state);
|
||||
// void slotDiscoveringChanged(const TQString&, bool state);
|
||||
void slotUpdateToolTip(const TQString& adapter, const TQString& name);
|
||||
void slotAdapterAliasChanged(const TQString&, const TQString&);
|
||||
|
||||
protected:
|
||||
void mousePressEvent(TQMouseEvent *e);
|
||||
|
||||
private:
|
||||
// TQTimer *blinkTimer;
|
||||
bool iconConnectingBlinkState;
|
||||
|
||||
KHelpMenu *helpMenu;
|
||||
TDEBluetoothApp* app;
|
||||
|
||||
AdapterConfigDialog *adapterConfigDialog; // for BT Adapters
|
||||
DeviceWizard *deviceWizard; // for BT Devices
|
||||
|
||||
bool acceptClose;
|
||||
KPixmap iconIdle;
|
||||
KPixmap iconConnected;
|
||||
KPixmap iconNoAdapter;
|
||||
KPixmap iconOff;
|
||||
|
||||
TDEToggleAction *agentIconAction;
|
||||
TDEToggleAction *obexIconAction;
|
||||
// TDEToggleAction *showIconAction;
|
||||
TDEToggleAction *autostartIconAction;
|
||||
TQMap<TQString, TDEToggleAction *> showPowerOnActionMap;
|
||||
|
||||
TDEAction *serviceConfigAction;
|
||||
// TDEAction *pairedConfigAction;
|
||||
TDEAction *adapterConfigAction;
|
||||
TDEAction *deviceConfigAction;
|
||||
// TDEAction *inputConfigAction;
|
||||
TDEAction *showHelpAction;
|
||||
TDEAction *kbluemonAction;
|
||||
TDEAction *kbluelockAction;
|
||||
TDEAction *kbtobexclientAction;
|
||||
TDEAction *aboutAction;
|
||||
TDEActionMenu *configActionMenu;
|
||||
TDEActionMenu *helpActionMenu;
|
||||
|
||||
void setupTray(bool);
|
||||
void updateIcon();
|
||||
|
||||
void updateTooltip(const TQString &text);
|
||||
|
||||
TQString localAndEnglish(const TQCString& s);
|
||||
|
||||
signals:
|
||||
// void setObexSrv(bool);
|
||||
void setPowerOn(bool);
|
||||
|
||||
};
|
||||
|
||||
#endif
|
@ -0,0 +1,47 @@
|
||||
#################################################
|
||||
#
|
||||
# (C) 2018 Emanoil Kotsev
|
||||
# deloptes (AT) gmail.com
|
||||
#
|
||||
# Improvements and feedback are welcome
|
||||
#
|
||||
# This file is released under GPL >= 2
|
||||
#
|
||||
#################################################
|
||||
|
||||
project( tdebluezauth )
|
||||
|
||||
# import required
|
||||
#tde_import( lib... )
|
||||
|
||||
include_directories(
|
||||
${CMAKE_CURRENT_BINARY_DIR}
|
||||
${CMAKE_SOURCE_DIR}
|
||||
${CMAKE_BINARY_DIR}
|
||||
${CMAKE_SOURCE_DIR}/src/libtdebluez
|
||||
${CMAKE_BINARY_DIR}/src/libtdebluez
|
||||
${TDE_INCLUDE_DIR}
|
||||
${TQT_INCLUDE_DIRS}
|
||||
# ${DBUS_INCLUDE_DIRS}
|
||||
${DBUS_TQT_INCLUDE_DIRS}
|
||||
)
|
||||
|
||||
link_directories(
|
||||
${TQT_LIBRARY_DIRS}
|
||||
)
|
||||
|
||||
##### tdebluezauth (tdeinit) ######################
|
||||
|
||||
tde_add_executable( tdebluezauth AUTOMOC
|
||||
SOURCES
|
||||
authorize.cpp authdialog.ui
|
||||
pindialog.cpp pindefdialog.ui
|
||||
authservice.cpp application.cpp main.cpp
|
||||
LINK
|
||||
${DBUS_TQT_LIBRARIES} tdebluez-shared bluezinterfaces-static
|
||||
DESTINATION ${BIN_INSTALL_DIR}
|
||||
)
|
||||
|
||||
##### other data ################################
|
||||
#tde_install_icons( tdebluezauth )
|
||||
install( FILES tdebluezauth.desktop DESTINATION ${XDG_APPS_INSTALL_DIR} )
|
@ -0,0 +1,156 @@
|
||||
/*
|
||||
*
|
||||
* Authorization Agent implementation of bluez5
|
||||
*
|
||||
* Copyright (C) 2018 Emanoil Kotsev <deloptes@gmail.com>
|
||||
*
|
||||
*
|
||||
* This file is part of tdebluezauth.
|
||||
*
|
||||
* tdebluezauth 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.
|
||||
*
|
||||
* tdebluezauth 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 kbluetooth; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
*/
|
||||
#include <tqdbusobjectpath.h>
|
||||
#include <tdecmdlineargs.h>
|
||||
#include <tdemessagebox.h>
|
||||
|
||||
#include <adapterImpl.h>
|
||||
#include "application.h"
|
||||
#include "authservice.h"
|
||||
|
||||
#define DBUS_AUTH_SERVICE "TDEBluezAuth"
|
||||
#define DBUS_AUTH_SERVICE_NAME "org.trinitydesktop.tdebluez"
|
||||
|
||||
TDEBluezAuth::TDEBluezAuth() :
|
||||
KUniqueApplication()
|
||||
{
|
||||
m_connection = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus, DBUS_AUTH_SERVICE);
|
||||
|
||||
if (!m_connection.isConnected())
|
||||
{
|
||||
kdError() << "Failed to open connection to system message bus: " << m_connection.lastError().message() << endl;
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
// try to get a specific service name
|
||||
if (!m_connection.requestName(DBUS_AUTH_SERVICE_NAME))
|
||||
{
|
||||
tqWarning("Requesting name %s failed. "
|
||||
"The object will only be addressable through unique name '%s'",
|
||||
DBUS_AUTH_SERVICE_NAME, m_connection.uniqueName().local8Bit().data());
|
||||
exit(-2);
|
||||
}
|
||||
|
||||
manager = new TDEBluetooth::ObjectManagerImpl("org.bluez", "/", this, "ObjectManager");
|
||||
if (!manager->isConnectedToDBUS())
|
||||
{
|
||||
tqDebug("ObjectManager is not connected to DBus");
|
||||
exit(-3);
|
||||
}
|
||||
|
||||
rootService = new RootNodeService(m_connection);
|
||||
orgService = new OrgNodeService(m_connection);
|
||||
tdeNodeService = new TrinityDekstopNodeService(m_connection);
|
||||
authService = new AuthService(m_connection);
|
||||
agentManager = 0;
|
||||
if (!configureAgent())
|
||||
{
|
||||
tqDebug("Failed to configure the auth agent");
|
||||
}
|
||||
disableSessionManagement();
|
||||
|
||||
// connect to manager signals
|
||||
// connect(manager, SIGNAL(adapterAdded(const TQString&)), SLOT(slotAdapterAdded(const TQString&)));
|
||||
// connect(manager, SIGNAL(adapterRemoved(const TQString&)), SLOT(slotAdapterRemoved(const TQString&)));
|
||||
connect(manager, SIGNAL(adapterPowerOnChanged(const TQString&, bool)),
|
||||
this, SLOT(slotPowerOnChanged(const TQString&, bool)));
|
||||
}
|
||||
|
||||
TDEBluezAuth::~TDEBluezAuth()
|
||||
{
|
||||
disconnect(manager, SIGNAL(adapterPowerOnChanged(const TQString&, bool)),
|
||||
this, SLOT(slotPowerOnChanged(const TQString&, bool)));
|
||||
// close D-Bus connection
|
||||
unconfigureAgent();
|
||||
|
||||
m_connection.closeConnection(DBUS_AUTH_SERVICE);
|
||||
|
||||
delete authService;
|
||||
delete tdeNodeService;
|
||||
delete orgService;
|
||||
delete rootService;
|
||||
|
||||
delete manager;
|
||||
agentManager = 0;
|
||||
}
|
||||
|
||||
bool TDEBluezAuth::isConnectedToDBUS()
|
||||
{
|
||||
return m_connection.isConnected();
|
||||
}
|
||||
|
||||
bool TDEBluezAuth::configureAgent()
|
||||
{
|
||||
if (!agentManager)
|
||||
agentManager = manager->getAgentManager();
|
||||
|
||||
if (manager->isAgentRegistered() && manager->isAgentDefaultAgent())
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!manager->isAgentRegistered())
|
||||
{
|
||||
if (!manager->registerAgent())
|
||||
{
|
||||
tqWarning("org.bluez.Agent1 registering FAILED");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
if (!manager->isAgentDefaultAgent())
|
||||
{
|
||||
if (!manager->requestDefaultAgent())
|
||||
{
|
||||
tqWarning("org.bluez.Agent1 registering FAILED");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
kdDebug() << "org.bluez.Agent1 registering OK" << endl;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool TDEBluezAuth::unconfigureAgent()
|
||||
{
|
||||
if (manager->isAgentRegistered())
|
||||
{
|
||||
if (manager->unregisterAgent())
|
||||
kdDebug() << "Agent unregistered OK" << endl;
|
||||
else
|
||||
kdDebug() << "Agent unregistered FAILED" << endl;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
void TDEBluezAuth::slotPowerOnChanged(const TQString& adapter, bool state)
|
||||
{
|
||||
if (state)
|
||||
configureAgent();
|
||||
else
|
||||
unconfigureAgent();
|
||||
}
|
||||
|
||||
#include "application.moc"
|
@ -0,0 +1,79 @@
|
||||
/*
|
||||
*
|
||||
* Authorization Agent implementation of bluez5
|
||||
*
|
||||
* Copyright (C) 2018 Emanoil Kotsev <deloptes@gmail.com>
|
||||
*
|
||||
*
|
||||
* This file is part of tdebluezauth.
|
||||
*
|
||||
* tdebluezauth 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.
|
||||
*
|
||||
* tdebluezauth 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 kbluetooth; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
*/
|
||||
#ifndef TDEAUTHAPP_H_
|
||||
#define TDEAUTHAPP_H_
|
||||
|
||||
#include <kuniqueapplication.h>
|
||||
|
||||
#include <objectmanagerImpl.h>
|
||||
#include "authservice.h"
|
||||
|
||||
class TDEBluezAuth: public KUniqueApplication
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
TDEBluezAuth();
|
||||
virtual ~TDEBluezAuth();
|
||||
|
||||
/*!
|
||||
* This function return information about connection status to the DBUS daemon.
|
||||
* \return boolean with the state of the connection to D-Bus
|
||||
* \retval true if connected
|
||||
* \retval false if disconnected
|
||||
*/
|
||||
bool isConnectedToDBUS();
|
||||
|
||||
private:
|
||||
/*!
|
||||
* This function initialise the connection to the D-Bus daemon.
|
||||
* \return boolean with the result of the operation
|
||||
* \retval true if successful initialised D-Bus connection
|
||||
* \retval false if unsuccessful
|
||||
*/
|
||||
bool configureAgent();
|
||||
//! to close the connection to D-Bus
|
||||
bool unconfigureAgent();
|
||||
|
||||
private:
|
||||
TQT_DBusConnection m_connection;
|
||||
|
||||
AgentManager1Proxy* agentManager;
|
||||
RootNodeService *rootService;
|
||||
OrgNodeService *orgService;
|
||||
TrinityDekstopNodeService *tdeNodeService;
|
||||
AuthService *authService;
|
||||
|
||||
public:
|
||||
TDEBluetooth::ObjectManagerImpl *manager;
|
||||
|
||||
public slots:
|
||||
// void slotAdapterAdded(const TQString& adapter);
|
||||
// void slotAdapterRemoved(const TQString& adapter);
|
||||
void slotPowerOnChanged(const TQString&, bool);
|
||||
|
||||
};
|
||||
|
||||
#endif // TDEAUTHAPP_H_
|
@ -0,0 +1,52 @@
|
||||
<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
|
||||
<class>AuthDialog</class>
|
||||
<widget class="TQWidget">
|
||||
<property name="name">
|
||||
<cstring>AuthDialog</cstring>
|
||||
</property>
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>425</width>
|
||||
<height>300</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy>
|
||||
<hsizetype>1</hsizetype>
|
||||
<vsizetype>1</vsizetype>
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>400</width>
|
||||
<height>300</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="caption">
|
||||
<string>AuthenticationDialog</string>
|
||||
</property>
|
||||
<vbox>
|
||||
<property name="name">
|
||||
<cstring>unnamed</cstring>
|
||||
</property>
|
||||
<widget class="TQLabel">
|
||||
<property name="name">
|
||||
<cstring>messageLabel</cstring>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string><font size="+2">Bluetooth Authorization Request</font>
|
||||
<p><b>%1</b> (device address <b>%2</b>) %3.</p>
|
||||
|
||||
<p>
|
||||
If you aren't sure about the identity of the other party, then reject
|
||||
this authorization request.</p></string>
|
||||
</property>
|
||||
</widget>
|
||||
</vbox>
|
||||
</widget>
|
||||
<layoutdefaults spacing="6" margin="11"/>
|
||||
</UI>
|
@ -0,0 +1,52 @@
|
||||
/*
|
||||
*
|
||||
* Authorization dialog for kbluetooth
|
||||
*
|
||||
* Copyright (C) 2006 Daniel Gollub <dgollub@suse.de>
|
||||
*
|
||||
*
|
||||
* This file is part of kbluetooth.
|
||||
*
|
||||
* kbluetooth 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.
|
||||
*
|
||||
* libkbluetooth 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 libkbluetooth; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
*/
|
||||
|
||||
#include "authorize.h"
|
||||
#include "authdialog.h"
|
||||
|
||||
AuthorizeDialog::AuthorizeDialog(const TQString &addr, const TQString &devName, const TQString &service) :
|
||||
KDialogBase(NULL, "authrequest", true, "Bluetooth Authorization Request",
|
||||
(Ok | Cancel), Ok, false,
|
||||
KGuiItem(i18n("Accept"), "accept"),
|
||||
KGuiItem(i18n("Reject"), "reject"))
|
||||
{
|
||||
TQString action(i18n("wants to act as Input Device"));
|
||||
|
||||
if (!service.isEmpty())
|
||||
action.append(" for " + service);
|
||||
|
||||
authDlg = new AuthDialog(this);
|
||||
authDlg->messageLabel->setText(authDlg->messageLabel->text().arg(devName).arg(addr).arg(action));
|
||||
connect(this, SIGNAL(okClicked()), SLOT(close()));
|
||||
|
||||
setMainWidget(authDlg);
|
||||
}
|
||||
|
||||
AuthorizeDialog::~AuthorizeDialog()
|
||||
{
|
||||
delete authDlg;
|
||||
}
|
||||
|
||||
#include "authorize.moc"
|
@ -0,0 +1,47 @@
|
||||
/*
|
||||
*
|
||||
* Authorization Agent implementation of bluez5
|
||||
*
|
||||
* Copyright (C) 2018 Emanoil Kotsev <deloptes@gmail.com>
|
||||
*
|
||||
*
|
||||
* This file is part of tdebluezauth.
|
||||
*
|
||||
* tdebluezauth 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.
|
||||
*
|
||||
* tdebluezauth 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 kbluetooth; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef AUTHORIZE_H
|
||||
#define AUTHORIZE_H
|
||||
|
||||
#include <tqlabel.h>
|
||||
|
||||
#include <kdialogbase.h>
|
||||
|
||||
#include "application.h"
|
||||
#include "authdialog.h"
|
||||
|
||||
class AuthorizeDialog : public KDialogBase
|
||||
{
|
||||
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
AuthorizeDialog(const TQString &addr, const TQString &devName, const TQString &service);
|
||||
~AuthorizeDialog();
|
||||
AuthDialog *authDlg;
|
||||
};
|
||||
|
||||
#endif
|
@ -0,0 +1,294 @@
|
||||
/*
|
||||
*
|
||||
* Authorization Agent implementation of bluez5
|
||||
*
|
||||
* Copyright (C) 2019 Emanoil Kotsev <deloptes@gmail.com>
|
||||
*
|
||||
*
|
||||
* This file is part of tdebluezauth.
|
||||
*
|
||||
* tdebluezauth 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.
|
||||
*
|
||||
* tdebluezauth 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 kbluetooth; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
*/
|
||||
|
||||
// TQt includes
|
||||
#include <tqdbusobjectpath.h>
|
||||
#include <deviceImpl.h>
|
||||
#include <btuuids.h>
|
||||
|
||||
#include "authservice.h"
|
||||
#include "pindialog.h"
|
||||
#include "authorize.h"
|
||||
|
||||
#define DBUS_AUTH_SERVICE_PATH "/org/trinitydesktop/tdebluez"
|
||||
|
||||
Agent1InterfaceImpl::Agent1InterfaceImpl(TQT_DBusConnection &conn) :
|
||||
m_connection(&conn)
|
||||
{
|
||||
}
|
||||
|
||||
Agent1InterfaceImpl::~Agent1InterfaceImpl()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* Implement virtual methods
|
||||
*
|
||||
*/
|
||||
|
||||
void Agent1InterfaceImpl::handleMethodReply(const TQT_DBusMessage& reply)
|
||||
{
|
||||
m_connection->send(reply);
|
||||
}
|
||||
|
||||
bool Agent1InterfaceImpl::Release(TQT_DBusError& error)
|
||||
{
|
||||
// do something
|
||||
return true;
|
||||
}
|
||||
|
||||
void Agent1InterfaceImpl::RequestPinCodeAsync(int asyncCallId, const TQT_DBusObjectPath& device)
|
||||
{
|
||||
TQT_DBusError error;
|
||||
TDEBluetooth::DeviceImpl *devImpl = new TDEBluetooth::DeviceImpl("org.bluez", device);
|
||||
devImpl->setConnection((*m_connection));
|
||||
TQString addr = devImpl->getAddress(error);
|
||||
TQString name = devImpl->getAlias(error);
|
||||
delete devImpl;
|
||||
PinDialog *pinDialog = new PinDialog(addr, name);
|
||||
pinDialog->pinDlg->pinEdit->setText(TQString());
|
||||
pinDialog->pinDlg->pinEdit->setEnabled(true);
|
||||
KDialogBase::centerOnScreen(pinDialog);
|
||||
pinDialog->setActiveWindow();
|
||||
pinDialog->show();
|
||||
pinDialog->raise();
|
||||
|
||||
if (pinDialog->exec() == TQDialog::Accepted)
|
||||
RequestPinCodeAsyncReply(asyncCallId, pinDialog->pinDlg->pinEdit->text());
|
||||
else
|
||||
RequestPinCodeAsyncError(asyncCallId, TQT_DBusError::stdFailed("Request canceled"));
|
||||
delete pinDialog;
|
||||
}
|
||||
|
||||
void Agent1InterfaceImpl::DisplayPinCodeAsync(int asyncCallId, const TQT_DBusObjectPath& device, const TQString& pincode)
|
||||
{
|
||||
TQT_DBusError error;
|
||||
TDEBluetooth::DeviceImpl *devImpl = new TDEBluetooth::DeviceImpl("org.bluez", device);
|
||||
devImpl->setConnection((*m_connection));
|
||||
TQString addr = devImpl->getAddress(error);
|
||||
TQString name = devImpl->getAlias(error);
|
||||
kdDebug() << addr << " " << name << endl;
|
||||
delete devImpl;
|
||||
PinDialog *pinDialog = new PinDialog(addr, name);
|
||||
pinDialog->pinDlg->pinEdit->setText(TQString("%1").arg(pincode));
|
||||
pinDialog->pinDlg->pinEdit->setEnabled(false);
|
||||
KDialogBase::centerOnScreen(pinDialog);
|
||||
pinDialog->setActiveWindow();
|
||||
pinDialog->show();
|
||||
pinDialog->raise();
|
||||
|
||||
if (pinDialog->exec() == TQDialog::Accepted)
|
||||
DisplayPinCodeAsyncReply(asyncCallId);
|
||||
else
|
||||
DisplayPinCodeAsyncError(asyncCallId, TQT_DBusError::stdFailed("Request not accepted"));
|
||||
delete pinDialog;
|
||||
}
|
||||
|
||||
void Agent1InterfaceImpl::RequestPasskeyAsync(int asyncCallId, const TQT_DBusObjectPath& device)
|
||||
{
|
||||
TQT_DBusError error;
|
||||
TDEBluetooth::DeviceImpl *devImpl = new TDEBluetooth::DeviceImpl("org.bluez", device);
|
||||
devImpl->setConnection((*m_connection));
|
||||
TQString addr = devImpl->getAddress(error);
|
||||
TQString name = devImpl->getAlias(error);
|
||||
delete devImpl;
|
||||
PinDialog *pinDialog = new PinDialog(addr, name);
|
||||
pinDialog->pinDlg->pinEdit->setText(TQString());
|
||||
pinDialog->pinDlg->pinEdit->setEnabled(true);
|
||||
KDialogBase::centerOnScreen(pinDialog);
|
||||
pinDialog->setActiveWindow();
|
||||
pinDialog->show();
|
||||
pinDialog->raise();
|
||||
|
||||
if (pinDialog->exec() == TQDialog::Accepted)
|
||||
RequestPasskeyAsyncReply(asyncCallId, pinDialog->pinDlg->pinEdit->text().toUInt());
|
||||
else
|
||||
RequestPasskeyAsyncError(asyncCallId, TQT_DBusError::stdFailed("Request not accepted"));
|
||||
delete pinDialog;
|
||||
}
|
||||
|
||||
void Agent1InterfaceImpl::DisplayPasskeyAsync(int asyncCallId, const TQT_DBusObjectPath& device, TQ_UINT32 passkey, TQ_UINT16 entered)
|
||||
{
|
||||
TQT_DBusError error;
|
||||
TDEBluetooth::DeviceImpl *devImpl = new TDEBluetooth::DeviceImpl("org.bluez", device);
|
||||
devImpl->setConnection((*m_connection));
|
||||
TQString addr = devImpl->getAddress(error);
|
||||
TQString name = devImpl->getAlias(error);
|
||||
delete devImpl;
|
||||
PinDialog *pinDialog = new PinDialog(addr, name);
|
||||
pinDialog->pinDlg->pinEdit->setText(TQString("%1").arg(passkey));
|
||||
pinDialog->pinDlg->pinEdit->setEnabled(false);
|
||||
KDialogBase::centerOnScreen(pinDialog);
|
||||
pinDialog->setActiveWindow();
|
||||
pinDialog->show();
|
||||
pinDialog->raise();
|
||||
|
||||
if (pinDialog->exec() == TQDialog::Accepted)
|
||||
DisplayPasskeyAsyncReply(asyncCallId);
|
||||
else
|
||||
DisplayPasskeyAsyncError(asyncCallId, TQT_DBusError::stdFailed("Request not accepted"));
|
||||
delete pinDialog;
|
||||
}
|
||||
|
||||
void Agent1InterfaceImpl::RequestConfirmationAsync(int asyncCallId, const TQT_DBusObjectPath& device, TQ_UINT32 passkey)
|
||||
{
|
||||
TQT_DBusError error;
|
||||
TDEBluetooth::DeviceImpl *devImpl = new TDEBluetooth::DeviceImpl("org.bluez", device);
|
||||
devImpl->setConnection((*m_connection));
|
||||
TQString addr = devImpl->getAddress(error);
|
||||
TQString name = devImpl->getAlias(error);
|
||||
delete devImpl;
|
||||
PinDialog *pinDialog = new PinDialog(addr, name);
|
||||
pinDialog->pinDlg->pinEdit->setText(TQString("%3").arg(passkey));
|
||||
pinDialog->pinDlg->pinEdit->setEnabled(false);
|
||||
KDialogBase::centerOnScreen(pinDialog);
|
||||
pinDialog->setActiveWindow();
|
||||
pinDialog->show();
|
||||
pinDialog->raise();
|
||||
|
||||
if (pinDialog->exec() == TQDialog::Accepted)
|
||||
RequestConfirmationAsyncReply(asyncCallId);
|
||||
else
|
||||
RequestConfirmationAsyncError(asyncCallId, TQT_DBusError::stdFailed("Request not accepted"));
|
||||
delete pinDialog;
|
||||
}
|
||||
|
||||
void Agent1InterfaceImpl::RequestAuthorizationAsync(int asyncCallId, const TQT_DBusObjectPath& device)
|
||||
{
|
||||
TQT_DBusError error;
|
||||
TDEBluetooth::DeviceImpl *devImpl = new TDEBluetooth::DeviceImpl("org.bluez", device);
|
||||
devImpl->setConnection((*m_connection));
|
||||
TQString addr = devImpl->getAddress(error);
|
||||
TQString name = devImpl->getAlias(error);
|
||||
delete devImpl;
|
||||
AuthorizeDialog *authDialog = new AuthorizeDialog(addr, name, TQString());
|
||||
KDialogBase::centerOnScreen(authDialog);
|
||||
authDialog->setActiveWindow();
|
||||
authDialog->show();
|
||||
authDialog->raise();
|
||||
|
||||
if (authDialog->exec() == TQDialog::Accepted)
|
||||
RequestAuthorizationAsyncReply(asyncCallId);
|
||||
else
|
||||
RequestAuthorizationAsyncError(asyncCallId, TQT_DBusError::stdFailed("Request not authorized"));
|
||||
delete authDialog;
|
||||
}
|
||||
|
||||
void Agent1InterfaceImpl::AuthorizeServiceAsync(int asyncCallId, const TQT_DBusObjectPath& device, const TQString& uuid)
|
||||
{
|
||||
kdDebug() << __func__ << "()" << endl;
|
||||
|
||||
TQT_DBusError error;
|
||||
TDEBluetooth::DeviceImpl *devImpl = new TDEBluetooth::DeviceImpl("org.bluez", device);
|
||||
devImpl->setConnection((*m_connection));
|
||||
TQString addr = devImpl->getAddress(error);
|
||||
TQString name = devImpl->getAlias(error);
|
||||
delete devImpl;
|
||||
AuthorizeDialog *authDialog = new AuthorizeDialog(addr, name, resolveUUID(uuid));
|
||||
KDialogBase::centerOnScreen(authDialog);
|
||||
authDialog->setActiveWindow();
|
||||
authDialog->show();
|
||||
authDialog->raise();
|
||||
|
||||
if (authDialog->exec() == TQDialog::Accepted)
|
||||
AuthorizeServiceAsyncReply(asyncCallId);
|
||||
else
|
||||
AuthorizeServiceAsyncError(asyncCallId, TQT_DBusError::stdFailed("Request not accepted"));
|
||||
delete authDialog;
|
||||
}
|
||||
|
||||
bool Agent1InterfaceImpl::Cancel(TQT_DBusError& error)
|
||||
{
|
||||
kdDebug() << __func__ << "()" << endl;
|
||||
|
||||
// do something
|
||||
return true;
|
||||
}
|
||||
|
||||
RootNodeService::RootNodeService(TQT_DBusConnection &connection) :
|
||||
DBusBaseNode(), m_connection(connection)
|
||||
{
|
||||
addChildNode("org");
|
||||
registerObject(m_connection, "/");
|
||||
}
|
||||
|
||||
RootNodeService::~RootNodeService()
|
||||
{
|
||||
}
|
||||
|
||||
TQT_DBusObjectBase* RootNodeService::createInterface(const TQString& interfaceName)
|
||||
{
|
||||
return (TQT_DBusObjectBase*) m_interfaces[interfaceName];
|
||||
}
|
||||
|
||||
OrgNodeService::OrgNodeService(TQT_DBusConnection &connection) :
|
||||
DBusBaseNode(), m_connection(connection)
|
||||
{
|
||||
addChildNode("trinitydesktop");
|
||||
registerObject(m_connection, "/org");
|
||||
}
|
||||
|
||||
OrgNodeService::~OrgNodeService()
|
||||
{
|
||||
}
|
||||
|
||||
TQT_DBusObjectBase* OrgNodeService::createInterface(const TQString& interfaceName)
|
||||
{
|
||||
return (TQT_DBusObjectBase*) m_interfaces[interfaceName];
|
||||
}
|
||||
|
||||
TrinityDekstopNodeService::TrinityDekstopNodeService(TQT_DBusConnection &connection) :
|
||||
DBusBaseNode(), m_connection(connection)
|
||||
{
|
||||
addChildNode("tdebluez");
|
||||
registerObject(m_connection, "/org/trinitydesktop");
|
||||
}
|
||||
|
||||
TrinityDekstopNodeService::~TrinityDekstopNodeService()
|
||||
{
|
||||
}
|
||||
|
||||
TQT_DBusObjectBase* TrinityDekstopNodeService::createInterface(const TQString& interfaceName)
|
||||
{
|
||||
return (TQT_DBusObjectBase*) m_interfaces[interfaceName];
|
||||
}
|
||||
|
||||
AuthService::AuthService(TQT_DBusConnection &conn) :
|
||||
org::trinitydesktop::tdebluezNode(), m_connection(conn)
|
||||
{
|
||||
m_interfaces.insert("org.freedesktop.DBus.Introspectable", this);
|
||||
m_interfaces.insert("org.bluez.Agent1", new Agent1InterfaceImpl(m_connection));
|
||||
registerObject(m_connection, DBUS_AUTH_SERVICE_PATH);
|
||||
}
|
||||
|
||||
AuthService::~AuthService()
|
||||
{
|
||||
}
|
||||
|
||||
TQT_DBusObjectBase* AuthService::createInterface(const TQString& interfaceName)
|
||||
{
|
||||
return (TQT_DBusObjectBase*) m_interfaces[interfaceName];
|
||||
}
|
@ -0,0 +1,230 @@
|
||||
/*
|
||||
*
|
||||
* Authorization Agent implementation of bluez5
|
||||
*
|
||||
* Copyright (C) 2018 Emanoil Kotsev <deloptes@gmail.com>
|
||||
*
|
||||
*
|
||||
* This file is part of tdebluezauth.
|
||||
*
|
||||
* tdebluezauth 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.
|
||||
*
|
||||
* tdebluezauth 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 kbluetooth; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
*/
|
||||
#ifndef AGENTIMPL_H
|
||||
#define AGENTIMPL_H
|
||||
|
||||
#include <tqdbusconnection.h>
|
||||
|
||||
#include <interfaces/agent1Interface.h>
|
||||
#include <interfaces/tdebluezNode.h>
|
||||
#include <interfaces/dbusbaseNode.h>
|
||||
|
||||
class Agent1InterfaceImpl : public org::bluez::Agent1Interface
|
||||
{
|
||||
|
||||
public:
|
||||
Agent1InterfaceImpl(TQT_DBusConnection&);
|
||||
virtual ~Agent1InterfaceImpl();
|
||||
protected:
|
||||
/**
|
||||
* void Release()
|
||||
* This method gets called when the service daemon
|
||||
* unregisters the agent. An agent can use it to do
|
||||
* cleanup tasks. There is no need to unregister the
|
||||
* agent, because when this method gets called it has
|
||||
* already been unregistered.
|
||||
*/
|
||||
virtual bool Release(TQT_DBusError& error);
|
||||
/**
|
||||
* string RequestPinCode(object device)
|
||||
*
|
||||
* This method gets called when the service daemon
|
||||
* needs to get the passkey for an authentication.
|
||||
*
|
||||
* The return value should be a string of 1-16 characters
|
||||
* length. The string can be alphanumeric.
|
||||
*
|
||||
* Possible errors: org.bluez.Error.Rejected
|
||||
* org.bluez.Error.Canceled
|
||||
*/
|
||||
virtual void RequestPinCodeAsync(int asyncCallId, const TQT_DBusObjectPath& device);
|
||||
/**
|
||||
* void DisplayPinCode(object device, string pincode)
|
||||
|
||||
This method gets called when the service daemon
|
||||
needs to display a pincode for an authentication.
|
||||
|
||||
An empty reply should be returned. When the pincode
|
||||
needs no longer to be displayed, the Cancel method
|
||||
of the agent will be called.
|
||||
|
||||
This is used during the pairing process of keyboards
|
||||
that don't support Bluetooth 2.1 Secure Simple Pairing,
|
||||
in contrast to DisplayPasskey which is used for those
|
||||
that do.
|
||||
|
||||
This method will only ever be called once since
|
||||
older keyboards do not support typing notification.
|
||||
|
||||
Note that the PIN will always be a 6-digit number,
|
||||
zero-padded to 6 digits. This is for harmony with
|
||||
the later specification.
|
||||
|
||||
Possible errors: org.bluez.Error.Rejected
|
||||
org.bluez.Error.Canceled
|
||||
*/
|
||||
virtual void DisplayPinCodeAsync(int asyncCallId, const TQT_DBusObjectPath& device, const TQString& pincode);
|
||||
/**
|
||||
* uint32 RequestPasskey(object device)
|
||||
|
||||
This method gets called when the service daemon
|
||||
needs to get the passkey for an authentication.
|
||||
|
||||
The return value should be a numeric value
|
||||
between 0-999999.
|
||||
|
||||
Possible errors: org.bluez.Error.Rejected
|
||||
org.bluez.Error.Canceled
|
||||
*/
|
||||
virtual void RequestPasskeyAsync(int asyncCallId, const TQT_DBusObjectPath& device);
|
||||
/**
|
||||
* void DisplayPasskey(object device, uint32 passkey,
|
||||
uint16 entered)
|
||||
|
||||
This method gets called when the service daemon
|
||||
needs to display a passkey for an authentication.
|
||||
|
||||
The entered parameter indicates the number of already
|
||||
typed keys on the remote side.
|
||||
|
||||
An empty reply should be returned. When the passkey
|
||||
needs no longer to be displayed, the Cancel method
|
||||
of the agent will be called.
|
||||
|
||||
During the pairing process this method might be
|
||||
called multiple times to update the entered value.
|
||||
|
||||
Note that the passkey will always be a 6-digit number,
|
||||
so the display should be zero-padded at the start if
|
||||
the value contains less than 6 digits.
|
||||
*/
|
||||
virtual void DisplayPasskeyAsync(int asyncCallId, const TQT_DBusObjectPath& device, TQ_UINT32 passkey, TQ_UINT16 entered);
|
||||
/**
|
||||
* void RequestConfirmation(object device, uint32 passkey)
|
||||
|
||||
This method gets called when the service daemon
|
||||
needs to confirm a passkey for an authentication.
|
||||
|
||||
To confirm the value it should return an empty reply
|
||||
or an error in case the passkey is invalid.
|
||||
|
||||
Note that the passkey will always be a 6-digit number,
|
||||
so the display should be zero-padded at the start if
|
||||
the value contains less than 6 digits.
|
||||
|
||||
Possible errors: org.bluez.Error.Rejected
|
||||
org.bluez.Error.Canceled
|
||||
*/
|
||||
virtual void RequestConfirmationAsync(int asyncCallId, const TQT_DBusObjectPath& device, TQ_UINT32 passkey);
|
||||
/**
|
||||
* void RequestAuthorization(object device)
|
||||
|
||||
This method gets called to request the user to
|
||||
authorize an incoming pairing attempt which
|
||||
would in other circumstances trigger the just-works
|
||||
model, or when the user plugged in a device that
|
||||
implements cable pairing. In the latter case, the
|
||||
device would not be connected to the adapter via
|
||||
Bluetooth yet.
|
||||
|
||||
Possible errors: org.bluez.Error.Rejected
|
||||
org.bluez.Error.Canceled
|
||||
*/
|
||||
virtual void RequestAuthorizationAsync(int asyncCallId, const TQT_DBusObjectPath& device);
|
||||
/**
|
||||
* void AuthorizeService(object device, string uuid)
|
||||
|
||||
This method gets called when the service daemon
|
||||
needs to authorize a connection/service request.
|
||||
|
||||
Possible errors: org.bluez.Error.Rejected
|
||||
org.bluez.Error.Canceled
|
||||
*/
|
||||
virtual void AuthorizeServiceAsync(int asyncCallId, const TQT_DBusObjectPath& device, const TQString& uuid);
|
||||
/**
|
||||
* void Cancel()
|
||||
|
||||
This method gets called to indicate that the agent
|
||||
request failed before a reply was returned.
|
||||
*/
|
||||
virtual bool Cancel(TQT_DBusError& error);
|
||||
|
||||
virtual void handleMethodReply(const TQT_DBusMessage& reply);
|
||||
|
||||
private:
|
||||
TQT_DBusConnection *m_connection;
|
||||
};
|
||||
|
||||
class AuthService: public org::trinitydesktop::tdebluezNode
|
||||
{
|
||||
public:
|
||||
AuthService(TQT_DBusConnection&);
|
||||
~AuthService();
|
||||
|
||||
protected:
|
||||
virtual TQT_DBusObjectBase* createInterface(const TQString&);
|
||||
|
||||
private:
|
||||
TQMap<TQString, TQT_DBusObjectBase*> m_interfaces;
|
||||
TQT_DBusConnection m_connection;
|
||||
};
|
||||
|
||||
class RootNodeService: public DBusBaseNode
|
||||
{
|
||||
public:
|
||||
RootNodeService(TQT_DBusConnection&);
|
||||
~RootNodeService();
|
||||
protected:
|
||||
virtual TQT_DBusObjectBase* createInterface(const TQString&);
|
||||
private:
|
||||
TQMap<TQString, TQT_DBusObjectBase*> m_interfaces;
|
||||
TQT_DBusConnection m_connection;
|
||||
};
|
||||
|
||||
class OrgNodeService: public DBusBaseNode
|
||||
{
|
||||
public:
|
||||
OrgNodeService(TQT_DBusConnection&);
|
||||
~OrgNodeService();
|
||||
protected:
|
||||
virtual TQT_DBusObjectBase* createInterface(const TQString&);
|
||||
private:
|
||||
TQMap<TQString, TQT_DBusObjectBase*> m_interfaces;
|
||||
TQT_DBusConnection m_connection;
|
||||
};
|
||||
|
||||
class TrinityDekstopNodeService: public DBusBaseNode
|
||||
{
|
||||
public:
|
||||
TrinityDekstopNodeService(TQT_DBusConnection&);
|
||||
~TrinityDekstopNodeService();
|
||||
protected:
|
||||
virtual TQT_DBusObjectBase* createInterface(const TQString&);
|
||||
private:
|
||||
TQMap<TQString, TQT_DBusObjectBase*> m_interfaces;
|
||||
TQT_DBusConnection m_connection;
|
||||
};
|
||||
|
||||
#endif // AGENTIMPL_H
|
@ -0,0 +1,77 @@
|
||||
/*
|
||||
*
|
||||
* Adapter config dialog for tdebluez authentication
|
||||
*
|
||||
* Copyright (C) 2018 Emanoil Kotsev <deloptes@gmail.com>
|
||||
*
|
||||
*
|
||||
* This file is part of tdebluezauth.
|
||||
*
|
||||
* tdebluezauth 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.
|
||||
*
|
||||
* tdebluezauth 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 kbluetooth; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#include <tdecmdlineargs.h>
|
||||
#include <tdeaboutdata.h>
|
||||
#include <tdemessagebox.h>
|
||||
#include <kuniqueapplication.h>
|
||||
#include <iostream>
|
||||
|
||||
#include "application.h"
|
||||
|
||||
static const char *description = I18N_NOOP("TDEBluezAuth");
|
||||
static const char *copy = I18N_NOOP("Copyright (C) 2018 Emanoil.");
|
||||
|
||||
static TDECmdLineOptions options[] =
|
||||
{
|
||||
{ 0, 0, 0 }
|
||||
};
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
TDELocale::setMainCatalogue("tdebluetooth");
|
||||
TDEAboutData aboutData("tdebluezauth",
|
||||
I18N_NOOP("TDEBluezAuth"),
|
||||
0,
|
||||
description, TDEAboutData::License_GPL,
|
||||
copy,0, "http://trinitydesktop.org");
|
||||
aboutData.addAuthor("Tom Patzig", I18N_NOOP("Author"), "tpatzig@suse.de");
|
||||
aboutData.addAuthor("Emanoil Kotsev", I18N_NOOP("Bluez5 and port to TDE"), "deloptes@gmail.com");
|
||||
TDECmdLineArgs::init( argc, argv, &aboutData );
|
||||
TDECmdLineArgs::addCmdLineOptions( options );
|
||||
KUniqueApplication::addCmdLineOptions();
|
||||
|
||||
if (!KUniqueApplication::start())
|
||||
{
|
||||
std::cerr << i18n("TDEBluezAuth is already running.\n").local8Bit();
|
||||
return 0;
|
||||
}
|
||||
|
||||
TDEBluezAuth a;
|
||||
|
||||
if (!a.isConnectedToDBUS())
|
||||
{
|
||||
KMessageBox::error(NULL,i18n("Can't connect to DBus!\nUnable to start tdebluezauth. \n\n \
|
||||
Restart dbus and the bluetooth service"));
|
||||
KUniqueApplication::kApplication()->quit();
|
||||
return -1;
|
||||
}
|
||||
else
|
||||
{
|
||||
return a.exec();
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,87 @@
|
||||
<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
|
||||
<class>PinDefaultDialog</class>
|
||||
<widget class="TQWidget">
|
||||
<property name="name">
|
||||
<cstring>PinDefaultDialog</cstring>
|
||||
</property>
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>738</width>
|
||||
<height>300</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy>
|
||||
<hsizetype>1</hsizetype>
|
||||
<vsizetype>1</vsizetype>
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>400</width>
|
||||
<height>300</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="caption">
|
||||
<string>PinDefaultDialog</string>
|
||||
</property>
|
||||
<vbox>
|
||||
<property name="name">
|
||||
<cstring>unnamed</cstring>
|
||||
</property>
|
||||
<widget class="TQLabel">
|
||||
<property name="name">
|
||||
<cstring>messageLabel</cstring>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string><font size="+2">Bluetooth Pairing Request</font>
|
||||
<p><b>%1</b> (device address <b>%2</b>) wants to pair with your
|
||||
Bluetooth device, which is needed for authenticated and secure connections.
|
||||
</p><p>
|
||||
If you are sure about the identity of the other party, then please enter
|
||||
the same PIN below as was used by the other device.</p></string>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="TQLayoutWidget">
|
||||
<property name="name">
|
||||
<cstring>layout3</cstring>
|
||||
</property>
|
||||
<hbox>
|
||||
<property name="name">
|
||||
<cstring>unnamed</cstring>
|
||||
</property>
|
||||
<widget class="TQLineEdit">
|
||||
<property name="name">
|
||||
<cstring>pinEdit</cstring>
|
||||
</property>
|
||||
<property name="enabled">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
<spacer>
|
||||
<property name="name">
|
||||
<cstring>spacer2</cstring>
|
||||
</property>
|
||||
<property name="orientation">
|
||||
<enum>Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeType">
|
||||
<enum>Expanding</enum>
|
||||
</property>
|
||||
<property name="sizeHint">
|
||||
<size>
|
||||
<width>197</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</hbox>
|
||||
</widget>
|
||||
</vbox>
|
||||
</widget>
|
||||
<layoutdefaults spacing="6" margin="11"/>
|
||||
</UI>
|
@ -0,0 +1,87 @@
|
||||
<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
|
||||
<class>PinDefaultDialog</class>
|
||||
<widget class="TQWidget">
|
||||
<property name="name">
|
||||
<cstring>PinDefaultDialog</cstring>
|
||||
</property>
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>738</width>
|
||||
<height>300</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy>
|
||||
<hsizetype>1</hsizetype>
|
||||
<vsizetype>1</vsizetype>
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>400</width>
|
||||
<height>300</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="caption">
|
||||
<string>PinDefaultDialog</string>
|
||||
</property>
|
||||
<vbox>
|
||||
<property name="name">
|
||||
<cstring>unnamed</cstring>
|
||||
</property>
|
||||
<widget class="TQLabel">
|
||||
<property name="name">
|
||||
<cstring>messageLabel</cstring>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string><font size="+2">Bluetooth Pairing Request</font>
|
||||
<p><b>%1</b> (device address <b>%2</b>) wants to pair with your
|
||||
Bluetooth device, which is needed for authenticated and secure connections.
|
||||
</p><p>
|
||||
If you are sure about the identity of the other party, then please enter
|
||||
the same PIN below as was used by the other device.</p></string>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="TQLayoutWidget">
|
||||
<property name="name">
|
||||
<cstring>layout3</cstring>
|
||||
</property>
|
||||
<hbox>
|
||||
<property name="name">
|
||||
<cstring>unnamed</cstring>
|
||||
</property>
|
||||
<widget class="TQLineEdit">
|
||||
<property name="name">
|
||||
<cstring>pinEdit</cstring>
|
||||
</property>
|
||||
<property name="enabled">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
<spacer>
|
||||
<property name="name">
|
||||
<cstring>spacer2</cstring>
|
||||
</property>
|
||||
<property name="orientation">
|
||||
<enum>Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeType">
|
||||
<enum>Expanding</enum>
|
||||
</property>
|
||||
<property name="sizeHint">
|
||||
<size>
|
||||
<width>197</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</hbox>
|
||||
</widget>
|
||||
</vbox>
|
||||
</widget>
|
||||
<layoutdefaults spacing="6" margin="11"/>
|
||||
</UI>
|
@ -0,0 +1,58 @@
|
||||
/*
|
||||
*
|
||||
* PIN Dialog dialog for tdebluez authentication
|
||||
*
|
||||
* Copyright (C) 2018 Emanoil Kotsev <deloptes@gmail.com>
|
||||
*
|
||||
*
|
||||
* This file is part of tdebluezauth.
|
||||
*
|
||||
* tdebluezauth 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.
|
||||
*
|
||||
* tdebluezauth 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 kbluetooth; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
*/
|
||||
|
||||
#include "pindialog.h"
|
||||
#include "pindefdialog.h"
|
||||
|
||||
PinDialog::PinDialog(const TQString &addr, const TQString &devName) :
|
||||
KDialogBase(NULL, "pinrequest", true, "Pin Request", (Ok | Cancel))
|
||||
{
|
||||
|
||||
pinDlg = new PinDefaultDialog(this);
|
||||
pinDlg->messageLabel->setText(pinDlg->messageLabel->text().arg(devName).arg(addr));
|
||||
|
||||
pinDlg->pinEdit->setFocus();
|
||||
|
||||
connect(this, TQT_SIGNAL(okClicked()), TQT_SLOT(setPin()));
|
||||
|
||||
setMainWidget(pinDlg);
|
||||
}
|
||||
|
||||
PinDialog::~PinDialog()
|
||||
{
|
||||
delete pinDlg;
|
||||
}
|
||||
|
||||
void PinDialog::setPin()
|
||||
{
|
||||
pin = pinDlg->pinEdit->text();
|
||||
}
|
||||
|
||||
const TQString PinDialog::getPin()
|
||||
{
|
||||
return pin;
|
||||
}
|
||||
|
||||
#include "pindialog.moc"
|
@ -0,0 +1,58 @@
|
||||
/*
|
||||
*
|
||||
* PIN Dialog dialog for tdebluez authentication
|
||||
*
|
||||
* Copyright (C) 2018 Emanoil Kotsev <deloptes@gmail.com>
|
||||
*
|
||||
*
|
||||
* This file is part of tdebluezauth.
|
||||
*
|
||||
* tdebluezauth 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.
|
||||
*
|
||||
* tdebluezauth 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 kbluetooth; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef PINDIALOG_H
|
||||
#define PINDIALOG_H
|
||||
|
||||
#include <tqlineedit.h>
|
||||
#include <tqlabel.h>
|
||||
#include <kdialogbase.h>
|
||||
#include "application.h"
|
||||
#include "pindefdialog.h"
|
||||
|
||||
/**
|
||||
@author Fred Schaettgen
|
||||
*/
|
||||
|
||||
class PinDialog : public KDialogBase
|
||||
{
|
||||
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
PinDialog(const TQString &addr, const TQString &devName);
|
||||
~PinDialog();
|
||||
PinDefaultDialog *pinDlg;
|
||||
const TQString getPin();
|
||||
|
||||
private:
|
||||
TQString pin;
|
||||
|
||||
private slots:
|
||||
void setPin();
|
||||
|
||||
};
|
||||
|
||||
#endif
|
@ -0,0 +1,40 @@
|
||||
#################################################
|
||||
#
|
||||
# (C) 2018 Emanoil Kotsev
|
||||
# deloptes (AT) gmail.com
|
||||
#
|
||||
# Improvements and feedback are welcome
|
||||
#
|
||||
# This file is released under GPL >= 2
|
||||
#
|
||||
#################################################
|
||||
|
||||
project (tdeioclient)
|
||||
|
||||
include_directories(
|
||||
${CMAKE_CURRENT_BINARY_DIR}
|
||||
${CMAKE_BINARY_DIR}
|
||||
${CMAKE_SOURCE_DIR}
|
||||
${CMAKE_SOURCE_DIR}/src/libtdebluez
|
||||
${CMAKE_SOURCE_DIR}/src/tdeioclient
|
||||
${CMAKE_BINARY_DIR}/src
|
||||
${CMAKE_BINARY_DIR}/src/tdeioclient
|
||||
${TDE_INCLUDE_DIR}
|
||||
${TQT_INCLUDE_DIRS}
|
||||
${DBUS_INCLUDE_DIRS}
|
||||
${DBUS_TQT_INCLUDE_DIRS}
|
||||
)
|
||||
|
||||
link_directories(
|
||||
${TQT_LIBRARY_DIRS}
|
||||
)
|
||||
|
||||
##### tdeioclient (tdeinit) ######################
|
||||
|
||||
tde_add_executable ( tdeioclient AUTOMOC
|
||||
SOURCES
|
||||
commandhandler.cpp main.cpp
|
||||
LINK
|
||||
${DBUS_TQT_LIBRARIES} tdecore-shared tdebluez-shared tdeio-shared
|
||||
DESTINATION ${BIN_INSTALL_DIR}
|
||||
)
|
@ -0,0 +1,407 @@
|
||||
/***************************************************************************
|
||||
* Copyright (C) 2004 by Fred Schaettgen <kdebluetooth@schaettgen.de>*
|
||||
* *
|
||||
* 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. *
|
||||
***************************************************************************/
|
||||
#include "commandhandler.h"
|
||||
#include <tdecmdlineargs.h>
|
||||
#include <tdeapplication.h>
|
||||
#include <tdelocale.h>
|
||||
#include <iostream>
|
||||
#include <kdebug.h>
|
||||
#include <tqdatetime.h>
|
||||
#include <tqtimer.h>
|
||||
#include <tdeio/job.h>
|
||||
|
||||
CommandHandler::CommandHandler(TDECmdLineArgs *a)
|
||||
{
|
||||
this->iterate = false;
|
||||
this->args = a;
|
||||
returnValue = 0;
|
||||
if (args->count() < 2)
|
||||
{
|
||||
exitPrintUsage(i18n("Arguments missing."));
|
||||
}
|
||||
origCommand = args->arg(0);
|
||||
for (int n = 1; n < args->count() - 1; ++n)
|
||||
{
|
||||
sources.append(args->arg(n));
|
||||
}
|
||||
target = args->arg(args->count() - 1);
|
||||
targets = sources;
|
||||
targets.append(target);
|
||||
|
||||
if (args->isSet("outfile"))
|
||||
{
|
||||
outFile.setName(args->getOption("outfile"));
|
||||
outFile.open(IO_WriteOnly);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Open stdout
|
||||
outFile.open(IO_WriteOnly, 1);
|
||||
}
|
||||
|
||||
if (args->isSet("infile"))
|
||||
{
|
||||
inFile.setName(args->getOption("infile"));
|
||||
inFile.open(IO_ReadOnly);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Open stdin
|
||||
inFile.open(IO_ReadOnly, 0);
|
||||
}
|
||||
|
||||
showProgressWindow = args->isSet("progresswindow");
|
||||
overwrite = args->isSet("overwrite");
|
||||
}
|
||||
|
||||
CommandHandler::~CommandHandler()
|
||||
{
|
||||
}
|
||||
|
||||
void CommandHandler::start()
|
||||
{
|
||||
if (origCommand == "ls")
|
||||
{
|
||||
command = "ls";
|
||||
list(target);
|
||||
}
|
||||
else if (origCommand == "get" || origCommand == "cat" || origCommand == "read")
|
||||
{
|
||||
command = "get";
|
||||
get(target);
|
||||
}
|
||||
else if (origCommand == "put" || origCommand == "write")
|
||||
{
|
||||
command = "put";
|
||||
put(target);
|
||||
}
|
||||
else if (origCommand == "mkdir")
|
||||
{
|
||||
command = "mkdir";
|
||||
mkdir(target);
|
||||
}
|
||||
else if (origCommand == "rmdir")
|
||||
{
|
||||
command = "rmdir";
|
||||
rmdir(target);
|
||||
}
|
||||
else if (origCommand == "rm" || origCommand == "del")
|
||||
{
|
||||
command = "del";
|
||||
del(targets);
|
||||
}
|
||||
else if (origCommand == "cp" || origCommand == "copy")
|
||||
{
|
||||
command = "copy";
|
||||
copy(sources, target);
|
||||
}
|
||||
else
|
||||
{
|
||||
command = origCommand;
|
||||
exitPrintUsage(i18n("unknown command: %1").arg(command));
|
||||
}
|
||||
}
|
||||
|
||||
void CommandHandler::commonConnect(TDEIO::Job* job)
|
||||
{
|
||||
connect(job, SIGNAL(infoMessage(TDEIO::Job*,const TQString&)),
|
||||
this, SLOT(slotInfoMessage(TDEIO::Job*,const TQString&)));
|
||||
connect(job, SIGNAL(percent (TDEIO::Job*, unsigned long)),
|
||||
this, SLOT(slotPercent(TDEIO::Job*, unsigned long)));
|
||||
connect(job, SIGNAL(result(TDEIO::Job*)), this, SLOT(slotFinished(TDEIO::Job*)));
|
||||
}
|
||||
|
||||
KURL::List CommandHandler::urlList(const TQStringList& sources)
|
||||
{
|
||||
KURL::List ret;
|
||||
for (size_t n = 0; n < sources.size(); ++n)
|
||||
{
|
||||
ret.append(KURL(sources[n]));
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
// Commands ---------------------------------------------------
|
||||
|
||||
void CommandHandler::list(const TQString& target)
|
||||
{
|
||||
bool showHidden = true;
|
||||
TDEIO::ListJob* job = TDEIO::listDir(KURL(target), showProgressWindow, showHidden);
|
||||
this->job = job;
|
||||
commonConnect(job);
|
||||
connect(job, SIGNAL(entries(TDEIO::Job*, const TDEIO::UDSEntryList&)),
|
||||
this, SLOT(slotEntries(TDEIO::Job*, const TDEIO::UDSEntryList&)));
|
||||
}
|
||||
|
||||
void CommandHandler::get(const TQString& target)
|
||||
{
|
||||
bool reload = false;
|
||||
TDEIO::TransferJob* job = TDEIO::get(KURL(target), reload, showProgressWindow);
|
||||
this->job = job;
|
||||
commonConnect(job);
|
||||
connect(job, SIGNAL(data(TDEIO::Job*,const TQByteArray&)),
|
||||
this, SLOT(slotData(TDEIO::Job*,const TQByteArray&)));
|
||||
}
|
||||
|
||||
void CommandHandler::put(const TQString& target)
|
||||
{
|
||||
int permissions = -1;
|
||||
bool resume = false;
|
||||
TDEIO::TransferJob* job = TDEIO::put(KURL(target), permissions,
|
||||
overwrite, resume, showProgressWindow);
|
||||
this->job = job;
|
||||
commonConnect(job);
|
||||
connect(job, SIGNAL(dataReq(TDEIO::Job*,TQByteArray&)),
|
||||
this, SLOT(slotDataReq(TDEIO::Job*,TQByteArray&)));
|
||||
}
|
||||
|
||||
void CommandHandler::mkdir(const TQString& target)
|
||||
{
|
||||
int permissions = -1;
|
||||
TDEIO::SimpleJob* job = TDEIO::mkdir(KURL(target), permissions);
|
||||
this->job = job;
|
||||
commonConnect(job);
|
||||
}
|
||||
|
||||
void CommandHandler::rmdir(const TQString& target)
|
||||
{
|
||||
TDEIO::SimpleJob* job = TDEIO::rmdir(KURL(target));
|
||||
this->job = job;
|
||||
commonConnect(job);
|
||||
}
|
||||
|
||||
void CommandHandler::del(const TQStringList& targets)
|
||||
{
|
||||
bool shred = false;
|
||||
TDEIO::DeleteJob* job = TDEIO::del(urlList(targets), shred, showProgressWindow);
|
||||
this->job = job;
|
||||
commonConnect(job);
|
||||
}
|
||||
|
||||
void CommandHandler::copy(const TQStringList& sources, const TQString& target)
|
||||
{
|
||||
TDEIO::CopyJob *job = TDEIO::copy(urlList(sources), KURL(target),
|
||||
showProgressWindow);
|
||||
this->job = job;
|
||||
commonConnect(job);
|
||||
}
|
||||
|
||||
// Signal handlers --------------------------------------------
|
||||
|
||||
void CommandHandler::slotEntries(TDEIO::Job* /*job*/, const TDEIO::UDSEntryList& list)
|
||||
{
|
||||
if (command == "ls")
|
||||
{
|
||||
for (size_t n = 0; n < list.size(); ++n)
|
||||
{
|
||||
TDEIO::UDSEntry entry = list[n];
|
||||
|
||||
TQDateTime date = TQDateTime::currentDateTime();
|
||||
TQString user = "n/a";
|
||||
TQString iconName = "unknown";
|
||||
TQString group = "n/a";
|
||||
TQString extra = "n/a";
|
||||
TQString name = "n/a";
|
||||
TQDateTime mTime = TQDateTime::currentDateTime();
|
||||
TQDateTime aTime = TQDateTime::currentDateTime();
|
||||
TQDateTime cTime = TQDateTime::currentDateTime();
|
||||
int fileType = 0;
|
||||
TQString linkDest = "n/a";
|
||||
TQString url = "n/a";
|
||||
TQString mimeType = "n/a";
|
||||
TQString guessedMimeType = "n/a";
|
||||
TQString xmlProperties = "n/a";
|
||||
long long size = -1;
|
||||
int access = 0;
|
||||
|
||||
for (size_t m = 0; m < entry.size(); ++m)
|
||||
{
|
||||
TDEIO::UDSAtom atom = entry[m];
|
||||
switch (atom.m_uds)
|
||||
{
|
||||
case TDEIO::UDS_TIME:
|
||||
date.setTime_t(atom.m_long);
|
||||
break;
|
||||
case TDEIO::UDS_SIZE:
|
||||
size = atom.m_long;
|
||||
break;
|
||||
case TDEIO::UDS_USER:
|
||||
user = atom.m_str;
|
||||
break;
|
||||
case TDEIO::UDS_ICON_NAME:
|
||||
iconName = atom.m_str;
|
||||
break;
|
||||
case TDEIO::UDS_GROUP:
|
||||
group = atom.m_str;
|
||||
break;
|
||||
case TDEIO::UDS_EXTRA:
|
||||
extra = atom.m_str;
|
||||
break;
|
||||
case TDEIO::UDS_NAME:
|
||||
name = atom.m_str;
|
||||
break;
|
||||
case TDEIO::UDS_ACCESS:
|
||||
access = atom.m_long;
|
||||
break;
|
||||
case TDEIO::UDS_MODIFICATION_TIME:
|
||||
mTime.setTime_t(atom.m_long);
|
||||
break;
|
||||
case TDEIO::UDS_ACCESS_TIME:
|
||||
aTime.setTime_t(atom.m_long);
|
||||
break;
|
||||
case TDEIO::UDS_CREATION_TIME:
|
||||
cTime.setTime_t(atom.m_long);
|
||||
break;
|
||||
case TDEIO::UDS_FILE_TYPE:
|
||||
fileType = atom.m_long;
|
||||
break;
|
||||
case TDEIO::UDS_LINK_DEST:
|
||||
linkDest = atom.m_str;
|
||||
break;
|
||||
case TDEIO::UDS_URL:
|
||||
url = atom.m_str;
|
||||
break;
|
||||
case TDEIO::UDS_MIME_TYPE:
|
||||
mimeType = atom.m_str;
|
||||
break;
|
||||
case TDEIO::UDS_GUESSED_MIME_TYPE:
|
||||
guessedMimeType = atom.m_str;
|
||||
break;
|
||||
case TDEIO::UDS_XML_PROPERTIES:
|
||||
xmlProperties = atom.m_str;
|
||||
break;
|
||||
};
|
||||
}
|
||||
|
||||
if (args->isSet("access"))
|
||||
{
|
||||
std::cout << TQString::number(access, 8).local8Bit() << " ";
|
||||
}
|
||||
if (args->isSet("filetype"))
|
||||
{
|
||||
std::cout << TQString::number(fileType).rightJustify(4).local8Bit() << " ";
|
||||
}
|
||||
if (args->isSet("user"))
|
||||
{
|
||||
std::cout << user.rightJustify(8).local8Bit() << " ";
|
||||
}
|
||||
if (args->isSet("group"))
|
||||
{
|
||||
std::cout << group.rightJustify(8).local8Bit() << " ";
|
||||
}
|
||||
if (args->isSet("size"))
|
||||
{
|
||||
std::cout << TQString::number(size).rightJustify(9).local8Bit() << " ";
|
||||
}
|
||||
if (args->isSet("date"))
|
||||
{
|
||||
std::cout << date.toString("yyyy-MM-dd hh:mm:ss").local8Bit() << " ";
|
||||
}
|
||||
if (args->isSet("mtime"))
|
||||
{
|
||||
std::cout << mTime.toString("yyyy-MM-dd hh:mm:ss").local8Bit() << " ";
|
||||
}
|
||||
if (args->isSet("atime"))
|
||||
{
|
||||
std::cout << aTime.toString("yyyy-MM-dd hh:mm:ss").local8Bit() << " ";
|
||||
}
|
||||
if (args->isSet("ctime"))
|
||||
{
|
||||
std::cout << cTime.toString("yyyy-MM-dd hh:mm:ss").local8Bit() << " ";
|
||||
}
|
||||
if (args->isSet("iconName"))
|
||||
{
|
||||
std::cout << iconName.local8Bit() << " ";
|
||||
}
|
||||
if (args->isSet("mimetype"))
|
||||
{
|
||||
std::cout << mimeType.local8Bit() << " ";
|
||||
}
|
||||
if (args->isSet("guessedmimetype"))
|
||||
{
|
||||
std::cout << guessedMimeType.local8Bit() << " ";
|
||||
}
|
||||
if (args->isSet("linkdest"))
|
||||
{
|
||||
std::cout << linkDest.local8Bit() << " ";
|
||||
}
|
||||
if (args->isSet("url"))
|
||||
{
|
||||
std::cout << url.local8Bit() << " ";
|
||||
}
|
||||
if (args->isSet("name"))
|
||||
{
|
||||
std::cout << name.local8Bit() << " ";
|
||||
}
|
||||
if (args->isSet("xmlproperties"))
|
||||
{
|
||||
std::cout << xmlProperties.local8Bit() << " ";
|
||||
}
|
||||
if (args->isSet("extra"))
|
||||
{
|
||||
std::cout << extra.local8Bit() << " ";
|
||||
}
|
||||
std::cout << std::endl;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void CommandHandler::slotData(TDEIO::Job* /*job*/, const TQByteArray &data)
|
||||
{
|
||||
outFile.writeBlock(data);
|
||||
}
|
||||
|
||||
void CommandHandler::slotDataReq(TDEIO::Job* /*job*/, TQByteArray &data)
|
||||
{
|
||||
data.resize(65536);
|
||||
data.resize(inFile.readBlock(data.data(), data.size()));
|
||||
}
|
||||
|
||||
void CommandHandler::slotInfoMessage(TDEIO::Job* /*job*/, const TQString& msg)
|
||||
{
|
||||
if (msg != lastMessage && args->isSet("messages"))
|
||||
{
|
||||
std::cerr << " >" << msg.local8Bit() << std::endl;
|
||||
lastMessage = msg;
|
||||
}
|
||||
}
|
||||
|
||||
void CommandHandler::slotPercent(TDEIO::Job* /*job*/, unsigned long /*percent*/)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void CommandHandler::slotFinished(TDEIO::Job* job)
|
||||
{
|
||||
if (job->error() != 0)
|
||||
{
|
||||
std::cerr << job->errorString().local8Bit() << std::endl;
|
||||
iterate = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (iterate)
|
||||
{
|
||||
start();
|
||||
}
|
||||
}
|
||||
|
||||
if (!iterate)
|
||||
{
|
||||
TDEApplication::kApplication()->exit(job->error());
|
||||
}
|
||||
}
|
||||
|
||||
void CommandHandler::exitPrintUsage(const TQString& message)
|
||||
{
|
||||
std::cout << message.local8Bit() << std::endl;
|
||||
TDECmdLineArgs::usage();
|
||||
}
|
||||
|
||||
#include "commandhandler.moc"
|
@ -0,0 +1,60 @@
|
||||
//-*-c++-*-
|
||||
/***************************************************************************
|
||||
* Copyright (C) 2004 by Fred Schaettgen <kdebluetooth@schaettgen.de>*
|
||||
* *
|
||||
* 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. *
|
||||
***************************************************************************/
|
||||
#ifndef COMMANDHANDLER_H
|
||||
#define COMMANDHANDLER_H
|
||||
|
||||
#include <tqobject.h>
|
||||
#include <tqstringlist.h>
|
||||
#include <tdeio/jobclasses.h>
|
||||
#include <tqfile.h>
|
||||
#include <kurl.h>
|
||||
|
||||
class TDECmdLineArgs;
|
||||
namespace TDEIO { class Job; }
|
||||
|
||||
class CommandHandler : public TQObject
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
CommandHandler(TDECmdLineArgs *args);
|
||||
~CommandHandler();
|
||||
void start();
|
||||
|
||||
private:
|
||||
KURL::List urlList(const TQStringList& list);
|
||||
void exitPrintUsage(const TQString& message);
|
||||
void list(const TQString& target);
|
||||
void get(const TQString& target);
|
||||
void put(const TQString& target);
|
||||
void mkdir(const TQString& target);
|
||||
void rmdir(const TQString& target);
|
||||
void del(const TQStringList& targets);
|
||||
void copy(const TQStringList& sources, const TQString& target);
|
||||
void commonConnect(TDEIO::Job* job);
|
||||
|
||||
TQString command, origCommand, target, lastMessage;
|
||||
TQStringList targets, sources;
|
||||
TDEIO::Job* job;
|
||||
int returnValue;
|
||||
TDECmdLineArgs *args;
|
||||
TQFile outFile, inFile;
|
||||
bool showProgressWindow, overwrite, iterate;
|
||||
|
||||
private slots:
|
||||
void slotFinished(TDEIO::Job *job);
|
||||
void slotEntries(TDEIO::Job* job, const TDEIO::UDSEntryList& list);
|
||||
void slotData(TDEIO::Job *, const TQByteArray &data);
|
||||
void slotDataReq(TDEIO::Job *, TQByteArray &data);
|
||||
void slotInfoMessage(TDEIO::Job* job,const TQString& msg);
|
||||
void slotPercent(TDEIO::Job* job, unsigned long percent);
|
||||
};
|
||||
|
||||
#endif
|
@ -0,0 +1,73 @@
|
||||
//-*-c++-*-
|
||||
/***************************************************************************
|
||||
* Copyright (C) 2003 by Fred Schaettgen *
|
||||
* kdebluetooth@schaettgen.de *
|
||||
* *
|
||||
* 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. *
|
||||
***************************************************************************/
|
||||
|
||||
#include <tdeapplication.h>
|
||||
#include <tdeaboutdata.h>
|
||||
#include <tdecmdlineargs.h>
|
||||
#include <tdelocale.h>
|
||||
#include <kurl.h>
|
||||
#include <tqwidget.h>
|
||||
|
||||
#include "commandhandler.h"
|
||||
|
||||
static const char description[] =
|
||||
I18N_NOOP("TDEIO command line client for tdebluez");
|
||||
|
||||
//FIXME static const char* version = TDEBluetoothConfig::version;
|
||||
|
||||
static const char* version = "0.0.1";
|
||||
|
||||
static TDECmdLineOptions options[] =
|
||||
{
|
||||
{"d", 0, 0}, {"date", I18N_NOOP("List date"), 0},
|
||||
{"u", 0, 0}, {"user", I18N_NOOP("List user"), 0},
|
||||
{"i", 0, 0}, {"iconName", I18N_NOOP("List icon name"), 0},
|
||||
{"g", 0, 0}, {"group", I18N_NOOP("List group"), 0},
|
||||
{"extra", I18N_NOOP("List extra"), 0},
|
||||
{"noname", I18N_NOOP("Do not list name"), 0},
|
||||
{"p", 0, 0}, {"access", I18N_NOOP("List access permissions"), 0},
|
||||
{"m", 0, 0}, {"mtime", I18N_NOOP("List modification time"), 0},
|
||||
{"a", 0, 0}, {"atime", I18N_NOOP("List access time"), 0},
|
||||
{"c", 0, 0}, {"ctime", I18N_NOOP("List creation time"), 0},
|
||||
{"f", 0, 0}, {"filetype", I18N_NOOP("List file type"), 0},
|
||||
{"D", 0, 0}, {"linkdest", I18N_NOOP("List link destination"), 0},
|
||||
{"U", 0, 0}, {"url", I18N_NOOP("List URL"), 0},
|
||||
{"M", 0, 0}, {"mimetype", I18N_NOOP("List mime type"), 0},
|
||||
{"G", 0, 0}, {"guessedmimetype", I18N_NOOP("List guessed mime type"), 0},
|
||||
{"X", 0, 0}, {"xmlproperties", I18N_NOOP("List XML properties"), 0},
|
||||
{"s", 0, 0}, {"size", I18N_NOOP("List size"), 0},
|
||||
{"outfile [filename]", I18N_NOOP("Output file. Defaults to stdout"), 0},
|
||||
{"infile [filename]", I18N_NOOP("Input file. Defaults to stdin"), 0},
|
||||
{"progresswindow", I18N_NOOP("Show a progress window"), 0},
|
||||
{"nooverwrite", I18N_NOOP("Ask (graphically) before overwriting files"), 0},
|
||||
{"messages", I18N_NOOP("Show messages from the tdeioslave"), 0},
|
||||
{"+[cmd]", I18N_NOOP("Command (ls, cat, put, cp, rm, mv, mkdir, rmdir)"), 0 },
|
||||
TDECmdLineLastOption
|
||||
};
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
TDEAboutData about("tdeioclient",
|
||||
I18N_NOOP("tdeio client"),
|
||||
version, description,
|
||||
TDEAboutData::License_GPL,
|
||||
"(C) 2004 Fred Schaettgen", 0, 0,
|
||||
"kdebluetooth@schaettgen.de");
|
||||
about.addAuthor("Emanoil Kotsev", I18N_NOOP("Bluez5 and port to TDE"), "deloptes@gmail.com");
|
||||
TDECmdLineArgs::init(argc, argv, &about);
|
||||
TDECmdLineArgs::addCmdLineOptions(options);
|
||||
TDECmdLineArgs *args = TDECmdLineArgs::parsedArgs();
|
||||
TDEApplication app;
|
||||
|
||||
CommandHandler commandHandler(args);
|
||||
commandHandler.start();
|
||||
return app.exec();
|
||||
}
|
@ -0,0 +1,13 @@
|
||||
#################################################
|
||||
#
|
||||
# (C) 2018 Emanoil Kotsev
|
||||
# deloptes (AT) gmail.com
|
||||
#
|
||||
# Improvements and feedback are welcome
|
||||
#
|
||||
# This file is released under GPL >= 2
|
||||
#
|
||||
#################################################
|
||||
|
||||
add_subdirectory( bluetooth )
|
||||
add_subdirectory( obex )
|
@ -0,0 +1,40 @@
|
||||
#################################################
|
||||
#
|
||||
# (C) 2018 Emanoil Kotsev
|
||||
# deloptes (AT) gmail.com
|
||||
#
|
||||
# Improvements and feedback are welcome
|
||||
#
|
||||
# This file is released under GPL >= 2
|
||||
#
|
||||
#################################################
|
||||
|
||||
include_directories(
|
||||
${CMAKE_CURRENT_BINARY_DIR}
|
||||
${CMAKE_BINARY_DIR}
|
||||
${CMAKE_SOURCE_DIR}
|
||||
${CMAKE_SOURCE_DIR}/src/libtdebluez
|
||||
${CMAKE_BINARY_DIR}/src/libtdebluez
|
||||
${CMAKE_SOURCE_DIR}/src/tdeioslave/bluetooth
|
||||
${TDE_INCLUDE_DIR}
|
||||
${TQT_INCLUDE_DIRS}
|
||||
${DBUS_INCLUDE_DIRS}
|
||||
${DBUS_TQT_INCLUDE_DIRS}
|
||||
)
|
||||
##### tdeio_bluetooth (static) #############################
|
||||
set( target tdeio_bluetooth )
|
||||
|
||||
tde_add_kpart( ${target} AUTOMOC
|
||||
SOURCES tdeiobluetooth.cpp
|
||||
LINK ${DBUS_TQT_LIBRARIES} tdeio-shared tdebluez-shared bluezinterfaces-static
|
||||
DESTINATION ${PLUGIN_INSTALL_DIR}
|
||||
)
|
||||
|
||||
# konqueror sidebar entry
|
||||
install(
|
||||
FILES bluetooth.protocol
|
||||
DESTINATION ${SERVICES_INSTALL_DIR} )
|
||||
install(
|
||||
FILES bluetooth_sidebarentry.desktop
|
||||
DESTINATION ${DATA_INSTALL_DIR}/konqsidebartng/virtual_folders/services
|
||||
)
|
@ -0,0 +1,464 @@
|
||||
//-*-c++-*-
|
||||
/***************************************************************************
|
||||
* Copyright (C) 2003 by Fred Schaettgen *
|
||||
* kdebluetooth@schaettgen.de *
|
||||
* *
|
||||
* 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. *
|
||||
***************************************************************************/
|
||||
|
||||
#include "tdeiobluetooth.h"
|
||||
|
||||
#include <sys/stat.h>
|
||||
#include <dcopclient.h>
|
||||
#include <tdeapplication.h>
|
||||
#include <tdecmdlineargs.h>
|
||||
#include <tqregexp.h>
|
||||
|
||||
#include <devicemimeconverter.h>
|
||||
#include <deviceImpl.h>
|
||||
#include <btuuids.h>
|
||||
|
||||
using namespace TDEBluetooth;
|
||||
|
||||
static const TDECmdLineOptions options[] =
|
||||
{
|
||||
{ "+protocol", I18N_NOOP( "Protocol name" ), 0 },
|
||||
{ "+pool", I18N_NOOP( "Socket name" ), 0 },
|
||||
{ "+app", I18N_NOOP( "Socket name" ), 0 },
|
||||
TDECmdLineLastOption
|
||||
};
|
||||
|
||||
extern "C"
|
||||
{
|
||||
int kdemain(int argc, char **argv) {
|
||||
TDEInstance instance( "tdeio_bluetooth" );
|
||||
kdDebug() << "*** Starting tdeio_bluetooth " << endl;
|
||||
if (argc != 4) {
|
||||
kdDebug() << "Usage: tdeio_bluetooth protocol domain-socket1 domain-socket2" << endl;
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
putenv(strdup("SESSION_MANAGER="));
|
||||
TDECmdLineArgs::init(argc, argv, "tdeio_bluetooth", 0, 0, 0, 0);
|
||||
TDECmdLineArgs::addCmdLineOptions( options );
|
||||
|
||||
TDEApplication app( false, false, false );
|
||||
app.dcopClient()->attach();
|
||||
|
||||
TDECmdLineArgs *args = TDECmdLineArgs::parsedArgs();
|
||||
TDEioBluetooth slave( args->arg(0), args->arg(1), args->arg(2) );
|
||||
kdDebug() << "*** protocol " << args->arg(0) << endl;
|
||||
kdDebug() << "*** pool socket " << args->arg(1) << endl;
|
||||
kdDebug() << "*** app socket " << args->arg(2) << endl;
|
||||
slave.dispatchLoop();
|
||||
kdDebug() << "*** tdeio_bluetooth Done" << endl;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
TDEioBluetooth::TDEioBluetooth(const TQCString &protocol, const TQCString &pool_socket, const TQCString &app_socket) :
|
||||
ForwardingSlaveBase(protocol, pool_socket, app_socket)
|
||||
{
|
||||
kdDebug() << k_funcinfo << endl;
|
||||
|
||||
TDELocale::setMainCatalogue("tdebluez");
|
||||
TQT_DBusError error;
|
||||
adapter = 0;
|
||||
|
||||
manager = new TDEBluetooth::ObjectManagerImpl("org.bluez", "/"/*, this, "ObexObjectManager"*/);
|
||||
|
||||
if (!manager)
|
||||
{
|
||||
ForwardingSlaveBase::error(TDEIO::ERR_SERVICE_NOT_AVAILABLE, i18n("Bluetooth Manager not found"));
|
||||
closeConnection();
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!manager->getAdapters().isEmpty())
|
||||
{
|
||||
TDEBluetooth::ObjectManagerImpl::AdapterList al = manager->getAdapters();
|
||||
TDEBluetooth::ObjectManagerImpl::AdapterList::Iterator ait = al.begin();
|
||||
for (ait; ait != al.end(); ++ait)
|
||||
{
|
||||
TDEBluetooth::AdapterImpl *ad = new TDEBluetooth::AdapterImpl("org.bluez", (*ait));
|
||||
ad->setConnection((*(manager->getConnection())));
|
||||
// FIXME implement multiple adapters
|
||||
if (ad->getPowered(error))
|
||||
{
|
||||
adapter = ad;
|
||||
break;
|
||||
}
|
||||
}
|
||||
connect(manager, SIGNAL(deviceAdded(const TQString &)),
|
||||
this, SLOT(slotAddDevice(const TQString &)));
|
||||
connect(manager, SIGNAL(deviceRemoved(const TQString &)),
|
||||
this, SLOT(slotRemoveDevice(const TQString &)));
|
||||
connect(manager, SIGNAL(adapterPowerOnChanged(const TQString&, bool )),
|
||||
this, SLOT(slotAdapterPowerOnChanged(const TQString &, bool )));
|
||||
}
|
||||
else
|
||||
{
|
||||
ForwardingSlaveBase::error(TDEIO::ERR_SERVICE_NOT_AVAILABLE, i18n("No adapter found"));
|
||||
closeConnection();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
TDEioBluetooth::~TDEioBluetooth()
|
||||
{
|
||||
kdDebug() << k_funcinfo << endl;
|
||||
if (manager) delete manager;
|
||||
if (adapter) delete adapter;
|
||||
}
|
||||
|
||||
void TDEioBluetooth::closeConnection()
|
||||
{
|
||||
kdDebug() << k_funcinfo << endl;
|
||||
exit();
|
||||
}
|
||||
|
||||
void TDEioBluetooth::stat(const KURL &url)
|
||||
{
|
||||
kdDebug() << __func__ << "(" << url.prettyURL() << ")" << endl;
|
||||
|
||||
TDEIO::UDSEntry entry;
|
||||
|
||||
if (!adapter)
|
||||
{
|
||||
// ForwardingSlaveBase::warning(i18n("Bluetooth Adapter not found"));
|
||||
// ForwardingSlaveBase::error(TDEIO::ERR_SERVICE_NOT_AVAILABLE, i18n("Bluetooth Adapter not found"));
|
||||
TQString name = "No device found";
|
||||
TQ_UINT32 devClass = 0;
|
||||
|
||||
addAtom(entry, TDEIO::UDS_NAME, name);
|
||||
addAtom(entry, TDEIO::UDS_FILE_TYPE, S_IFDIR);
|
||||
addAtom(entry, TDEIO::UDS_ACCESS, 0555);
|
||||
addAtom(entry, TDEIO::UDS_MIME_TYPE, DeviceMimeConverter::classToMimeType(devClass));
|
||||
addAtom(entry, TDEIO::UDS_ICON_NAME, DeviceMimeConverter::classToIconName(devClass));
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
TQT_DBusError dbuserror;
|
||||
TQString path = url.path();
|
||||
if (path.isEmpty() || path == "/")
|
||||
{
|
||||
// The root is "virtual" - it's not a single physical directory
|
||||
createTopLevelEntry(entry);
|
||||
}
|
||||
else if (path.find(TQRegExp("/\\[([0-9A-F]{2}:){5}[0-9A-F]{2}\\]"), 0) != -1)
|
||||
{
|
||||
createDirEntry(entry, path, path);
|
||||
}
|
||||
else
|
||||
{
|
||||
ForwardingSlaveBase::error(TDEIO::ERR_MALFORMED_URL, i18n("Could not stat %1.").arg(url.prettyURL()));
|
||||
}
|
||||
statEntry(entry);
|
||||
finished();
|
||||
}
|
||||
|
||||
void TDEioBluetooth::listDir(const KURL &url)
|
||||
{
|
||||
kdDebug() << k_funcinfo << endl;
|
||||
|
||||
if (!adapter)
|
||||
{
|
||||
ForwardingSlaveBase::error(TDEIO::ERR_SERVICE_NOT_AVAILABLE, i18n("Bluetooth Adapter not found"));
|
||||
return;
|
||||
}
|
||||
|
||||
TDEIO::UDSEntry entry;
|
||||
TQValueList<TDEIO::UDSEntry> list;
|
||||
TQT_DBusError error;
|
||||
TDEIO::UDSEntryList entries;
|
||||
|
||||
TQString path = url.path();
|
||||
TQString name = adapter->getName(error);
|
||||
|
||||
kdDebug() << __func__ << "(" << path << ")" << endl;
|
||||
|
||||
TQRegExp rx("/" + name + "/\\[([0-9A-F]{2}:){5}[0-9A-F]{2}\\]");
|
||||
kdDebug() << "Regex: " << rx.search(path) << endl;
|
||||
|
||||
if (rx.search(path) == 0)
|
||||
{
|
||||
listServices(list, url);
|
||||
}
|
||||
else if (path == "/" + name)
|
||||
{
|
||||
listDevices(list, url);
|
||||
}
|
||||
else if (path == "/")
|
||||
{
|
||||
createTopLevelEntry(entry);
|
||||
listEntry(entry, false);
|
||||
}
|
||||
else
|
||||
{
|
||||
ForwardingSlaveBase::listDir(url);
|
||||
}
|
||||
|
||||
if (list.count() > 0)
|
||||
{
|
||||
kdDebug() << __func__ << "(" << path << ")" << endl;
|
||||
totalSize(list.count() + 1);
|
||||
|
||||
TDEIO::UDSEntryListIterator it = list.begin();
|
||||
TDEIO::UDSEntryListIterator end = list.end();
|
||||
for (; it != end; ++it)
|
||||
{
|
||||
entries.append(*it);
|
||||
}
|
||||
listEntries(entries);
|
||||
}
|
||||
listEntry(entry, true);
|
||||
|
||||
finished();
|
||||
return;
|
||||
}
|
||||
|
||||
bool TDEioBluetooth::rewriteURL(const KURL &url, KURL &newUrl)
|
||||
{
|
||||
kdDebug() << k_funcinfo << endl;
|
||||
|
||||
TQString path = url.path();
|
||||
TQString protocol = url.protocol();
|
||||
|
||||
if (protocol == "obexopp" || protocol == "obexftp")
|
||||
{
|
||||
newUrl = url;
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
ForwardingSlaveBase::error(TDEIO::ERR_MALFORMED_URL, url.prettyURL());
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
void TDEioBluetooth::createTopLevelEntry(TDEIO::UDSEntry &entry)
|
||||
{
|
||||
kdDebug() << k_funcinfo << endl;
|
||||
|
||||
TQT_DBusError error;
|
||||
TQString name = adapter->getName(error);
|
||||
TQ_UINT32 devClass = adapter->getClass(error);
|
||||
|
||||
addAtom(entry, TDEIO::UDS_NAME, name);
|
||||
addAtom(entry, TDEIO::UDS_FILE_TYPE, S_IFDIR);
|
||||
addAtom(entry, TDEIO::UDS_ACCESS, 0555);
|
||||
addAtom(entry, TDEIO::UDS_MIME_TYPE, DeviceMimeConverter::classToMimeType(devClass));
|
||||
addAtom(entry, TDEIO::UDS_ICON_NAME, DeviceMimeConverter::classToIconName(devClass));
|
||||
}
|
||||
|
||||
bool TDEioBluetooth::listDevice(TDEIO::UDSEntry &entry, const TQString &path, const KURL &url)
|
||||
{
|
||||
kdDebug() << __func__ << "(" << url << ")" << endl;
|
||||
TQT_DBusError error;
|
||||
|
||||
TDEBluetooth::DeviceImpl *dev = new TDEBluetooth::DeviceImpl("org.bluez", path);
|
||||
dev->setConnection((*(manager->getConnection())));
|
||||
|
||||
const TQString addr = dev->getAddress(error);
|
||||
TQString name = dev->getName(error);
|
||||
TQString alias = dev->getAlias(error);
|
||||
const int devClass = dev->getClass(error);
|
||||
TQString aname = adapter->getName(error);
|
||||
|
||||
delete dev;
|
||||
|
||||
entry.clear();
|
||||
|
||||
if (!alias.isEmpty())
|
||||
name = alias;
|
||||
else
|
||||
name = alias = addr;
|
||||
|
||||
createDirEntry(entry, name, TQString("bluetooth:/%1/[%2]").arg(aname).arg(addr),
|
||||
DeviceMimeConverter::classToMimeType(devClass));
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool TDEioBluetooth::listDevices(TQValueList<TDEIO::UDSEntry> &list, const KURL &url)
|
||||
{
|
||||
kdDebug() << __func__ << "(" << url << ")" << endl;
|
||||
|
||||
TDEIO::UDSEntry entry;
|
||||
TDEBluetooth::ObjectManagerImpl::DeviceList dl = manager->getDevices();
|
||||
TDEBluetooth::ObjectManagerImpl::DeviceList::Iterator dit = dl.begin();
|
||||
for (dit; dit != dl.end(); ++dit)
|
||||
{
|
||||
entry.clear();
|
||||
listDevice(entry, (*dit), url);
|
||||
list.append(entry);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool TDEioBluetooth::listServices(TQValueList<TDEIO::UDSEntry> &list, const KURL &url)
|
||||
{
|
||||
kdDebug() << __func__ << "url: " << url << endl;
|
||||
|
||||
TDEIO::UDSEntry entry;
|
||||
TQString path = url.path();
|
||||
|
||||
kdDebug() << __func__ << "path: " << path << endl;
|
||||
|
||||
int pos = path.find(TQRegExp("/\\[([0-9A-F]{2}:){5}[0-9A-F]{2}\\]"), 0);
|
||||
if (pos != -1)
|
||||
{
|
||||
|
||||
TQString address = path.remove(0, pos + 2).remove(17, path.length());
|
||||
kdDebug() << __func__ << "address: " << address << endl;
|
||||
|
||||
TDEBluetooth::ObjectManagerImpl::DeviceList dl = manager->getDevices();
|
||||
TDEBluetooth::ObjectManagerImpl::DeviceList::Iterator dit = dl.begin();
|
||||
for (dit; dit != dl.end(); ++dit)
|
||||
{
|
||||
TDEBluetooth::DeviceImpl *d = new TDEBluetooth::DeviceImpl("org.bluez", (*dit));
|
||||
d->setConnection((*(manager->getConnection())));
|
||||
|
||||
TQT_DBusError dbuserror;
|
||||
TQString addr = d->getAddress(dbuserror);
|
||||
if (addr == address)
|
||||
{
|
||||
TQStringList uuids = d->getUUIDs(dbuserror);
|
||||
for (TQStringList::Iterator it = uuids.begin();
|
||||
it != uuids.end(); ++it)
|
||||
{
|
||||
entry.clear();
|
||||
// accepted services OBEX OPP, PCE, FTP
|
||||
//FIXME temporary disabled
|
||||
// if ((*it) == "00001105-0000-1000-8000-00805f9b34fb")
|
||||
// {
|
||||
// createDirEntry(entry, resolveUUID((*it)), TQString("obexopp:/[%1]/").arg(address), "bluetooth/obex-objectpush-profile");
|
||||
// addAtom(entry, TDEIO::UDS_NAME, "obexopp");
|
||||
// list.append(entry);
|
||||
// }
|
||||
// else if ((*it) == "00001106-0000-1000-8000-00805f9b34fb")
|
||||
// {
|
||||
// createDirEntry(entry, resolveUUID((*it)), TQString("obexftp:/[%1]/").arg(address), "bluetooth/obex-ftp-profile");
|
||||
// addAtom(entry, TDEIO::UDS_NAME, "obexftp");
|
||||
// list.append(entry);
|
||||
// }
|
||||
}
|
||||
break;
|
||||
}
|
||||
delete d;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
ForwardingSlaveBase::error(TDEIO::ERR_MALFORMED_URL, url.url());
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool TDEioBluetooth::createDirEntry(TDEIO::UDSEntry &entry, const TQString &name, const TQString &dir, const TQString &mimeType)
|
||||
{
|
||||
kdDebug() << k_funcinfo << endl;
|
||||
|
||||
addAtom(entry, TDEIO::UDS_NAME, name);
|
||||
if (dir != TQString::null)
|
||||
{
|
||||
addAtom(entry, TDEIO::UDS_URL, dir);
|
||||
}
|
||||
addAtom(entry, TDEIO::UDS_MIME_TYPE, mimeType);
|
||||
|
||||
if (mimeType == "inode/directory")
|
||||
addAtom(entry, TDEIO::UDS_FILE_TYPE, S_IFDIR);
|
||||
else
|
||||
addAtom(entry, TDEIO::UDS_FILE_TYPE, S_IRUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void TDEioBluetooth::slotAddDevice(const TQString &path)
|
||||
{
|
||||
kdDebug() << k_funcinfo << endl;
|
||||
listDir("bluetooth:/");
|
||||
}
|
||||
|
||||
void TDEioBluetooth::slotRemoveDevice(const TQString &path)
|
||||
{
|
||||
kdDebug() << __func__ << "(" << path << ")" << endl;
|
||||
listDir("bluetooth:/");
|
||||
|
||||
// TQT_DBusError error;
|
||||
// TDEBluetooth::DeviceImpl *d= new TDEBluetooth::DeviceImpl("org.bluez",path);
|
||||
// d->setConnection((*(manager->getConnection())));
|
||||
// const TQString address = d->getAddress(error);
|
||||
// delete d;
|
||||
//
|
||||
// listDevice(address);
|
||||
// listEntry(TDEIO::UDSEntry(), true);
|
||||
|
||||
}
|
||||
|
||||
void TDEioBluetooth::slotAddService(const KURL &url, const TQString uuid)
|
||||
{
|
||||
kdDebug() << __func__ << "(URL=" << url << ", UUID=" << uuid << ")" << endl;
|
||||
|
||||
// TQT_DBusError error;
|
||||
// TDEBluetooth::DeviceImpl *d= new TDEBluetooth::DeviceImpl("org.bluez",path);
|
||||
// d->setConnection((*(manager->getConnection())));
|
||||
// const TQString address = d->getAddress(error);
|
||||
// TQ_UINT32 devclass = d->getClass(error);
|
||||
// const TQString devicon = DeviceMimeConverter::classToIconName(devclass);
|
||||
// delete d;
|
||||
//
|
||||
// TQMap<TQString,int>::iterator f=qDevicesList.find(address);
|
||||
// if(f!=qDevicesList.end() && f.data() == devclass) return;
|
||||
|
||||
// listEntry(UDSEntry(), true);
|
||||
|
||||
}
|
||||
|
||||
void TDEioBluetooth::slotAdapterPowerOnChanged(TQString const& path, bool state)
|
||||
{
|
||||
kdDebug() << __func__ << "(" << path << ")" << endl;
|
||||
//
|
||||
// TQT_DBusError error;
|
||||
// TDEBluetooth::DeviceImpl *d= new TDEBluetooth::DeviceImpl("org.bluez",path);
|
||||
// d->setConnection((*(manager->getConnection())));
|
||||
// const TQString address = d->getAddress(error);
|
||||
// TQ_UINT32 devclass = d->getClass(error);
|
||||
// const TQString devicon = DeviceMimeConverter::classToIconName(devclass);
|
||||
// delete d;
|
||||
//
|
||||
// TQMap<TQString,int>::iterator f=qDevicesList.find(address);
|
||||
// if(f!=qDevicesList.end() && f.data() == devclass) return;
|
||||
// qDevicesList.insert(address, devclass);
|
||||
//
|
||||
// listDevice(address);
|
||||
// listEntry(UDSEntry(), true);
|
||||
|
||||
}
|
||||
|
||||
void TDEioBluetooth::addAtom(TDEIO::UDSEntry &entry, TDEIO::UDSAtomTypes type, TQString s)
|
||||
{
|
||||
kdDebug() << k_funcinfo << endl;
|
||||
TDEIO::UDSAtom atom;
|
||||
atom.m_uds = type;
|
||||
atom.m_str = s;
|
||||
entry.append(atom);
|
||||
}
|
||||
|
||||
void TDEioBluetooth::addAtom(TDEIO::UDSEntry &entry, TDEIO::UDSAtomTypes type, long l)
|
||||
{
|
||||
kdDebug() << k_funcinfo << endl;
|
||||
TDEIO::UDSAtom atom;
|
||||
atom.m_uds = type;
|
||||
atom.m_long = l;
|
||||
entry.append(atom);
|
||||
}
|
||||
|
||||
#include "tdeiobluetooth.moc"
|
@ -0,0 +1,56 @@
|
||||
//-*-c++-*-
|
||||
/***************************************************************************
|
||||
* Copyright (C) 2003 by Fred Schaettgen *
|
||||
* kdebluetooth@schaettgen.de *
|
||||
* *
|
||||
* 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. *
|
||||
***************************************************************************/
|
||||
|
||||
#ifndef _TDEIOBT_H_
|
||||
#define _TDEIOBT_H_
|
||||
|
||||
#include <tdeio/forwardingslavebase.h>
|
||||
#include <vector>
|
||||
|
||||
#include <adapterImpl.h>
|
||||
#include <objectmanagerImpl.h>
|
||||
|
||||
class TDEioBluetooth : public TDEIO::ForwardingSlaveBase
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
TDEioBluetooth(const TQCString &protocol, const TQCString &pool_socket, const TQCString &app_socket);
|
||||
virtual ~TDEioBluetooth();
|
||||
virtual void closeConnection();
|
||||
virtual void stat(const KURL &url);
|
||||
virtual void listDir(const KURL &url);
|
||||
|
||||
protected:
|
||||
virtual bool rewriteURL(const KURL &url, KURL &newUrl);
|
||||
|
||||
private:
|
||||
void createTopLevelEntry(TDEIO::UDSEntry& entry);
|
||||
bool listDevice(TDEIO::UDSEntry &entry, const TQString &path, const KURL &url);
|
||||
bool listDevices(TQValueList<TDEIO::UDSEntry> &list, const KURL &url);
|
||||
bool listServices(TQValueList<TDEIO::UDSEntry> &list, const KURL &url);
|
||||
bool createDirEntry(TDEIO::UDSEntry &entry, const TQString &title,
|
||||
const TQString &dir = TQString::null, const TQString &mimeType = "inode/directory");
|
||||
void addAtom(TDEIO::UDSEntry &entry, TDEIO::UDSAtomTypes type, TQString s);
|
||||
void addAtom(TDEIO::UDSEntry &entry, TDEIO::UDSAtomTypes type, long l);
|
||||
|
||||
TDEBluetooth::AdapterImpl *adapter;
|
||||
TDEBluetooth::ObjectManagerImpl *manager;
|
||||
|
||||
private slots:
|
||||
void slotAddDevice(const TQString &address);
|
||||
void slotAddService(const KURL &url, const TQString uuid);
|
||||
void slotRemoveDevice(const TQString &address);
|
||||
void slotAdapterPowerOnChanged(const TQString & path, bool state) ;
|
||||
|
||||
};
|
||||
|
||||
#endif //TDEIOBT
|
@ -0,0 +1,38 @@
|
||||
#################################################
|
||||
#
|
||||
# (C) 2018 Emanoil Kotsev
|
||||
# deloptes (AT) gmail.com
|
||||
#
|
||||
# Improvements and feedback are welcome
|
||||
#
|
||||
# This file is released under GPL >= 2
|
||||
#
|
||||
#################################################
|
||||
|
||||
include_directories(
|
||||
${CMAKE_CURRENT_BINARY_DIR}
|
||||
${CMAKE_BINARY_DIR}
|
||||
${CMAKE_SOURCE_DIR}
|
||||
${CMAKE_SOURCE_DIR}/src/libtdeobex
|
||||
${CMAKE_BINARY_DIR}/src/libtdeobex
|
||||
${CMAKE_SOURCE_DIR}/src/tdeioslave/obex
|
||||
${TDE_INCLUDE_DIR}
|
||||
${TQT_INCLUDE_DIRS}
|
||||
${DBUS_INCLUDE_DIRS}
|
||||
${DBUS_TQT_INCLUDE_DIRS}
|
||||
)
|
||||
##### tdeio_bluetooth (static) #############################
|
||||
set( target tdeio_obex )
|
||||
|
||||
tde_add_kpart( ${target} AUTOMOC
|
||||
SOURCES tdeio_obex.cpp obex.cpp
|
||||
LINK ${DBUS_TQT_LIBRARIES} tdeio-shared tdeobex-shared obexinterfaces-static
|
||||
DESTINATION ${PLUGIN_INSTALL_DIR}
|
||||
)
|
||||
|
||||
install( FILES obexftp.protocol
|
||||
DESTINATION ${SERVICES_INSTALL_DIR} )
|
||||
install( FILES obexopp.protocol
|
||||
DESTINATION ${SERVICES_INSTALL_DIR} )
|
||||
install( FILES obex_sidebarentry.desktop
|
||||
DESTINATION ${DATA_INSTALL_DIR}/konqsidebartng/virtual_folders/services )
|
@ -0,0 +1,91 @@
|
||||
|
||||
OBEX tdeio slave.
|
||||
---------------
|
||||
|
||||
At the moment it is mostly working with ober IP, IrDA and the Siemens BFB
|
||||
transport protocol. The slave ues url's of the form
|
||||
|
||||
obex://hostname:port/path
|
||||
|
||||
for IP connections. It will use the standard OBEX port 650 if the port
|
||||
argument is omitted. The IP transport also queries for the nss/netdb entry
|
||||
|
||||
obex 650/tcp
|
||||
|
||||
if registered in the services database. (see getent(1) or nsswitch.conf(5))
|
||||
The IP transport also tries the port 29650. This one is used in case of
|
||||
a server running without root privileges.
|
||||
|
||||
The IrDA Transport is accessed via the url format
|
||||
|
||||
obex://irda/path
|
||||
|
||||
In this case device discovery is done and the first device offering
|
||||
the OBEX hint bit is connected.
|
||||
|
||||
The Bluetooth Transport is accessed via the url format
|
||||
|
||||
obex://bluetooth/path
|
||||
|
||||
In this case device discovery is done and the first device offering
|
||||
the filesystem browsing profile is connected.
|
||||
|
||||
There exist serial transports for Siemens mobiles. It is currently untested.
|
||||
In theory it should work.
|
||||
|
||||
A serial transport for the ericcson mobiles is also in the works. It should be
|
||||
easy to do. It is also difficult to test because I don't know anyone with an
|
||||
ericsson phone ...
|
||||
|
||||
I have removed the old url format using '!' to separate transport options.
|
||||
There is now a kcontrol module for configuration. Using this module one can
|
||||
define 'OBEX hosts' which can be used for hostnames in OBEX url's. Since there
|
||||
are many configuration options i think this is the best method to access
|
||||
specific devices. If you know the hardware addresses of your bluetooth or
|
||||
irda device you can use url's of the form:
|
||||
|
||||
obex://[ef:01:23:45]/
|
||||
|
||||
if your irda device has the address ef:01:23:45 or
|
||||
|
||||
obex://[ab:cd:ef:01:23:45]/
|
||||
|
||||
if your bluetooth device has the hardware address ab:cd:ef:01:23:45.
|
||||
For bluetooth you can also include the rfcomm channel of the folderbrowsing
|
||||
profile in the usual port field.
|
||||
|
||||
OBEX authentication is currently supported in url's.
|
||||
More complete authentication configutation will come.
|
||||
|
||||
DEVICE COMPATIBILITY
|
||||
|
||||
The NOKIA 3650 mobile has a firmware bug in some versions.
|
||||
Mobiles with this bug return invalid XML files for folder listings. This
|
||||
leads to empty directories. Thie bug is reported to be in at least firmware
|
||||
version 2.50. The firmware version 3.16 fixed this bug.
|
||||
Thanks to Fred Schaettgen <Sch@ttgen.net> for testing.
|
||||
|
||||
My Siemens S45i works well with this implementation.
|
||||
|
||||
Connections from and to openobex driven clients or servers will be refused,
|
||||
since openobex uses a wrong protocol version value in connect
|
||||
requests/responses.
|
||||
|
||||
DOCUMENTATION
|
||||
|
||||
Hmm, can someone tell me how to write kdehelp documentation?
|
||||
|
||||
DEMO SERVER
|
||||
|
||||
There is an example folderbowsing server in the subfolder
|
||||
libqobex/qobexfbssrv/. This server and the server api is currently under
|
||||
heavy development. It listens by default on localhost. You can change the
|
||||
transport where it listens with -t <whatever>. It is also password protected
|
||||
by the password 'fbsserver' For more information think of the wisdom of
|
||||
the yedi:
|
||||
|
||||
Use the source Luke
|
||||
|
||||
:)
|
||||
|
||||
Have fun!
|
@ -0,0 +1,312 @@
|
||||
/*
|
||||
This file is part of tdeio_obex.
|
||||
|
||||
Copyright (c) 2003 Mathias Froehlich <Mathias.Froehlich@web.de>
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2 of the License, or (at your option) any later version.
|
||||
|
||||
This library 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
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public License
|
||||
along with this library; see the file COPYING.LIB. If not, write to
|
||||
the Free Software Foundation, Inc., 51 Franklin Steet, Fifth Floor,
|
||||
Boston, MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
#include "obex.h"
|
||||
|
||||
#include <kdebug.h>
|
||||
#include <tqapplication.h>
|
||||
#include <tqeventloop.h>
|
||||
#include <tqregexp.h>
|
||||
|
||||
#include <sys/stat.h>
|
||||
|
||||
#include <tqdbusvariant.h>
|
||||
|
||||
#define MINIMUM_UID 500
|
||||
|
||||
Obex::Obex(TQString &protocol) :
|
||||
mProtocol(protocol)
|
||||
{
|
||||
kdDebug() << k_funcinfo << endl;
|
||||
KUser user;
|
||||
m_effectiveUid = user.uid();
|
||||
}
|
||||
|
||||
Obex::~Obex()
|
||||
{
|
||||
kdDebug() << k_funcinfo << endl;
|
||||
}
|
||||
|
||||
bool Obex::parseURL(const KURL &url, TQString &address, TQString &name, TQString &path) const
|
||||
{
|
||||
kdDebug() << k_funcinfo << endl;
|
||||
TQString url_path = url.path(+1);
|
||||
|
||||
if (url_path.find(TQRegExp("/\\[([0-9A-F]{2}:){5}[0-9A-F]{2}\\]"), 0) != -1)
|
||||
{
|
||||
address = url_path.remove(0, 2);
|
||||
address = address.remove(17, url_path.length());
|
||||
url_path = url_path.remove(0, 18);
|
||||
kdDebug() << "Obex::parseURL address : " << address << endl;
|
||||
kdDebug() << "Obex::parseURL url_path : " << url_path << endl;
|
||||
}
|
||||
else
|
||||
return false;
|
||||
|
||||
int i = url_path.find('/', 1);
|
||||
if (i > 0)
|
||||
{
|
||||
name = url_path.mid(1, i - 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
name = url_path.mid(1);
|
||||
}
|
||||
path = url_path;
|
||||
kdDebug() << "Obex::parseURL path : " << path << endl;
|
||||
kdDebug() << "Obex::parseURL name : " << name << endl;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void Obex::addAtom(UDSEntry &entry, UDSAtomTypes type, const TQString &s)
|
||||
{
|
||||
kdDebug() << k_funcinfo << endl;
|
||||
UDSAtom atom;
|
||||
atom.m_uds = type;
|
||||
atom.m_str = s;
|
||||
entry.append(atom);
|
||||
}
|
||||
|
||||
void Obex::addAtom(UDSEntry &entry, UDSAtomTypes type, const long l)
|
||||
{
|
||||
kdDebug() << k_funcinfo << endl;
|
||||
UDSAtom atom;
|
||||
atom.m_uds = type;
|
||||
atom.m_long = l;
|
||||
entry.append(atom);
|
||||
}
|
||||
|
||||
void Obex::createTopLevelEntry(UDSEntry &entry)
|
||||
{
|
||||
kdDebug() << k_funcinfo << endl;
|
||||
|
||||
entry.clear();
|
||||
addAtom(entry, UDS_NAME, ".");
|
||||
addAtom(entry, UDS_FILE_TYPE, S_IFDIR);
|
||||
addAtom(entry, UDS_ACCESS, 0555);
|
||||
addAtom(entry, UDS_MIME_TYPE, "inode/directory");
|
||||
addAtom(entry, UDS_ICON_NAME, "pda_blue");
|
||||
addAtom(entry, UDS_USER, "root");
|
||||
addAtom(entry, UDS_GROUP, "root");
|
||||
}
|
||||
|
||||
void Obex::createDirEntry(UDSEntry &entry, const TQString dir)
|
||||
{
|
||||
kdDebug() << k_funcinfo << endl;
|
||||
entry.clear();
|
||||
addAtom(entry, UDS_NAME, "/" + dir);
|
||||
addAtom(entry, UDS_FILE_TYPE, S_IFDIR);
|
||||
addAtom(entry, UDS_ACCESS, 0755);
|
||||
addAtom(entry, UDS_MIME_TYPE, "inode/directory");
|
||||
addAtom(entry, UDS_ICON_NAME, "pda_blue");
|
||||
addAtom(entry, UDS_USER, "root");
|
||||
addAtom(entry, UDS_GROUP, "root");
|
||||
}
|
||||
|
||||
void Obex::slotStatResult(Job *job)
|
||||
{
|
||||
kdDebug() << k_funcinfo << endl;
|
||||
if (job->error() == 0)
|
||||
{
|
||||
StatJob *stat_job = static_cast<StatJob *>(job);
|
||||
m_entryBuffer = stat_job->statResult();
|
||||
}
|
||||
|
||||
tqApp->eventLoop()->exitLoop();
|
||||
}
|
||||
|
||||
UDSEntry Obex::createUDSEntry(const TQMap<TQString, TQT_DBusData> &map)
|
||||
{
|
||||
kdDebug() << k_funcinfo << endl;
|
||||
|
||||
UDSEntry entry;
|
||||
long mode;
|
||||
uint isFile = 0;
|
||||
|
||||
TQMap<TQString, TQT_DBusData>::const_iterator mit = map.begin();
|
||||
for (mit; mit != map.end(); ++mit)
|
||||
{
|
||||
|
||||
UDSAtom atom;
|
||||
if (mit.key() == "Accessed")
|
||||
{
|
||||
TQString v = mit.data().toVariant().value.toString();
|
||||
atom.m_uds = UDS_ACCESS_TIME;
|
||||
atom.m_long = stringToTime_t(v);
|
||||
entry.append(atom);
|
||||
}
|
||||
if (mit.key() == "Created")
|
||||
{
|
||||
TQString v = mit.data().toVariant().value.toString();
|
||||
atom.m_uds = UDS_CREATION_TIME;
|
||||
atom.m_long = stringToTime_t(v);
|
||||
entry.append(atom);
|
||||
}
|
||||
if (mit.key() == "Group-perm")
|
||||
{
|
||||
TQString v = mit.data().toVariant().value.toString();
|
||||
if (v.contains('R', FALSE))
|
||||
mode |= S_IRGRP;
|
||||
if (v.contains('W', FALSE))
|
||||
mode |= S_IWGRP;
|
||||
}
|
||||
if (mit.key() == "Modified")
|
||||
{
|
||||
TQString v = mit.data().toVariant().value.toString();
|
||||
atom.m_uds = UDS_MODIFICATION_TIME;
|
||||
atom.m_long = stringToTime_t(v);
|
||||
entry.append(atom);
|
||||
}
|
||||
if (mit.key() == "Size")
|
||||
{
|
||||
TQ_UINT64 v = mit.data().toVariant().value.toUInt64();
|
||||
atom.m_uds = UDS_SIZE;
|
||||
atom.m_long = v;
|
||||
entry.append(atom);
|
||||
}
|
||||
if (mit.key() == "Name")
|
||||
{
|
||||
TQString v = mit.data().toVariant().value.toString();
|
||||
atom.m_uds = UDS_NAME;
|
||||
atom.m_str = v;
|
||||
entry.append(atom);
|
||||
}
|
||||
if (mit.key() == "Other-perm")
|
||||
{
|
||||
TQString v = mit.data().toVariant().value.toString();
|
||||
if (v.contains('R', FALSE))
|
||||
mode |= S_IROTH;
|
||||
if (v.contains('W', FALSE))
|
||||
mode |= S_IWOTH;
|
||||
}
|
||||
if (mit.key() == "Type")
|
||||
{
|
||||
TQString v = mit.data().toVariant().value.toString();
|
||||
if (v == "folder")
|
||||
{
|
||||
isFile = 1;
|
||||
}
|
||||
if (v == "file")
|
||||
{
|
||||
TQString v = mit.data().toVariant().value.toString();
|
||||
isFile = 2;
|
||||
}
|
||||
}
|
||||
if (mit.key() == "User-perm")
|
||||
{
|
||||
TQString v = mit.data().toVariant().value.toString();
|
||||
if (v.contains('R', FALSE))
|
||||
mode |= S_IRUSR;
|
||||
if (v.contains('W', FALSE))
|
||||
mode |= S_IWUSR;
|
||||
}
|
||||
}
|
||||
|
||||
if (isFile == 1)
|
||||
{
|
||||
if (mode & S_IRUSR)
|
||||
mode |= S_IXUSR;
|
||||
if (mode & S_IRGRP)
|
||||
mode |= S_IXGRP;
|
||||
if (mode & S_IROTH)
|
||||
mode |= S_IXOTH;
|
||||
|
||||
UDSAtom atom;
|
||||
atom.m_uds = UDS_ACCESS;
|
||||
atom.m_long = mode;
|
||||
entry.append(atom);
|
||||
|
||||
// set the file type
|
||||
atom.m_uds = UDS_FILE_TYPE;
|
||||
atom.m_long = S_IFDIR;
|
||||
entry.append(atom);
|
||||
}
|
||||
else if (isFile == 2)
|
||||
{
|
||||
UDSAtom atom;
|
||||
atom.m_uds = UDS_ACCESS;
|
||||
atom.m_long = mode;
|
||||
entry.append(atom);
|
||||
|
||||
// set the file type
|
||||
atom.m_uds = UDS_FILE_TYPE;
|
||||
atom.m_long = S_IFREG;
|
||||
entry.append(atom);
|
||||
}
|
||||
else
|
||||
{
|
||||
//FIXME fall back
|
||||
}
|
||||
return entry;
|
||||
}
|
||||
|
||||
time_t Obex::stringToTime_t(TQString str)
|
||||
{
|
||||
kdDebug() << k_funcinfo << endl;
|
||||
|
||||
str.insert(13, ':');
|
||||
str.insert(11, ':');
|
||||
str.insert(6, '-');
|
||||
str.insert(4, '-');
|
||||
TQDateTime time = TQDateTime::fromString(str, TQt::ISODate);
|
||||
|
||||
return time.toTime_t();
|
||||
}
|
||||
|
||||
UDSEntry Obex::extractUrlInfos(const KURL &url)
|
||||
{
|
||||
kdDebug() << k_funcinfo << endl;
|
||||
|
||||
m_entryBuffer.clear();
|
||||
|
||||
StatJob *job = stat(url, false);
|
||||
connect(job, TQT_SIGNAL(result(Job *)), this, TQT_SLOT(slotStatResult(Job *)));
|
||||
tqApp->eventLoop()->enterLoop();
|
||||
|
||||
UDSEntry::iterator it = m_entryBuffer.begin();
|
||||
UDSEntry::iterator end = m_entryBuffer.end();
|
||||
|
||||
UDSEntry infos;
|
||||
|
||||
for (; it != end; ++it)
|
||||
{
|
||||
switch ((*it).m_uds)
|
||||
{
|
||||
case UDS_ACCESS:
|
||||
case UDS_USER:
|
||||
case UDS_GROUP:
|
||||
case UDS_CREATION_TIME:
|
||||
case UDS_MODIFICATION_TIME:
|
||||
case UDS_ACCESS_TIME:
|
||||
infos.append(*it);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
addAtom(infos, UDS_LOCAL_PATH, url.path());
|
||||
|
||||
return infos;
|
||||
}
|
||||
|
||||
#include "obex.moc"
|
@ -0,0 +1,66 @@
|
||||
/*
|
||||
This file is part of tdeio_obex.
|
||||
|
||||
Copyright (c) 2003 Mathias Froehlich <Mathias.Froehlich@web.de>
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2 of the License, or (at your option) any later version.
|
||||
|
||||
This library 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
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public License
|
||||
along with this library; see the file COPYING.LIB. If not, write to
|
||||
the Free Software Foundation, Inc., 51 Franklin Steet, Fifth Floor,
|
||||
Boston, MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
#ifndef OBEX_H
|
||||
#define OBEX_H
|
||||
|
||||
|
||||
#include <tdeio/global.h>
|
||||
#include <tdeio/job.h>
|
||||
#include <kurl.h>
|
||||
#include <kuser.h>
|
||||
|
||||
#include <tqdbusdata.h>
|
||||
|
||||
#include <tqstring.h>
|
||||
|
||||
using namespace TDEIO;
|
||||
|
||||
class Obex : public TQObject
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
Obex(TQString & mProtocol);
|
||||
virtual ~Obex();
|
||||
bool parseURL(const KURL &url, TQString &address, TQString &name, TQString &path) const;
|
||||
void createTopLevelEntry(UDSEntry &entry);
|
||||
void createDirEntry(UDSEntry &entry, const TQString dir);
|
||||
UDSEntry createUDSEntry( const TQMap< TQString, TQT_DBusData > &map );
|
||||
bool changeWorkingDirectory( const TQString& to );
|
||||
|
||||
private slots:
|
||||
void slotStatResult(Job *job);
|
||||
|
||||
private:
|
||||
|
||||
UDSEntry extractUrlInfos(const KURL &url);
|
||||
UDSEntry m_entryBuffer;
|
||||
void addAtom(UDSEntry &entry, UDSAtomTypes type, const TQString &s);
|
||||
void addAtom(UDSEntry &entry, UDSAtomTypes type, const long l);
|
||||
|
||||
time_t stringToTime_t( TQString );
|
||||
|
||||
long m_effectiveUid;
|
||||
TQString mProtocol;
|
||||
};
|
||||
|
||||
#endif
|
@ -0,0 +1,10 @@
|
||||
[Desktop Entry]
|
||||
Encoding=UTF-8
|
||||
Type=Link
|
||||
URL=obexftp:/
|
||||
Icon=tdebluez
|
||||
Name=Bluetooth Browser
|
||||
Name[et]=Bluetoothi brauser
|
||||
Open=false
|
||||
X-TDE-TreeModule=Directory
|
||||
X-TDE-KonqSidebarModule=konqsidebar_tree
|
@ -0,0 +1,548 @@
|
||||
/*
|
||||
This file is part of tdeio_obex.
|
||||
|
||||
Copyright (c) 2003 Mathias Froehlich <Mathias.Froehlich@web.de>
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2 of the License, or (at your option) any later version.
|
||||
|
||||
This library 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
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public License
|
||||
along with this library; see the file COPYING.LIB. If not, write to
|
||||
the Free Software Foundation, Inc., 51 Franklin Steet, Fifth Floor,
|
||||
Boston, MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
//#include <sys/stat.h>
|
||||
#include <pwd.h>
|
||||
#include <grp.h>
|
||||
|
||||
#include <kdebug.h>
|
||||
|
||||
#include <tdeapplication.h>
|
||||
#include <dcopclient.h>
|
||||
#include <tdecmdlineargs.h>
|
||||
|
||||
#include <tqdbusvariant.h>
|
||||
#include <tqdbusdatalist.h>
|
||||
#include <tqdbusdatamap.h>
|
||||
|
||||
#include "tdeio_obex.h"
|
||||
|
||||
static const TDECmdLineOptions options[] = { { "+protocol", I18N_NOOP(
|
||||
"Protocol name"), 0 }, { "+pool", I18N_NOOP("Socket name"), 0 }, {
|
||||
"+app", I18N_NOOP("Socket name"), 0 }, TDECmdLineLastOption };
|
||||
|
||||
extern "C" {
|
||||
int KDE_EXPORT kdemain( int argc, char **argv )
|
||||
{
|
||||
// TDEApplication is necessary to use other ioslaves
|
||||
putenv(strdup("SESSION_MANAGER="));
|
||||
TDECmdLineArgs::init(argc, argv, "tdeio_obex", 0, 0, 0, 0);
|
||||
TDECmdLineArgs::addCmdLineOptions( options );
|
||||
TDEApplication app( false, false, false );
|
||||
// We want to be anonymous even if we use DCOP
|
||||
app.dcopClient()->attach();
|
||||
|
||||
TDECmdLineArgs *args = TDECmdLineArgs::parsedArgs();
|
||||
ObexProtocol slave( args->arg(0), args->arg(1), args->arg(2) );
|
||||
slave.dispatchLoop();
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
ObexProtocol::ObexProtocol(const TQCString &protocol, const TQCString &pool_socket, const TQCString &app_socket) :
|
||||
SlaveBase(protocol, pool_socket, app_socket)
|
||||
{
|
||||
kdDebug() << k_funcinfo << endl;
|
||||
mChannel = 0;
|
||||
mAddress = TQString::null;
|
||||
mSessionPath = TQString();
|
||||
mFileTransfer = 0;
|
||||
mSessionProperties = 0;
|
||||
mSession = 0;
|
||||
mClient = 0;
|
||||
mProtocol = protocol;
|
||||
mHost = TQString::null;
|
||||
mConnected = false;
|
||||
|
||||
mManager = new TDEObex::ObexObjectManagerImpl("org.bluez.obex", "/");
|
||||
if (!mManager->isConnectedToDBUS())
|
||||
{
|
||||
TQString err = "ObexObjectManager is not connected to DBus";
|
||||
tqDebug(err);
|
||||
// infoMessage(i18n("Error"));
|
||||
TDEIO::SlaveBase::error(TDEIO::ERR_COULD_NOT_CONNECT, err);
|
||||
exit();
|
||||
}
|
||||
|
||||
kdDebug() << "ObexProtocol::ObexProtocol DBus connection: " << (*(mManager->getConnection())).uniqueName() << endl;
|
||||
|
||||
if (mProtocol == "obexftp" || mProtocol == "obexopp")
|
||||
{
|
||||
obex = new Obex(mProtocol);
|
||||
// mConnected = connectObex();
|
||||
}
|
||||
else
|
||||
exit();
|
||||
|
||||
if (!mClient)
|
||||
mClient = mManager->getClient();
|
||||
if (!mClient)
|
||||
{
|
||||
TDEIO::SlaveBase::error(TDEIO::ERR_COULD_NOT_CONNECT, "ObexClient was not created");
|
||||
exit();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
ObexProtocol::~ObexProtocol()
|
||||
{
|
||||
kdDebug() << k_funcinfo << endl;
|
||||
if (mConnected)
|
||||
closeObex();
|
||||
if (obex)
|
||||
delete obex;
|
||||
if (mManager)
|
||||
delete mManager;
|
||||
}
|
||||
|
||||
void ObexProtocol::closeConnection()
|
||||
{
|
||||
kdDebug() << k_funcinfo << endl;
|
||||
closeObex();
|
||||
}
|
||||
|
||||
void ObexProtocol::closeObex()
|
||||
{
|
||||
kdDebug() << k_funcinfo << endl;
|
||||
|
||||
TQT_DBusError dbuserror;
|
||||
if (mConnected && !mSessionPath.isEmpty())
|
||||
{
|
||||
// infoMessage(i18n("Disconnecting"));
|
||||
if (!mClient->RemoveSession(mSessionPath, dbuserror))
|
||||
{
|
||||
if (dbuserror.isValid())
|
||||
TDEIO::SlaveBase::error(TDEIO::ERR_COULD_NOT_CONNECT, dbuserror.message());
|
||||
}
|
||||
// infoMessage(i18n("Disconnected"));
|
||||
}
|
||||
|
||||
if (mFileTransfer)
|
||||
delete mFileTransfer;
|
||||
if (mSessionProperties)
|
||||
delete mSessionProperties;
|
||||
if (mSession)
|
||||
delete mSession;
|
||||
if (mClient)
|
||||
delete mClient;
|
||||
mConnected = false;
|
||||
|
||||
exit();
|
||||
}
|
||||
|
||||
//void ObexProtocol::openConnection()
|
||||
//{
|
||||
// kdDebug() << k_funcinfo << endl;
|
||||
//
|
||||
//}
|
||||
|
||||
bool ObexProtocol::connectObex()
|
||||
{
|
||||
kdDebug() << k_funcinfo << endl;
|
||||
|
||||
TQT_DBusError dbuserror;
|
||||
|
||||
TQT_DBusVariant obexprot;
|
||||
if (mProtocol == "obexftp")
|
||||
obexprot.value = TQT_DBusData::fromString("00001106-0000-1000-8000-00805f9b34fb");
|
||||
else if (mProtocol == "obexopp")
|
||||
obexprot.value = TQT_DBusData::fromString("00001105-0000-1000-8000-00805f9b34fb");
|
||||
else if (mProtocol == "obexmap")
|
||||
obexprot.value = TQT_DBusData::fromString("00001134-0000-1000-8000-00805f9b34fb");
|
||||
else if (mProtocol == "obexpbap")
|
||||
obexprot.value = TQT_DBusData::fromString("00001130-0000-1000-8000-00805f9b34fb");
|
||||
else if (mProtocol == "obexsync")
|
||||
obexprot.value = TQT_DBusData::fromString("00001104-0000-1000-8000-00805f9b34fb");
|
||||
obexprot.signature = obexprot.value.buildDBusSignature();
|
||||
TQMap<TQString, TQT_DBusVariant> args;
|
||||
args.insert(TQString("Target"), obexprot);
|
||||
|
||||
if (mSessionPath.isEmpty())
|
||||
{
|
||||
kdDebug() << "ObexProtocol::connectObex : trying to create session" << endl;
|
||||
if (!mClient->CreateSession(mAddress, args, mSessionPath, dbuserror))
|
||||
{
|
||||
TDEIO::SlaveBase::error(TDEIO::ERR_COULD_NOT_CONNECT, i18n("Could not create session for %1.").arg(mAddress));
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
kdDebug() << "ObexProtocol::connectObex mSessionPath: " << mSessionPath << endl;
|
||||
if (!mSession)
|
||||
{
|
||||
mSession = new org::bluez::obex::Session1Proxy("org.bluez.obex", mSessionPath);
|
||||
mSession->setConnection((*(mManager->getConnection())));
|
||||
|
||||
mSessionProperties = new org::freedesktop::DBus::PropertiesProxy("org.bluez", mSessionPath);
|
||||
mSessionProperties->setConnection((*(mManager->getConnection())));
|
||||
|
||||
connect(mSessionProperties, SIGNAL(PropertiesChanged ( const TQString&, const TQMap< TQString, TQT_DBusVariant >&, const TQStringList& )),
|
||||
this, SLOT(slotPropertiesChanged ( const TQString& , const TQMap< TQString, TQT_DBusVariant >&, const TQStringList& )));
|
||||
|
||||
mFileTransfer = new org::bluez::obex::FileTransfer1Proxy("org.bluez.obex", mSessionPath);
|
||||
mFileTransfer->setConnection((*(mManager->getConnection())));
|
||||
|
||||
}
|
||||
if (mClient != 0 && mSession != 0 && mFileTransfer != 0)
|
||||
mConnected = true;
|
||||
return mConnected;
|
||||
}
|
||||
|
||||
void ObexProtocol::listDir(const KURL &url)
|
||||
{
|
||||
kdDebug() << k_funcinfo << endl;
|
||||
kdDebug() << "utl: " << url.url() << endl;
|
||||
kdDebug() << "path: " << url.path() << endl;
|
||||
|
||||
if (url.path().length() <= 1)
|
||||
{
|
||||
TDEIO::SlaveBase::error(TDEIO::ERR_MALFORMED_URL, url.prettyURL());
|
||||
finished();
|
||||
return;
|
||||
}
|
||||
|
||||
TQString address, name, path;
|
||||
bool ok = obex->parseURL(url, address, name, path);
|
||||
|
||||
if (!ok || address.isEmpty())
|
||||
{
|
||||
TDEIO::SlaveBase::error(TDEIO::ERR_MALFORMED_URL, url.prettyURL());
|
||||
finished();
|
||||
return;
|
||||
}
|
||||
mAddress = address;
|
||||
|
||||
kdDebug() << k_funcinfo << " address " << mAddress << endl;
|
||||
kdDebug() << k_funcinfo << " name " << name << endl;
|
||||
kdDebug() << k_funcinfo << " path " << path << endl;
|
||||
kdDebug() << k_funcinfo << " at line " << __LINE__ << endl;
|
||||
|
||||
if (!mConnected)
|
||||
{
|
||||
if (!connectObex())
|
||||
{
|
||||
finished();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (!path.isEmpty())
|
||||
{
|
||||
if (!changeWorkingDirectory(path))
|
||||
{
|
||||
TDEIO::SlaveBase::error(TDEIO::ERR_CANNOT_OPEN_FOR_READING, path);
|
||||
|
||||
finished();
|
||||
closeObex();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
kdDebug() << k_funcinfo << " at line " << __LINE__ << endl;
|
||||
TQT_DBusDataList folderinfo;
|
||||
TQT_DBusError dbuserror;
|
||||
if (!mFileTransfer->ListFolder(folderinfo, dbuserror))
|
||||
{
|
||||
if (dbuserror.isValid())
|
||||
{
|
||||
TDEIO::SlaveBase::error(TDEIO::ERR_CANNOT_OPEN_FOR_READING, i18n("%1.\n%2").arg(url.prettyURL()).arg(dbuserror.message()));
|
||||
}
|
||||
else
|
||||
{
|
||||
TDEIO::SlaveBase::error(TDEIO::ERR_CANNOT_OPEN_FOR_READING, url.prettyURL());
|
||||
}
|
||||
|
||||
finished();
|
||||
closeObex();
|
||||
return;
|
||||
}
|
||||
|
||||
TDEIO::UDSEntryList entries;
|
||||
entries.clear();
|
||||
|
||||
TQValueList<TQT_DBusData> vl = folderinfo.toTQValueList();
|
||||
TQValueList<TQT_DBusData>::Iterator dit = vl.begin();
|
||||
for (dit; dit != vl.end(); ++dit)
|
||||
{
|
||||
bool ok = false;
|
||||
TQMap<TQString, TQT_DBusData> map = (*dit).toStringKeyMap(&ok).toTQMap();
|
||||
if (!ok)
|
||||
{
|
||||
kdDebug() << k_funcinfo << " failed " << endl;
|
||||
continue;
|
||||
}
|
||||
TDEIO::UDSEntry entry = obex->createUDSEntry(map);
|
||||
entries.append(entry);
|
||||
kdDebug() << k_funcinfo << " at line " << __LINE__ << endl;
|
||||
}
|
||||
|
||||
listEntries(entries);
|
||||
listEntry(UDSEntry(), true); // ready
|
||||
|
||||
finished();
|
||||
closeObex();
|
||||
}
|
||||
|
||||
void ObexProtocol::stat(const KURL &url)
|
||||
{
|
||||
kdDebug() << k_funcinfo << " url: " << url << endl;
|
||||
|
||||
TQString address, name, path;
|
||||
bool ok = obex->parseURL(url, address, name, path);
|
||||
kdDebug() << k_funcinfo << " addr: " << address << endl;
|
||||
kdDebug() << k_funcinfo << " name: " << name << endl;
|
||||
kdDebug() << k_funcinfo << " path: " << path << endl;
|
||||
|
||||
if (!ok || address.isEmpty())
|
||||
{
|
||||
error(TDEIO::ERR_MALFORMED_URL, url.prettyURL());
|
||||
return;
|
||||
}
|
||||
|
||||
TDEIO::UDSEntry entry;
|
||||
if (path.isEmpty() || path == "/")
|
||||
{
|
||||
// The root is "virtual" - it's not a single physical directory
|
||||
obex->createTopLevelEntry(entry);
|
||||
}
|
||||
else
|
||||
{
|
||||
obex->createDirEntry(entry, url.url());
|
||||
}
|
||||
statEntry(entry);
|
||||
finished();
|
||||
}
|
||||
|
||||
void ObexProtocol::get(const KURL& url)
|
||||
{
|
||||
kdDebug() << k_funcinfo << endl;
|
||||
|
||||
if (!mFileTransfer)
|
||||
{
|
||||
TDEIO::SlaveBase::error(TDEIO::ERR_INTERNAL, i18n("Could not get file: %1. No file transport").arg(url.prettyURL()));
|
||||
return;
|
||||
}
|
||||
if (!mConnected)
|
||||
{
|
||||
if (!connectObex())
|
||||
{
|
||||
finished();
|
||||
return;
|
||||
}
|
||||
}
|
||||
// TQT_DBusError dbuserror;
|
||||
// if (!mFileTransfer->GetFile(url.url(), dbuserror)) {
|
||||
// TDEIO::SlaveBase::error(TDEIO::ERR_INTERNAL, i18n("Could not get file: %1.").arg(dbuserror.message()));
|
||||
// }
|
||||
}
|
||||
|
||||
void ObexProtocol::copy(const KURL &src, const KURL &dest, int permissions, bool overwrite)
|
||||
{
|
||||
kdDebug() << k_funcinfo << endl;
|
||||
// obex->copy(src, dest, permissions, overwrite);
|
||||
if (!mConnected)
|
||||
{
|
||||
if (!connectObex())
|
||||
{
|
||||
finished();
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ObexProtocol::put(const KURL& url, int permissions, bool overwrite, bool resume)
|
||||
{
|
||||
kdDebug() << k_funcinfo << endl;
|
||||
if (!mConnected)
|
||||
{
|
||||
if (!connectObex())
|
||||
{
|
||||
finished();
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (!mFileTransfer)
|
||||
{
|
||||
TDEIO::SlaveBase::error(TDEIO::ERR_INTERNAL, i18n("Could not put file: %1. No file transport").arg(url.prettyURL()));
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
// TQT_DBusError dbuserror;
|
||||
// if (!mFileTransfer->PutFile(url.url(), dbuserror)) {
|
||||
// TDEIO::SlaveBase::error(TDEIO::ERR_INTERNAL, i18n("Could not put file: %1.").arg(dbuserror.message()));
|
||||
// }
|
||||
|
||||
}
|
||||
|
||||
void ObexProtocol::del(const KURL &url, bool isfile)
|
||||
{
|
||||
kdDebug() << k_funcinfo << endl;
|
||||
|
||||
if (!isfile)
|
||||
{
|
||||
TDEIO::SlaveBase::error(TDEIO::ERR_INTERNAL, i18n("Only files can be deleted. Request to delete: %1").arg(url.prettyURL()));
|
||||
return;
|
||||
}
|
||||
if (!mConnected)
|
||||
{
|
||||
if (!connectObex())
|
||||
{
|
||||
finished();
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (!mFileTransfer)
|
||||
{
|
||||
TDEIO::SlaveBase::error(TDEIO::ERR_INTERNAL, i18n("Could not delete file: %1. No file transport").arg(url.prettyURL()));
|
||||
return;
|
||||
}
|
||||
|
||||
TQT_DBusError dbuserror;
|
||||
if (!mFileTransfer->Delete(url.url(), dbuserror))
|
||||
{
|
||||
TDEIO::SlaveBase::error(TDEIO::ERR_INTERNAL, i18n("Could not delete file: %1.").arg(dbuserror.message()));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//void ObexProtocol::rename(const KURL& src, const KURL& dest, bool overwrite)
|
||||
//{
|
||||
// kdDebug() << k_funcinfo << endl;
|
||||
// // obex->rename(src, dest, overwrite);
|
||||
//
|
||||
//}
|
||||
|
||||
void ObexProtocol::mkdir(const KURL&url, int permissions)
|
||||
{
|
||||
kdDebug() << k_funcinfo << endl;
|
||||
if (!mConnected)
|
||||
{
|
||||
if (!connectObex())
|
||||
{
|
||||
finished();
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (!mFileTransfer)
|
||||
{
|
||||
TDEIO::SlaveBase::error(TDEIO::ERR_INTERNAL, i18n("Could not create directory: %1. No file transport").arg(url.prettyURL()));
|
||||
return;
|
||||
}
|
||||
|
||||
TQT_DBusError dbuserror;
|
||||
if (!mFileTransfer->CreateFolder(url.url(), dbuserror))
|
||||
{
|
||||
TDEIO::SlaveBase::error(TDEIO::ERR_INTERNAL, i18n("Could not create directory: %1.").arg(dbuserror.message()));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
bool ObexProtocol::changeWorkingDirectory(const TQString& dir)
|
||||
{
|
||||
kdDebug() << "ObexProtocol::changeWorkingDirectory( " << dir << " )" << endl;
|
||||
if (!dir.startsWith("/"))
|
||||
{
|
||||
TDEIO::SlaveBase::error(TDEIO::ERR_MALFORMED_URL, i18n("Could not change directory: %1. Directory should start with \"/\"").arg(dir));
|
||||
return false;
|
||||
}
|
||||
if (!mConnected)
|
||||
{
|
||||
if (!connectObex())
|
||||
{
|
||||
finished();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
if (!mFileTransfer)
|
||||
{
|
||||
TDEIO::SlaveBase::error(TDEIO::ERR_INTERNAL, i18n("Could not change directory: %1. No file transport").arg(dir));
|
||||
return false;
|
||||
}
|
||||
|
||||
TQT_DBusError dbuserror;
|
||||
if (!mFileTransfer->ChangeFolder(dir, dbuserror))
|
||||
{
|
||||
TDEIO::SlaveBase::error(TDEIO::ERR_INTERNAL, i18n("Could not change directory: %1.").arg(dbuserror.message()));
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void ObexProtocol::slotPropertiesChanged(const TQString& interface, const TQMap<
|
||||
TQString, TQT_DBusVariant>& changed_properties, const TQStringList& invalidated_properties)
|
||||
{
|
||||
kdDebug() << k_funcinfo << endl;
|
||||
kdDebug() << interface << endl;
|
||||
|
||||
if (interface == "org.bluez.obex.Session1")
|
||||
{
|
||||
TQMap<TQString, TQT_DBusVariant>::const_iterator it;
|
||||
for (it = changed_properties.begin(); it != changed_properties.end();
|
||||
++it)
|
||||
{
|
||||
bool ok = false;
|
||||
if (it.key() == "Source")
|
||||
emit sessionSourceChanged(mSessionPath, it.data().value.toBool(&ok));
|
||||
else if (it.key() == "Destination")
|
||||
emit sessionDestinationChanged(mSessionPath, it.data().value.toString(&ok));
|
||||
else if (it.key() == "Channel")
|
||||
emit sessionChannelChanged(mSessionPath, it.data().value.toByte(&ok));
|
||||
else if (it.key() == "Target")
|
||||
emit sessionTargetChanged(mSessionPath, it.data().value.toString(&ok));
|
||||
else if (it.key() == "Root")
|
||||
emit sessionRootChanged(mSessionPath, it.data().value.toString(&ok));
|
||||
else
|
||||
continue;
|
||||
if (!ok)
|
||||
tqDebug("ObjectManagerImpl::slotPropertiesChanged conversion failed");
|
||||
}
|
||||
}
|
||||
|
||||
if (interface == "org.bluez.obex.FileTransfer1" || interface == "org.bluez.obex.Transfer1")
|
||||
{
|
||||
TQMap<TQString, TQT_DBusVariant>::const_iterator it;
|
||||
for (it = changed_properties.begin(); it != changed_properties.end();
|
||||
++it)
|
||||
{
|
||||
bool ok = false;
|
||||
if (it.key() == "Size")
|
||||
emit transferSizeChanged(mSessionPath, it.data().value.toUInt64(&ok));
|
||||
else if (it.key() == "Status")
|
||||
emit transferStatusChanged(mSessionPath, it.data().value.toString(&ok));
|
||||
else if (it.key() == "Transferred")
|
||||
emit transferTransferredChanged(mSessionPath, it.data().value.toUInt64(&ok));
|
||||
else if (it.key() == "Time")
|
||||
emit transferTimeChanged(mSessionPath, it.data().value.toUInt64(&ok));
|
||||
else if (it.key() == "Filename")
|
||||
emit transferFilenameChanged(mSessionPath, it.data().value.toString(&ok));
|
||||
else
|
||||
continue;
|
||||
if (!ok)
|
||||
tqDebug("ObjectManagerImpl::slotPropertiesChanged conversion failed");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#include "tdeio_obex.moc"
|
@ -0,0 +1,135 @@
|
||||
/*
|
||||
This file is part of tdeio_obex.
|
||||
|
||||
Copyright (c) 2003 Mathias Froehlich <Mathias.Froehlich@web.de>
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2 of the License, or (at your option) any later version.
|
||||
|
||||
This library 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
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public License
|
||||
along with this library; see the file COPYING.LIB. If not, write to
|
||||
the Free Software Foundation, Inc., 51 Franklin Steet, Fifth Floor,
|
||||
Boston, MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
#ifndef TDEIO_OBEX_H
|
||||
#define TDEIO_OBEX_H
|
||||
|
||||
#include <tdeio/global.h>
|
||||
#include <tdeio/job.h>
|
||||
#include <tdeio/slavebase.h>
|
||||
|
||||
#include <tqdbusobjectpath.h>
|
||||
|
||||
#include <interfaces/client1Proxy.h>
|
||||
#include <interfaces/session1Proxy.h>
|
||||
#include <interfaces/propertiesProxy.h>
|
||||
#include <obexobjectmanagerImpl.h>
|
||||
|
||||
#include "obex.h"
|
||||
|
||||
class ObexProtocol: public TQObject, public TDEIO::SlaveBase {
|
||||
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
ObexProtocol(const TQCString &protcol, const TQCString &pool_socket,
|
||||
const TQCString &app_socket);
|
||||
virtual ~ObexProtocol();
|
||||
// virtual void openConnection();
|
||||
virtual void closeConnection();
|
||||
virtual void stat(const KURL& url);
|
||||
virtual void listDir(const KURL& url);
|
||||
virtual void get(const KURL& url);
|
||||
virtual void copy(const KURL &src, const KURL &dest, int permissions,
|
||||
bool overwrite);
|
||||
virtual void put(const KURL& url, int permissions, bool overwrite,
|
||||
bool resume);
|
||||
virtual void del(const KURL &url, bool isfile);
|
||||
// virtual void chmod(const KURL& url, int permissions);
|
||||
// virtual void rename(const KURL& src, const KURL& dest, bool overwrite);
|
||||
virtual void mkdir(const KURL&url, int permissions);
|
||||
|
||||
private:
|
||||
// Private variables
|
||||
/** True if ioslave is connected to server. */
|
||||
bool mConnected;
|
||||
|
||||
/** Host we are connected to. */
|
||||
TQString mHost;
|
||||
|
||||
/**
|
||||
The protocol to be used.
|
||||
*/
|
||||
TQString mProtocol;
|
||||
|
||||
/**
|
||||
Pointer to the obex obejct.
|
||||
*/
|
||||
Obex *obex;
|
||||
|
||||
/**
|
||||
Pointer to the obex client class.
|
||||
*/
|
||||
org::bluez::obex::Client1Proxy* mClient;
|
||||
|
||||
/**
|
||||
Pointer to the obex session class.
|
||||
*/
|
||||
org::bluez::obex::Session1Proxy* mSession;
|
||||
org::freedesktop::DBus::PropertiesProxy* mSessionProperties;
|
||||
org::bluez::obex::FileTransfer1Proxy* mFileTransfer;
|
||||
TQT_DBusObjectPath mSessionPath;
|
||||
TQString mAddress;
|
||||
|
||||
/**
|
||||
Pointer to the obex agent manager class.
|
||||
*/
|
||||
TDEObex::ObexObjectManagerImpl* mManager;
|
||||
|
||||
/** Channel we are connected to. */
|
||||
int mChannel;
|
||||
|
||||
struct Status {
|
||||
int code;
|
||||
TDEIO::filesize_t size;
|
||||
TQString text;
|
||||
};
|
||||
|
||||
private:
|
||||
// private methods
|
||||
|
||||
/**
|
||||
Helper functions.
|
||||
*/
|
||||
bool connectObex();
|
||||
void closeObex();
|
||||
bool changeWorkingDirectory(const TQString& to);
|
||||
|
||||
private slots:
|
||||
void slotPropertiesChanged(const TQString& interface,
|
||||
const TQMap<TQString, TQT_DBusVariant>& changed_properties,
|
||||
const TQStringList& invalidated_properties);
|
||||
|
||||
signals:
|
||||
void sessionSourceChanged(TQT_DBusObjectPath &path,bool ok);
|
||||
void sessionDestinationChanged(TQT_DBusObjectPath &path, TQString value);
|
||||
void sessionChannelChanged(TQT_DBusObjectPath &path, TQ_UINT8 value);
|
||||
void sessionTargetChanged(TQT_DBusObjectPath &path, TQString value);
|
||||
void sessionRootChanged(TQT_DBusObjectPath &path, TQString value);
|
||||
|
||||
void transferSizeChanged(TQT_DBusObjectPath &path, TQ_UINT64 value);
|
||||
void transferStatusChanged(TQT_DBusObjectPath &path, TQString value);
|
||||
void transferTransferredChanged(TQT_DBusObjectPath &path, TQ_UINT64 value);
|
||||
void transferTimeChanged(TQT_DBusObjectPath &path, TQ_UINT64 value);
|
||||
void transferFilenameChanged(TQT_DBusObjectPath &path, TQString value);
|
||||
};
|
||||
|
||||
#endif
|