コード例 #1
0
 public InventoryArchiveReadRequest(
     Scene scene, CachedUserInfo userInfo, string invPath, Stream loadStream)
 {
     m_scene = scene;
     m_userInfo = userInfo;
     m_invPath = invPath;
     m_loadStream = loadStream;
 }
コード例 #2
0
 public InventoryArchiveReadRequest(
     CachedUserInfo userInfo, string invPath, Stream loadStream, CommunicationsManager commsManager, IAssetService assetService)
 {
     m_userInfo = userInfo;
     m_invPath = invPath;
     m_loadStream = loadStream;
     m_commsManager = commsManager;
     m_assetService = assetService;
 }
コード例 #3
0
 public InventoryArchiveReadRequest(
     CachedUserInfo userInfo, string invPath, string loadPath, CommunicationsManager commsManager, IAssetService assetService)
     : this(
         userInfo,
         invPath,
         new GZipStream(new FileStream(loadPath, FileMode.Open), CompressionMode.Decompress),
         commsManager, assetService)
 {
 }
コード例 #4
0
 public InventoryArchiveReadRequest(
     Scene scene, CachedUserInfo userInfo, string invPath, string loadPath)
     : this(
         scene,
         userInfo,
         invPath,
         new GZipStream(new FileStream(loadPath, FileMode.Open), CompressionMode.Decompress))
 {
 }
コード例 #5
0
 private void UpdateCachedInfo(UUID agentID, CachedUserInfo info)
 {
     lock (MuteListCache)
         MuteListCache[agentID] = info.MuteList.ToArray();
 }
コード例 #6
0
 private void UpdateCachedInfo(UUID agentID, CachedUserInfo info)
 {
     lock (m_offlineMessagesCache)
         m_offlineMessagesCache[agentID] = info.OfflineMessages;
 }
コード例 #7
0
        private void GridInventoryOffer(GridInstantMessage im)
        {
            if (im.binaryBucket.Length < 1) // Invalid
            {
                m_log.WarnFormat("[INVENTORY TRANSFER]: Invalid IM (binary bucket length {0}).", im.binaryBucket.Length);
                return;
            }

            Scene         scene = FindScene(new UUID(im.toAgentID));
            ScenePresence user  = scene.GetScenePresence(new UUID(im.toAgentID));

            if (user == null) // Shouldn't happen
            {
                m_log.Warn("[INVENTORY TRANSFER]: Can't find recipient");
                return;
            }

            CachedUserInfo userInfo =
                scene.CommsManager.UserService.
                GetUserDetails(user.ControllingClient.AgentId);

            if (userInfo == null)
            {
                m_log.Warn("[INVENTORY TRANSFER]: Can't find user info of recipient");
                return;
            }

            AssetType assetType         = (AssetType)im.binaryBucket[0];
            UUID      inventoryEntityID = UUID.Zero;

            if (im.binaryBucket.Length >= 17) // includes UUID
            {
                inventoryEntityID = new UUID(im.binaryBucket, 1);
            }

            if (AssetType.Folder == assetType)
            {
                if (inventoryEntityID != UUID.Zero)
                {
                    // Get folder info
                    InventoryFolderBase folder = userInfo.GetFolder(inventoryEntityID);
                    if (folder == null)
                    {
                        m_log.WarnFormat("[INVENTORY TRANSFER]: Can't retrieve folder {0} to give.", inventoryEntityID);
                        return;
                    }

                    // Update folder to viewer (makes it appear to user)
                    user.ControllingClient.SendBulkUpdateInventory(folder);
                    userInfo.SendInventoryDecendents(user.ControllingClient, folder.ID, false, true);
                }

                // Deliver message
                user.ControllingClient.SendInstantMessage(im);
            }
            else
            {
                if (inventoryEntityID != UUID.Zero)
                {
                    // Get item info
                    InventoryItemBase item = userInfo.FindItem(inventoryEntityID);
                    if (item == null)
                    {
                        m_log.WarnFormat("[INVENTORY TRANSFER]: Can't retrieve item {0} to give.", inventoryEntityID);
                        return;
                    }

                    // Update item to viewer (makes it appear in proper folder)
                    user.ControllingClient.SendInventoryItemCreateUpdate(item, 0);
                }

                // Deliver message
                user.ControllingClient.SendInstantMessage(im);
            }
        }
コード例 #8
0
        protected bool IsLocalUser(CachedUserInfo uinfo)
        {
            if (uinfo == null)
                return false;

            return !(uinfo.UserProfile is ForeignUserProfileData);

        }
コード例 #9
0
 /// <summary>
 /// Notify the client of loaded nodes if they are logged in
 /// </summary>
 /// <param name="loadedNodes">Can be empty.  In which case, nothing happens</param>
 private void UpdateClientWithLoadedNodes(CachedUserInfo userInfo, List<InventoryNodeBase> loadedNodes)
 {               
     if (loadedNodes.Count == 0)
         return;
            
     foreach (Scene scene in m_scenes.Values)
     {
         ScenePresence user = scene.GetScenePresence(userInfo.UserProfile.ID);
         
         if (user != null && !user.IsChildAgent)
         {        
             foreach (InventoryNodeBase node in loadedNodes)
             {
                 m_log.DebugFormat(
                     "[INVENTORY ARCHIVER]: Notifying {0} of loaded inventory node {1}", 
                     user.Name, node.Name);
                 
                 user.ControllingClient.SendBulkUpdateInventory(node);
             }
             
             break;
         }        
     }            
 }
