// Token: 0x06001CBB RID: 7355 RVA: 0x000A56CC File Offset: 0x000A38CC
 private void CreateMutexFailed(Exception e)
 {
     OwaDiagnostics.LogEvent(ClientsEventLogConstants.Tuple_TranscodingManagerInitializationFailed, string.Empty, new object[]
     {
         e.Message
     });
     throw new TranscodingFatalFaultException("Create Mutex for active transcoding service com object failed.", e, this);
 }
예제 #2
0
 // Token: 0x06002827 RID: 10279 RVA: 0x00094998 File Offset: 0x00092B98
 private static void LogManifestExceptionToEventLogs(string fileName, Exception exception)
 {
     ExTraceGlobals.CoreTracer.TraceError <Type, string, Exception>(0L, "Exception {0} loading manifest {1}. Details: {2}", exception.GetType(), fileName, exception);
     OwaDiagnostics.LogEvent(ClientsEventLogConstants.Tuple_OwaManifestInvalid, string.Empty, new object[]
     {
         fileName,
         exception
     });
 }
        // Token: 0x06001CB9 RID: 7353 RVA: 0x000A52D8 File Offset: 0x000A34D8
        private void OnCreateWorkerDelegate(IComWorker <ITranscoder> worker, object requestParameters)
        {
            ITranscoder worker2 = worker.Worker;

            if (worker2 == null)
            {
                OwaDiagnostics.LogEvent(ClientsEventLogConstants.Tuple_TranscodingWorkerInitializationFailed, string.Empty, new object[]
                {
                    string.Empty
                });
                throw new TranscodingFatalFaultException("TranscodingTaskManager failed to get ITranscoder interface", null, this);
            }
            TranscodingInitOption initOption = default(TranscodingInitOption);

            initOption.MaxOutputSize         = this.maxOutputSize;
            initOption.RowNumberPerExcelPage = this.rowNumberInExcel;
            initOption.HtmlOutputFormat      = this.htmlFormat;
            initOption.IsImageMode           = this.isImageMode;
            TranscodeErrorCode transcodeErrorCode = TranscodeErrorCode.Succeeded;

            try
            {
                transcodeErrorCode = worker2.Initialize(initOption);
            }
            catch (NullReferenceException innerException)
            {
                throw new TranscodingFatalFaultException("Worker has been terminated by some reason", innerException, this);
            }
            catch (COMException ex)
            {
                ExTraceGlobals.TranscodingTracer.TraceDebug((long)this.GetHashCode(), "Work object initialize failed!");
                OwaDiagnostics.LogEvent(ClientsEventLogConstants.Tuple_TranscodingWorkerInitializationFailed, string.Empty, new object[]
                {
                    ex.Message
                });
                throw new TranscodingFatalFaultException("TranscodingTaskManager call ITranscoder.Initialize() failed!", ex, this);
            }
            if (transcodeErrorCode != TranscodeErrorCode.Succeeded)
            {
                OwaDiagnostics.LogEvent(ClientsEventLogConstants.Tuple_TranscodingWorkerInitializationFailed, string.Empty, new object[]
                {
                    string.Empty
                });
                throw new TranscodingFatalFaultException(string.Format("Initializalize Transcoding service failed with error code : {0}.", transcodeErrorCode), null, this);
            }
        }
 // Token: 0x06001CB1 RID: 7345 RVA: 0x000A5078 File Offset: 0x000A3278
 public static bool Initialize(int maxConversionTime, int maxConversionPerProcess, string rootPath, int totalSizeQuota, int rowNumberPerExcelPage, int maxInputSize, int maxOutputSize, bool isImageMode, HtmlFormat htmlFormat, int memoryLimitInMB)
 {
     if (!TranscodingTaskManager.isInitialized)
     {
         lock (TranscodingTaskManager.initLockObj)
         {
             if (!TranscodingTaskManager.isInitialized)
             {
                 ExTraceGlobals.TranscodingTracer.TraceDebug(0L, "Start Initialization");
                 TranscodingTaskManager.transcodingTaskManager = new TranscodingTaskManager(maxConversionTime, maxConversionPerProcess, rootPath, totalSizeQuota * 1024 * 1024, rowNumberPerExcelPage, maxInputSize * 1024, maxOutputSize * 1024, isImageMode, htmlFormat, memoryLimitInMB * 1024 * 1024);
                 TranscodingTaskManager.isInitialized          = true;
                 OwaDiagnostics.LogEvent(ClientsEventLogConstants.Tuple_TranscodingStartSuccessfully, string.Empty, new object[0]);
                 ExTraceGlobals.TranscodingTracer.TraceDebug(0L, "Initialization finished");
                 return(true);
             }
         }
         return(false);
     }
     return(false);
 }
