structs.go
changeset 12 122ab6208c3c
parent 11 48be1ae93fd4
child 17 d269d9c0fc8e
equal deleted inserted replaced
11:48be1ae93fd4 12:122ab6208c3c
    19 
    19 
    20 // JID represents an entity that can communicate with other
    20 // JID represents an entity that can communicate with other
    21 // entities. It looks like node@domain/resource. Node and resource are
    21 // entities. It looks like node@domain/resource. Node and resource are
    22 // sometimes optional.
    22 // sometimes optional.
    23 type JID struct {
    23 type JID struct {
       
    24 	// TODO Make this not a pointer.
    24 	Node *string
    25 	Node *string
    25 	Domain string
    26 	Domain string
    26 	Resource *string
    27 	Resource string
    27 }
    28 }
    28 var _ fmt.Stringer = &JID{}
    29 var _ fmt.Stringer = &JID{}
    29 var _ flag.Value = &JID{}
    30 var _ flag.Value = &JID{}
    30 
    31 
    31 // XMPP's <stream:stream> XML element
    32 // XMPP's <stream:stream> XML element
    59 var _ xml.Marshaler = &errText{}
    60 var _ xml.Marshaler = &errText{}
    60 
    61 
    61 type Features struct {
    62 type Features struct {
    62 	Starttls *starttls
    63 	Starttls *starttls
    63 	Mechanisms mechs
    64 	Mechanisms mechs
       
    65 	Bind *Unrecognized
    64 }
    66 }
    65 
    67 
    66 type starttls struct {
    68 type starttls struct {
    67 	XMLName xml.Name
    69 	XMLName xml.Name
    68 	required *string
    70 	required *string
    77 	Chardata string `xml:"chardata"`
    79 	Chardata string `xml:"chardata"`
    78 	Mechanism string `xml:"attr"`
    80 	Mechanism string `xml:"attr"`
    79 	Any *Unrecognized
    81 	Any *Unrecognized
    80 }
    82 }
    81 
    83 
       
    84 type Stanza interface {
       
    85 	XName() string
       
    86 	XTo() string
       
    87 	XFrom() string
       
    88 	XId() string
       
    89 	XType() string
       
    90 	XLang() string
       
    91 	XError() *Error
       
    92 	XChild() *Unrecognized
       
    93 }
       
    94 
       
    95 type Message struct {
       
    96 	To string `xml:"attr"`
       
    97 	From string `xml:"attr"`
       
    98 	Id string `xml:"attr"`
       
    99 	Type string `xml:"attr"`
       
   100 	Lang string `xml:"attr"`
       
   101 	Error *Error
       
   102 	Any *Unrecognized
       
   103 }
       
   104 var _ xml.Marshaler = &Message{}
       
   105 var _ Stanza = &Message{}
       
   106 
       
   107 type Presence struct {
       
   108 	To string `xml:"attr"`
       
   109 	From string `xml:"attr"`
       
   110 	Id string `xml:"attr"`
       
   111 	Type string `xml:"attr"`
       
   112 	Lang string `xml:"attr"`
       
   113 	Error *Error
       
   114 	Any *Unrecognized
       
   115 }
       
   116 var _ xml.Marshaler = &Presence{}
       
   117 var _ Stanza = &Presence{}
       
   118 
       
   119 type Iq struct {
       
   120 	To string `xml:"attr"`
       
   121 	From string `xml:"attr"`
       
   122 	Id string `xml:"attr"`
       
   123 	Type string `xml:"attr"`
       
   124 	Lang string `xml:"attr"`
       
   125 	Error *Error
       
   126 	Any *Unrecognized
       
   127 }
       
   128 var _ xml.Marshaler = &Iq{}
       
   129 var _ Stanza = &Iq{}
       
   130 
       
   131 type Error struct {
       
   132 	Type string `xml:"attr"`
       
   133 	Any *Unrecognized
       
   134 }
       
   135 var _ xml.Marshaler = &Error{}
       
   136 
       
   137 // TODO Rename this to something like Generic.
    82 type Unrecognized struct {
   138 type Unrecognized struct {
    83 	XMLName xml.Name
   139 	XMLName xml.Name
       
   140 	Any *Unrecognized
       
   141 	Chardata string `xml:"chardata"`
    84 }
   142 }
    85 var _ fmt.Stringer = &Unrecognized{}
   143 var _ fmt.Stringer = &Unrecognized{}
    86 
   144 
    87 func (jid *JID) String() string {
   145 func (jid *JID) String() string {
    88 	result := jid.Domain
   146 	result := jid.Domain
    89 	if jid.Node != nil {
   147 	if jid.Node != nil {
    90 		result = *jid.Node + "@" + result
   148 		result = *jid.Node + "@" + result
    91 	}
   149 	}
    92 	if jid.Resource != nil {
   150 	if jid.Resource != "" {
    93 		result = result + "/" + *jid.Resource
   151 		result = result + "/" + jid.Resource
    94 	}
   152 	}
    95 	return result
   153 	return result
    96 }
   154 }
    97 
   155 
    98 func (jid *JID) Set(val string) bool {
   156 func (jid *JID) Set(val string) bool {
   105 		jid.Node = nil
   163 		jid.Node = nil
   106 	} else {
   164 	} else {
   107 		jid.Node = &parts[2]
   165 		jid.Node = &parts[2]
   108 	}
   166 	}
   109 	jid.Domain = parts[3]
   167 	jid.Domain = parts[3]
   110 	if parts[5] == "" {
   168 	jid.Resource = parts[5]
   111 		jid.Resource = nil
       
   112 	} else {
       
   113 		jid.Resource = &parts[5]
       
   114 	}
       
   115 	return true
   169 	return true
   116 }
   170 }
   117 
   171 
   118 func (s *Stream) MarshalXML() ([]byte, os.Error) {
   172 func (s *Stream) MarshalXML() ([]byte, os.Error) {
   119 	buf := bytes.NewBuffer(nil)
   173 	buf := bytes.NewBuffer(nil)
   185 		io.WriteString(w, `"`)
   239 		io.WriteString(w, `"`)
   186 	}
   240 	}
   187 }
   241 }
   188 
   242 
   189 func (u *Unrecognized) String() string {
   243 func (u *Unrecognized) String() string {
   190 	return fmt.Sprintf("unrecognized{%s %s}", u.XMLName.Space,
   244 	var sub string
       
   245 	if u.Any != nil {
       
   246 		sub = u.Any.String()
       
   247 	}
       
   248 	return fmt.Sprintf("<%s %s>%s%s</%s %s>", u.XMLName.Space,
       
   249 		u.XMLName.Local, sub, u.Chardata, u.XMLName.Space,
   191 		u.XMLName.Local)
   250 		u.XMLName.Local)
   192 }
   251 }
       
   252 
       
   253 func marshalXML(st Stanza) ([]byte, os.Error) {
       
   254 	buf := bytes.NewBuffer(nil)
       
   255 	buf.WriteString("<")
       
   256 	buf.WriteString(st.XName())
       
   257 	if st.XTo() != "" {
       
   258 		writeField(buf, "to", st.XTo())
       
   259 	}
       
   260 	if st.XFrom() != "" {
       
   261 		writeField(buf, "from", st.XFrom())
       
   262 	}
       
   263 	if st.XId() != "" {
       
   264 		writeField(buf, "id", st.XId())
       
   265 	}
       
   266 	if st.XType() != "" {
       
   267 		writeField(buf, "type", st.XType())
       
   268 	}
       
   269 	if st.XLang() != "" {
       
   270 		writeField(buf, "xml:lang", st.XLang())
       
   271 	}
       
   272 	buf.WriteString(">")
       
   273 	if st.XError() != nil {
       
   274 		bytes, _ := st.XError().MarshalXML()
       
   275 		buf.WriteString(string(bytes))
       
   276 	}
       
   277 	if st.XChild() != nil {
       
   278 		xml.Marshal(buf, st.XChild())
       
   279 	}
       
   280 	buf.WriteString("</")
       
   281 	buf.WriteString(st.XName())
       
   282 	buf.WriteString(">")
       
   283 	return buf.Bytes(), nil
       
   284 }
       
   285 
       
   286 func (er *Error) MarshalXML() ([]byte, os.Error) {
       
   287 	buf := bytes.NewBuffer(nil)
       
   288 	buf.WriteString("<error")
       
   289 	writeField(buf, "type", er.Type)
       
   290 	buf.WriteString(">")
       
   291 	if er.Any != nil {
       
   292 		xml.Marshal(buf, er.Any)
       
   293 	}
       
   294 	buf.WriteString("</error>")
       
   295 	return buf.Bytes(), nil
       
   296 }
       
   297 
       
   298 func (m *Message) XName() string {
       
   299 	return "message"
       
   300 }
       
   301 
       
   302 func (m *Message) XTo() string {
       
   303 	return m.To
       
   304 }
       
   305 
       
   306 func (m *Message) XFrom() string {
       
   307 	return m.From
       
   308 }
       
   309 
       
   310 func (m *Message) XId() string {
       
   311 	return m.Id
       
   312 }
       
   313 
       
   314 func (m *Message) XType() string {
       
   315 	return m.Type
       
   316 	}
       
   317 
       
   318 func (m *Message) XLang() string {
       
   319 	return m.Lang
       
   320 }
       
   321 
       
   322 func (m *Message) XError() *Error {
       
   323 	return m.Error
       
   324 }
       
   325 
       
   326 func (m *Message) XChild() *Unrecognized {
       
   327 	return m.Any
       
   328 }
       
   329 
       
   330 func (m *Message) MarshalXML() ([]byte, os.Error) {
       
   331 	return marshalXML(m)
       
   332 }
       
   333 
       
   334 func (p *Presence) XName() string {
       
   335 	return "presence"
       
   336 }
       
   337 
       
   338 func (p *Presence) XTo() string {
       
   339 	return p.To
       
   340 }
       
   341 
       
   342 func (p *Presence) XFrom() string {
       
   343 	return p.From
       
   344 }
       
   345 
       
   346 func (p *Presence) XId() string {
       
   347 	return p.Id
       
   348 }
       
   349 
       
   350 func (p *Presence) XType() string {
       
   351 	return p.Type
       
   352 	}
       
   353 
       
   354 func (p *Presence) XLang() string {
       
   355 	return p.Lang
       
   356 }
       
   357 
       
   358 func (p *Presence) XError() *Error {
       
   359 	return p.Error
       
   360 }
       
   361 
       
   362 func (p *Presence) XChild() *Unrecognized {
       
   363 	return p.Any
       
   364 }
       
   365 
       
   366 func (p *Presence) MarshalXML() ([]byte, os.Error) {
       
   367 	return marshalXML(p)
       
   368 }
       
   369 
       
   370 func (iq *Iq) XName() string {
       
   371 	return "iq"
       
   372 }
       
   373 
       
   374 func (iq *Iq) XTo() string {
       
   375 	return iq.To
       
   376 }
       
   377 
       
   378 func (iq *Iq) XFrom() string {
       
   379 	return iq.From
       
   380 }
       
   381 
       
   382 func (iq *Iq) XId() string {
       
   383 	return iq.Id
       
   384 }
       
   385 
       
   386 func (iq *Iq) XType() string {
       
   387 	return iq.Type
       
   388 	}
       
   389 
       
   390 func (iq *Iq) XLang() string {
       
   391 	return iq.Lang
       
   392 }
       
   393 
       
   394 func (iq *Iq) XError() *Error {
       
   395 	return iq.Error
       
   396 }
       
   397 
       
   398 func (iq *Iq) XChild() *Unrecognized {
       
   399 	return iq.Any
       
   400 }
       
   401 
       
   402 func (iq *Iq) MarshalXML() ([]byte, os.Error) {
       
   403 	return marshalXML(iq)
       
   404 }