コード例 #10
0
        /// <summary>
        /// Test saving a V0.1 OpenSim Inventory Archive (subject to change since there is no fixed format yet).
        /// </summary>
        //[Test]
        public void TestSaveIarV0_1()
        {
            TestHelper.InMethod();
            log4net.Config.XmlConfigurator.Configure();

            InventoryArchiverModule archiverModule = new InventoryArchiverModule();

            Scene scene = SceneSetupHelpers.SetupScene(false);

            SceneSetupHelpers.SetupSceneModules(scene, archiverModule);
            CommunicationsManager cm = scene.CommsManager;

            // Create user
            string userFirstName = "Jock";
            string userLastName  = "Stirrup";
            UUID   userId        = UUID.Parse("00000000-0000-0000-0000-000000000020");

            cm.UserAdminService.AddUser(userFirstName, userLastName, string.Empty, string.Empty, 1000, 1000, userId);
            CachedUserInfo userInfo = cm.UserProfileCacheService.GetUserDetails(userId);

            userInfo.FetchInventory();
            for (int i = 0; i < 50; i++)
            {
                if (userInfo.HasReceivedInventory == true)
                {
                    break;
                }
                Thread.Sleep(200);
            }
            Assert.That(userInfo.HasReceivedInventory, Is.True, "FetchInventory timed out (10 seconds)");

            // Create asset
            SceneObjectGroup object1;
            SceneObjectPart  part1;
            {
                string             partName       = "My Little Dog Object";
                UUID               ownerId        = UUID.Parse("00000000-0000-0000-0000-000000000040");
                PrimitiveBaseShape shape          = PrimitiveBaseShape.CreateSphere();
                Vector3            groupPosition  = new Vector3(10, 20, 30);
                Quaternion         rotationOffset = new Quaternion(20, 30, 40, 50);
                Vector3            offsetPosition = new Vector3(5, 10, 15);

                part1
                    = new SceneObjectPart(
                          ownerId, shape, groupPosition, rotationOffset, offsetPosition);
                part1.Name = partName;

                object1 = new SceneObjectGroup(part1);
                scene.AddNewSceneObject(object1, false);
            }

            UUID      asset1Id = UUID.Parse("00000000-0000-0000-0000-000000000060");
            AssetBase asset1   = new AssetBase();

            asset1.FullID = asset1Id;
            asset1.Data   = Encoding.ASCII.GetBytes(SceneObjectSerializer.ToXml2Format(object1));
            scene.AssetService.Store(asset1);

            // Create item
            UUID item1Id            = UUID.Parse("00000000-0000-0000-0000-000000000080");
            InventoryItemBase item1 = new InventoryItemBase();

            item1.Name    = "My Little Dog";
            item1.AssetID = asset1.FullID;
            item1.ID      = item1Id;
            item1.Folder  = userInfo.RootFolder.FindFolderByPath("Objects").ID;
            scene.AddInventoryItem(userId, item1);

            MemoryStream archiveWriteStream = new MemoryStream();

            archiverModule.OnInventoryArchiveSaved += SaveCompleted;

            lock (this)
            {
                archiverModule.ArchiveInventory(userFirstName, userLastName, "Objects", archiveWriteStream);
                Monitor.Wait(this, 60000);
            }

            byte[]           archive           = archiveWriteStream.ToArray();
            MemoryStream     archiveReadStream = new MemoryStream(archive);
            TarArchiveReader tar = new TarArchiveReader(archiveReadStream);

            InventoryFolderImpl objectsFolder = userInfo.RootFolder.FindFolderByPath("Objects");

            //bool gotControlFile = false;
            bool gotObject1File = false;
            //bool gotObject2File = false;
            string expectedObject1FilePath = string.Format(
                "{0}{1}/{2}_{3}.xml",
                ArchiveConstants.INVENTORY_PATH,
                string.Format(
                    "Objects{0}{1}", ArchiveConstants.INVENTORY_NODE_NAME_COMPONENT_SEPARATOR, objectsFolder.ID),
                item1.Name,
                item1Id);

//            string expectedObject2FileName = string.Format(
//                "{0}_{1:000}-{2:000}-{3:000}__{4}.xml",
//                part2.Name,
//                Math.Round(part2.GroupPosition.X), Math.Round(part2.GroupPosition.Y), Math.Round(part2.GroupPosition.Z),
//                part2.UUID);

            string filePath;

            TarArchiveReader.TarEntryType tarEntryType;

            Console.WriteLine("Reading archive");

            while (tar.ReadEntry(out filePath, out tarEntryType) != null)
            {
                Console.WriteLine("Got {0}", filePath);

//                if (ArchiveConstants.CONTROL_FILE_PATH == filePath)
//                {
//                    gotControlFile = true;
//                }

                if (filePath.StartsWith(ArchiveConstants.INVENTORY_PATH) && filePath.EndsWith(".xml"))
                {
//                    string fileName = filePath.Remove(0, "Objects/".Length);
//
//                    if (fileName.StartsWith(part1.Name))
//                    {
                    Assert.That(filePath, Is.EqualTo(expectedObject1FilePath));
                    gotObject1File = true;
//                    }
//                    else if (fileName.StartsWith(part2.Name))
//                    {
//                        Assert.That(fileName, Is.EqualTo(expectedObject2FileName));
//                        gotObject2File = true;
//                    }
                }
            }

//            Assert.That(gotControlFile, Is.True, "No control file in archive");
            Assert.That(gotObject1File, Is.True, "No item1 file in archive");
//            Assert.That(gotObject2File, Is.True, "No object2 file in archive");

            // TODO: Test presence of more files and contents of files.
        }
