Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / wpf / src / BuildTasks / MS / Internal / Tasks / CompilerLocalReference.cs / 1305600 / CompilerLocalReference.cs
//----------------------------------------------------------------------------------------
//
//
// Copyright (C) Microsoft Corporation. All rights reserved.
//
//
// Description:
// this internal class handles cache for xaml files which
// want to reference local types.
//
// History:
//
// 11/21/05: weibz Created
//
//---------------------------------------------------------------------------------------
using System;
using System.IO;
using System.Collections;
using System.Diagnostics;
using System.Text;
using Microsoft.Build.Tasks.Windows;
using Microsoft.Build.Framework;
using Microsoft.Build.Utilities;
using MS.Utility;
namespace MS.Internal.Tasks
{
//
// LocalReferenceFile
// This class keeps xaml file path and whether it is localizable.
//
internal class LocalReferenceFile
{
private bool _localizable;
private string _filePath;
private const char trueChar = 'T';
private const char falseChar = 'F';
internal LocalReferenceFile(string filepath, bool localizable)
{
_localizable = localizable;
_filePath = filepath;
}
internal bool Localizable
{
get { return _localizable; }
}
internal string FilePath
{
get { return _filePath; }
}
//
// Serialize the instance to a string so that it can saved into a cache file.
//
internal string Serialize()
{
string cacheText = String.Empty;
if (!String.IsNullOrEmpty(FilePath))
{
StringBuilder sb = new StringBuilder();
if (Localizable)
{
sb.Append(trueChar);
}
else
{
sb.Append(falseChar);
}
sb.Append(FilePath);
cacheText = sb.ToString();
}
return cacheText;
}
//
// Create instance from a cache text string.
//
internal static LocalReferenceFile Deserialize(string cacheInfo)
{
// cachInfo string must follow pattern like Localizable + FilePath.
// Localizable contains one character.
LocalReferenceFile lrf = null;
if (!String.IsNullOrEmpty(cacheInfo))
{
bool localizable;
string filePath;
localizable = (cacheInfo[0] == trueChar) ? true : false;
filePath = cacheInfo.Substring(1);
lrf = new LocalReferenceFile(filePath, localizable);
}
return lrf;
}
}
//
// CompilerLocalReference
//
internal class CompilerLocalReference
{
//
// ctor of CompilerLocalReference
//
internal CompilerLocalReference(string localCacheFile, ITaskFileService taskFileService)
{
_localCacheFile = localCacheFile;
_taskFileService = taskFileService;
}
#region internal methods
//
// Detect whether the local cache file exists or not.
//
//
internal bool CacheFileExists()
{
return _taskFileService.Exists(_localCacheFile);
}
//
// Clean up the state file.
//
internal void CleanupCache()
{
if (CacheFileExists())
{
_taskFileService.Delete(_localCacheFile);
}
}
//
// Save the local reference related information from MarkupCompilePass1 task to cache file.
//
internal bool SaveCacheInformation(MarkupCompilePass1 mcPass1)
{
Debug.Assert(String.IsNullOrEmpty(_localCacheFile) != true, "_localCacheFile must not be empty.");
Debug.Assert(mcPass1 != null, "A valid instance of MarkupCompilePass1 must be passed to method SaveCacheInformation.");
bool bSuccess = false;
// Transfer the cache related information from mcPass1 to this instance.
LocalApplicationFile = mcPass1.LocalApplicationFile;
LocalMarkupPages = mcPass1.LocalMarkupPages;
// 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)))
{
// Write InternalTypeHelperFile only when Pass1 asks Pass2 to do further check.
if (mcPass1.FurtherCheckInternalTypeHelper)
{
sw.WriteLine(mcPass1.InternalTypeHelperFile);
}
else
{
sw.WriteLine(String.Empty);
}
// Write the ApplicationFile for Pass2 compilation.
if (LocalApplicationFile == null)
{
sw.WriteLine(String.Empty);
}
else
{
sw.WriteLine(LocalApplicationFile.Serialize());
}
if (LocalMarkupPages != null && LocalMarkupPages.Length > 0)
{
for (int i = 0; i < LocalMarkupPages.Length; i++)
{
sw.WriteLine(LocalMarkupPages[i].Serialize( ));
}
}
sw.Flush();
_taskFileService.WriteFile(memStream.ToArray(), _localCacheFile);
bSuccess = true;
}
return bSuccess;
}
//
// Read the Local Reference cache file, load the cached information
// to the corresponding data fields in this class.
//
internal bool LoadCacheFile()
{
Debug.Assert(String.IsNullOrEmpty(_localCacheFile) != true, "_localCacheFile must not be empty.");
bool loadSuccess = false;
Stream stream = _taskFileService.GetContent(_localCacheFile);
// 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))
{
// The first line must be for InternalTypeHelperFile.
// The second line is for Local Application Defintion file.
// For Library, the second line is an empty line.
InternalTypeHelperFile = srCache.ReadLine();
string lineText;
lineText = srCache.ReadLine();
LocalApplicationFile = LocalReferenceFile.Deserialize(lineText);
ArrayList alMarkupPages = new ArrayList();
while (srCache.EndOfStream != true)
{
lineText = srCache.ReadLine();
LocalReferenceFile lrf = LocalReferenceFile.Deserialize(lineText);
if (lrf != null)
{
alMarkupPages.Add(lrf);
}
}
if (alMarkupPages.Count > 0)
{
LocalMarkupPages = (LocalReferenceFile []) alMarkupPages.ToArray(typeof(LocalReferenceFile));
}
loadSuccess = true;
}
return loadSuccess;
}
#endregion
#region internal properties
internal string CacheFilePath
{
get { return _localCacheFile; }
}
internal LocalReferenceFile LocalApplicationFile
{
get { return _localApplicationFile; }
set { _localApplicationFile = value; }
}
internal LocalReferenceFile[] LocalMarkupPages
{
get { return _localMarkupPages; }
set { _localMarkupPages = value; }
}
//
// InternalTypeHelper file path.
//
// Since Pass2 task doesn't know the code language, it could not generate the real
// InternalTypeHelper code file path on the fly.
// The real file path would be passed from Pass1 task to Pass2 through the cache file.
//
// If this file path is set in the cache file, it means Pass1 asks Passs2 to do the further
// check for this file to see if it is really required, if this file is required for the assembly,
// Pass2 then adds it to the appropriate output Item, otherwise, Pass2 just deletes this file.
//
// If the path is empty, this means Pass1 has alreay known how to handle the file correctly,
// no further check is required in Pass2.
//
internal string InternalTypeHelperFile
{
get { return _internalTypeHelperFile; }
set { _internalTypeHelperFile = value; }
}
#endregion
#region private data
private LocalReferenceFile _localApplicationFile;
private LocalReferenceFile[] _localMarkupPages;
private string _localCacheFile;
private string _internalTypeHelperFile = String.Empty;
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

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- DnsPermission.cs
- IdentityModelStringsVersion1.cs
- KeyInfo.cs
- SessionPageStatePersister.cs
- OdbcCommand.cs
- SqlException.cs
- UserPersonalizationStateInfo.cs
- ListViewInsertEventArgs.cs
- SessionStateItemCollection.cs
- WaitHandle.cs
- SqlPersistenceWorkflowInstanceDescription.cs
- DoubleUtil.cs
- SchemaNamespaceManager.cs
- PersonalizationStateInfoCollection.cs
- WebDescriptionAttribute.cs
- SymLanguageVendor.cs
- FileSystemInfo.cs
- DataGridViewImageCell.cs
- DataColumnMappingCollection.cs
- Setter.cs
- PriorityBindingExpression.cs
- TypeDescriptionProvider.cs
- TransformedBitmap.cs
- StrongName.cs
- StatusBarDesigner.cs
- SystemUdpStatistics.cs
- FunctionDescription.cs
- SubstitutionDesigner.cs
- FixedSOMContainer.cs
- MergeFailedEvent.cs
- ContentFileHelper.cs
- GlyphRun.cs
- PointConverter.cs
- Atom10FormatterFactory.cs
- cookiecollection.cs
- GridViewHeaderRowPresenterAutomationPeer.cs
- IdentityValidationException.cs
- DataGridRowHeaderAutomationPeer.cs
- XslCompiledTransform.cs
- PkcsMisc.cs
- ToolStripPanelRenderEventArgs.cs
- ClockGroup.cs
- PtsHost.cs
- safelink.cs
- NameScopePropertyAttribute.cs
- MbpInfo.cs
- UInt16.cs
- AsnEncodedData.cs
- SystemResourceHost.cs
- TcpClientChannel.cs
- ActiveDesignSurfaceEvent.cs
- WebConfigurationFileMap.cs
- PenContext.cs
- EventLogPermissionAttribute.cs
- ColumnPropertiesGroup.cs
- DataGridCellsPresenter.cs
- VirtualDirectoryMappingCollection.cs
- ReaderWriterLock.cs
- ServiceHost.cs
- PaintEvent.cs
- WindowsToolbarItemAsMenuItem.cs
- FrameworkRichTextComposition.cs
- JulianCalendar.cs
- AppSettings.cs
- ExceptionRoutedEventArgs.cs
- FileInfo.cs
- DataGridViewCellErrorTextNeededEventArgs.cs
- DataGridToolTip.cs
- GridItemCollection.cs
- DataGridViewMethods.cs
- MenuTracker.cs
- TemplatedWizardStep.cs
- AmbiguousMatchException.cs
- XmlUTF8TextReader.cs
- ListBoxChrome.cs
- LingerOption.cs
- XmlSchemaSimpleTypeList.cs
- Shared.cs
- DataKey.cs
- filewebrequest.cs
- FixedDocumentSequencePaginator.cs
- smtpconnection.cs
- XsltCompileContext.cs
- KeyMatchBuilder.cs
- FillBehavior.cs
- FormViewDeletedEventArgs.cs
- DropSource.cs
- ConnectionsZone.cs
- BackgroundWorker.cs
- ErasingStroke.cs
- PersonalizationProviderCollection.cs
- XPathAxisIterator.cs
- RequiredFieldValidator.cs
- DynamicPropertyHolder.cs
- CalendarDateChangedEventArgs.cs
- VScrollProperties.cs
- CapabilitiesRule.cs
- GregorianCalendarHelper.cs
- HttpWebRequest.cs
- BuilderInfo.cs