summaryrefslogtreecommitdiff
path: root/xmpp/router.go
blob: d437b28a55da7d08e1a480bbf69fd8a65f3cc779 (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
package xmpp

import (
	"encoding/xml"
)

// routingTable is a data structure which contains routing information for XML
// elements. The xml.StartElement at the beginning of an XML element has a name
// containing the XML namespace and a local name. Based on this compisition
// which forms the xml.Name the appropriate handler function is defined by each
// entry of the routingTable.
type routingTable []struct {
	name    xml.Name
	handler func(s *xml.StartElement, d *xml.Decoder, c chan<- any)
}

// getRoutingTable returns the routing table used in
// xengineering.eu/limox/xmpp. Since Go does not allow such a datatype as a
// constant such a function is a simple yet inefficient approach to guarantee
// that an unmodified routing table is delivered to each user. A global
// variable would have the problem that it could be altered during execution.
func getRoutingTable() routingTable {
	return routingTable{
		{xml.Name{`http://etherx.jabber.org/streams`, `features`}, streamFeaturesHandler},
//		{xml.Name{`urn:ietf:params:xml:ns:xmpp-sasl`, `success`}, saslSuccessHandler},
//		{xml.Name{`urn:ietf:params:xml:ns:xmpp-sasl`, `failure`}, saslFailureHandler},
//		{xml.Name{`jabber:client`, `iq`}, iqHandler},
	}
}

// route determines the correct handler function for the given XML element by a
// given routingTable. In addition it executes the determined handler function.
// If no handler function is found an error message is send via the log module.
func route(s *xml.StartElement, d *xml.Decoder, c chan<- any, t routingTable) {
	for _, v := range t {
		if v.name == (*s).Name {
			v.handler(s, d, c)
		}
	}
}