コード例 #11
0
 public InventoryArchiveReadRequest(
     CachedUserInfo userInfo, string invPath, Stream loadStream, CommunicationsManager commsManager)
 {
     m_userInfo     = userInfo;
     m_commsManager = commsManager;
 }
コード例 #12
0

        
コード例 #13
0

        
コード例 #14
0
        /// <summary>
        /// Handle the caps inventory descendents fetch.
        ///
        /// Since the folder structure is sent to the client on login, I believe we only need to handle items.
        /// </summary>
        /// <param name="agentID"></param>
        /// <param name="folderID"></param>
        /// <param name="ownerID"></param>
        /// <param name="fetchFolders"></param>
        /// <param name="fetchItems"></param>
        /// <param name="sortOrder"></param>
        /// <returns>null if the inventory look up failed</returns>
        public List <InventoryItemBase> HandleFetchInventoryDescendentsCAPS(UUID agentID, UUID folderID, UUID ownerID,
                                                                            bool fetchFolders, bool fetchItems, int sortOrder)
        {
//            m_log.DebugFormat(
//                "[INVENTORY CACHE]: Fetching folders ({0}), items ({1}) from {2} for agent {3}",
//                fetchFolders, fetchItems, folderID, agentID);

            // FIXME MAYBE: We're not handling sortOrder!

            // TODO: This code for looking in the folder for the library should be folded back into the
            // CachedUserInfo so that this class doesn't have to know the details (and so that multiple libraries, etc.
            // can be handled transparently).
            InventoryFolderImpl fold;

            if ((fold = CommsManager.UserProfileCacheService.LibraryRoot.FindFolder(folderID)) != null)
            {
                return(fold.RequestListOfItems());
            }

            CachedUserInfo userProfile = CommsManager.UserProfileCacheService.GetUserDetails(agentID);

            if (null == userProfile)
            {
                m_log.ErrorFormat("[AGENT INVENTORY]: Could not find user profile for {0}", agentID);
                return(null);
            }

            // XXX: When a client crosses into a scene, their entire inventory is fetched
            // asynchronously.  If the client makes a request before the inventory is received, we need
            // to give the inventory a chance to come in.
            //
            // This is a crude way of dealing with that by retrying the lookup.  It's not quite as bad
            // in CAPS as doing this with the udp request, since here it won't hold up other packets.
            // In fact, here we'll be generous and try for longer.
            if (!userProfile.HasReceivedInventory)
            {
                int attempts = 0;
                while (attempts++ < 30)
                {
                    m_log.DebugFormat(
                        "[INVENTORY CACHE]: Poll number {0} for inventory items in folder {1} for user {2}",
                        attempts, folderID, agentID);

                    Thread.Sleep(2000);

                    if (userProfile.HasReceivedInventory)
                    {
                        break;
                    }
                }
            }

            if (userProfile.HasReceivedInventory)
            {
                if ((fold = userProfile.RootFolder.FindFolder(folderID)) != null)
                {
                    return(fold.RequestListOfItems());
                }
                else
                {
                    m_log.WarnFormat(
                        "[AGENT INVENTORY]: Could not find folder {0} requested by user {1}",
                        folderID, agentID);
                    return(null);
                }
            }
            else
            {
                m_log.ErrorFormat("[INVENTORY CACHE]: Could not find root folder for user {0}", agentID);
                return(null);
            }
        }
コード例 #15
0
ファイル: HGGridServices.cs プロジェクト: ChrisD/opensim
        protected bool IsLocalUser(CachedUserInfo uinfo)
        {
            if (uinfo == null)
                return true;

            if (uinfo.UserProfile is ForeignUserProfileData)
                return HGNetworkServersInfo.Singleton.IsLocalUser(((ForeignUserProfileData)uinfo.UserProfile).UserServerURI);
            else
                return true;

        }
コード例 #16
0
ファイル: HGGridServices.cs プロジェクト: ChrisD/opensim
        protected bool IsGoingHome(CachedUserInfo uinfo, RegionInfo rinfo)
        {
            if (uinfo.UserProfile == null)
                return false;

            string userUserServerURI = String.Empty;
            if (uinfo.UserProfile is ForeignUserProfileData)
            {
                userUserServerURI = HGNetworkServersInfo.ServerURI(((ForeignUserProfileData)uinfo.UserProfile).UserServerURI);
            }

            return ((uinfo.UserProfile.HomeRegionID == rinfo.RegionID) &&
                    (userUserServerURI != HGNetworkServersInfo.Singleton.LocalUserServerURI));
        }
コード例 #17
0
 private void SaveCompleted(
     Guid id, bool succeeded, CachedUserInfo userInfo, string invPath, Stream saveStream, 
     Exception reportedException)
 {
     mre.Set();
 }
