Fix various channel freezer bugs.

This commit is contained in:
Mikkel Krautz 2011-11-12 21:08:24 +01:00
parent a42e4d07b4
commit 41689595f2

View file

@ -245,6 +245,7 @@ func (c *Channel) Unfreeze(fc *freezer.Channel) {
}
// Update ACLs
if fc.Acl != nil {
c.ACL = nil
for _, facl := range fc.Acl {
acl := NewChannelACL(c)
@ -270,8 +271,10 @@ func (c *Channel) Unfreeze(fc *freezer.Channel) {
}
c.ACL = append(c.ACL, acl)
}
}
// Update groups
if fc.Groups != nil {
c.Groups = make(map[string]*Group)
for _, fgrp := range fc.Groups {
if fgrp.Name == nil {
@ -294,6 +297,17 @@ func (c *Channel) Unfreeze(fc *freezer.Channel) {
}
}
// Hook up links, but make them point to the channel itself.
// We can't be sure that the channels the links point to exist
// yet, so we delay hooking up the map 'correctly' to later.
if fc.Links != nil {
c.Links = make(map[int]*Channel)
for _, link := range fc.Links {
c.Links[int(link)] = c
}
}
}
// Freeze a User into a flattened protobuf-based structure
// ready to be persisted to disk.
func (user *User) Freeze() (fu *freezer.User, err error) {
@ -588,8 +602,8 @@ func NewServerFromFrozen(name string) (s *Server, err error) {
channelId := int(*fc.Id)
channel, ok := s.Channels[channelId]
if !ok {
channel, alreadyExists := s.Channels[channelId]
if !alreadyExists {
if fc.Name == nil {
log.Printf("Skipped Channel creation log entry: No name given.")
continue
@ -610,11 +624,13 @@ func NewServerFromFrozen(name string) (s *Server, err error) {
s.Channels[channelId] = channel
// Mark the channel's parent
if !alreadyExists {
if fc.ParentId != nil {
parents[*fc.Id] = *fc.ParentId
} else {
delete(parents, *fc.Id)
}
}
case *freezer.ChannelRemove:
fc := val.(*freezer.ChannelRemove)
@ -657,6 +673,20 @@ func NewServerFromFrozen(name string) (s *Server, err error) {
parentChan.AddChild(childChan)
}
// Hook up all channel links
for _, channel := range s.Channels {
if len(channel.Links) > 0 {
links := channel.Links
channel.Links = make(map[int]*Channel)
for chanId, _ := range links {
targetChannel := s.Channels[chanId]
if targetChannel != nil {
s.LinkChannels(channel, targetChannel)
}
}
}
}
return s, nil
}
@ -717,7 +747,7 @@ func (server *Server) UpdateFrozenChannel(channel *Channel, state *mumbleproto.C
if state.Parent != nil {
fc.ParentId = state.Parent
}
if len(state.LinksAdd) > 0 && len(state.LinksRemove) > 0 {
if len(state.LinksAdd) > 0 || len(state.LinksRemove) > 0 {
links := []uint32{}
for cid, _ := range channel.Links {
links = append(links, uint32(cid))