public static int Add(string url, string token, bool processClosed, bool disableNotifications)
        {
            lock (Imports.SynchRoot)
            {
                if (Imports.GetItems().Count(x => x.Id == CoreContext.TenantManager.GetCurrentTenant().TenantId) > 0)
                {
                    throw new DuplicateNameException("Import already running");
                }
            }
            lock (Completed)
            {
                Completed.RemoveAll(x => x.Id == CoreContext.TenantManager.GetCurrentTenant().TenantId);
            }

            SecurityContext.DemandPermissions(ASC.Core.Users.Constants.Action_AddRemoveUser);
            ProjectSecurity.DemandCreateProject();

            var importTask = new ImportFromBasecamp(url, token, HttpContext.Current, SecurityContext.CurrentAccount.ID, processClosed, disableNotifications, Global.EngineFactory);//NOTE: engine factory newly created!!!

            lock (Imports.SynchRoot)
            {
                Imports.Add(importTask);
            }
            return(importTask.Id);
        }
        public static void DeletePhoto(int contactID)
        {
            if (contactID == 0)
            {
                throw new ArgumentException();
            }

            lock (_synchronizedObj)
            {
                ResizeQueue.GetItems().Where(item => item.ContactID == contactID)
                .All(item =>
                {
                    ResizeQueue.Remove(item);
                    return(true);
                });

                var photoDirectory = BuildFileDirectory(contactID);

                if (Global.GetStore().IsDirectory(photoDirectory))
                {
                    Global.GetStore().DeleteFiles(photoDirectory, "*", true);
                }

                RemoveFromCache(contactID);
            }
        }
        private static string SizePhoto(Guid userID, byte[] data, long maxFileSize, Size size, bool now)
        {
            if (data == null || data.Length <= 0)
            {
                throw new UnknownImageFormatException();
            }
            if (maxFileSize != -1 && data.Length > maxFileSize)
            {
                throw new ImageWeightLimitException();
            }

            var resizeTask = new ResizeWorkerItem(userID, data, maxFileSize, size, GetDataStore(), UserPhotoThumbnailSettings.LoadForUser(userID));

            if (now)
            {
                //Resize synchronously
                ResizeImage(resizeTask);
                return(GetSizedPhotoAbsoluteWebPath(userID, size));
            }
            else
            {
                if (!ResizeQueue.GetItems().Contains(resizeTask))
                {
                    //Add
                    ResizeQueue.Add(resizeTask);
                    if (!ResizeQueue.IsStarted)
                    {
                        ResizeQueue.Start(ResizeImage);
                    }
                }
                return(GetDefaultPhotoAbsoluteWebPath(size));
                //NOTE: return default photo here. Since task will update cache
            }
        }
        public static void Make(HelpCenterRequest request, Action <HelpCenterRequest, string> starter)
        {
            if (!DownloadEnabled)
            {
                return;
            }

            lock (LockObj)
            {
                if (Tasks.GetItems().Any(r => r.Url == request.Url))
                {
                    return;
                }

                Tasks.Add(request);

                if (!Tasks.IsStarted)
                {
                    Tasks.Start(r =>
                    {
                        var html = SendRequest(r.Url);
                        starter(r, html);
                    });
                }
            }
        }
        public static int Add(string url, string userName, string password, bool processClosed, bool disableNotifications, bool importUsersAsCollaborators, IEnumerable <int> projects)
        {
            if (Imports.GetItems().Count(x => x.Id == TenantProvider.CurrentTenantID) > 0)
            {
                throw new DuplicateNameException("Import already running");
            }

            lock (Completed)
            {
                Completed.RemoveAll(x => x.Id == TenantProvider.CurrentTenantID);
            }

            SecurityContext.DemandPermissions(Constants.Action_AddRemoveUser);

            var importTask = new ImportFromBasecamp(url, userName, password, SecurityContext.CurrentAccount.ID, processClosed, disableNotifications, importUsersAsCollaborators, Global.EngineFactory, projects);

            Imports.Add(importTask);

            return(importTask.Id);
        }
        public static void DeletePhoto(int contactID, bool isTmpDir, string tmpDirName, bool recursive)
        {
            if (contactID == 0)
            {
                throw new ArgumentException();
            }

            lock (_synchronizedObj)
            {
                ResizeQueue.GetItems().Where(item => item.ContactID == contactID)
                .All(item =>
                {
                    ResizeQueue.Remove(item);
                    return(true);
                });

                var photoDirectory = !isTmpDir
                                         ? BuildFileDirectory(contactID)
                                         : (String.IsNullOrEmpty(tmpDirName) ? BuildFileTmpDirectory(contactID) : BuildFileTmpDirectory(tmpDirName));

                var store = Global.GetStore();

                if (store.IsDirectory(photoDirectory))
                {
                    store.DeleteFiles(photoDirectory, "*", recursive);
                    if (recursive)
                    {
                        store.DeleteDirectory(photoDirectory);
                    }
                }

                if (!isTmpDir)
                {
                    RemoveFromCache(contactID);
                }
            }
        }
        public static void Make(HelpCenterRequest request)
        {
            if (!DownloadEnabled)
            {
                return;
            }

            lock (LockObj)
            {
                if (Tasks.GetItems().Any(r => r.Url == request.Url))
                {
                    return;
                }

                Tasks.Add(request);

                if (!Tasks.IsStarted)
                {
                    Tasks.Start(r => r.SendRequest());
                }
            }
        }