コード例 #18
0
ファイル: LibraryModule.cs プロジェクト: AlphaStaxLLC/taiga
        protected void LoadLibrariesFromArchives()
        {
            InventoryFolderImpl lib = m_Scene.CommsManager.UserProfileCacheService.LibraryRoot;
            if (lib == null)
            {
                m_log.Debug("[LIBRARY MODULE]: No library. Ignoring Library Module");
                return;
            }

            lib.Name = m_LibraryName;

            RegionInfo regInfo = new RegionInfo();
            Scene m_MockScene = new Scene(regInfo);
            m_MockScene.CommsManager = m_Scene.CommsManager;
            LocalInventoryService invService = new LocalInventoryService((LibraryRootFolder)lib);
            m_MockScene.RegisterModuleInterface<IInventoryService>(invService);
            m_MockScene.RegisterModuleInterface<IAssetService>(m_Scene.AssetService);

            UserProfileData profile = new UserProfileData();
            profile.FirstName = "OpenSim";
            profile.ID = lib.Owner;
            profile.SurName = "Library";
            CachedUserInfo uinfo = new CachedUserInfo(invService, profile);

            foreach (string iarFileName in Directory.GetFiles(pathToLibraries, "*.iar"))
            {
                string simpleName = Path.GetFileNameWithoutExtension(iarFileName);

                m_log.InfoFormat("[LIBRARY MODULE]: Loading library archive {0} ({1})...", iarFileName, simpleName);
                simpleName = GetInventoryPathFromName(simpleName);

                try
                {
                    InventoryArchiveReadRequest archread = new InventoryArchiveReadRequest(m_MockScene, uinfo, simpleName, iarFileName);
                    List<InventoryNodeBase> nodes = archread.Execute();
                    if (nodes.Count == 0)
                    {
                        // didn't find the subfolder with the given name; place it on the top
                        m_log.InfoFormat("[LIBRARY MODULE]: Didn't find {0} in library. Placing archive on the top level", simpleName);
                        archread.Close();
                        archread = new InventoryArchiveReadRequest(m_MockScene, uinfo, "/", iarFileName);
                        archread.Execute();
                    }
                    archread.Close();
                }
                catch (Exception e)
                {
                    m_log.DebugFormat("[LIBRARY MODULE]: Exception when processing archive {0}: {1}", iarFileName, e.Message);
                }
            }
        }
コード例 #19
0
 /// <summary>
 /// Trigger the inventory archive saved event.
 /// </summary>
 protected internal void TriggerInventoryArchiveSaved(
     Guid id, bool succeeded, CachedUserInfo userInfo, string invPath, Stream saveStream, 
     Exception reportedException)
 {
     InventoryArchiveSaved handlerInventoryArchiveSaved = OnInventoryArchiveSaved;
     if (handlerInventoryArchiveSaved != null)
         handlerInventoryArchiveSaved(id, succeeded, userInfo, invPath, saveStream, reportedException);
 }       
コード例 #20
0
        public XmlNode RequestSnapshotData(XmlDocument factory)
        {
            //Estate data section - contains who owns a set of sims and the name of the set.
            //Now in DataSnapshotProvider module form!
            XmlNode estatedata = factory.CreateNode(XmlNodeType.Element, "estate", "");

            UUID ownerid = m_scene.RegionInfo.MasterAvatarAssignedUUID;

            if (m_scene.RegionInfo.EstateSettings.EstateOwner != UUID.Zero)
            {
                ownerid = m_scene.RegionInfo.EstateSettings.EstateOwner;
            }

            CachedUserInfo userInfo = m_scene.CommsManager.UserProfileCacheService.GetUserDetails(ownerid);

            //TODO: Change to query userserver about the master avatar UUID ?
            String firstname;
            String lastname;

            if (userInfo != null)
            {
                UserProfileData userProfile = userInfo.UserProfile;
                firstname = userProfile.FirstName;
                lastname  = userProfile.SurName;

                //TODO: Fix the marshalling system to have less copypasta gruntwork
                XmlNode user = factory.CreateNode(XmlNodeType.Element, "user", "");
//                XmlAttribute type = (XmlAttribute)factory.CreateNode(XmlNodeType.Attribute, "type", "");
//                type.Value = "owner";
//                user.Attributes.Append(type);

                //TODO: Create more TODOs
                XmlNode username = factory.CreateNode(XmlNodeType.Element, "name", "");
                username.InnerText = firstname + " " + lastname;
                user.AppendChild(username);

                XmlNode useruuid = factory.CreateNode(XmlNodeType.Element, "uuid", "");
                useruuid.InnerText = ownerid.ToString();
                user.AppendChild(useruuid);

                estatedata.AppendChild(user);
            }

            XmlNode estatename = factory.CreateNode(XmlNodeType.Element, "name", "");

            estatename.InnerText = m_scene.RegionInfo.EstateSettings.EstateName.ToString();
            estatedata.AppendChild(estatename);

            XmlNode estateid = factory.CreateNode(XmlNodeType.Element, "id", "");

            estateid.InnerText = m_scene.RegionInfo.EstateSettings.EstateID.ToString();
            estatedata.AppendChild(estateid);

            XmlNode parentid = factory.CreateNode(XmlNodeType.Element, "parentid", "");

            parentid.InnerText = m_scene.RegionInfo.EstateSettings.ParentEstateID.ToString();
            estatedata.AppendChild(parentid);

            XmlNode flags = factory.CreateNode(XmlNodeType.Element, "flags", "");

            XmlAttribute teleport = (XmlAttribute)factory.CreateNode(XmlNodeType.Attribute, "teleport", "");

            teleport.Value = m_scene.RegionInfo.EstateSettings.AllowDirectTeleport.ToString();
            flags.Attributes.Append(teleport);

            XmlAttribute publicaccess = (XmlAttribute)factory.CreateNode(XmlNodeType.Attribute, "public", "");

            publicaccess.Value = m_scene.RegionInfo.EstateSettings.PublicAccess.ToString();
            flags.Attributes.Append(publicaccess);

            estatedata.AppendChild(flags);

            this.Stale = false;
            return(estatedata);
        }
