Code:
/ WCF / WCF / 3.5.30729.1 / untmp / Orcas / SP / ndp / cdf / src / WCF / Tools / comsvcutil / SvcFileManager.cs / 1 / 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.Configuration; using System.ServiceModel.ComIntegration; using Microsoft.Tools.ServiceModel; using Microsoft.Tools.ServiceModel.SvcUtil; class SvcFileManager { string webDirectoryPath; DictionarysvcFiles; 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(Message).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. // Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- TimeoutValidationAttribute.cs
- ErrorEventArgs.cs
- ExpressionBinding.cs
- ContainerAction.cs
- TypeDescriptionProvider.cs
- Currency.cs
- SizeChangedInfo.cs
- MappingModelBuildProvider.cs
- FrameworkElementAutomationPeer.cs
- CharacterString.cs
- OutputCacheSettings.cs
- EmptyStringExpandableObjectConverter.cs
- XamlSerializerUtil.cs
- LifetimeServices.cs
- UnknownBitmapEncoder.cs
- EntityViewGenerationAttribute.cs
- OdbcConnectionHandle.cs
- GacUtil.cs
- ErrorWrapper.cs
- FillRuleValidation.cs
- Vertex.cs
- HostedBindingBehavior.cs
- MulticastNotSupportedException.cs
- TreeNodeCollection.cs
- HwndProxyElementProvider.cs
- Int32AnimationBase.cs
- DbConnectionPoolGroup.cs
- UrlMapping.cs
- LocalizabilityAttribute.cs
- DataGridLinkButton.cs
- RegexCompiler.cs
- SqlRemoveConstantOrderBy.cs
- ParameterCollection.cs
- HttpPostedFile.cs
- ContextMenuStrip.cs
- CodeTypeMemberCollection.cs
- Membership.cs
- LassoSelectionBehavior.cs
- ByteAnimation.cs
- RequestDescription.cs
- XPathNavigator.cs
- DataGridViewHitTestInfo.cs
- x509store.cs
- mactripleDES.cs
- KeyMatchBuilder.cs
- XmlNamespaceDeclarationsAttribute.cs
- CharacterBufferReference.cs
- SmiRecordBuffer.cs
- followingquery.cs
- WSHttpBinding.cs
- FileDialogCustomPlacesCollection.cs
- BamlLocalizationDictionary.cs
- httpapplicationstate.cs
- StorageAssociationSetMapping.cs
- UntrustedRecipientException.cs
- BaseAsyncResult.cs
- NativeActivityMetadata.cs
- WebRequestModulesSection.cs
- MultiTrigger.cs
- DateTimePickerDesigner.cs
- MsdtcClusterUtils.cs
- DrawingBrush.cs
- srgsitem.cs
- SiteIdentityPermission.cs
- ICspAsymmetricAlgorithm.cs
- MarkupObject.cs
- WSHttpBindingBaseElement.cs
- SystemUdpStatistics.cs
- SortKey.cs
- ColumnBinding.cs
- SolidColorBrush.cs
- TransformDescriptor.cs
- ToolStripItemClickedEventArgs.cs
- ActivityExecutionWorkItem.cs
- CodeSnippetCompileUnit.cs
- FrameworkRichTextComposition.cs
- cookieexception.cs
- DbConvert.cs
- XmlProcessingInstruction.cs
- PerformanceCounterPermissionEntry.cs
- Literal.cs
- TargetParameterCountException.cs
- KeyPressEvent.cs
- XmlMembersMapping.cs
- FileLogRecordEnumerator.cs
- LinearKeyFrames.cs
- PerformanceCounterCategory.cs
- IFormattable.cs
- MenuItemBinding.cs
- XmlArrayItemAttribute.cs
- LogicalTreeHelper.cs
- AudienceUriMode.cs
- QueryCacheEntry.cs
- SimpleBitVector32.cs
- SystemSounds.cs
- TogglePattern.cs
- COM2Properties.cs
- ColumnCollection.cs
- StreamingContext.cs
- AssemblyNameProxy.cs