Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / wpf / src / BuildTasks / MS / Internal / Tasks / TaskFileService.cs / 1305600 / TaskFileService.cs
//---------------------------------------------------------------------------- // //// Copyright (C) Microsoft Corporation. All rights reserved. // // // Description: // // File service for the input source files in a build task. // // The service does something like below: // // return stream for a given source file, // get last modification time in memory or disk. // // or get the link metadata part of a source file. // // It returns above information no matter the task is hosted // inside VS or not. // // History: // 01/24/2007, weibz created it // 03/28/2007, hamidm added support of Exists, Delete, PutFileContents, IsRealBuild // //--------------------------------------------------------------------------- using System; using System.IO; using Microsoft.Build.Utilities; using System.Diagnostics; using System.Text; using System.Security.Cryptography; namespace MS.Internal { // // Declaration of interface ITaskFileService // internal interface ITaskFileService { // // Get content stream for a given source file // Stream GetContent(string srcFile); // // Get MD5 Check Sum for a given source file // byte[] GetChecksum(string srcFile, Guid hashGuid); // // Get the last modificatin time for a given file. // DateTime GetLastChangeTime(string srcFile); // // Checks to see if file exists // bool Exists(string fileName); // // Deletes the specified file // void Delete(string fileName); // // Save content stream for the given destination file // void WriteFile(byte[] contentArray, string destinationFile); // // Save content stream for the given generated code file. // This function decides which extension to use for the file // and whether to put it into memory or merely write it to // disk based on whether it is a real build or an intellisense // build operation. It also takes care of deleting the corresponding // unused generated file (i.e. if real build then it deletes // the intellisense file otherwise it deletes the non-intellisense // file. // NOTE: UTF8 BOM should not be added to the contentArray. This // method adds BOM before writing file to disk. // void WriteGeneratedCodeFile(byte[] contentArray, string destinationFileBaseName, string generatedExtension, string intellisenseGeneratedExtension, string languageSourceExtension); // // Determines if this is a real build operation or an // intellisense build operation // bool IsRealBuild {get;} // // Determines if this is running in VS or MsBuild // bool IsRunningInVS { get; } } // // TaskFileService class // // This class can be used by different build tasks to get source file // service, the instance is created by those build tasks when task's // Execute( ) method is called. // internal class TaskFileService : MarshalByRefObject, ITaskFileService { // // Ctor // public TaskFileService(Task buildTask) { _buildTask = buildTask; _hostFileManager = null; _isRealBuild = null; } #region ITaskFileService // // Get content stream for a given source file, the content could // come from memory or disk based on the build host environment. // // It is the caller's responsibility to close the stream. // public Stream GetContent(string srcFile) { Stream fileStream = null; if (String.IsNullOrEmpty(srcFile)) { throw new ArgumentNullException("srcFile"); } if (HostFileManager != null) { // // Build Host environment has a FileManager, use it to get // file content from edit buffer in memory. GetFileContents // removes the BOM before returning the string. // string strFileContent = HostFileManager.GetFileContents(srcFile); // IVsMsBuildTaskFileManager.GetFileContents should never return null. // GetBytes might throw when input is null, but that should be fine. // // For xaml file, UTF8 is the standard encoding // UTF8Encoding utf8Encoding = new UTF8Encoding(); byte[] baFileContent = utf8Encoding.GetBytes(strFileContent); fileStream = new MemoryStream(baFileContent); } else { fileStream = File.OpenRead(srcFile); } return fileStream; } public byte[] GetChecksum(string fileName, Guid md5HashGuid) { byte[] hashData=null; if (HostFileManager != null) { object docData = HostFileManager.GetFileDocData(fileName); IPersistFileCheckSum fileChecksummer = docData as IPersistFileCheckSum; if (fileChecksummer != null) { byte[] tempBytes = new byte[1024]; int actualSize; fileChecksummer.CalculateCheckSum(md5HashGuid, tempBytes.Length, tempBytes, out actualSize); hashData = new byte[actualSize]; for (int i = 0; i < actualSize; i++) { hashData[i] = tempBytes[i]; } } } if (hashData == null) { HashAlgorithm MD5cryptoProvider = new MD5CryptoServiceProvider(); using (Stream fileStream = File.OpenRead(fileName)) { hashData = MD5cryptoProvider.ComputeHash(fileStream); } } return hashData; } // // Get the last modificatin time for a given file. // public DateTime GetLastChangeTime(string srcFile) { DateTime lastChangeDT = new DateTime(0); if (String.IsNullOrEmpty(srcFile)) { throw new ArgumentNullException("srcFile"); } if (IsFileInHostManager(srcFile)) { long fileTime = HostFileManager.GetFileLastChangeTime(srcFile); lastChangeDT = DateTime.FromFileTime(fileTime); } else { lastChangeDT = File.GetLastWriteTime(srcFile); } return lastChangeDT; } // // Checks to see if file exists // public bool Exists(string fileName) { bool fileExists = false; if (fileName == null) { throw new ArgumentNullException("fileName"); } if (HostFileManager != null) { fileExists = HostFileManager.Exists(fileName, IsRealBuild); } else { fileExists = File.Exists(fileName); } return fileExists; } // // Deletes the specified file // public void Delete(string fileName) { if (fileName == null) { throw new ArgumentNullException("fileName"); } if (IsFileInHostManager(fileName)) { HostFileManager.Delete(fileName); } else { File.Delete(fileName); } } // // Save content stream for the given destination file // UTF8 BOM should not be added to the contentArray. This // method adds BOM before writing file to disk. // public void WriteFile(byte[] contentArray, string destinationFile) { if (String.IsNullOrEmpty(destinationFile)) { throw new ArgumentNullException("destinationFile"); } if (contentArray == null) { throw new ArgumentNullException("contentArray"); } UTF8Encoding utf8Encoding = new UTF8Encoding(); string contentStr = utf8Encoding.GetString(contentArray); if (IsFileInHostManager(destinationFile)) { // PutGeneratedFileContents adds BOM to the file when saving // to memory or disk. HostFileManager.PutGeneratedFileContents(destinationFile, contentStr); } else { // Add BOM for UTF8Encoding since the input contentArray is not supposed to // have it already. using (StreamWriter sw = new StreamWriter(destinationFile, false, new UTF8Encoding(true))) { sw.WriteLine(contentStr); } } } // Save content stream for the given generated code file. // This function decides which extension to use for the file // and whether to put it into memory or merely write it to // disk based on whether it is a real build or an intellisense // build operation. It also takes care of deleting the corresponding // unused generated file (i.e. if real build then it deletes // the intellisense file otherwise it deletes the non-intellisense // file. // NOTE: UTF8 BOM should not be added to the contentArray. This // method adds BOM before writing file to disk. // public void WriteGeneratedCodeFile(byte[] contentArray, string destinationFileBaseName, string generatedExtension, string intellisenseGeneratedExtension, string languageSourceExtension) { if (String.IsNullOrEmpty(destinationFileBaseName)) { throw new ArgumentNullException("destinationFileBaseName"); } if (contentArray == null) { throw new ArgumentNullException("contentArray"); } string buildFile = destinationFileBaseName + generatedExtension + languageSourceExtension; string intelFile = destinationFileBaseName + intellisenseGeneratedExtension + languageSourceExtension; string destinationFile = IsRealBuild ? buildFile : intelFile; UTF8Encoding utf8Encoding = new UTF8Encoding(); string contentStr = utf8Encoding.GetString(contentArray); // Add BOM for UTF8Encoding since the input contentArray is not supposed to // have it already. using (StreamWriter sw = new StreamWriter(destinationFile, false, new UTF8Encoding(true))) { sw.WriteLine(contentStr); } if (IsRealBuild && IsRunningInVS) { File.Copy(buildFile, intelFile, /*overwrite*/ true); } } // // Tells if this is an intellisense build or a real build. // Caching the result since this is called a lot of times. // public bool IsRealBuild { get { if (_isRealBuild == null) { bool isRealBuild = true; if (HostFileManager != null) { isRealBuild = HostFileManager.IsRealBuildOperation(); } _isRealBuild = isRealBuild; } return _isRealBuild.Value; } } public bool IsRunningInVS { get { return (HostFileManager != null); } } #endregion ITaskFileService #region private property // // Get the FileManager implemented by the Host system // private IVsMSBuildTaskFileManager HostFileManager { get { if (_hostFileManager == null) { if (_buildTask != null && _buildTask.HostObject != null) { _hostFileManager = _buildTask.HostObject as IVsMSBuildTaskFileManager; } } return _hostFileManager; } } private bool IsFileInHostManager(string destinationFile) { if (HostFileManager != null && null != HostFileManager.GetFileDocData(destinationFile)) { return true; } return false; } #endregion private property #region private data field private Task _buildTask; private IVsMSBuildTaskFileManager _hostFileManager; private Nullable_isRealBuild; #endregion private data field } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved. //---------------------------------------------------------------------------- // // // Copyright (C) Microsoft Corporation. All rights reserved. // // // Description: // // File service for the input source files in a build task. // // The service does something like below: // // return stream for a given source file, // get last modification time in memory or disk. // // or get the link metadata part of a source file. // // It returns above information no matter the task is hosted // inside VS or not. // // History: // 01/24/2007, weibz created it // 03/28/2007, hamidm added support of Exists, Delete, PutFileContents, IsRealBuild // //--------------------------------------------------------------------------- using System; using System.IO; using Microsoft.Build.Utilities; using System.Diagnostics; using System.Text; using System.Security.Cryptography; namespace MS.Internal { // // Declaration of interface ITaskFileService // internal interface ITaskFileService { // // Get content stream for a given source file // Stream GetContent(string srcFile); // // Get MD5 Check Sum for a given source file // byte[] GetChecksum(string srcFile, Guid hashGuid); // // Get the last modificatin time for a given file. // DateTime GetLastChangeTime(string srcFile); // // Checks to see if file exists // bool Exists(string fileName); // // Deletes the specified file // void Delete(string fileName); // // Save content stream for the given destination file // void WriteFile(byte[] contentArray, string destinationFile); // // Save content stream for the given generated code file. // This function decides which extension to use for the file // and whether to put it into memory or merely write it to // disk based on whether it is a real build or an intellisense // build operation. It also takes care of deleting the corresponding // unused generated file (i.e. if real build then it deletes // the intellisense file otherwise it deletes the non-intellisense // file. // NOTE: UTF8 BOM should not be added to the contentArray. This // method adds BOM before writing file to disk. // void WriteGeneratedCodeFile(byte[] contentArray, string destinationFileBaseName, string generatedExtension, string intellisenseGeneratedExtension, string languageSourceExtension); // // Determines if this is a real build operation or an // intellisense build operation // bool IsRealBuild {get;} // // Determines if this is running in VS or MsBuild // bool IsRunningInVS { get; } } // // TaskFileService class // // This class can be used by different build tasks to get source file // service, the instance is created by those build tasks when task's // Execute( ) method is called. // internal class TaskFileService : MarshalByRefObject, ITaskFileService { // // Ctor // public TaskFileService(Task buildTask) { _buildTask = buildTask; _hostFileManager = null; _isRealBuild = null; } #region ITaskFileService // // Get content stream for a given source file, the content could // come from memory or disk based on the build host environment. // // It is the caller's responsibility to close the stream. // public Stream GetContent(string srcFile) { Stream fileStream = null; if (String.IsNullOrEmpty(srcFile)) { throw new ArgumentNullException("srcFile"); } if (HostFileManager != null) { // // Build Host environment has a FileManager, use it to get // file content from edit buffer in memory. GetFileContents // removes the BOM before returning the string. // string strFileContent = HostFileManager.GetFileContents(srcFile); // IVsMsBuildTaskFileManager.GetFileContents should never return null. // GetBytes might throw when input is null, but that should be fine. // // For xaml file, UTF8 is the standard encoding // UTF8Encoding utf8Encoding = new UTF8Encoding(); byte[] baFileContent = utf8Encoding.GetBytes(strFileContent); fileStream = new MemoryStream(baFileContent); } else { fileStream = File.OpenRead(srcFile); } return fileStream; } public byte[] GetChecksum(string fileName, Guid md5HashGuid) { byte[] hashData=null; if (HostFileManager != null) { object docData = HostFileManager.GetFileDocData(fileName); IPersistFileCheckSum fileChecksummer = docData as IPersistFileCheckSum; if (fileChecksummer != null) { byte[] tempBytes = new byte[1024]; int actualSize; fileChecksummer.CalculateCheckSum(md5HashGuid, tempBytes.Length, tempBytes, out actualSize); hashData = new byte[actualSize]; for (int i = 0; i < actualSize; i++) { hashData[i] = tempBytes[i]; } } } if (hashData == null) { HashAlgorithm MD5cryptoProvider = new MD5CryptoServiceProvider(); using (Stream fileStream = File.OpenRead(fileName)) { hashData = MD5cryptoProvider.ComputeHash(fileStream); } } return hashData; } // // Get the last modificatin time for a given file. // public DateTime GetLastChangeTime(string srcFile) { DateTime lastChangeDT = new DateTime(0); if (String.IsNullOrEmpty(srcFile)) { throw new ArgumentNullException("srcFile"); } if (IsFileInHostManager(srcFile)) { long fileTime = HostFileManager.GetFileLastChangeTime(srcFile); lastChangeDT = DateTime.FromFileTime(fileTime); } else { lastChangeDT = File.GetLastWriteTime(srcFile); } return lastChangeDT; } // // Checks to see if file exists // public bool Exists(string fileName) { bool fileExists = false; if (fileName == null) { throw new ArgumentNullException("fileName"); } if (HostFileManager != null) { fileExists = HostFileManager.Exists(fileName, IsRealBuild); } else { fileExists = File.Exists(fileName); } return fileExists; } // // Deletes the specified file // public void Delete(string fileName) { if (fileName == null) { throw new ArgumentNullException("fileName"); } if (IsFileInHostManager(fileName)) { HostFileManager.Delete(fileName); } else { File.Delete(fileName); } } // // Save content stream for the given destination file // UTF8 BOM should not be added to the contentArray. This // method adds BOM before writing file to disk. // public void WriteFile(byte[] contentArray, string destinationFile) { if (String.IsNullOrEmpty(destinationFile)) { throw new ArgumentNullException("destinationFile"); } if (contentArray == null) { throw new ArgumentNullException("contentArray"); } UTF8Encoding utf8Encoding = new UTF8Encoding(); string contentStr = utf8Encoding.GetString(contentArray); if (IsFileInHostManager(destinationFile)) { // PutGeneratedFileContents adds BOM to the file when saving // to memory or disk. HostFileManager.PutGeneratedFileContents(destinationFile, contentStr); } else { // Add BOM for UTF8Encoding since the input contentArray is not supposed to // have it already. using (StreamWriter sw = new StreamWriter(destinationFile, false, new UTF8Encoding(true))) { sw.WriteLine(contentStr); } } } // Save content stream for the given generated code file. // This function decides which extension to use for the file // and whether to put it into memory or merely write it to // disk based on whether it is a real build or an intellisense // build operation. It also takes care of deleting the corresponding // unused generated file (i.e. if real build then it deletes // the intellisense file otherwise it deletes the non-intellisense // file. // NOTE: UTF8 BOM should not be added to the contentArray. This // method adds BOM before writing file to disk. // public void WriteGeneratedCodeFile(byte[] contentArray, string destinationFileBaseName, string generatedExtension, string intellisenseGeneratedExtension, string languageSourceExtension) { if (String.IsNullOrEmpty(destinationFileBaseName)) { throw new ArgumentNullException("destinationFileBaseName"); } if (contentArray == null) { throw new ArgumentNullException("contentArray"); } string buildFile = destinationFileBaseName + generatedExtension + languageSourceExtension; string intelFile = destinationFileBaseName + intellisenseGeneratedExtension + languageSourceExtension; string destinationFile = IsRealBuild ? buildFile : intelFile; UTF8Encoding utf8Encoding = new UTF8Encoding(); string contentStr = utf8Encoding.GetString(contentArray); // Add BOM for UTF8Encoding since the input contentArray is not supposed to // have it already. using (StreamWriter sw = new StreamWriter(destinationFile, false, new UTF8Encoding(true))) { sw.WriteLine(contentStr); } if (IsRealBuild && IsRunningInVS) { File.Copy(buildFile, intelFile, /*overwrite*/ true); } } // // Tells if this is an intellisense build or a real build. // Caching the result since this is called a lot of times. // public bool IsRealBuild { get { if (_isRealBuild == null) { bool isRealBuild = true; if (HostFileManager != null) { isRealBuild = HostFileManager.IsRealBuildOperation(); } _isRealBuild = isRealBuild; } return _isRealBuild.Value; } } public bool IsRunningInVS { get { return (HostFileManager != null); } } #endregion ITaskFileService #region private property // // Get the FileManager implemented by the Host system // private IVsMSBuildTaskFileManager HostFileManager { get { if (_hostFileManager == null) { if (_buildTask != null && _buildTask.HostObject != null) { _hostFileManager = _buildTask.HostObject as IVsMSBuildTaskFileManager; } } return _hostFileManager; } } private bool IsFileInHostManager(string destinationFile) { if (HostFileManager != null && null != HostFileManager.GetFileDocData(destinationFile)) { return true; } return false; } #endregion private property #region private data field private Task _buildTask; private IVsMSBuildTaskFileManager _hostFileManager; private Nullable_isRealBuild; #endregion private data field } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- BStrWrapper.cs
- TaskExtensions.cs
- Geometry.cs
- PropertyEmitterBase.cs
- EntryWrittenEventArgs.cs
- MetadataConversionError.cs
- MouseButtonEventArgs.cs
- RelationshipEndCollection.cs
- PackWebResponse.cs
- FreezableCollection.cs
- XmlTextReader.cs
- CallbackCorrelationInitializer.cs
- UpdateEventArgs.cs
- BufferedReceiveElement.cs
- MobileTemplatedControlDesigner.cs
- GeometryGroup.cs
- ObservableDictionary.cs
- PackageProperties.cs
- SmiEventSink_Default.cs
- SecurityDocument.cs
- TreeIterator.cs
- SurrogateDataContract.cs
- StringUtil.cs
- ButtonChrome.cs
- Error.cs
- LinearGradientBrush.cs
- TextAnchor.cs
- DnsPermission.cs
- IsolatedStorageException.cs
- HttpConfigurationContext.cs
- HtmlHistory.cs
- MailAddress.cs
- LinkLabelLinkClickedEvent.cs
- OutputCacheProfile.cs
- AppDomainManager.cs
- AsymmetricSignatureFormatter.cs
- HttpErrorTraceRecord.cs
- RenderTargetBitmap.cs
- _DomainName.cs
- UpdateRecord.cs
- TimeSpanOrInfiniteValidator.cs
- TrackingExtract.cs
- WebSysDescriptionAttribute.cs
- SimplePropertyEntry.cs
- WsdlWriter.cs
- TemplatePropertyEntry.cs
- QuadraticEase.cs
- XmlEncoding.cs
- LinqDataSourceContextEventArgs.cs
- SymLanguageVendor.cs
- StreamReader.cs
- SimpleHandlerBuildProvider.cs
- Pen.cs
- AsyncOperationManager.cs
- WebPermission.cs
- SqlDataSourceSelectingEventArgs.cs
- StatusBarAutomationPeer.cs
- SystemIPInterfaceProperties.cs
- DataGridViewLayoutData.cs
- NamedPermissionSet.cs
- PersonalizableAttribute.cs
- ResourceReferenceExpression.cs
- SqlServer2KCompatibilityCheck.cs
- ItemContainerGenerator.cs
- TransactionTraceIdentifier.cs
- RolePrincipal.cs
- ParallelTimeline.cs
- FixedDocumentPaginator.cs
- PersonalizationStateQuery.cs
- StateFinalizationDesigner.cs
- HttpProcessUtility.cs
- StsCommunicationException.cs
- SAPICategories.cs
- InstancePersistence.cs
- InstanceContext.cs
- ContainerUIElement3D.cs
- PowerStatus.cs
- SelectionItemPattern.cs
- SaveFileDialog.cs
- Crc32.cs
- InternalTransaction.cs
- HtmlInputButton.cs
- KeyConverter.cs
- DoubleConverter.cs
- EntityDataSourceQueryBuilder.cs
- DetailsViewDeleteEventArgs.cs
- Rotation3D.cs
- Types.cs
- PassportPrincipal.cs
- SecurityDocument.cs
- KoreanLunisolarCalendar.cs
- WebServiceResponse.cs
- MenuItemCollectionEditor.cs
- BitmapEffectvisualstate.cs
- AutomationProperties.cs
- WebSysDisplayNameAttribute.cs
- ErrorEventArgs.cs
- IfAction.cs
- AbsoluteQuery.cs
- InternalMappingException.cs