コード例 #21
0
        /// <summary>
        /// Test loading a V0.1 OpenSim Inventory Archive (subject to change since there is no fixed format yet) where
        /// no account exists with the creator name
        /// </summary>
        //[Test]
        public void TestLoadIarV0_1TempProfiles()
        {
            TestHelper.InMethod();

            log4net.Config.XmlConfigurator.Configure();

            string userFirstName  = "Dennis";
            string userLastName   = "Menace";
            UUID   userUuid       = UUID.Parse("00000000-0000-0000-0000-000000000aaa");
            string user2FirstName = "Walter";
            string user2LastName  = "Mitty";

            string itemName = "b.lsl";
            string archiveItemName
                = string.Format("{0}{1}{2}", itemName, "_", UUID.Random());

            MemoryStream     archiveWriteStream = new MemoryStream();
            TarArchiveWriter tar = new TarArchiveWriter(archiveWriteStream);

            InventoryItemBase item1 = new InventoryItemBase();

            item1.Name      = itemName;
            item1.AssetID   = UUID.Random();
            item1.GroupID   = UUID.Random();
            item1.CreatorId = OspResolver.MakeOspa(user2FirstName, user2LastName);
            item1.Owner     = UUID.Zero;

            string item1FileName
                = string.Format("{0}{1}", ArchiveConstants.INVENTORY_PATH, archiveItemName);

            tar.WriteFile(item1FileName, UserInventoryItemSerializer.Serialize(item1));
            tar.Close();

            MemoryStream            archiveReadStream = new MemoryStream(archiveWriteStream.ToArray());
            SerialiserModule        serialiserModule  = new SerialiserModule();
            InventoryArchiverModule archiverModule    = new InventoryArchiverModule();

            // Annoyingly, we have to set up a scene even though inventory loading has nothing to do with a scene
            Scene             scene            = SceneSetupHelpers.SetupScene();
            IUserAdminService userAdminService = scene.CommsManager.UserAdminService;

            SceneSetupHelpers.SetupSceneModules(scene, serialiserModule, archiverModule);
            userAdminService.AddUser(
                userFirstName, userLastName, "meowfood", String.Empty, 1000, 1000, userUuid);

            archiverModule.DearchiveInventory(userFirstName, userLastName, "/", archiveReadStream);

            // Check that a suitable temporary user profile has been created.
            UserProfileData user2Profile
                = scene.CommsManager.UserService.GetUserProfile(
                      OspResolver.HashName(user2FirstName + " " + user2LastName));

            Assert.That(user2Profile, Is.Not.Null);
            Assert.That(user2Profile.FirstName == user2FirstName);
            Assert.That(user2Profile.SurName == user2LastName);

            CachedUserInfo userInfo
                = scene.CommsManager.UserProfileCacheService.GetUserDetails(userFirstName, userLastName);

            userInfo.FetchInventory();
            for (int i = 0; i < 50; i++)
            {
                if (userInfo.HasReceivedInventory == true)
                {
                    break;
                }
                Thread.Sleep(200);
            }
            Assert.That(userInfo.HasReceivedInventory, Is.True, "FetchInventory timed out (10 seconds)");
            InventoryItemBase foundItem = userInfo.RootFolder.FindItemByPath(itemName);

            Assert.That(foundItem.CreatorId, Is.EqualTo(item1.CreatorId));
            Assert.That(
                foundItem.CreatorIdAsUuid, Is.EqualTo(OspResolver.HashName(user2FirstName + " " + user2LastName)));
            Assert.That(foundItem.Owner, Is.EqualTo(userUuid));

            Console.WriteLine("### Successfully completed {0} ###", MethodBase.GetCurrentMethod());
        }
