group.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. package brlyt
  2. import (
  3. "bytes"
  4. "encoding/binary"
  5. "strings"
  6. )
  7. func (r *Root) ParseGRP(data []byte) (*XMLGRP, error) {
  8. var grp GRP
  9. err := binary.Read(bytes.NewReader(data), binary.BigEndian, &grp)
  10. if err != nil {
  11. return nil, err
  12. }
  13. // Strip the null bytes from the strings
  14. name := strings.Replace(string(grp.Name[:]), "\x00", "", -1)
  15. entries := make([]string, grp.NumOfEntries)
  16. for i := 0; i < int(grp.NumOfEntries); i++ {
  17. offset := 20 + (i * 16)
  18. object := strings.Replace(string(data[offset:offset+16]), "\x00", "", -1)
  19. entries[i] = object
  20. }
  21. xmlData := XMLGRP{
  22. Name: name,
  23. Entries: entries,
  24. }
  25. if name == "RootGroup" {
  26. r.RootGroup = xmlData
  27. if r.HasChildren() {
  28. r.RootGroup.Children, err = r.ParseChildren()
  29. if err != nil {
  30. return nil, err
  31. }
  32. }
  33. } else {
  34. if r.HasChildren() {
  35. xmlData.Children, err = r.ParseChildren()
  36. if err != nil {
  37. return nil, err
  38. }
  39. }
  40. }
  41. return &xmlData, nil
  42. }
  43. func (b *BRLYTWriter) WriteGRP(data XMLGRP) error {
  44. header := SectionHeader{
  45. Type: SectionTypeGRP,
  46. Size: uint32(28 + (16 * len(data.Entries))),
  47. }
  48. var name [16]byte
  49. copy(name[:], data.Name)
  50. grp := GRP{
  51. Name: name,
  52. NumOfEntries: uint16(len(data.Entries)),
  53. }
  54. err := write(b, header)
  55. if err != nil {
  56. return err
  57. }
  58. err = write(b, grp)
  59. if err != nil {
  60. return err
  61. }
  62. for _, str := range data.Entries {
  63. var entry [16]byte
  64. copy(entry[:], str)
  65. err = write(b, entry)
  66. if err != nil {
  67. return err
  68. }
  69. }
  70. return nil
  71. }
  72. func (b *BRLYTWriter) WriteGRS() error {
  73. header := SectionHeader{
  74. Type: SectionTypeGRS,
  75. Size: 8,
  76. }
  77. return write(b, header)
  78. }
  79. func (b *BRLYTWriter) WriteGRE() error {
  80. header := SectionHeader{
  81. Type: SectionTypeGRE,
  82. Size: 8,
  83. }
  84. return write(b, header)
  85. }