misc.go 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. package main
  2. import (
  3. "bytes"
  4. "github.com/kpmy/xippo/entity"
  5. "github.com/kpmy/xippo/entity/dyn"
  6. "github.com/kpmy/ypk/dom"
  7. "gopkg.in/xmlpath.v2"
  8. "log"
  9. )
  10. func conv(fn func(entity.Entity)) func(*bytes.Buffer) bool {
  11. delayed := func(msg dom.Element) bool {
  12. for _, _e := range msg.Children() {
  13. if e, ok := _e.(dom.Element); ok && e.Name() == "delay" {
  14. return true
  15. }
  16. }
  17. return false
  18. }
  19. return func(in *bytes.Buffer) (done bool) {
  20. done = true
  21. //log.Println("IN")
  22. //log.Println(string(in.Bytes()))
  23. //log.Println()
  24. if _, err := xmlpath.Parse(bytes.NewBuffer(in.Bytes())); err == nil {
  25. } else {
  26. log.Println(err)
  27. }
  28. if _e, err := entity.Decode(bytes.NewBuffer(in.Bytes())); err == nil {
  29. e := _e.Model()
  30. switch e.Name() {
  31. case dyn.MESSAGE:
  32. if !delayed(e) {
  33. if ent, err := entity.ConsumeStatic(in); err == nil {
  34. fn(ent)
  35. } else {
  36. log.Println(err)
  37. }
  38. }
  39. case dyn.PRESENCE:
  40. fn(_e)
  41. }
  42. } else {
  43. log.Println(err)
  44. }
  45. return
  46. }
  47. }
  48. func firstByName(root dom.Element, name string) (ret dom.Element) {
  49. for _, x := range root.Children() {
  50. if e, ok := x.(dom.Element); ok && e.Name() == name {
  51. ret = e
  52. break
  53. }
  54. }
  55. return
  56. }