コード例 #22
0
ファイル: LandSnapshot.cs プロジェクト: boodie/Opensim2

        
コード例 #23
0
            private void CreateLink()
            {
                if (!_scene.Permissions.CanCreateUserInventory((int)InventoryType.Wearable, _avatarID))
                {
                    return;
                }

                ScenePresence presence;

                if ((presence = _scene.GetScenePresence(_avatarID)) != null)
                {
                    // Don't link to default items
                    if ((_wearableInventoryItemID == AvatarWearable.DEFAULT_EYES_ITEM) ||
                        (_wearableInventoryItemID == AvatarWearable.DEFAULT_BODY_ITEM) ||
                        (_wearableInventoryItemID == AvatarWearable.DEFAULT_HAIR_ITEM) ||
                        (_wearableInventoryItemID == AvatarWearable.DEFAULT_PANTS_ITEM) ||
                        (_wearableInventoryItemID == AvatarWearable.DEFAULT_SHIRT_ITEM) ||
                        (_wearableInventoryItemID == AvatarWearable.DEFAULT_SKIN_ITEM))
                    {
                        return;
                    }

                    CachedUserInfo userInfo = _scene.CommsManager.UserService.GetUserDetails(_avatarID);

                    if (userInfo != null)
                    {
                        InventoryItemBase oldItem = null;
                        try
                        {
                            oldItem = userInfo.FindItem(_wearableInventoryItemID);
                        }
                        catch { }
                        if (oldItem == null)
                        {
                            return;//Item doesn't exist?
                        }
                        InventoryFolderBase CurrentOutfitFolder = GetCurrentOutfitFolder(userInfo);
                        if (CurrentOutfitFolder == null)
                        {
                            return;                              //No COF, just ignore
                        }
                        CurrentOutfitFolder.Version++;
                        userInfo.UpdateFolder(CurrentOutfitFolder);

                        InventoryItemBase item = new InventoryItemBase();
                        item.Owner        = _avatarID;
                        item.CreatorId    = _avatarID.ToString();
                        item.ID           = UUID.Random();
                        item.AssetID      = _wearableInventoryItemID;
                        item.Description  = oldItem.Description;
                        item.Name         = oldItem.Name;
                        item.Flags        = oldItem.Flags;
                        item.AssetType    = (int)AssetType.Link;
                        item.InvType      = (int)InventoryType.Wearable;
                        item.Folder       = CurrentOutfitFolder.ID;
                        item.CreationDate = Util.UnixTimeSinceEpoch();

                        item.BasePermissions     = (uint)(PermissionMask.All | PermissionMask.Export);
                        item.CurrentPermissions  = (uint)(PermissionMask.All | PermissionMask.Export);
                        item.GroupPermissions    = (uint)PermissionMask.None;
                        item.EveryOnePermissions = (uint)PermissionMask.None;
                        item.NextPermissions     = (uint)PermissionMask.All;

                        userInfo.AddItem(item);
                        presence.ControllingClient.SendInventoryItemCreateUpdate(item, 0);
                    }
                    else
                    {
                        m_log.WarnFormat(
                            "No user details associated with client {0} uuid {1} in CreateNewInventoryItem!",
                            presence.Name, presence.UUID);
                    }
                }
                else
                {
                    m_log.ErrorFormat(
                        "ScenePresence for agent uuid {0} unexpectedly not found in HandleLinkInventoryItem",
                        _avatarID);
                }
            }
コード例 #24
0
 private void SaveInvConsoleCommandCompleted(
     Guid id, bool succeeded, CachedUserInfo userInfo, string invPath, Stream saveStream, 
     Exception reportedException)
 {
     lock (m_pendingConsoleSaves)
     {
         if (m_pendingConsoleSaves.Contains(id))
             m_pendingConsoleSaves.Remove(id);
         else
             return;
     }
     
     if (succeeded)
     {
         m_log.InfoFormat("[INVENTORY ARCHIVER]: Saved archive for {0}", userInfo.UserProfile.Name);
     }
     else
     {
         m_log.ErrorFormat(
             "[INVENTORY ARCHIVER]: Archive save for {0} failed - {1}", 
             userInfo.UserProfile.Name, reportedException.Message);
     }
 }
