Esempio n. 1
0
        private void workerReadIdentities_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
        {
            UIContext.Instance.LogMessage(new IconListEntry(UIContext.Instance.GetLogImage(LogImage.Info), "Loading users..."));

            this.Invoke(new Action(() =>
            {
                this.lvUsers.Groups.Clear();
                blockSelectedChange = true;
                try
                {
                    cmbDomains.Items.Clear();
                }
                finally
                {
                    blockSelectedChange = false;
                }
            }));

            this.cachedUsers = new List <Identity>();

            Identity everyOneGroup = Context.SecurityService.ReadIdentity(SearchFactor.EveryoneApplicationGroup,
                                                                          null, QueryMembership.Expanded);
            int usersCount = everyOneGroup.Members.Length;

            UIContext.Instance.LogMessage(new IconListEntry(UIContext.Instance.GetLogImage(LogImage.Info),
                                                            string.Format("Loaded identity group '{0}' with assigned '{1}' members", everyOneGroup.AccountName, usersCount)));

            UIContext.Instance.LogMessage(new IconListEntry(UIContext.Instance.GetLogImage(LogImage.Info),
                                                            string.Format("Starting to load '{0}' identities...", usersCount)));

            int chunkLastStep = 0;
            int chunkCount    = 1;
            int maxCount      = usersCount;

            if (usersCount > USERS_COUNT_LOWER_LIMIT)
            {
                maxCount      = USERS_COUNT_LOWER_LIMIT;
                chunkCount    = usersCount / USERS_COUNT_LOWER_LIMIT;
                chunkLastStep = usersCount - (chunkCount * USERS_COUNT_LOWER_LIMIT);
                if (chunkLastStep < 0)
                {
                    chunkLastStep = 0;
                }
            }

            loadingPanel.ProgressInitialize(usersCount, 0, 0);


            //UIContext.Instance.ProgressBegin(usersCount, maxCount);

            int currentProgress = 0;

            Func <Tuple <int, int, EventWaitHandle>, bool> loadIdentitiesFunc = tuple =>
            {
                int             startIdx = tuple.Item1;
                int             maxcnt   = tuple.Item2;
                EventWaitHandle ev       = tuple.Item3;
                string[]        filter   = new string[maxcnt];
                Array.Copy(everyOneGroup.Members, startIdx, filter, 0, maxcnt);
                Identity[] loadedIdentities = Context.SecurityService.ReadIdentities(SearchFactor.Sid, filter, QueryMembership.None);
                currentProgress += filter.Length;

                if (ev != null)
                {
                    ev.Reset();
                }

                workerReadIdentities.ReportProgress(currentProgress, Tuple.Create(startIdx, loadedIdentities, ev));

                return(EnsureCancel(e));
            };

            bool loadingCancelled = false;

            for (int i = 0; i < chunkCount; i++)
            {
                EventWaitHandle ev = null;

                if (chunkLastStep <= 0)
                {
                    ev = progressChangedCompleted;
                }

                loadingCancelled = loadIdentitiesFunc(Tuple.Create(i * maxCount, maxCount, ev));
                if (loadingCancelled)
                {
                    break;
                }
            }

            if (chunkLastStep > 0 && !loadingCancelled)
            {
                loadIdentitiesFunc(Tuple.Create(chunkCount * USERS_COUNT_LOWER_LIMIT, chunkLastStep, (EventWaitHandle)progressChangedCompleted));
            }

            progressChangedCompleted.WaitOne();
        }