CompilerState.cs source code in C# .NET

Source code for the .NET framework in C#

                        

Code:

/ DotNET / DotNET / 8.0 / untmp / WIN_WINDOWS / lh_tools_devdiv_wpf / Windows / wcp / Build / MS / Internal / Tasks / CompilerState.cs / 2 / CompilerState.cs

                             
//----------------------------------------------------------------------------------------
//
// 
//    Copyright (C) Microsoft Corporation.  All rights reserved. 
// 
// 
// Description: 
//       An internal class which handles compiler information cache. It can read
//       write the cache file, this is for incremental build support. 
//
//  History:
//
//  11/21/05: [....]   Created 
//
//--------------------------------------------------------------------------------------- 
 
using System;
using System.IO; 
using System.Collections;
using System.Diagnostics;
using System.Text;
using System.Globalization; 

using Microsoft.Build.Tasks.Windows; 
using Microsoft.Build.Framework; 
using Microsoft.Build.Utilities;
using MS.Utility; 

namespace MS.Internal.Tasks
{
    // 
    // Only cache information for below types.
    // 
    internal enum CompilerStateType : int 
    {
        AssemblyName = 0x00, 
        AssemblyVersion,
        AssemblyPublicKeyToken,
        OutputType,
        Language, 
        LanguageSourceExtension,
        OutputPath, 
        RootNamespace, 
        LocalizationDirectivesToLocFile,
        HostInBrowser, 
        DefineConstants,
        ApplicationFile,
        PageMarkup,
        ContentFiles, 
        SourceCodeFiles,
        References, 
        PageMarkupFileNames, 
        MaxCount
    } 

    // 
    // CompilerState
    //  
    internal class CompilerState
    { 
        //  
        // ctor of CompilerState
        //  
        internal CompilerState(string stateFilePath, ITaskFileService taskFileService)
        {
            _cacheInfoList = new String[(int)CompilerStateType.MaxCount];
            _stateFilePath = stateFilePath; 
            _taskFileService = taskFileService;
        } 
 
        #region internal methods
 

        // 
        // Detect whether the state file exists or not.
        //  
        // 
        internal bool StateFileExists() 
        { 
            return _taskFileService.Exists(_stateFilePath);
        } 

        //
        // Clean up the state file.
        // 
        internal void CleanupCache()
        { 
            if (StateFileExists() ) 
            {
                _taskFileService.Delete(_stateFilePath); 
            }
        }

        internal bool SaveStateInformation(MarkupCompilePass1 mcPass1) 
        {
            Debug.Assert(String.IsNullOrEmpty(_stateFilePath) != true, "StateFilePath must not be empty."); 
            Debug.Assert(mcPass1 != null, "A valid instance of MarkupCompilePass1 must be passed to method SaveCacheInformation."); 
            Debug.Assert(_cacheInfoList.Length == (int)CompilerStateType.MaxCount, "The Cache string array should be already allocated.");
 
            bool bSuccess = false;

            // Transfer the cache related information from mcPass1 to this instance.
 
            AssemblyName = mcPass1.AssemblyName;
            AssemblyVersion = mcPass1.AssemblyVersion; 
            AssemblyPublicKeyToken = mcPass1.AssemblyPublicKeyToken; 
            OutputType = mcPass1.OutputType;
            Language = mcPass1.Language; 
            LanguageSourceExtension = mcPass1.LanguageSourceExtension;
            OutputPath = mcPass1.OutputPath;
            RootNamespace = mcPass1.RootNamespace;
            LocalizationDirectivesToLocFile = mcPass1.LocalizationDirectivesToLocFile; 
            HostInBrowser = mcPass1.HostInBrowser;
            DefineConstants = mcPass1.DefineConstants; 
            ApplicationFile = mcPass1.ApplicationFile; 
            PageMarkup = mcPass1.PageMarkupCache;
            ContentFiles = mcPass1.ContentFilesCache; 
            SourceCodeFiles = mcPass1.SourceCodeFilesCache;
            References = mcPass1.ReferencesCache;
            PageMarkupFileNames = GenerateStringFromFileNames(mcPass1.PageMarkup);
 
            // Save the cache information to the cache file.
 
            MemoryStream memStream = new MemoryStream(); 
            // using Disposes the StreamWriter when it ends.  Disposing the StreamWriter
            // also closes the underlying MemoryStream.  Furthermore, don't add BOM here 
            // since TaskFileService.WriteFile adds it.
            using (StreamWriter sw = new StreamWriter(memStream, new UTF8Encoding(false)))
            {
                for (int i =0; i<(int)CompilerStateType.MaxCount; i++) 
                {
                    sw.WriteLine(_cacheInfoList[i]); 
                } 

                sw.Flush(); 
                _taskFileService.WriteFile(memStream.ToArray(), _stateFilePath);

                bSuccess = true;
            } 

            return bSuccess; 
        } 