コード例 #25
0
        /// <summary>
        /// Update what the avatar is wearing using an item from their inventory.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        public void AvatarIsWearing(Object sender, AvatarWearingArgs e)
        {
            IClientAPI    clientView = (IClientAPI)sender;
            ScenePresence avatar     = m_scene.GetScenePresence(clientView.AgentId);

            if (avatar == null)
            {
                m_log.Error("[APPEARANCE]: Avatar is child agent, ignoring AvatarIsWearing event");
                return;
            }

            CachedUserInfo profile = m_scene.CommsManager.UserService.GetUserDetails(clientView.AgentId);

            if (profile != null)
            {
                AvatarAppearance appearance = avatar.Appearance;

                // we need to clean out the existing textures
                appearance.Texture = AvatarAppearance.GetDefaultTexture();

                List <AvatarWearable> wearables = new List <AvatarWearable>();
                lock (_currentlyWaitingCOFBuilds)
                {
                    //Check to see whether the client can manage itself
                    if (_cofSyncEnabled && !_viewer2Users.Contains(clientView.AgentId))
                    {
                        foreach (AvatarWearingArgs.Wearable wear in e.NowWearing)
                        {
                            wearables.Add(new AvatarWearable(wear.Type, wear.ItemID, UUID.Zero));
                            AvatarWearable oldWearable = appearance.GetWearableOfType(wear.Type);
                            if (wear.ItemID != UUID.Zero)
                            {
                                if (oldWearable == null || oldWearable.ItemID == UUID.Zero || wear.ItemID != oldWearable.ItemID)
                                {
                                    bool add = false;
                                    Dictionary <UUID, BuildCOF> waitingCOFs = new Dictionary <UUID, BuildCOF>();
                                    if ((add = !_currentlyWaitingCOFBuilds.TryGetValue(clientView.AgentId, out waitingCOFs)))
                                    {
                                        waitingCOFs = new Dictionary <UUID, BuildCOF>();
                                    }
                                    //Make sure that the new item is added
                                    if (waitingCOFs.ContainsKey(wear.ItemID))
                                    {
                                        BuildCOF cof = waitingCOFs[wear.ItemID];
                                        cof.SetWearableToLookFor(wear.ItemID, m_scene, clientView.AgentId, true);
                                        if (cof.Finished())
                                        {
                                            waitingCOFs.Remove(wear.ItemID);
                                        }
                                    }
                                    else
                                    {
                                        BuildCOF cof = new BuildCOF(ClearWaitingCOF);
                                        cof.SetWearableToLookFor(wear.ItemID, m_scene, clientView.AgentId, true);
                                        waitingCOFs.Add(wear.ItemID, cof);
                                    }
                                    if (add)
                                    {
                                        _currentlyWaitingCOFBuilds.Add(clientView.AgentId, waitingCOFs);
                                    }
                                }
                                if (oldWearable != null && oldWearable.ItemID != UUID.Zero && wear.ItemID != oldWearable.ItemID)
                                {
                                    bool add = false;
                                    Dictionary <UUID, BuildCOF> waitingCOFs = new Dictionary <UUID, BuildCOF>();
                                    if ((add = !_currentlyWaitingCOFBuilds.TryGetValue(clientView.AgentId, out waitingCOFs)))
                                    {
                                        waitingCOFs = new Dictionary <UUID, BuildCOF>();
                                    }
                                    //Check for removal of old item
                                    if (waitingCOFs.ContainsKey(oldWearable.ItemID))
                                    {
                                        BuildCOF cof = waitingCOFs[oldWearable.ItemID];
                                        cof.SetWearableToLookFor(oldWearable.ItemID, m_scene, clientView.AgentId, false);
                                        if (cof.Finished())
                                        {
                                            waitingCOFs.Remove(oldWearable.ItemID);
                                        }
                                    }
                                    else
                                    {
                                        BuildCOF cof = new BuildCOF(ClearWaitingCOF);
                                        cof.SetWearableToLookFor(oldWearable.ItemID, m_scene, clientView.AgentId, false);
                                        waitingCOFs.Add(oldWearable.ItemID, cof);
                                    }
                                    if (add)
                                    {
                                        _currentlyWaitingCOFBuilds.Add(clientView.AgentId, waitingCOFs);
                                    }
                                }
                            }
                            else if (oldWearable != null && oldWearable.ItemID != UUID.Zero)
                            {
                                bool add = false;
                                Dictionary <UUID, BuildCOF> waitingCOFs = new Dictionary <UUID, BuildCOF>();
                                if ((add = !_currentlyWaitingCOFBuilds.TryGetValue(clientView.AgentId, out waitingCOFs)))
                                {
                                    waitingCOFs = new Dictionary <UUID, BuildCOF>();
                                }
                                //Remove the item if it was just removed
                                if (waitingCOFs.ContainsKey(oldWearable.ItemID))
                                {
                                    BuildCOF cof = waitingCOFs[oldWearable.ItemID];
                                    cof.SetWearableToLookFor(oldWearable.ItemID, m_scene, clientView.AgentId, false);
                                    if (cof.Finished())
                                    {
                                        waitingCOFs.Remove(oldWearable.ItemID);
                                    }
                                }
                                else
                                {
                                    BuildCOF cof = new BuildCOF(ClearWaitingCOF);
                                    cof.SetWearableToLookFor(oldWearable.ItemID, m_scene, clientView.AgentId, false);
                                    waitingCOFs.Add(oldWearable.ItemID, cof);
                                }
                                if (add)
                                {
                                    _currentlyWaitingCOFBuilds.Add(clientView.AgentId, waitingCOFs);
                                }
                            }
                        }
                    }
                    else
                    {
                        foreach (AvatarWearingArgs.Wearable wear in e.NowWearing)
                        {
                            wearables.Add(new AvatarWearable(wear.Type, wear.ItemID, UUID.Zero));
                        }
                    }
                }
                // Wearables are a stack. The entries we have represent the current "top" stack state.  Apply them

                SetAppearanceAssets(profile, ref wearables, clientView);
                avatar.Appearance.SetWearables(wearables);
                this.UpdateDatabase(clientView.AgentId, avatar.Appearance, null, null);
            }
            else
            {
                m_log.WarnFormat("[APPEARANCE]: Cannot set wearables for {0}, no user profile found", clientView.Name);
            }
        }
コード例 #26
0
        // Is the user going back to the home region or the home grid?
        protected bool IsGoingHome(CachedUserInfo uinfo, GridRegion rinfo)
        {
            if (uinfo.UserProfile == null)
                return false;

            if (!(uinfo.UserProfile is ForeignUserProfileData))
                // it's a home user, can't be outside to return home
                return false;

            // OK, it's a foreign user with a ForeignUserProfileData
            // and is going back to exactly the home region.
            // We can't check if it's going back to a non-home region
            // of the home grid. That will be dealt with in the
            // receiving end
            return (uinfo.UserProfile.HomeRegionID == rinfo.RegionID);
        }
