sum7
/
yaja
Archived
1
0
Fork 0
This repository has been archived on 2020-09-27. You can view files and clone it, but cannot push or open issues or pull requests.
yaja/client/comm.go

84 lines
2.0 KiB
Go

package client
import (
"encoding/xml"
"dev.sum7.eu/genofire/yaja/messages"
)
func (client *Client) Read() (*xml.StartElement, error) {
for {
nextToken, err := client.in.Token()
if err != nil {
return nil, err
}
switch nextToken.(type) {
case xml.StartElement:
element := nextToken.(xml.StartElement)
client.Logging.Debug("recv xml: ", messages.XMLStartElementToString(&element))
return &element, nil
}
}
}
func (client *Client) Decode(p interface{}, element *xml.StartElement) error {
err := client.in.DecodeElement(p, element)
if err != nil {
client.Logging.Debugf("decode failed xml: %s to: %v", messages.XMLStartElementToString(element), p)
} else {
client.Logging.Debugf("decode xml: %s to: %v with children %s", messages.XMLStartElementToString(element), p, messages.XMLChildrenString(p))
}
return err
}
func (client *Client) ReadDecode(p interface{}) error {
element, err := client.Read()
if err != nil {
return err
}
var iq *messages.IQClient
iq, ok := p.(*messages.IQClient)
if !ok {
iq = &messages.IQClient{}
}
err = client.Decode(iq, element)
if err == nil && iq.Ping != nil {
client.Logging.Info("ReadElement: auto answer ping")
iq.Type = messages.IQTypeResult
iq.To = iq.From
iq.From = client.JID
client.Send(iq)
return nil
}
if ok {
return err
}
return client.Decode(p, element)
}
func (client *Client) encode(p interface{}) error {
err := client.out.Encode(p)
if err != nil {
client.Logging.Debugf("encode failed %v", p)
} else {
client.Logging.Debugf("encode %v with children %s", p, messages.XMLChildrenString(p))
}
return err
}
func (client *Client) Send(p interface{}) error {
msg, ok := p.(*messages.MessageClient)
if ok {
msg.From = client.JID
return client.encode(msg)
}
iq, ok := p.(*messages.IQClient)
if ok {
iq.From = client.JID
return client.encode(iq)
}
pc, ok := p.(*messages.PresenceClient)
if ok {
pc.From = client.JID
return client.encode(pc)
}
return client.encode(p)
}