        // 
        // Read the markupcompiler cache file, load the cached information
        // to the corresponding data fields in this class.
        //
        internal bool LoadStateInformation( ) 
        {
            Debug.Assert(String.IsNullOrEmpty(_stateFilePath) != true, "_stateFilePath must be not be empty."); 
            Debug.Assert(_cacheInfoList.Length == (int)CompilerStateType.MaxCount, "The Cache string array should be already allocated."); 

            bool loadSuccess = false; 

            Stream stream = _taskFileService.GetContent(_stateFilePath);

            // using Disposes the StreamReader when it ends.  Disposing the StreamReader 
            // also closes the underlying MemoryStream.  Don't look for BOM at the beginning
            // of the stream, since we don't add it when writing.  TaskFileService takes care 
            // of this. 
            using (StreamReader srCache = new StreamReader(stream, false))
            { 

                int i = 0;

                while (srCache.EndOfStream != true) 
                {
                    if (i >= (int)CompilerStateType.MaxCount) 
                    { 
                        break;
                    } 

                    _cacheInfoList[i] = srCache.ReadLine();

                    i++; 
                }
 
                loadSuccess = true; 
            }
 
            return loadSuccess;

        }
 
        //
        // Generate cache string for item lists such as PageMarkup, References, 
        // ContentFiles and CodeFiles etc. 
        //
        internal static string GenerateCacheForFileList(ITaskItem[] fileItemList) 
        {
            string cacheString = String.Empty;

            if (fileItemList != null && fileItemList.Length > 0) 
            {
                int iHashCode = 0; 
 
                int iCount = fileItemList.Length;
 
                for (int i = 0; i < iCount; i++)
                {
                    iHashCode += fileItemList[i].ItemSpec.GetHashCode();
                } 

                StringBuilder sb = new StringBuilder(); 
 
                sb.Append(iCount);
                sb.Append(iHashCode); 

                cacheString = sb.ToString();
            }
 

            return cacheString; 
 
        }
 
        private static string GenerateStringFromFileNames(ITaskItem[] fileItemList)
        {
            string fileNames = String.Empty;
 
            if (fileItemList != null)
            { 
                StringBuilder sb = new StringBuilder(); 

                for (int i = 0; i < fileItemList.Length; i++) 
                {
                    sb.Append(fileItemList[i].ItemSpec);
                    sb.Append(";");
                } 

                fileNames = sb.ToString(); 
            } 

            return fileNames; 
        }

        #endregion
 
        #region internal properties
 
        internal string CacheFilePath 
        {
            get { return _stateFilePath; } 
        }

        internal string AssemblyName
        { 
            get { return _cacheInfoList[(int)CompilerStateType.AssemblyName]; }
            set { _cacheInfoList[(int)CompilerStateType.AssemblyName] = value; } 
        } 

        internal string AssemblyVersion 
        {
            get { return _cacheInfoList[(int)CompilerStateType.AssemblyVersion]; }
            set { _cacheInfoList[(int)CompilerStateType.AssemblyVersion] = value; }
        } 

