コード例 #1
0
        public void Can_obtain_all_folder_ids()
        {
            var knownFolderManager = (IKnownFolderManager)new KnownFolderManager();
            uint count = 0;
            object ppIds = IntPtr.Zero;
            var h = GCHandle.Alloc(ppIds, GCHandleType.Pinned);
            try
            {
                knownFolderManager.GetFolderIds(h.AddrOfPinnedObject(), ref count);
                IntPtr pIds = (IntPtr)ppIds;
                if (IntPtr.Zero == pIds)
                {
                    throw new InvalidOperationException("GetFolderIds returned NULL");
                }

                try
                {
                    var ids = new KNOWNFOLDERID[count];
                    var ptr = pIds.ToInt64();
                    for (uint u = 0; u < count; ++u)
                    {
                        ids[u] = (KNOWNFOLDERID)Marshal.PtrToStructure((IntPtr)ptr, typeof(KNOWNFOLDERID));
                        ptr += Marshal.SizeOf(typeof(KNOWNFOLDERID));
                    }

                    foreach (var id in ids)
                    {
                        Assert.AreNotEqual(Guid.Empty, id.value);
                    }
                }
                finally
                {
                    Marshal.FreeCoTaskMem(pIds);
                }
            }
            finally
            {
                h.Free();
            }
        }
コード例 #2
0
        private void RedirectOneFolder(KnownFolder folder, string newPath)
        {
            if (!folder.CanRedirect)
            {
                throw new InvalidOperationException(string.Format("Folder '{0}' cannot be redirected.", folder.Name));
            }

            string currentPath = folder.Path;
            if (!this.ShouldProcess(folder.Name, string.Format("Redirect from {0} to {1}", currentPath, newPath)))
            {
                return;
            }

            if (!this.Force && !this.ShouldContinue("Do it?", "Folder redirection", ref this.yesToAll, ref this.noToAll))
            {
                return;
            }

            var id = new KNOWNFOLDERID(folder.FolderId);
            var flags = KF_REDIRECT_FLAGS.KF_REDIRECT_NONE;
            if (this.CheckOnly)
            {
                flags |= KF_REDIRECT_FLAGS.KF_REDIRECT_CHECK_ONLY;
            }

            if (!this.DontMoveExistingData)
            {
                flags |= KF_REDIRECT_FLAGS.KF_REDIRECT_COPY_CONTENTS | KF_REDIRECT_FLAGS.KF_REDIRECT_DEL_SOURCE_CONTENTS;
            }

            string error;
            HResult hr = this.knownFolderManager.Redirect(ref id, IntPtr.Zero, flags, newPath, 0, null, out error);
            if (hr != HResult.S_OK)
            {
                if (string.IsNullOrEmpty(error))
                {
                    Marshal.ThrowExceptionForHR(unchecked((int)hr));
                    this.WriteWarning(string.Format("Redirection returned success code other than S_OK ({0})", hr));
                }
                else
                {
                    throw new TargetInvocationException(
                        error,
                        Marshal.GetExceptionForHR(unchecked((int)hr)));
                }
            }

            if (this.PassThru)
            {
                this.WriteObject(folder);
            }
        }
コード例 #3
0
        private IEnumerable<IKnownFolder> GetAll()
        {
            KNOWNFOLDERID[] ids;

            object boxpIds = IntPtr.Zero;
            var h = GCHandle.Alloc(boxpIds, GCHandleType.Pinned);
            try
            {
                uint count = 0;
                this.knownFolderManager.GetFolderIds(h.AddrOfPinnedObject(), ref count);
                IntPtr pIds = (IntPtr)boxpIds;
                if (IntPtr.Zero == pIds)
                {
                    throw new InvalidOperationException("GetFolderIds returned NULL");
                }

                try
                {
                    ids = new KNOWNFOLDERID[count];
                    var ptr = pIds.ToInt64();
                    for (uint u = 0; u < count; ++u)
                    {
                        ids[u] = (KNOWNFOLDERID)Marshal.PtrToStructure((IntPtr)ptr, typeof(KNOWNFOLDERID));
                        ptr += Marshal.SizeOf(typeof(KNOWNFOLDERID));
                    }
                }
                finally
                {
                    Marshal.FreeCoTaskMem(pIds);
                }
            }
            finally
            {
                h.Free();
            }

            var result = ids.Select(kfi => this.GetKnownFolderById(kfi));

            return result;
        }
コード例 #4
0
        private IKnownFolder GetKnownFolderById(KNOWNFOLDERID knownFolderId)
        {
            IKnownFolder nativeKnownFolder;
            try
            {
                this.knownFolderManager.GetFolder(ref knownFolderId, out nativeKnownFolder);
            }
            catch (FileNotFoundException x)
            {
                throw new FileNotFoundException(string.Format("Known folder not found: {0}", knownFolderId.value), x);
            }

            return nativeKnownFolder;
        }
コード例 #5
0
 private static void AssertSingleFolderOutput(KNOWNFOLDERID expectedId, Collection<PSObject> output)
 {
     Assert.IsNotNull(output);
     Assert.AreEqual(1, output.Count);
     var psObj = output.First();
     Assert.IsNotNull(psObj);
     Assert.IsInstanceOfType(psObj.BaseObject, typeof(KnownFolder));
     Assert.AreEqual(expectedId.value, ((KnownFolder)psObj.BaseObject).FolderId);
 }