aboutsummaryrefslogtreecommitdiff
path: root/srv/server.go
blob: 673081b8699f71df7be5e8cf0ac5250159e4256c (plain)
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
83
84
package srv

import (
	"fmt"
	"log"
	"sync"

	"github.com/godbus/dbus/v5"
)

const DEFAULT_EXPIRATION = 5000
const SORT_DIRECTION = 1 // 1 = newest first, -1 = oldest first

type server = struct {
	conn   *dbus.Conn
	object dbus.ObjectPath
	name   string
}

func Start() {
	const NOTIF_DBUS_OBJECT = "/org/freedesktop/Notifications"
	const NOTIF_DBUS_NAME = "org.freedesktop.Notifications"
	const CORVID_DBUS_OBJECT = "/sh/cxl/Corvid"
	const CORVID_DBUS_NAME = "sh.cxl.Corvid"

	notifications := notificationStack{
		mutex:         &sync.Mutex{},
		notifications: make(map[uint32]notification),
		nextId:        1,
	}

	conn, err := dbus.SessionBus()
	if err != nil {
		log.Fatal(err)
	}

	err = startDBusServer(
		conn,
		corvidServer{
			conn:   conn,
			object: CORVID_DBUS_OBJECT,
			name:   CORVID_DBUS_NAME,
		},
		CORVID_DBUS_OBJECT,
		CORVID_DBUS_NAME,
	)
	if err != nil {
		log.Fatal(err)
	}

	err = startDBusServer(
		conn,
		notifServer{
			notifications: &notifications,
			server: server{
				conn:   conn,
				object: NOTIF_DBUS_OBJECT,
				name:   NOTIF_DBUS_NAME,
			},
		},
		NOTIF_DBUS_OBJECT,
		NOTIF_DBUS_NAME,
	)
	if err != nil {
		log.Fatal(err)
	}
}

func startDBusServer(conn *dbus.Conn, v interface{}, object dbus.ObjectPath, name string) error {
	conn.Export(v, object, name)

	reply, err := conn.RequestName(name, dbus.NameFlagReplaceExisting|dbus.NameFlagDoNotQueue)
	if err != nil {
		return err
	}

	if reply != dbus.RequestNameReplyPrimaryOwner {
		return fmt.Errorf("'%s' already taken", name)
	}

	log.Printf("connected to dbus as %s @ %s", name, object)

	return nil
}