Esempio n. 1
0
func (t *BindFeature) Negotate(strm *stream.Stream) error {
	if strm.Jid.Resource != "" {
		t.Resource = &strm.Jid.Resource
	}
	id := strconv.Itoa(rand.Intn(1000))
	iq := Iq{To: strm.Jid.Server(), Id: &id, Payload: t}
	typ := IqTypeSet
	iq.Type = &typ
	if err := strm.Send(&iq); err != nil {
		return err
	}
	resp, err := strm.Read()
	if err != nil {
		return err
	}
	if resp == nil {
		return stream.ErrUnexpectedEOF
	}
	switch rsp := resp.(type) {
	case *Iq:
		if rsp.Type != nil && *rsp.Type == IqTypeResult && rsp.Payload != nil {
			if newt, ok := rsp.Payload.(*BindFeature); ok {
				if newt.Jid != nil {
					strm.Jid = newt.Jid
					return nil
				}
			} else {
				return stream.ErrMalformedProtocol
			}
		}
	case *stream.Error:
		return rsp
	}
	return stream.ErrMalformedProtocol
}