|
|
@ -7,18 +7,57 @@ import (
|
|
|
|
"fluux.io/xmpp/iot"
|
|
|
|
"fluux.io/xmpp/iot"
|
|
|
|
)
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
|
|
|
TODO I would like to be able to write
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
newIQ(Id, From, To, Type, Lang).AddPayload(IQPayload)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
xmpp.IQ{
|
|
|
|
|
|
|
|
XMLName: xml.Name{
|
|
|
|
|
|
|
|
Space: "",
|
|
|
|
|
|
|
|
Local: "",
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
PacketAttrs: xmpp.PacketAttrs{
|
|
|
|
|
|
|
|
Id: "",
|
|
|
|
|
|
|
|
From: "",
|
|
|
|
|
|
|
|
To: "",
|
|
|
|
|
|
|
|
Type: "",
|
|
|
|
|
|
|
|
Lang: "",
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
Payload: nil,
|
|
|
|
|
|
|
|
RawXML: "",
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
// ============================================================================
|
|
|
|
// ============================================================================
|
|
|
|
// IQ Packet
|
|
|
|
// IQ Packet
|
|
|
|
|
|
|
|
|
|
|
|
type IQ struct { // Info/Query
|
|
|
|
type IQ struct { // Info/Query
|
|
|
|
XMLName xml.Name `xml:"iq"`
|
|
|
|
XMLName xml.Name `xml:"iq"`
|
|
|
|
PacketAttrs
|
|
|
|
PacketAttrs
|
|
|
|
Payload IQPayload `xml:",omitempty"`
|
|
|
|
Payload []IQPayload `xml:",omitempty"`
|
|
|
|
RawXML string `xml:",innerxml"`
|
|
|
|
RawXML string `xml:",innerxml"`
|
|
|
|
// TODO We need to support detecting the IQ namespace / Query packet
|
|
|
|
|
|
|
|
// Error clientError
|
|
|
|
// Error clientError
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func NewIQ(iqtype, from, to, id, lang string) IQ {
|
|
|
|
|
|
|
|
return IQ{
|
|
|
|
|
|
|
|
XMLName: xml.Name{Local: "iq"},
|
|
|
|
|
|
|
|
PacketAttrs: PacketAttrs{
|
|
|
|
|
|
|
|
Id: id,
|
|
|
|
|
|
|
|
From: from,
|
|
|
|
|
|
|
|
To: to,
|
|
|
|
|
|
|
|
Type: iqtype,
|
|
|
|
|
|
|
|
Lang: lang,
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func (iq *IQ) AddPayload(payload IQPayload) {
|
|
|
|
|
|
|
|
iq.Payload = append(iq.Payload, payload)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
func (IQ) Name() string {
|
|
|
|
func (IQ) Name() string {
|
|
|
|
return "iq"
|
|
|
|
return "iq"
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -33,10 +72,6 @@ func (iqDecoder) decode(p *xml.Decoder, se xml.StartElement) (IQ, error) {
|
|
|
|
return packet, err
|
|
|
|
return packet, err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
type IQPayload interface {
|
|
|
|
|
|
|
|
IsIQPayload()
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// UnmarshalXML implements custom parsing for IQs
|
|
|
|
// UnmarshalXML implements custom parsing for IQs
|
|
|
|
func (iq *IQ) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
|
|
|
|
func (iq *IQ) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
|
|
|
|
iq.XMLName = start.Name
|
|
|
|
iq.XMLName = start.Name
|
|
|
@ -83,7 +118,7 @@ func (iq *IQ) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
|
|
|
|
if err != nil {
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
iq.Payload = p
|
|
|
|
iq.Payload = []IQPayload{p}
|
|
|
|
p = nil
|
|
|
|
p = nil
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -117,12 +152,32 @@ func (iq *IQ) XMPPFormat() string {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// ============================================================================
|
|
|
|
// ============================================================================
|
|
|
|
// Genery IQ Node
|
|
|
|
// Generic IQ Payload
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
type IQPayload interface {
|
|
|
|
|
|
|
|
IsIQPayload()
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
type Node struct {
|
|
|
|
type Node struct {
|
|
|
|
XMLName xml.Name
|
|
|
|
XMLName xml.Name
|
|
|
|
Content []byte `xml:",innerxml"`
|
|
|
|
Attrs []xml.Attr `xml:"-"`
|
|
|
|
Nodes []Node `xml:",any"`
|
|
|
|
// Content []byte `xml:",innerxml"`
|
|
|
|
|
|
|
|
Nodes []Node `xml:",any"`
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func (n *Node) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
|
|
|
|
|
|
|
|
n.Attrs = start.Attr
|
|
|
|
|
|
|
|
type node Node
|
|
|
|
|
|
|
|
return d.DecodeElement((*node)(n), &start)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func (n *Node) MarshalXML(e *xml.Encoder, start xml.StartElement) (err error) {
|
|
|
|
|
|
|
|
start.Attr = n.Attrs
|
|
|
|
|
|
|
|
start.Name = n.XMLName
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
err = e.EncodeToken(start)
|
|
|
|
|
|
|
|
e.EncodeElement(n.Nodes, xml.StartElement{Name: n.XMLName})
|
|
|
|
|
|
|
|
return e.EncodeToken(xml.EndElement{Name: start.Name})
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
func (*Node) IsIQPayload() {}
|
|
|
|
func (*Node) IsIQPayload() {}
|
|
|
|