Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / cdf / src / WCF / Tools / comsvcutil / SvcFileManager.cs / 1305376 / SvcFileManager.cs
//------------------------------------------------------------------------------
// Copyright (c) Microsoft Corporation. All rights reserved.
//-----------------------------------------------------------------------------
namespace Microsoft.Tools.ServiceModel.ComSvcConfig
{
using System;
using System.ServiceModel.Channels;
using System.Diagnostics;
using System.Configuration;
using System.Globalization;
using System.Collections;
using System.Collections.Specialized;
using System.Collections.Generic;
using System.IO;
using System.Reflection;
using System.Text;
using System.Threading;
using System.Runtime.InteropServices;
using System.Security;
using System.ServiceModel;
using System.ServiceModel.Activation;
using System.ServiceModel.Configuration;
using System.ServiceModel.ComIntegration;
using Microsoft.Tools.ServiceModel;
using Microsoft.Tools.ServiceModel.SvcUtil;
class SvcFileManager
{
string webDirectoryPath;
Dictionary svcFiles;
public SvcFileManager(string webDirectoryPath)
{
this.webDirectoryPath = webDirectoryPath;
this.svcFiles = new Dictionary();
string[] fileNames = Directory.GetFiles(webDirectoryPath, "*.svc");
foreach (string fileName in fileNames)
{
SvcFile svcFile = SvcFile.OpenExisting(fileName);
if (svcFile != null)
{
this.svcFiles.Add(svcFile.Clsid, svcFile);
}
}
}
public void Abort()
{
foreach (SvcFile file in svcFiles.Values)
{
file.Abort();
}
}
public void Add(Guid appid, Guid clsid)
{
SvcFile svcFile = null;
if (this.svcFiles.TryGetValue(clsid, out svcFile))
{
// we found an existing SVC file, all is good
// We should never be adding and deleting SVC files at the same time..
Debug.Assert(svcFile.State != SvcFileState.Deleted, "svcFile.State != SvcFileState.Deleted");
}
else
{
svcFile = SvcFile.CreateNew(this.webDirectoryPath, appid, clsid);
this.svcFiles.Add(clsid, svcFile);
}
}
public bool Remove(Guid appid, Guid clsid)
{
SvcFile svcFile = null;
if (this.svcFiles.TryGetValue(clsid, out svcFile))
{
// we found an existing SVC file
// We should never be adding and deleting SVC files at the same time..
Debug.Assert(svcFile.State != SvcFileState.Added, "svcFile.State != SvcFileState.Added");
if (svcFile.State == SvcFileState.Deleted)
{
// already marked for deletion
return true;
}
else
{
Debug.Assert(svcFile.State == SvcFileState.Existing, "svcFile.State == SvcFileState.Existing");
svcFile.Delete();
return true;
}
}
else
{
// didn't find any SVC file to remove
return false;
}
}
public void Prepare()
{
foreach (SvcFile file in svcFiles.Values)
{
file.Prepare();
}
}
public void Commit()
{
foreach (SvcFile file in svcFiles.Values)
{
file.Commit();
}
}
public bool ResolveClsid(Guid clsid, out Guid appid)
{
SvcFile svcFile;
appid = Guid.Empty;
if (this.svcFiles.TryGetValue(clsid, out svcFile))
{
if (svcFile.State == SvcFileState.Deleted)
{
return false; // we cant resolve because we think its deleted
}
else
{
appid = svcFile.Appid;
return true;
}
}
else
{
return false; // Clsid not found
}
}
enum SvcFileState
{
Existing,
Added,
Deleted
}
class SvcFile
{
Guid appid;
Guid clsid;
SvcFileState state;
AtomicFile svcFile;
const string factoryAttributeName = "Factory";
const string serviceAttributeName = "Service";
SvcFile(Guid appid, Guid clsid, SvcFileState state, AtomicFile svcFile)
{
this.appid = appid;
this.clsid = clsid;
this.state = state;
this.svcFile = svcFile;
}
public static SvcFile CreateNew(string webDirectoryPath, Guid appid, Guid clsid)
{
ComAdminAppInfo adminAppInfo = ComAdminWrapper.GetAppInfo(appid.ToString("B"));
if (null == adminAppInfo)
{
throw Tool.CreateException(SR.GetString(SR.CannotFindAppInfo, appid.ToString("B")), null);
}
ComAdminClassInfo adminClassInfo = adminAppInfo.FindClass(clsid.ToString("B"));
if (null == adminClassInfo)
{
throw Tool.CreateException(SR.GetString(SR.CannotFindClassInfo, clsid.ToString("B")), null);
}
string fileName = webDirectoryPath + "\\" + adminClassInfo.Name;
if (File.Exists(fileName + ".svc"))
{
int count = 1;
while (File.Exists(fileName + "." + count.ToString(CultureInfo.InvariantCulture) + ".svc"))
{
count++;
}
fileName = fileName + "." + count.ToString(CultureInfo.InvariantCulture);
}
fileName = fileName + ".svc";
string comPlusString = clsid.ToString("B") + "," + appid.ToString("B");
using (StreamWriter sw = File.CreateText(fileName))
{
sw.WriteLine("<%@ServiceHost {0}=\"{1}\" {2}=\"{3}\" %>",
factoryAttributeName,
typeof(WasHostedComPlusFactory).FullName,
serviceAttributeName,
comPlusString);
}
return new SvcFile(appid, clsid, SvcFileState.Added, new AtomicFile(fileName));
}
// this function wraps the call to the internal method in ServiceModel assembly.
static IDictionary ParseServiceDirective(string serviceText)
{
IDictionary dictionary = null;
try
{
Type serviceParser = typeof(ServiceHostFactory).Assembly.GetType("System.ServiceModel.Activation.ServiceParser");
dictionary = (IDictionary) serviceParser.InvokeMember("ParseServiceDirective", BindingFlags.InvokeMethod | BindingFlags.Static | BindingFlags.NonPublic,
null, null, new object[1] { serviceText }, CultureInfo.InvariantCulture);
}
catch (TargetInvocationException e)
{
throw e.InnerException;
}
return dictionary;
}
public static SvcFile OpenExisting(string fileName)
{
if (!File.Exists(fileName))
{
return null;
}
string svcFileContents = null;
Guid appid;
Guid clsid;
using (StreamReader sr = File.OpenText(fileName))
{
svcFileContents = sr.ReadToEnd();
}
IDictionary dictionary = null;
try
{
dictionary = ParseServiceDirective(svcFileContents);
}
catch (Exception e)
{
if (e is NullReferenceException || e is SEHException)
{
throw e;
}
ToolConsole.WriteWarning (SR.GetString (SR.SvcFileParsingFailedWithError, fileName, e.Message));
return null;
}
if (dictionary == null)
{
return null;
}
if (!dictionary.ContainsKey(factoryAttributeName) ||
!dictionary.ContainsKey(serviceAttributeName))
{
return null;
}
string typeName = dictionary[factoryAttributeName];
Type factoryType = typeof(WasHostedComPlusFactory);
Type compiledType = factoryType.Assembly.GetType(dictionary[factoryAttributeName], false);
if (compiledType != factoryType)
{
return null;
}
string comPlusText = dictionary[serviceAttributeName];
string[] parameters = comPlusText.Split(',');
if (parameters.Length != 2)
{
ToolConsole.WriteWarning (SR.GetString (SR.BadlyFormattedSvcFile, fileName));
return null;
}
try
{
clsid = new Guid(parameters[0]);
appid = new Guid(parameters[1]);
}
catch (FormatException)
{
ToolConsole.WriteWarning (SR.GetString (SR.BadlyFormattedAppIDOrClsidInSvcFile, fileName));
return null;
}
return new SvcFile(appid, clsid, SvcFileState.Existing, new AtomicFile(fileName));
}
public Guid Appid
{
get { return this.appid; }
}
public Guid Clsid
{
get { return this.clsid; }
}
public SvcFileState State
{
get { return this.state; }
}
public void Abort()
{
this.svcFile.Abort();
}
public void Commit()
{
this.svcFile.Commit();
}
public void Delete()
{
Debug.Assert(this.state == SvcFileState.Existing, "this.state == SvcFileState.Existing");
this.svcFile.Delete();
this.state = SvcFileState.Deleted;
}
public void Prepare()
{
this.svcFile.Prepare();
}
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- ProcessProtocolHandler.cs
- ConnectionStringsSection.cs
- GridEntry.cs
- GridViewEditEventArgs.cs
- SqlInternalConnectionTds.cs
- FontCacheLogic.cs
- StringValidator.cs
- CheckBoxAutomationPeer.cs
- Popup.cs
- WhitespaceSignificantCollectionAttribute.cs
- DriveInfo.cs
- UnsafeNativeMethodsTablet.cs
- DelegateInArgument.cs
- ResourceCategoryAttribute.cs
- BaseCodePageEncoding.cs
- DataServiceKeyAttribute.cs
- DetailsViewPageEventArgs.cs
- OdbcRowUpdatingEvent.cs
- ComplusEndpointConfigContainer.cs
- URLAttribute.cs
- QuotedPairReader.cs
- DeviceSpecificDesigner.cs
- Funcletizer.cs
- Point4DValueSerializer.cs
- DataGridCell.cs
- ManagedWndProcTracker.cs
- FacetChecker.cs
- DateTimeStorage.cs
- PeerNameRecord.cs
- SQlBooleanStorage.cs
- CodeGenerator.cs
- MissingMethodException.cs
- FrameSecurityDescriptor.cs
- OperatorExpressions.cs
- ClientBase.cs
- ThreadPool.cs
- DiscoveryInnerClientManaged11.cs
- LifetimeServices.cs
- FrameworkContentElement.cs
- SpnegoTokenAuthenticator.cs
- QilInvokeEarlyBound.cs
- CatalogPartChrome.cs
- RenderContext.cs
- ContravarianceAdapter.cs
- HttpInputStream.cs
- DesignerCategoryAttribute.cs
- ExtendedPropertyDescriptor.cs
- MatrixTransform.cs
- EnumBuilder.cs
- LayoutTable.cs
- EntityDataSourceEntitySetNameItem.cs
- CancellationToken.cs
- ReferenceConverter.cs
- CheckBox.cs
- UpdateCommand.cs
- DataGrid.cs
- SafeCancelMibChangeNotify.cs
- Point.cs
- DBAsyncResult.cs
- WebRequestModuleElement.cs
- CollectionContainer.cs
- BindingExpression.cs
- AffineTransform3D.cs
- BaseDataListComponentEditor.cs
- ContentPresenter.cs
- _ContextAwareResult.cs
- SqlConnectionString.cs
- WsdlHelpGeneratorElement.cs
- ImageList.cs
- ThreadSafeList.cs
- SystemUdpStatistics.cs
- CheckBoxFlatAdapter.cs
- ExpressionLexer.cs
- CachingHintValidation.cs
- Int32AnimationUsingKeyFrames.cs
- ByteFacetDescriptionElement.cs
- DecoderFallbackWithFailureFlag.cs
- TypeToStringValueConverter.cs
- FormatterServices.cs
- NonSerializedAttribute.cs
- FirstMatchCodeGroup.cs
- DefaultPrintController.cs
- SiteMapPath.cs
- PeerTransportListenAddressValidator.cs
- DialogResultConverter.cs
- WebPartEventArgs.cs
- Function.cs
- HtmlTernaryTree.cs
- ManagedCodeMarkers.cs
- HasCopySemanticsAttribute.cs
- ListChangedEventArgs.cs
- TransformerTypeCollection.cs
- DeflateStreamAsyncResult.cs
- Vector3DAnimationBase.cs
- XhtmlBasicSelectionListAdapter.cs
- SizeF.cs
- GeneralTransform3DGroup.cs
- XAMLParseException.cs
- CodeGroup.cs
- Normalizer.cs