예제 #5
0
        public Cache(Cache.CacheOption option)
        {
            if (string.IsNullOrEmpty(option.RootPath))
            {
                ExTraceGlobals.TranscodingTracer.TraceError((long)this.GetHashCode(), "ctor: root path is empty.");
                throw new ArgumentException("ctor: root path is empty.");
            }
            this.option          = option;
            this.option.RootPath = Path.Combine(this.option.RootPath, "XCCache");
            this.cleanupThread   = new Thread(new ThreadStart(this.CleanupThreadProc));
            this.cleanupThread.Start();
            if (Directory.Exists(this.option.RootPath))
            {
                try
                {
                    Directory.Delete(this.option.RootPath, true);
                }
                catch (IOException arg)
                {
                    ExTraceGlobals.TranscodingTracer.TraceError <IOException>((long)this.GetHashCode(), "Failed to delete the cache folders when intializing the Cache instance. Exception message: {0}", arg);
                    DirectoryInfo dirInfo = new DirectoryInfo(this.option.RootPath);
                    this.cacheSize = this.GetFolderSize(dirInfo);
                }
                catch (UnauthorizedAccessException ex)
                {
                    OwaDiagnostics.LogEvent(ClientsEventLogConstants.Tuple_TranscodingCacheFolderDeletingAccessDenied, string.Empty, new object[]
                    {
                        ex.Message
                    });
                    throw new TranscodingFatalFaultException("Failed to delete the cache root folder. Exception message: " + ex.ToString(), ex, this);
                }
            }
            string path = Cache.GenerateGuidString();

            this.processFolder = Path.Combine(this.option.RootPath, path);
            if (Directory.Exists(this.processFolder))
            {
                OwaDiagnostics.LogEvent(ClientsEventLogConstants.Tuple_TranscodingManagerInitializationFailed, string.Empty, new object[]
                {
                    string.Empty
                });
                throw new TranscodingFatalFaultException("The sub folder for the current OWA process has already existed.", null, this);
            }
            SecurityIdentifier identity;
            SecurityIdentifier identity2;

            try
            {
                identity  = new SecurityIdentifier(WellKnownSidType.LocalSystemSid, null);
                identity2 = new SecurityIdentifier(WellKnownSidType.LocalServiceSid, null);
            }
            catch (SystemException ex2)
            {
                ExTraceGlobals.TranscodingTracer.TraceError((long)this.GetHashCode(), "Failed to create security identifier in Cache.ctor.");
                OwaDiagnostics.LogEvent(ClientsEventLogConstants.Tuple_TranscodingManagerInitializationFailed, string.Empty, new object[]
                {
                    ex2.Message
                });
                throw new TranscodingFatalFaultException("Failed to create security identifier in Cache.ctor.", ex2, this);
            }
            this.localServiceReadRule       = new FileSystemAccessRule(identity2, FileSystemRights.Read, InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, PropagationFlags.None, AccessControlType.Allow);
            this.localServiceWriteRule      = new FileSystemAccessRule(identity2, FileSystemRights.Write, InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, PropagationFlags.None, AccessControlType.Allow);
            this.localServiceCreateFileRule = new FileSystemAccessRule(identity2, FileSystemRights.WriteData, InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, PropagationFlags.None, AccessControlType.Allow);
            this.localServiceDeleteFileRule = new FileSystemAccessRule(identity2, FileSystemRights.Delete, InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, PropagationFlags.None, AccessControlType.Allow);
            FileSystemAccessRule rule = new FileSystemAccessRule(identity, FileSystemRights.FullControl, InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, PropagationFlags.None, AccessControlType.Allow);

            this.directorySercurity = new DirectorySecurity();
            this.directorySercurity.SetAccessRuleProtection(true, false);
            this.directorySercurity.AddAccessRule(rule);
            try
            {
                if (!Directory.Exists(this.option.RootPath))
                {
                    Directory.CreateDirectory(this.option.RootPath, this.directorySercurity);
                }
                this.directorySercurity.AddAccessRule(this.localServiceReadRule);
                this.directorySercurity.AddAccessRule(this.localServiceWriteRule);
                this.directorySercurity.AddAccessRule(this.localServiceCreateFileRule);
                this.directorySercurity.AddAccessRule(this.localServiceDeleteFileRule);
                Directory.CreateDirectory(this.processFolder, this.directorySercurity);
            }
            catch (IOException ex3)
            {
                OwaDiagnostics.LogEvent(ClientsEventLogConstants.Tuple_TranscodingCacheFolderCreationFailed, string.Empty, new object[]
                {
                    ex3.Message
                });
                throw new TranscodingFatalFaultException("Failed to create the sub folder and set the ACL for the current OWA process. Exception message: " + ex3.ToString(), ex3, this);
            }
            catch (UnauthorizedAccessException ex4)
            {
                OwaDiagnostics.LogEvent(ClientsEventLogConstants.Tuple_TranscodingCacheFolderACLSettingAccessDenied, string.Empty, new object[]
                {
                    ex4.Message
                });
                throw new TranscodingFatalFaultException("Failed to create the sub folder and set the ACL for the current OWA process. Exception message: " + ex4.ToString(), ex4, this);
            }
        }
