diff --git a/xmpp.go b/xmpp.go index 9d257a4..a792e5a 100644 --- a/xmpp.go +++ b/xmpp.go @@ -562,10 +562,11 @@ type Presence struct { } type IQ struct { - ID string - From string - To string - Type string + ID string + From string + To string + Type string + Query []byte } // Recv waits to receive the next XMPP stanza. @@ -599,7 +600,7 @@ func (c *Client) Recv() (stanza interface{}, err error) { case *clientPresence: return Presence{v.From, v.To, v.Type, v.Show, v.Status}, nil case *clientIQ: - return IQ{v.ID, v.From, v.To, v.Type}, nil + return IQ{ID: v.ID, From: v.From, To: v.To, Type: v.Type, Query: v.Query}, nil } } } @@ -747,6 +748,7 @@ type clientIQ struct { // info/query ID string `xml:"id,attr"` To string `xml:"to,attr"` Type string `xml:"type,attr"` // error, get, result, set + Query []byte `xml:",innerxml"` Error clientError Bind bindBind } @@ -839,6 +841,7 @@ func next(p *xml.Decoder) (xml.Name, interface{}, error) { if err = p.DecodeElement(nv, &se); err != nil { return xml.Name{}, nil, err } + return se.Name, nv, err } diff --git a/xmpp_discovery.go b/xmpp_discovery.go deleted file mode 100644 index 5e753c1..0000000 --- a/xmpp_discovery.go +++ /dev/null @@ -1,12 +0,0 @@ -package xmpp - -import ( - "fmt" -) - -const xmlIqGet = "" - -func (c *Client) Discovery() { - cookie := getCookie() - fmt.Fprintf(c.conn, xmlIqGet, xmlEscape(c.jid), xmlEscape(c.domain), cookie) -} diff --git a/xmpp_information_query.go b/xmpp_information_query.go new file mode 100644 index 0000000..d89379a --- /dev/null +++ b/xmpp_information_query.go @@ -0,0 +1,24 @@ +package xmpp + +import ( + "fmt" + "strconv" +) + +const IQTypeGet = "get" +const IQTypeSet = "set" +const IQTypeResult = "result" + +func (c *Client) Discovery() (string, error) { + const namespace = "http://jabber.org/protocol/disco#items" + // use getCookie for a pseudo random id. + reqID := strconv.FormatUint(uint64(getCookie()), 10) + return c.RawInformationQuery(c.jid, c.domain, reqID, IQTypeGet, namespace, "") +} + +// RawInformationQuery sends an information query request to the server. +func (c *Client) RawInformationQuery(from, to, id, iqType, requestNamespace, body string) (string, error) { + const xmlIQ = "%s" + _, err := fmt.Fprintf(c.conn, xmlIQ, xmlEscape(from), xmlEscape(to), id, iqType, requestNamespace, body) + return id, err +}