Code:
/ WCF / WCF / 3.5.30729.1 / untmp / Orcas / SP / ndp / cdf / src / WCF / Log / System / IO / Log / LogLogRecord.cs / 1 / LogLogRecord.cs
//------------------------------------------------------------------------------ // Copyright (c) Microsoft Corporation. All rights reserved. //----------------------------------------------------------------------------- namespace System.IO.Log { using System; using System.IO; using System.Runtime.InteropServices; class LogLogRecord : LogRecord { RecordStream stream; SequenceNumber sequenceNumber; SequenceNumber previous; SequenceNumber user; unsafe internal LogLogRecord( SequenceNumber sequenceNumber, SequenceNumber user, SequenceNumber previous, byte *data, long length) { this.sequenceNumber = sequenceNumber; this.previous = previous; this.user = user; if (length < LogLogRecordHeader.Size) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.LogCorrupt()); } byte[] headerBits = new byte[LogLogRecordHeader.Size]; Marshal.Copy(new IntPtr(data), headerBits, 0, LogLogRecordHeader.Size); LogLogRecordHeader header = new LogLogRecordHeader(headerBits); if (header.MajorVersion > LogLogRecordHeader.CurrentMajorVersion) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.IncompatibleVersion()); } length -= LogLogRecordHeader.Size; data += LogLogRecordHeader.Size; if (header.Padding) { long paddingSize = LogLogRecordHeader.DecodePaddingSize(data, length); if ((paddingSize < 0) || (paddingSize > length)) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.LogCorrupt()); } length -= paddingSize; data += paddingSize; } this.stream = new RecordStream( new UnmanagedMemoryStream(data, length)); } public override Stream Data { get { return this.stream; } } public override SequenceNumber Previous { get { return this.previous; } } public override SequenceNumber SequenceNumber { get { return this.sequenceNumber; } } public override SequenceNumber User { get { return this.user; } } public override void Dispose() { this.stream.Dispose(); } internal void Detach() { this.stream.MakeLocalCopy(); } class RecordStream : Stream { Stream innerStream; object syncRoot; internal RecordStream(Stream innerStream) { this.innerStream = innerStream; this.syncRoot = new object(); } public override bool CanRead { get { return true; } } public override bool CanSeek { get { return true; } } public override bool CanWrite { get { return false; } } public override long Length { get { lock(this.syncRoot) { CheckDisposed(); return this.innerStream.Length; } } } public override long Position { get { lock(this.syncRoot) { CheckDisposed(); return this.innerStream.Position; } } set { lock(this.syncRoot) { CheckDisposed(); this.innerStream.Position = value; } } } public override void Flush() { lock(this.syncRoot) { if(this.innerStream != null) { this.innerStream.Flush(); } } } public override int Read(byte[] buffer, int offset, int count) { lock(this.syncRoot) { CheckDisposed(); return this.innerStream.Read(buffer, offset, count); } } public override long Seek(long offset, SeekOrigin origin) { lock(this.syncRoot) { CheckDisposed(); return this.innerStream.Seek(offset, origin); } } public override void SetLength(long value) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.NotSupported()); } public override void Write(byte[] buffer, int offset, int count) { if (this.innerStream == null) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.ObjectDisposed()); } else { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.NotSupported()); } } public override void WriteByte(byte value) { if (this.innerStream == null) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.ObjectDisposed()); } else { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.NotSupported()); } } internal void MakeLocalCopy() { lock(this.syncRoot) { if (this.innerStream != null) { long originalPosition = this.innerStream.Position; try { try { byte[] newData = new byte[this.innerStream.Length]; this.innerStream.Position = 0; this.innerStream.Read(newData, 0, newData.Length); Stream oldStream = this.innerStream; this.innerStream = new MemoryStream(newData); oldStream.Close(); } finally { this.innerStream.Position = originalPosition; } } catch { // This outer catch block is needed to prevent an exception filter // from running while we're in an inconsistent state before // restoring the inner stream's original position. // See http://msdn2.microsoft.com/en-US/library/8cd7yaws.aspx throw; } } } } protected override void Dispose(bool disposing) { try { if (disposing) { lock (this.syncRoot) { if (this.innerStream != null) { this.innerStream.Close(); this.innerStream = null; } } } } finally { base.Dispose(disposing); } } void CheckDisposed() { if (this.innerStream == null) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.ObjectDisposed()); } } } } } // 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
- ModulesEntry.cs
- Cursors.cs
- CanonicalizationDriver.cs
- DataGridViewCellLinkedList.cs
- ResourceDictionaryCollection.cs
- TextRangeEditTables.cs
- AnimationLayer.cs
- VirtualDirectoryMappingCollection.cs
- EntityDataSourceUtil.cs
- SqlUDTStorage.cs
- CloseCollectionAsyncResult.cs
- SqlUtil.cs
- ModelUIElement3D.cs
- PeerObject.cs
- MachineSettingsSection.cs
- OletxDependentTransaction.cs
- OracleRowUpdatedEventArgs.cs
- CompilerLocalReference.cs
- SingleObjectCollection.cs
- BindingsCollection.cs
- DesignerSerializerAttribute.cs
- ToolStripMenuItem.cs
- Util.cs
- UIPropertyMetadata.cs
- DataControlField.cs
- TableRowCollection.cs
- XmlSchemaAnnotated.cs
- BooleanSwitch.cs
- smtpconnection.cs
- SapiGrammar.cs
- ClientSideProviderDescription.cs
- EntityViewGenerationConstants.cs
- SecurityPolicyVersion.cs
- SocketAddress.cs
- MachineSettingsSection.cs
- ToolStripControlHost.cs
- TextServicesPropertyRanges.cs
- XamlTypeMapperSchemaContext.cs
- ColorInterpolationModeValidation.cs
- FormViewRow.cs
- FloaterParaClient.cs
- Adorner.cs
- SHA512Managed.cs
- TransactionCache.cs
- TextEditorCopyPaste.cs
- TypographyProperties.cs
- ThreadStartException.cs
- CellParaClient.cs
- FrameworkElementFactoryMarkupObject.cs
- FormsAuthenticationUserCollection.cs
- IOThreadScheduler.cs
- ListViewItemSelectionChangedEvent.cs
- XMLUtil.cs
- MethodExpression.cs
- SQLSingle.cs
- ParameterInfo.cs
- WorkflowOwnershipException.cs
- Input.cs
- ButtonRenderer.cs
- BasePattern.cs
- RefreshPropertiesAttribute.cs
- NamedObject.cs
- DrawingGroup.cs
- TimelineGroup.cs
- EndpointNotFoundException.cs
- ToolStripLabel.cs
- TerminatorSinks.cs
- ContravarianceAdapter.cs
- WebReferencesBuildProvider.cs
- CriticalExceptions.cs
- ResetableIterator.cs
- PolicyException.cs
- BuildProviderAppliesToAttribute.cs
- AssemblyHash.cs
- MetadataItemEmitter.cs
- ImageFormatConverter.cs
- AsyncCallback.cs
- HeaderCollection.cs
- SqlWebEventProvider.cs
- ConditionCollection.cs
- MexBindingElement.cs
- MulticastNotSupportedException.cs
- BufferedWebEventProvider.cs
- XmlCodeExporter.cs
- ConnectionManagementSection.cs
- AddDataControlFieldDialog.cs
- XmlSchemaElement.cs
- AppSettingsReader.cs
- DesignerSerializerAttribute.cs
- HScrollProperties.cs
- Slider.cs
- ConditionalAttribute.cs
- WebBrowserContainer.cs
- BigInt.cs
- Sorting.cs
- MultiView.cs
- NumberSubstitution.cs
- TreeViewTemplateSelector.cs
- GetCertificateRequest.cs
- AssemblyFilter.cs