public InventoryFolder[] ParseSkeleton(NetworkManager.InventorySkeletonEntry[] skeleton, LLUUID owner) { Dictionary <LLUUID, InventoryFolder> Folders = new Dictionary <LLUUID, InventoryFolder>(); Dictionary <LLUUID, List <InventoryFolder> > FoldersChildren = new Dictionary <LLUUID, List <InventoryFolder> >(skeleton.Length); foreach (NetworkManager.InventorySkeletonEntry entry in skeleton) { InventoryFolder folder = new InventoryFolder(entry.folder_id); if (entry.type_default != -1) { folder.PreferredType = (AssetType)entry.type_default; } folder.Version = entry.version; folder.OwnerID = owner; folder.ParentUUID = LLUUID.Parse(entry.parent_id); folder.Name = entry.name; Folders.Add(entry.folder_id, folder); if (entry.parent_id != LLUUID.Zero) { List <InventoryFolder> parentChildren; if (!FoldersChildren.TryGetValue(entry.parent_id, out parentChildren)) { parentChildren = new List <InventoryFolder>(); FoldersChildren.Add(entry.parent_id, parentChildren); } parentChildren.Add(folder); } } foreach (KeyValuePair <LLUUID, List <InventoryFolder> > pair in FoldersChildren) { if (Folders.ContainsKey(pair.Key)) { InventoryFolder parentFolder = Folders[pair.Key]; parentFolder.DescendentCount = pair.Value.Count; // Should we set this here? it's just the folders, not the items! } } // Should we do this or just return an IEnumerable? InventoryFolder[] ret = new InventoryFolder[Folders.Count]; int index = 0; foreach (InventoryFolder folder in Folders.Values) { ret[index] = folder; ++index; } return(ret); }
public void Parse(NetworkManager.LoginMethodResponse reply) { AgentID = LLUUID.Parse(reply.agent_id); SessionID = LLUUID.Parse(reply.session_id); SecureSessionID = LLUUID.Parse(reply.secure_session_id); FirstName = reply.first_name; LastName = reply.last_name; StartLocation = reply.start_location; AgentAccess = reply.agent_access; LLSDArray look_at = (LLSDArray)LLSDParser.DeserializeNotation(reply.look_at); LookAt = new LLVector3( (float)look_at[0].AsReal(), (float)look_at[1].AsReal(), (float)look_at[2].AsReal()); if (reply.home != null) { LLSDMap home = (LLSDMap)LLSDParser.DeserializeNotation(reply.home); LLSDArray array = (LLSDArray)home["position"]; HomePosition = new LLVector3( (float)array[0].AsReal(), (float)array[1].AsReal(), (float)array[2].AsReal()); array = (LLSDArray)home["look_at"]; HomeLookAt = new LLVector3( (float)array[0].AsReal(), (float)array[1].AsReal(), (float)array[2].AsReal()); } CircuitCode = (uint)reply.circuit_code; RegionX = (uint)reply.region_x; RegionY = (uint)reply.region_y; SimPort = (ushort)reply.sim_port; SimIP = IPAddress.Parse(reply.sim_ip); SeedCapability = reply.seed_capability; if (reply.buddy_list != null) { BuddyList = new FriendInfo[reply.buddy_list.Length]; for (int i = 0; i < BuddyList.Length; ++i) { NetworkManager.BuddyListEntry buddy = reply.buddy_list[i]; BuddyList[i] = new FriendInfo(buddy.buddy_id, (FriendRights)buddy.buddy_rights_given, (FriendRights)buddy.buddy_rights_has); } } else { BuddyList = new FriendInfo[0]; } InventoryRoot = LLUUID.Parse(reply.inventory_root[0].folder_id); LibraryRoot = LLUUID.Parse(reply.inventory_lib_root[0].folder_id); LibraryOwner = LLUUID.Parse(reply.inventory_lib_owner[0].agent_id); InventorySkeleton = ParseSkeleton(reply.inventory_skeleton, AgentID); LibrarySkeleton = ParseSkeleton(reply.inventory_skel_lib, LibraryOwner); }