summaryrefslogtreecommitdiffstats
path: root/geoclue.js
blob: bcd07758c34429bb24700fefcd65ece0084713b8 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#!/usr/bin/gjs
// Requires .desktop file installed in $XDG_DATA_DIRS/applications

const GLib = imports.gi.GLib;
const Gio = imports.gi.Gio;
const Json = imports.gi.Json;
const Lang = imports.lang;
const Mainloop = imports.mainloop;

const AccuracyLevel = {
    COUNTRY: 1,
    CITY: 4,
    NEIGHBORHOOD: 5,
    STREET: 6,
    EXACT: 8
};

const ManagerIface = '<node> \
  <interface name="org.freedesktop.GeoClue2.Manager"> \
    <method name="GetClient"> \
      <arg type="o" name="client" direction="out"/> \
    </method> \
  </interface> \
</node>';
const ManagerProxy = Gio.DBusProxy.makeProxyWrapper(ManagerIface);

const ClientInterface = '<node> \
<interface name="org.freedesktop.GeoClue2.Client"> \
    <property name="Location" type="o" access="read"/> \
    <property name="DesktopId" type="s" access="readwrite"/> \
    <property name="RequestedAccuracyLevel" type="u" access="readwrite"/> \
    <property name="DistanceThreshold" type="u" access="readwrite"/> \
    <property name="Active" type="b" access="read"/> \
    <method name="Start"/> \
    <method name="Stop"/> \
    <signal name="LocationUpdated"> \
        <arg name="old" type="o"/> \
        <arg name="new" type="o"/> \
    </signal> \
</interface> \
</node>';
const ClientProxy = Gio.DBusProxy.makeProxyWrapper(ClientInterface);

const LocationInterface = '<node> \
<interface name="org.freedesktop.GeoClue2.Location"> \
    <property name="Latitude" type="d" access="read"/> \
    <property name="Longitude" type="d" access="read"/> \
    <property name="Accuracy" type="d" access="read"/> \
    <property name="Description" type="s" access="read"/> \
</interface> \
</node>';
const LocationProxy = Gio.DBusProxy.makeProxyWrapper(LocationInterface);


function onLocationUpdated(proxy, sender, [oldPath, newPath]) {
  let geoclueLocation = new LocationProxy(Gio.DBus.system,
                                          "org.freedesktop.GeoClue2",
                                          newPath);
  print('location:');
  print('\tlatitude = ' + geoclueLocation.Latitude);
  print('\tlongitude = ' + geoclueLocation.Longitude);
  print('\taccuracy = ' + geoclueLocation.Accuracy);
  print('\tdescription = ' + geoclueLocation.Description);
  //this._updateLocation(location);
  Mainloop.quit();
}

let _managerProxy = new ManagerProxy(Gio.DBus.system,
  'org.freedesktop.GeoClue2', '/org/freedesktop/GeoClue2/Manager');

let [clientAddr] = _managerProxy.GetClientSync();

let clientProxy = new ClientProxy(Gio.DBus.system,
    'org.freedesktop.GeoClue2', clientAddr);
clientProxy.DesktopId = 'gnome-shell-ISS_Above';
clientProxy.DistanceThreshold = 10000;
clientProxy.RequestedAccuracyLevel = AccuracyLevel.EXACT;
let updatedId = clientProxy.connectSignal('LocationUpdated',
    onLocationUpdated);
clientProxy.StartRemote();

Mainloop.run();