2018-03-24 16:32:32 +00:00
|
|
|
#!/usr/bin/python
|
|
|
|
# -*- coding: UTF-8 -*-
|
|
|
|
|
|
|
|
"""
|
|
|
|
* Copyright 2018 Albert Vaca Cintora <albertvaka@gmail.com>
|
|
|
|
* Copyright 2018 Andy Holmes <andrew.g.r.holmes@gmail.com>
|
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU General Public License as
|
|
|
|
* published by the Free Software Foundation; either version 2 of
|
|
|
|
* the License or (at your option) version 3 or any later version
|
|
|
|
* accepted by the membership of KDE e.V. (or its successor approved
|
|
|
|
* by the membership of KDE e.V.), which shall act as a proxy
|
|
|
|
* defined in Section 14 of version 3 of the license.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
"""
|
|
|
|
|
|
|
|
__author__ = "Albert Vaca Cintora <albertvaka@gmail.com>"
|
|
|
|
__version__ = "1.0"
|
|
|
|
__appname__ = "kdeconnect-share"
|
|
|
|
__app_disp_name__ = "Share files to your phone via KDE Connect"
|
|
|
|
__website__ = "https://community.kde.org/KDEConnect"
|
|
|
|
|
|
|
|
import gettext
|
|
|
|
import locale
|
2018-05-29 19:52:16 +01:00
|
|
|
from functools import partial
|
2018-03-24 16:32:32 +00:00
|
|
|
|
|
|
|
from gi.repository import Nautilus, Gio, GLib, GObject
|
|
|
|
|
|
|
|
_ = gettext.gettext
|
|
|
|
|
|
|
|
class KdeConnectShareExtension(GObject.GObject, Nautilus.MenuProvider):
|
|
|
|
"""A context menu for sending files via KDE Connect."""
|
|
|
|
|
2018-05-29 19:52:16 +01:00
|
|
|
def refresh_devices_list(self, *args, **kwargs):
|
|
|
|
try:
|
|
|
|
onlyReachable = True
|
|
|
|
onlyPaired = True
|
|
|
|
variant = GLib.Variant('(bb)', (onlyReachable, onlyPaired))
|
|
|
|
devices = self.dbus.call_sync('deviceNames', variant, 0, -1, None)
|
|
|
|
self.devices = devices.unpack()[0]
|
|
|
|
except Exception as e:
|
|
|
|
raise Exception('Error while getting reachable devices')
|
|
|
|
|
|
|
|
|
2018-03-24 16:32:32 +00:00
|
|
|
def __init__(self):
|
|
|
|
GObject.GObject.__init__(self)
|
|
|
|
|
2018-05-29 19:52:16 +01:00
|
|
|
self.devices = {}
|
|
|
|
|
2018-03-24 16:32:32 +00:00
|
|
|
try:
|
|
|
|
locale.setlocale(locale.LC_ALL, '')
|
|
|
|
gettext.bindtextdomain('kdeconnect-nautilus-extension')
|
|
|
|
except Exception as e:
|
|
|
|
print(e)
|
|
|
|
|
|
|
|
self.dbus = Gio.DBusProxy.new_for_bus_sync(
|
|
|
|
Gio.BusType.SESSION,
|
|
|
|
Gio.DBusProxyFlags.NONE,
|
|
|
|
None,
|
|
|
|
'org.kde.kdeconnect',
|
|
|
|
'/modules/kdeconnect',
|
|
|
|
'org.kde.kdeconnect.daemon',
|
|
|
|
None)
|
|
|
|
|
2018-05-29 19:52:16 +01:00
|
|
|
connection = Gio.bus_get_sync(
|
|
|
|
Gio.BusType.SESSION,
|
|
|
|
None)
|
|
|
|
connection.signal_subscribe(
|
|
|
|
None,
|
|
|
|
'org.kde.kdeconnect.daemon',
|
|
|
|
'deviceListChanged',
|
|
|
|
"/modules/kdeconnect",
|
|
|
|
None,
|
|
|
|
Gio.DBusSignalFlags.NONE,
|
|
|
|
partial(self.refresh_devices_list, self),
|
|
|
|
)
|
|
|
|
|
|
|
|
self.refresh_devices_list()
|
|
|
|
|
2018-03-24 16:32:32 +00:00
|
|
|
def send_files(self, menu, files, deviceId):
|
|
|
|
device_proxy = Gio.DBusProxy.new_for_bus_sync(
|
|
|
|
Gio.BusType.SESSION,
|
|
|
|
Gio.DBusProxyFlags.NONE,
|
|
|
|
None,
|
|
|
|
'org.kde.kdeconnect',
|
|
|
|
'/modules/kdeconnect/devices/'+deviceId+'/share',
|
|
|
|
'org.kde.kdeconnect.device.share',
|
|
|
|
None)
|
|
|
|
|
|
|
|
for file in files:
|
|
|
|
variant = GLib.Variant('(s)', (file.get_uri(),))
|
|
|
|
device_proxy.call_sync('shareUrl', variant, 0, -1, None)
|
|
|
|
|
|
|
|
def get_file_items(self, window, files):
|
|
|
|
|
|
|
|
#We can only send regular files
|
|
|
|
for uri in files:
|
|
|
|
if uri.get_uri_scheme() != 'file' or uri.is_directory():
|
|
|
|
return
|
|
|
|
|
2018-05-29 19:52:16 +01:00
|
|
|
devices = self.devices
|
2018-03-24 16:32:32 +00:00
|
|
|
|
|
|
|
if len(devices) == 0:
|
|
|
|
return
|
|
|
|
|
|
|
|
if len(devices) == 1:
|
2018-05-29 20:03:02 +01:00
|
|
|
deviceId, deviceName = list(devices.items())[0]
|
2018-03-24 16:32:32 +00:00
|
|
|
item = Nautilus.MenuItem(
|
|
|
|
name='KdeConnectShareExtension::Devices::' + deviceId,
|
|
|
|
label=_("Send to %s via KDE Connect") % deviceName,
|
|
|
|
)
|
|
|
|
item.connect('activate', self.send_files, files, deviceId)
|
|
|
|
return item,
|
|
|
|
else:
|
|
|
|
menu = Nautilus.MenuItem(
|
|
|
|
name='KdeConnectShareExtension::Devices',
|
|
|
|
label=_('Send via KDE Connect'),
|
|
|
|
)
|
|
|
|
submenu = Nautilus.Menu()
|
|
|
|
menu.set_submenu(submenu)
|
|
|
|
|
|
|
|
for deviceId, deviceName in devices.items():
|
|
|
|
item = Nautilus.MenuItem(
|
|
|
|
name='KdeConnectShareExtension::Devices::' + deviceId,
|
|
|
|
label=deviceName,
|
|
|
|
)
|
|
|
|
item.connect('activate', self.send_files, files, deviceId)
|
|
|
|
submenu.append_item(item)
|
|
|
|
|
|
|
|
return menu,
|
|
|
|
|