        internal string AssemblyPublicKeyToken 
        { 
            get { return _cacheInfoList[(int)CompilerStateType.AssemblyPublicKeyToken]; }
            set { _cacheInfoList[(int)CompilerStateType.AssemblyPublicKeyToken] = value; } 
        }

        internal string OutputType
        { 
            get { return _cacheInfoList[(int)CompilerStateType.OutputType]; }
            set { _cacheInfoList[(int)CompilerStateType.OutputType] = value; } 
        } 

        internal string Language 
        {
            get { return _cacheInfoList[(int)CompilerStateType.Language]; }
            set { _cacheInfoList[(int)CompilerStateType.Language] = value; }
        } 

        internal string LanguageSourceExtension 
        { 
            get { return _cacheInfoList[(int)CompilerStateType.LanguageSourceExtension]; }
            set { _cacheInfoList[(int)CompilerStateType.LanguageSourceExtension] = value; } 
        }

        internal string OutputPath
        { 
            get { return _cacheInfoList[(int)CompilerStateType.OutputPath]; }
            set { _cacheInfoList[(int)CompilerStateType.OutputPath] = value; } 
        } 

        internal string RootNamespace 
        {
            get { return _cacheInfoList[(int)CompilerStateType.RootNamespace]; }
            set { _cacheInfoList[(int)CompilerStateType.RootNamespace] = value; }
        } 

        internal string LocalizationDirectivesToLocFile 
        { 
            get { return _cacheInfoList[(int)CompilerStateType.LocalizationDirectivesToLocFile]; }
            set { _cacheInfoList[(int)CompilerStateType.LocalizationDirectivesToLocFile] = value; } 
        }

        internal string HostInBrowser
        { 
            get { return _cacheInfoList[(int)CompilerStateType.HostInBrowser]; }
            set { _cacheInfoList[(int)CompilerStateType.HostInBrowser] = value; } 
        } 

        internal string DefineConstants 
        {
            get { return _cacheInfoList[(int)CompilerStateType.DefineConstants]; }
            set { _cacheInfoList[(int)CompilerStateType.DefineConstants] = value; }
        } 

        internal string ApplicationFile 
        { 
            get { return _cacheInfoList[(int)CompilerStateType.ApplicationFile]; }
            set { _cacheInfoList[(int)CompilerStateType.ApplicationFile] = value; } 
        }

        internal string PageMarkup
        { 
            get { return _cacheInfoList[(int)CompilerStateType.PageMarkup]; }
            set { _cacheInfoList[(int)CompilerStateType.PageMarkup] = value; } 
        } 

        internal string ContentFiles 
        {
            get { return _cacheInfoList[(int)CompilerStateType.ContentFiles]; }
            set { _cacheInfoList[(int)CompilerStateType.ContentFiles] = value; }
        } 

        internal string SourceCodeFiles 
        { 
            get { return _cacheInfoList[(int)CompilerStateType.SourceCodeFiles]; }
            set { _cacheInfoList[(int)CompilerStateType.SourceCodeFiles] = value; } 
        }

        internal string References
        { 
            get { return _cacheInfoList[(int)CompilerStateType.References]; }
            set { _cacheInfoList[(int)CompilerStateType.References] = value; } 
        } 

        internal string PageMarkupFileNames 
        {
            get { return _cacheInfoList[(int)CompilerStateType.PageMarkupFileNames]; }
            set { _cacheInfoList[(int)CompilerStateType.PageMarkupFileNames] = value; }
        } 
        #endregion
 
        #region private data 

        private String [] _cacheInfoList; 
        private string    _stateFilePath;
        private ITaskFileService _taskFileService = null;

        #endregion 

    } 
} 

// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.


                        

Link Menu

Network programming in C#, Network Programming in VB.NET, Network Programming in .NET
This book is available now!
Buy at Amazon US or
Buy at Amazon UK