コード例 #27
0
        private bool CheckFolderHeirarchyIsAppropriateForPurge(InventoryFolderBase folder, CachedUserInfo userProfile)
        {
            if (folder.Type == (short)AssetType.TrashFolder ||
                folder.Type == (short)AssetType.LostAndFoundFolder)
            {
                return(true);
            }

            if (folder.ParentID == UUID.Zero ||
                folder.Type == (short)AssetType.RootFolder)
            {
                //got to the top, didnt find squat
                return(false);
            }

            InventoryFolderBase parent = userProfile.GetFolderAttributes(folder.ParentID);

            return(CheckFolderHeirarchyIsAppropriateForPurge(parent, userProfile));
        }
コード例 #28
0
        /// <summary>
        /// Update an existing profile
        /// </summary>
        /// <param name="userProfile"></param>
        /// <returns>true if a user profile was found to update, false otherwise</returns>
        // Commented out for now.  The implementation needs to be improved by protecting against race conditions,
        // probably by making sure that the update doesn't use the UserCacheInfo.UserProfile directly (possibly via
        // returning a read only class from the cache).
//        public bool StoreProfile(UserProfileData userProfile)
//        {
//            lock (m_userProfilesById)
//            {
//                CachedUserInfo userInfo = GetUserDetails(userProfile.ID);
//
//                if (userInfo != null)
//                {
//                    userInfo.m_userProfile = userProfile;
//                    m_commsManager.UserService.UpdateUserProfile(userProfile);
//
//                    return true;
//                }
//            }
//
//            return false;
//        }
        
        /// <summary>
        /// Populate caches with the given user profile
        /// </summary>
        /// <param name="userProfile"></param>
        protected CachedUserInfo AddToCaches(UserProfileData userProfile)
        {
            CachedUserInfo createdUserInfo = new CachedUserInfo(m_InventoryService, userProfile);
            
            lock (m_userProfilesById)
            {
                m_userProfilesById[createdUserInfo.UserProfile.ID] = createdUserInfo;
                
                lock (m_userProfilesByName)
                {
                    m_userProfilesByName[createdUserInfo.UserProfile.Name] = createdUserInfo;
                }
            }
            
            return createdUserInfo;
        }
コード例 #29
0
////////////////////////////////////////////////
// User-to-user inventory offers

        private void UserInventoryOffer(IClientAPI client, Scene scene, GridInstantMessage im)
        {
            InventoryFolderBase folder = null;
            InventoryItemBase   item   = null;

            UUID toAgentID = new UUID(im.toAgentID);

            IMuteListModule m_muteListModule = scene.RequestModuleInterface <IMuteListModule>();

            if (m_muteListModule != null)
            {
                if (m_muteListModule.IsMuted(client.AgentId, toAgentID))
                {
                    client.SendAgentAlertMessage("Inventory offer was automatically declined.", false);
                    return; // recipient has sender muted
                }
            }

            // Unpack the binary bucket
            AssetType assetType = (AssetType)im.binaryBucket[0];
            UUID      destID    = new UUID(im.binaryBucket, 1);
            UUID      copyID;
            bool      isFolder = (assetType == AssetType.Folder);

            ScenePresence recipient = scene.GetScenePresence(toAgentID);

            if (recipient != null && recipient.IsBot)
            {
                client.SendAgentAlertMessage("Can't give inventory to bots.", false);
                return;//can't give objects to bots
            }

            if (assetType == AssetType.Folder)
            {
                folder = scene.GiveInventoryFolder(toAgentID, client.AgentId, destID, UUID.Zero);
                if (folder == null)
                {
                    client.SendAgentAlertMessage("Can't find folder to give. Nothing given.", false);
                    return;
                }
                copyID = folder.ID;
            }
            else
            {
                item = scene.GiveInventoryItem(toAgentID, client.AgentId, destID);
                if (item == null)
                {
                    client.SendAgentAlertMessage("Can't find item to give. Nothing given.", false);
                    return;
                }
                copyID = item.ID;
            }
//            m_log.InfoFormat("[AGENT INVENTORY]: Offering {0} {1} to user {2} inventory as {3}", isFolder ? "folder" : "item", destID, toAgentID, copyID);

            // Update the asset type and destination ID into the outgoing IM.
            im.binaryBucket    = new byte[17];
            im.binaryBucket[0] = (byte)assetType;
            Array.Copy(copyID.GetBytes(), 0, im.binaryBucket, 1, 16);
            // Also stuff the destination ID into the session ID field for retrieval in accept/decline
            im.imSessionID = copyID.Guid;

            CachedUserInfo recipientInfo = scene.CommsManager.UserService.GetUserDetails(toAgentID);

            if (recipientInfo != null && recipient != null)
            {
                if ((!isFolder) && (item != null))
                {
                    // item offer?
                    recipient.ControllingClient.SendInventoryItemCreateUpdate(item, 0);
                }

                if (isFolder && (folder != null))
                {
                    // folder offer?
                    folder = recipientInfo.GetFolder(folder.ID);
                    if (folder != null)
                    {
                        recipient.ControllingClient.SendBulkUpdateInventory(folder);
                        recipientInfo.SendInventoryDecendents(recipient.ControllingClient, folder.ID, false, true);
                    }
                }
            }

            // Send the IM to the recipient. The item is already in their inventory, so
            // it will not be lost if they are offline. Transaction ID is the item ID.
            // We get that same ID back on the reply so we know what to act on.
            RelayInventoryOfferIM(scene, recipient, im);
        }