예제 #6
0
        public void CacheInputDocument(string sessionId, string documentId, Stream documentStream, out string sourceDocumentPath, out string targetDocumentPath)
        {
            if (base.IsDisposed)
            {
                throw new ObjectDisposedException("the cache system has been disposed already.");
            }
            if (string.IsNullOrEmpty(sessionId))
            {
                ExTraceGlobals.TranscodingTracer.TraceError((long)this.GetHashCode(), "the session ID is empty.");
                throw new ArgumentException("the session ID is empty.");
            }
            if (string.IsNullOrEmpty(documentId))
            {
                ExTraceGlobals.TranscodingTracer.TraceError((long)this.GetHashCode(), "the document ID is empty.");
                throw new ArgumentException("the document ID is empty.");
            }
            if (documentStream == null)
            {
                ExTraceGlobals.TranscodingTracer.TraceError((long)this.GetHashCode(), "the document data stream is null.");
                throw new ArgumentNullException("documentStream");
            }
            bool flag = false;
            int  num  = 0;

            lock (this.myLock)
            {
                this.transcodingTaskCount++;
                if (100 == this.transcodingTaskCount)
                {
                    this.activeCleanupEvent.Set();
                    this.transcodingTaskCount = 0;
                }
                int num2 = this.cacheSize;
                if (num2 > (int)(0.8 * (double)this.option.TotalSizeQuota))
                {
                    this.activeCleanupEvent.Set();
                }
                sourceDocumentPath = this.GetAvailableSourceDocument(sessionId, documentId);
                flag = (sourceDocumentPath != null);
                int num3 = flag ? this.option.OutputThreshold : (this.option.OutputThreshold + this.option.InputThreshold);
                if (num2 + num3 > this.option.TotalSizeQuota)
                {
                    this.activeCleanupEvent.Set();
                    OwaDiagnostics.LogEvent(ClientsEventLogConstants.Tuple_TranscodingCacheReachedQuota, string.Empty, new object[0]);
                    throw new TranscodingFatalFaultException("The size of the cache system has reached the quota.", null, this);
                }
                if (!flag)
                {
                    sourceDocumentPath = this.GenerateSourceDocumentName(sessionId, documentId);
                }
            }
            if (!flag)
            {
                try
                {
                    string directoryName = Path.GetDirectoryName(sourceDocumentPath);
                    if (!Directory.Exists(directoryName))
                    {
                        Directory.CreateDirectory(directoryName, this.directorySercurity);
                    }
                    this.SaveSourceStreamIntoFile(documentStream, sourceDocumentPath, out num);
                    if (num == 0)
                    {
                        Directory.Delete(Path.GetDirectoryName(sourceDocumentPath), true);
                        throw new TranscodingUnconvertibleFileException("the size of the source stream is zero.", null, this);
                    }
                    if (this.option.InputThreshold < num)
                    {
                        Directory.Delete(Path.GetDirectoryName(sourceDocumentPath), true);
                        throw new TranscodingOverMaximumFileSizeException("the size of the source stream beyond the threshold.", null, this);
                    }
                }
                catch (IOException ex)
                {
                    lock (this.myLock)
                    {
                        this.UpdateCacheBeforeTranscoding(false, false, sessionId, documentId, Path.GetFileName(sourceDocumentPath), num);
                    }
                    throw new TranscodingFatalFaultException("Failed to store the source stream data to file. Exception message: " + ex.ToString(), ex, this);
                }
                catch (UnauthorizedAccessException ex2)
                {
                    ExTraceGlobals.TranscodingTracer.TraceError <string>((long)this.GetHashCode(), "Failed to store the source stream data to file. Exception message: ", ex2.ToString());
                    throw new TranscodingFatalFaultException("Failed to store the source stream data to file. Exception message: " + ex2.ToString(), ex2, this);
                }
            }
            lock (this.myLock)
            {
                this.UpdateCacheBeforeTranscoding(flag, true, sessionId, documentId, Path.GetFileName(sourceDocumentPath), num);
                targetDocumentPath = this.GenerateNewHtmlFilePath(sessionId, documentId);
            }
        }
        // Token: 0x06001CBC RID: 7356 RVA: 0x000A5708 File Offset: 0x000A3908
        private void TranscodeWorker(string docId, string sessionId, Stream inputStream, string sourceDocType, int currentPageNumber, out int totalPageNumber, HttpResponse response)
        {
            ExTraceGlobals.TranscodingTracer.TraceDebug <string>((long)this.GetHashCode(), "Start to process document {0}", docId);
            if (this.blockList.CheckItem(docId))
            {
                ExTraceGlobals.TranscodingTracer.TraceDebug <string>((long)this.GetHashCode(), "Document {0} has been blocked", docId);
                OwaSingleCounters.TotalRejectedConversions.Increment();
                OwaSingleCounters.TotalConversions.Increment();
                throw new TranscodingUnconvertibleFileException("Input document has been in block list.", null, this);
            }
            TranscodingParameters transcodingParameters = null;
            bool flag  = false;
            bool flag2 = false;

            try
            {
                transcodingParameters = new TranscodingParameters(sessionId, docId, inputStream, sourceDocType, currentPageNumber);
                this.UpdatePerformanceCounterBeforeEnterQueue(transcodingParameters);
                flag = this.transcodingProcessManager.ExecuteRequest(transcodingParameters);
            }
            catch (COMException ex)
            {
                if (ex.ErrorCode == -2147023170)
                {
                    this.blockList.AddNew(transcodingParameters.DocumentId);
                    throw new TranscodingCrashException("Worker process crashes when doing convension", ex, this);
                }
                throw new TranscodingFatalFaultException("ComException thrown from transcoding service", ex, this);
            }
            catch (ComInterfaceInitializeException ex2)
            {
                ExTraceGlobals.TranscodingTracer.TraceDebug <string>((long)this.GetHashCode(), "Document {0} can not be transcoded because of server initialize failed.", docId);
                OwaDiagnostics.LogEvent(ClientsEventLogConstants.Tuple_TranscodingWorkerInitializationFailed, string.Empty, new object[]
                {
                    ex2.Message
                });
                throw new TranscodingFatalFaultException("Initizlie transcoding service failed.", ex2, this);
            }
            catch (ComProcessTimeoutException innerException)
            {
                flag2 = true;
                ExTraceGlobals.TranscodingTracer.TraceDebug <string>((long)this.GetHashCode(), "Document {0} can not be transcoded because it takes too long to convert.", docId);
                this.blockList.AddNew(docId);
                throw new TranscodingTimeoutException("Takes too long to convert " + docId, innerException, this);
            }
            catch (ComProcessBusyException innerException2)
            {
                flag2 = true;
                ExTraceGlobals.TranscodingTracer.TraceDebug <string>((long)this.GetHashCode(), "Document {0} can not be transcoded because of server busy.", docId);
                throw new TranscodingServerBusyException("Server to busy to accept the request.", innerException2, this);
            }
            catch (ComProcessBeyondMemoryLimitException innerException3)
            {
                ExTraceGlobals.TranscodingTracer.TraceDebug <string>((long)this.GetHashCode(), "Document {0} can not be transcoded because of it causes transcodingservice consuming too much memory.", docId);
                this.blockList.AddNew(docId);
                throw new TranscodingUnconvertibleFileException("Document " + docId + " causes transcodingservice too memory to transcode it.", innerException3, this);
            }
            catch (UnauthorizedAccessException ex3)
            {
                ExTraceGlobals.TranscodingTracer.TraceDebug <string, string>((long)this.GetHashCode(), "Document {0} can not be transcoded because of the cache folder cannot be accessed. Exception message: {1}", docId, ex3.Message);
                throw new TranscodingFatalFaultException(string.Format("Document {0} can not be transcoded because of the cache folder cannot be accessed", docId), ex3, this);
            }
            finally
            {
                OwaSingleCounters.TotalConvertingRequestsRate.IncrementBy((long)(transcodingParameters.SourceDocSize / 1024));
                this.UpdatePerformanceCounterAfterLeftQueue(transcodingParameters);
                OwaSingleCounters.TotalConversions.Increment();
                if (!flag || transcodingParameters == null || transcodingParameters.ErrorCode != TranscodeErrorCode.Succeeded)
                {
                    if (flag2)
                    {
                        OwaSingleCounters.TotalTimeoutConversions.Increment();
                    }
                    else
                    {
                        OwaSingleCounters.TotalErrorConversions.Increment();
                    }
                }
            }
            if (transcodingParameters.ErrorCode != TranscodeErrorCode.Succeeded)
            {
                this.HandleTranscoderErrorCode(transcodingParameters.ErrorCode);
            }
            OwaSingleCounters.SuccessfulConversionRequestRate.IncrementBy((long)(transcodingParameters.SourceDocSize / 1024));
            totalPageNumber = transcodingParameters.TotalPageNumber;
            if (response != null)
            {
                this.cache.TransmitFile(sessionId, docId, transcodingParameters.RewrittenHtmlFileName, response);
            }
        }
        // Token: 0x06001CAD RID: 7341 RVA: 0x000A4D10 File Offset: 0x000A2F10
        private TranscodingTaskManager(int maxConversionTime, int maxConversionPerProcess, string rootCachePath, int totalSizeQuota, int rowNumberInExcel, int maxInputSize, int maxOutputSize, bool isImageMode, HtmlFormat htmlFormat, int memoryLimit)
        {
            if (maxConversionTime <= 0)
            {
                throw new ArgumentException("Invalid maximum conversion time", "maxConversionTime");
            }
            if (maxConversionPerProcess <= 0)
            {
                throw new ArgumentException("Invalid maximum conversion number per process", "maxConversionPerProcess");
            }
            if (string.IsNullOrEmpty(rootCachePath))
            {
                throw new ArgumentException("The root path for cache system can not be null or empty", "rootCachePath");
            }
            if (totalSizeQuota <= 0)
            {
                throw new ArgumentException("Invalid cache quota", "totalSizeQuota");
            }
            if (rowNumberInExcel <= 0)
            {
                throw new ArgumentException("Invalid maximum row/page of excel documents", "rowNumberInExcel");
            }
            if (maxInputSize <= 0)
            {
                throw new ArgumentException("Invalid input data threshold", "maxInputSize");
            }
            if (maxOutputSize <= 0)
            {
                throw new ArgumentException("Invalid output data threshold", "maxOutputSize");
            }
            if (memoryLimit <= 0)
            {
                throw new ArgumentException("Invalid memory limit", "memoryLimit");
            }
            this.rowNumberInExcel = rowNumberInExcel;
            this.maxOutputSize    = maxOutputSize;
            this.isImageMode      = isImageMode;
            this.htmlFormat       = htmlFormat;
            try
            {
                this.transcodingActiveMutex = new Mutex(false, "F7CC98B4-F6F5-489D-98EB-000689C721DE");
            }
            catch (UnauthorizedAccessException e)
            {
                this.CreateMutexFailed(e);
            }
            catch (IOException e2)
            {
                this.CreateMutexFailed(e2);
            }
            catch (ApplicationException e3)
            {
                this.CreateMutexFailed(e3);
            }
            OwaSingleCounters.TotalConversions.RawValue             = 0L;
            OwaSingleCounters.ActiveConversions.RawValue            = 0L;
            OwaSingleCounters.QueuedConversionRequests.RawValue     = 0L;
            OwaSingleCounters.AverageConvertingTime.RawValue        = 0L;
            OwaSingleCounters.AverageConversionQueuingTime.RawValue = 0L;
            OwaSingleCounters.TotalRejectedConversions.RawValue     = 0L;
            OwaSingleCounters.TotalTimeoutConversions.RawValue      = 0L;
            OwaSingleCounters.TotalErrorConversions.RawValue        = 0L;
            using (RegistryKey registryKey = Registry.LocalMachine.OpenSubKey(string.Format("SOFTWARE\\Classes\\CLSID\\{{{0}}}\\LocalServer32", "F7CC98B4-F6F5-489D-98EB-000689C721DE")))
            {
                if (registryKey == null)
                {
                    OwaDiagnostics.LogEvent(ClientsEventLogConstants.Tuple_TranscodingWorkerApplicationNotRegistered, string.Empty, new object[0]);
                    throw new TranscodingFatalFaultException("TranscodingService is not registered.", null, this);
                }
                this.workProcessPath = ((string)registryKey.GetValue(null)).Trim(new char[]
                {
                    '"'
                });
            }
            if (string.IsNullOrEmpty(this.workProcessPath) || !File.Exists(this.workProcessPath))
            {
                OwaDiagnostics.LogEvent(ClientsEventLogConstants.Tuple_TranscodingWorkerApplicationNotFound, string.Empty, new object[0]);
                throw new TranscodingFatalFaultException("Unable to find the transcoding service application.", null, this);
            }
            Cache.CacheOption option = new Cache.CacheOption(rootCachePath, totalSizeQuota, maxInputSize, maxOutputSize);
            this.cache     = new Cache(option);
            this.blockList = new BlockList(3000, TimeSpan.FromSeconds(86400.0));
            ComWorkerConfiguration workerConfiguration = new ComWorkerConfiguration(this.workProcessPath, null, new Guid("F7CC98B4-F6F5-489D-98EB-000689C721DE"), ComWorkerConfiguration.RunAsFlag.RunAsLocalService, this.transcodingActiveMutex, memoryLimit, 7200000, 30000, maxConversionPerProcess, maxConversionTime * 1000, 0);

            try
            {
                this.transcodingProcessManager = new ComProcessManager <ITranscoder>(TranscodingTaskManager.maxWorkProcessNumber, workerConfiguration, ExTraceGlobals.TranscodingTracer);
            }
            catch (ComProcessManagerInitializationException innerException)
            {
                throw new TranscodingFatalFaultException("Initialize transcoding process manager failed.", innerException, this);
            }
            ComProcessManager <ITranscoder> comProcessManager = this.transcodingProcessManager;

            comProcessManager.CreateWorkerCallback = (ComProcessManager <ITranscoder> .OnCreateWorker)Delegate.Combine(comProcessManager.CreateWorkerCallback, new ComProcessManager <ITranscoder> .OnCreateWorker(this.OnCreateWorkerDelegate));
            ComProcessManager <ITranscoder> comProcessManager2 = this.transcodingProcessManager;

            comProcessManager2.ExecuteRequestCallback = (ComProcessManager <ITranscoder> .OnExecuteRequest)Delegate.Combine(comProcessManager2.ExecuteRequestCallback, new ComProcessManager <ITranscoder> .OnExecuteRequest(this.OnExecuteRequestDelegate));
        }