public SavePresentationResult SavePresentationChanges(UserIdentity userIdentity, PresentationInfo presentationInfo,
     Slide[] newSlideArr, out ResourceDescriptor[] resourcesNotExists,
     out DeviceResourceDescriptor[] deviceResourcesNotExists, out int[] labelNotExists,
     out UserIdentity[] whoLock,
     out int[] slidesAlreadyExistsId)
 {
     resourcesNotExists = new ResourceDescriptor[] { };
     deviceResourcesNotExists = new DeviceResourceDescriptor[] {};
     whoLock = new UserIdentity[] { };
     slidesAlreadyExistsId = new int[] { };
     labelNotExists = presentationInfo.GetUsedLabels().Except(
         _configuration.LabelStorageAdapter.GetLabelStorage().Select(lb => lb.Id)).ToArray();
     if (labelNotExists.Length != 0) return SavePresentationResult.LabelNotExists;
     if (!IsStandAlone)
     {
         // необходим лок уровня презентации
         LockingInfo info = _lockService.GetLockInfo(ObjectKeyCreator.CreatePresentationKey(presentationInfo));
         if (info == null || !info.UserIdentity.Equals(userIdentity)) return SavePresentationResult.PresentationNotLocked;
     }
     string[] deletedEquipment;
     Presentation presentationStored = _presentationDAL.GetPresentation(
         presentationInfo.UniqueName, _sourceDAL, _deviceSourceDAL, out deletedEquipment);
     if (presentationStored == null) return SavePresentationResult.PresentationNotExists;
     resourcesNotExists = GetNotExistedResource(newSlideArr);
     deviceResourcesNotExists = GetNotExistedDeviceResource(newSlideArr, presentationInfo);
     if (resourcesNotExists.Length != 0 || deviceResourcesNotExists.Length != 0) return SavePresentationResult.ResourceNotExists;
     LockingInfo[] lockedSlides;
     Slide[] slideAlreadyExists;
     presentationStored = Merge(userIdentity, presentationInfo, newSlideArr, presentationStored,
         out lockedSlides, out slideAlreadyExists);
     if (presentationStored == null)
     {
         SavePresentationResult result = SavePresentationResult.Unknown;
         if (lockedSlides.Length != 0)
         {
             whoLock = lockedSlides.Select(li => li.UserIdentity).ToArray();
             result = SavePresentationResult.SlideLocked;
         }
         if (slideAlreadyExists.Length != 0)
         {
             slidesAlreadyExistsId = slideAlreadyExists.Select(sl => sl.Id).ToArray();
             result = SavePresentationResult.SlideAlreadyExists;
         }
         return result;
     }
     bool isSuccess = _presentationDAL.SavePresentation(userIdentity, presentationStored);
     if (isSuccess)
     {
         PresentationKey presentationKey = ObjectKeyCreator.CreatePresentationKey(presentationStored);
         ObjectChanged(userIdentity, new List<ObjectInfo> { new ObjectInfo(userIdentity, presentationKey) },
                       new PresentationInfo(presentationStored), true);
     }
     else
     {
         return SavePresentationResult.Unknown;
     }
     return SavePresentationResult.Ok;
 }
        public CreatePresentationResult CreatePresentation(UserIdentity sender,
            PresentationInfo presentationInfo,
            out int[] labelNotExists)
        {
            labelNotExists = presentationInfo.GetUsedLabels().Except(
                _configuration.LabelStorageAdapter.GetLabelStorage().Select(lb => lb.Id)).ToArray();
            if (labelNotExists.Length != 0) return CreatePresentationResult.LabelNotExists;
            if (null != _presentationDAL.GetPresentationInfo(presentationInfo.UniqueName)) return CreatePresentationResult.SameUniqueNameExists;
            if (null != _presentationDAL.GetPresentationInfoByPresentationName(presentationInfo.Name))
                return CreatePresentationResult.SameNameExists;

            bool isSuccess = _presentationDAL.SavePresentation(sender,
                                                     presentationInfo.CreatePresentationStub());
            if (isSuccess) return CreatePresentationResult.Ok;
            else return CreatePresentationResult.SameNameExists;
        }